手工迁移
简介
手工迁移需要用户对AI模型有迁移基础,了解GPU与NPU的接口设计的异同点以及各种迁移手段。手工迁移过程中,各个模型使用的迁移方法不完全相同,下文给出手工迁移的核心要点。
单卡迁移
- 导入NPU相关库。
import torch import torch_npu
- 指定NPU作为训练设备。指定训练设备需修改模型训练脚本,有两种指定方式:
- .to(device)方式:定义好device后可通过xx.to(device)的方式将模型或数据集等加载到GPU或NPU上,如model.to(device)。该方式可以指定需要的训练资源,使用比较灵活。
迁移前:
device = torch.device('cuda:{}'.format(args.gpu))
迁移后:device = torch.device('npu:{}'.format(args.gpu))
- set_device方式:调用set_device接口,指定训练设备。需注意该方式不会自动使用NPU,用户需要手动在想使用NPU的地方,添加xx.npu()代码,将模型数据集等加载到NPU上,如model.npu()。
迁移前:
torch.cuda.set_device(args.gpu)
迁移后:torch_npu.npu.set_device(args.gpu)
- .to(device)方式:定义好device后可通过xx.to(device)的方式将模型或数据集等加载到GPU或NPU上,如model.to(device)。该方式可以指定需要的训练资源,使用比较灵活。
- 替换CUDA接口:将训练脚本中的CUDA接口替换为NPU接口,例如模型、损失函数、数据集等迁移到NPU上。常见替换接口请参见常见PyTorch迁移替换接口。更多接口请参见《API 参考》。
多卡迁移(分布式训练迁移)
除单卡迁移包含的3个修改要点外,在分布式场景下,还需要切换通信方式,直接修改init_process_group的值。
修改前,GPU使用nccl方式:
dist.init_process_group(backend='nccl',init_method = "tcp://127.0.0.1:**", ...... ,rank = args.rank) # **为端口号,根据实际选择一个闲置端口填写
修改后,NPU使用hccl方式:
dist.init_process_group(backend='hccl',init_method = "tcp://127.0.0.1:**", ...... ,rank = args.rank) # **为端口号,根据实际选择一个闲置端口填写
父主题: 模型脚本迁移