手工迁移
简介
手工迁移需要用户对AI模型有迁移基础,了解GPU与NPU的代码的异同点以及各种迁移手段。手工迁移过程中各个模型的迁移方法均有不同,下文给出手工迁移的核心要点。
使用方法
- 单卡迁移
- 导入NPU相关库。
import torch import torch_npu
- 迁移适配GPU的模型脚本,指定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))
- .cuda(迁移前)和.npu(迁移后)方式:该方式不会自动使用GPU或NPU,需要以xx.cuda()或xx.npu()的方式将模型数据集等加载到GPU或NPU上,如model.cuda()。
迁移前:
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接口,例如CUDA接口、模型、损失函数、数据集等迁移到NPU上。常见替换接口请参见PyTorch接口替换。更多接口请参见API列表。
- 导入NPU相关库。
- 多卡迁移(分布式训练迁移)
除单卡迁移包含的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) # **为端口号,根据实际选择一个闲置端口填写
父主题: 模型迁移