本章节将指导用户将PyTorch训练脚本从GPU平台迁移至昇腾NPU平台。自动迁移方式支持PyTorch1.11.0、2.0.1、2.1.0版本的训练脚本的迁移,自动迁移方式较简单,且修改内容最少,只需在训练脚本中导入库代码。
约束
- 由于自动迁移工具使用了Python的动态特性,但torch.jit.script不支持Python的动态语法,因此用户原训练脚本中包含torch.jit.script时使用自动迁移功能会产生冲突,目前自动迁移时会屏蔽torch.jit.script功能,若用户脚本中必须使用torch.jit.script功能,请使用PyTorch GPU2Ascend工具迁移进行迁移。
- 当前自动迁移暂不支持channel_last特性,建议用户使用contiguous进行替换。
迁移操作
- 配置环境变量。
自动迁移脚本在CANN开发套件包所在安装路径的ascend-toolkit/latest/tools/ms_fmk_transplt/torch_npu_bridge目录下,执行如下命令配置当前进程的环境变量。
export PYTHONPATH={CANN包安装路径}/ascend-toolkit/latest/tools/ms_fmk_transplt/torch_npu_bridge:$PYTHONPATH
- 导入自动迁移的库代码。
在训练入口py文件中最上面,例如train.py中插入以下引用内容。
import torch
import torch_npu
.....
import transfer_to_npu
- 迁移完成,可参考原始脚本提供的训练流程,在昇腾NPU平台直接运行修改后的模型脚本即可。
后续操作
- 为了提升模型运行速度,建议开启使用二进制算子,参考环境准备安装二进制算子包后,参考如下方式开启:
- 单卡场景下,修改训练入口文件例如main.py文件,在import torch_npu下方添加加粗字体信息。
import torch
import torch_npu
torch_npu.npu.set_compile_mode(jit_compile=False)
......
- 多卡场景下,如果拉起多卡训练的方式为mp.spawn,则torch_npu.npu.set_compile_mode(jit_compile=False)必须加在进程拉起的主函数中才能使能二进制,否则使能方式与单卡场景相同。
if is_distributed:
mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args))
else:
main_worker(args.gpu, ngpus_per_node, args)
def main_worker(gpu, ngpus_per_node, args):
# 加在进程拉起的主函数中
torch_npu.npu.set_compile_mode(jit_compile=False)
......
- 用户训练脚本中包含昇腾NPU平台不支持的torch.nn.DataParallel接口,需要手动修改为torch.nn.parallel.DistributedDataParallel接口执行多卡训练,参考迁移单卡脚本为多卡脚本进行修改。
- 若用户训练脚本中包含昇腾NPU平台不支持的amp_C模块,需要用户手动删除后再进行训练。
- 若用户训练脚本中包含torch.cuda.get_device_capability接口,迁移后在昇腾NPU平台上运行时,会返回“None”值,如遇报错,需要用户将“None”值手动修改为固定值。torch.cuda.get_device_properties接口迁移后在昇腾NPU平台上运行时,返回值不包含minor和major属性,建议用户注释掉调用minor和major属性的代码。
- 若用户训练脚本中包含昇腾NPU平台不支持的torch.cuda.default_generators接口,需要手动修改为torch_npu.npu.default_generators接口。
- 若用户训练脚本中使用的backend为nccl,在init_process_group初始化进程组后,backend已被自动迁移工具替换为hccl。如果后续代码逻辑包含backend是否为nccl的判断,例如assert backend in ['gloo', 'nccl']、if backend == 'nccl',请手动将字符串nccl改写为hccl。