算子调优
本节介绍PyTorch训练场景下,如何进行算子调优,包括调优前须知、dump算子图、配置环境变量和调优命令。
调优前须知
- 请保证训练脚本在昇腾AI处理器上执行成功,功能和精度满足预期。
- 不建议用户绑定训练进程到指定的CPU,请使用系统默认的CPU调度策略。否则,可能会影响调优效果。
- 为提高调优效率,希望用户尽量控制训练步数。一般情况下,通过一个step能完成一次完整的图执行过程,保证图中所有的算子都能遍历一遍完成调优即可。
- 目前仅支持静态算子,暂不支持动态算子。
- 仅支持1P脚本进行dump图。
- AOE不支持不同用户同时使用同一device进行调优。
- 单个AOE进程时,请确保具备如下条件。多个AOE进程时,可参考如下条件自行扩展。
- 调优前,请确保关闭Profiling功能,避免影响调优结果。关闭Profiling功能具体操作请参见《性能分析工具使用指南》。
dump算子图
方式一:通过《CANN AscendCL应用软件开发指南(C&C++)》中的aclGenGraphAndDumpForOp接口dump出来算子图。
方式二:在模型脚本中添加如下使能代码,将算子图dump到本地。
- PyTorch 1.5版本:
#在模型脚本首行,确认PyTorch框架版本 import torch if torch.__version__ >= "1.5": import torch_npu import torch.npu def train_model(): # PyTorch 1.5版本参见如下设置使能AOE dump接口,dump_path为保存算子子图的路径,请自行设置 torch.npu.set_aoe(dump_path) train_model_one_step() # 模型训练过程,一般仅需要跑一个step即可 # dump_path表示设置保存dump出算子图的路径,必须要设置,不能为空;当设置的路径不存在时,会尝试创建,支持多级目录创建
- PyTorch 1.8及以上版本:
#在模型脚本首行,确认PyTorch框架版本 import torch if torch.__version__ >= "1.8": import torch_npu import torch.npu def train_model(): # PyTorch 1.8及以上版本参见如下设置使能AOE dump接口,dump_path为保存算子子图的路径,请自行设置 torch_npu.npu.set_aoe(dump_path) train_model_one_step() # 模型训练过程,一般仅需要跑一个step即可 # dump_path表示设置保存dump出算子图的路径,必须要设置,不能为空;当设置的路径不存在时,会尝试创建,支持多级目录创建
以resnet50模型为实际样例,修改如下。
- PyTorch 1.5版本:
#line 445~460 model.train() optimizer.zero_grad() end = time.time() torch.npu.set_aoe(dump_path)#使能接口 for i, (images, target) in enumerate(train_loader): # 图模式 if args.graph_mode: print("args.graph_mode") torch.npu.enable_graph_mode() if i > 0: #仅需要运行一个step exit() if i > 100: pass # measure data loading time data_time.update(time.time() - end) if args.gpu is not None: images = images.cuda(args.gpu, non_blocking=True)
- PyTorch 1.8及以上版本:
#line 427~437 model.train() optimizer.zero_grad() end = time.time() torch_npu.npu.set_aoe(dump_path) #使能接口 # 图模式 if args.graph_mode: print("args.graph_mode") torch.npu.enable_graph_mode() if i > 0: #仅需要运行一个step exit() if i > 100: pass # measure data loading time data_time.update(time.time() - end) if args.gpu is not None: images = images.cuda(args.gpu, non_blocking=True)
参考链接:https://gitee.com/ascend/ModelZoo-PyTorch/blob/master/PyTorch/built-in/cv/classification/ResNet50_for_PyTorch/pytorch_resnet50_apex.py
配置环境变量
发起调优前,需要添加如下环境变量。
- CANN软件基础环境变量
CANN组合包提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。执行命令参考如下,以下示例均为root或非root用户默认安装路径,请以实际安装路径为准。
# 以root用户安装toolkit包 . /usr/local/Ascend/ascend-toolkit/set_env.sh # 以非root用户安装toolkit包 . ${HOME}/Ascend/ascend-toolkit/set_env.sh
- AOE工具依赖Python,以Python3.7.5为例,请以运行用户执行如下命令设置Python3.7.5的相关环境变量。
#用于设置python3.7.5库文件路径 export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH #如果用户环境存在多个python3版本,则指定使用python3.7.5版本 export PATH=/usr/local/python3.7.5/bin:$PATH
Python3.7.5安装路径请根据实际情况进行替换,您也可以将以上命令写入~/.bashrc文件中,然后执行source ~/.bashrc命令使其立即生效。
- 调优前也可参考如下示例配置其他环境变量,但为可选配置,相关说明请参考表1。
export ASCEND_DEVICE_ID=0 export TUNE_BANK_PATH=/home/HwHiAiUser/custom_tune_bank export TE_PARALLEL_COMPILER=8 export REPEAT_TUNE=False
用户可将设置环境变量的命令写入自定义脚本,方便后续执行。
执行调优
将准备好的算子图使用AOE进行调优,调优示例如下。
aoe --job_type=2 --model_path=dump_path
更多AOE参数请参见AOE参数说明。
父主题: PyTorch训练场景下调优