首页 > 其他分享 >如何将PyTorch模型迁移到昇腾平台

如何将PyTorch模型迁移到昇腾平台

时间:2024-02-01 15:37:18浏览次数:35  
标签:脚本 训练 -- 模型 PyTorch NPU 迁移

https://bbs.huaweicloud.com/blogs/399602?utm_source=cnblog&utm_medium=bbs-ex&utm_campaign=other&utm_content=content

如何将PyTorch模型迁移到昇腾平台

举报  昇腾CANN 发表于 2023/04/18 09:54:50    5k+  0  1   【摘要】 本文介绍将PyTorch网络模型迁移到昇腾AI平台,并执行训练的全流程。

PyTorch是业界流行的深度学习框架,用于开发深度学习训练脚本,默认运行在CPU/GPU上。为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练,需要对PyTorch的训练脚本进行迁移。

首先,我们了解下模型迁移的全流程:

流程图.PNG

 

通过上图可以看出,模型迁移包括“脚本迁移 –> 模型训练 –> 精度调优 –> 性能调优 –> 模型固化”几个流程,其中:

  1. “脚本迁移”是对PyTorch训练脚本进行少量修改,使其可以运行在昇腾AI处理器上。目前支持自动迁移、工具迁移和手动迁移三种迁移方式,推荐使用自动迁移,用户仅需在脚本中添加一行导入训练转换库的代码即可完成PyTorch训练脚本到NPU的迁移。在迁移完成、训练开始之前,基于NPU的架构特性,用户需要开启混合精度,用于提升模型性能。
  2. “模型训练”是根据模型参数进行多轮训练迭代,并在训练过程中评估模型准确度,使其在训练结束时能够完成某种AI任务(例如图像识别)。
  3. “精度调优”与“性能调优”是在用户完成模型训练后,比对、分析模型的精度和性能是否达到用户要求,并指导用户对精度或性能进行进一步提升的操作。
  4. “模型固化”是将训练好的、精度性能达标的模型保存为pth或pth.tar模型文件用于在线推理,或导出为ONNX模型再通过ATC工具转换为om模型,使其可以在昇腾AI处理器上进行离线推理。

本文我们针对“脚本迁移”和“模型训练”两个阶段进行详细的介绍。

脚本迁移

将PyTorch训练脚本迁移到昇腾平台有自动迁移(推荐)、工具迁移和手工迁移三种方式。自动迁移仅需开发者在脚本中引入转换库,脚本执行时边训练边转换;工具迁移需要开发者手工配置拉起命令参数,工具可自动分析PyTorch训练脚本的算子支持情况;手工迁移需要开发者对训练脚本以及NPU接口的支持情况有一定的了解,然后手工修改脚本代码。其中自动迁移的方式最简单,推荐开发者优先使用自动迁移。

自动迁移

在训练脚本中导入脚本转换库,然后拉起脚本执行训练。训练脚本在运行的同时,会自动将脚本中的CUDA接口替换为昇腾AI处理器支持的NPU接口。整体过程为边训练边转换。代码实现方式如下:

1. 配置环境变量。

export PYTHONPATH={CANN软件安装目录}/ascend-toolkit/latest/tools/ms_fmk_transplt/torch_npu_bridge:$PYTHONPATH

2. 在训练脚本中引入以下头文件。

import torch
import torch_npu
.....
import transfer_to_npu

工具迁移

训练前,通过脚本迁移工具,自动将训练脚本中的CUDA接口替换为昇腾AI处理器支持的NPU接口,并生成迁移报告(包含脚本转换日志、不支持算子的列表、脚本修改记录)。训练时,运行转换后的脚本。整体过程为先转换脚本,再进行训练。

1. 安装依赖

pip3 install pandas    
pip3 install libcst     # Python语法树解析器 
pip3 install jedi       # 用于跨文件解析,建议安装

2. 进入迁移工具所在路径。

cd CANN软件安装目录/ascend-toolkit/latest/tools/ms_fmk_transplt/

3. 进入分析迁移工具所在路径,执行脚本迁移任务。

./pytorch_gpu2npu.sh -i 原始脚本路径 -o 脚本迁移结果输出路径 -v 原始脚本框架版本 [-r 自定义规则json文件路径] [-s] [-sim] [-a 模型名称] [-m] [distributed -t 目标模型变量名 -m 训练脚本的入口文件]

4. 脚本迁移完成后,进入脚本迁移结果输出路径查看结果文件,以GPU单卡脚本迁移为NPU多卡脚本为例:

├── xxx_msft/xxx_msft_multi     // 迁移结果输出目录
│   ├── 训练脚本文件存储目录      // 与迁移前目录结构一致                 
│   ├── msFmkTranspltlog.txt    // 脚本迁移过程日志文件
│   ├── cuda_op_list.csv        //分析出的cuda算子列表
│   ├── unknown_api.csv         //支持情况存疑的API列表
│   ├── unsupported_api.csv     //不支持的API列表
│   ├── change_list.csv         // 修改记录文件
│   ├── run_distributed_npu.sh  // 多卡启动shell脚本
│   ├── ascend_function         // 如果启用了自动替换不支持API功能,生成包含等价算子的目录

手工迁移

手工迁移需要用户对AI模型有迁移基础,了解GPU与NPU的代码异同点。手工迁移过程中各个模型的迁移方法均有不同,下文只给出手工迁移的核心要点。

单卡迁移

1. 导入NPU相关库。

import torch
import torch_npu 

2. 迁移适配GPU的模型脚本,指定NPU作为训练设备。

    迁移前:

device = torch.device('cuda:{}'.format(args.gpu))

    迁移后:

device = torch.device('npu:{}'.format(args.gpu))

3. 替换CUDA接口:将训练脚本中的CUDA接口替换为NPU接口,例如CUDA接口、模型、损失函数、数据集等迁移到NPU上。样例代码如下:

    迁移前:

model.cuda(args.gpu)

    迁移后:

model.npu(args.gpu)

多卡迁移

除单卡迁移包含的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)

**为端口号,根据实际选择一个闲置端口填写。

混合精度开启

混合精度训练是在训练时混合使用单精度(float32)与半精度(float16)数据类型,将两者结合在一起,并使用相同的超参数实现了与float32几乎相同的精度。在迁移完成、训练开始之前,基于NPU芯片的架构特性,用户需要开启混合精度,可以提升模型的性能。推荐用户使用PyTorch1.8.1及以上版本框架内置的AMP功能模块来使能混合精度训练。在典型模型训练场景中,代码实现方式如下。

1. 在构建神经网络前,我们需要导入torch_npu中的AMP模块。

import time
import torch
import torch.nn as nn
import torch_npu
from torch_npu.npu import amp    # 导入AMP模块

2. 在模型、优化器定义之后,定义AMP功能中的GradScaler。

model = CNN().to(device)
train_dataloader = DataLoader(train_data, batch_size=batch_size)    # 定义DataLoader
loss_func = nn.CrossEntropyLoss().to(device)    # 定义损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)    # 定义优化器
scaler = amp.GradScaler()    # 在模型、优化器定义之后,定义GradScaler

3. 在训练代码中添加AMP功能相关的代码开启AMP。

for epo in range(epochs):
for imgs, labels in train_dataloader:
imgs = imgs.to(device)
    labels = labels.to(device)
    with amp.autocast():
        outputs = model(imgs)    # 前向计算
        loss = loss_func(outputs, labels)    # 损失函数计算
    optimizer.zero_grad()
    # 进行反向传播前后的loss缩放、参数更新
    scaler.scale(loss).backward()    # loss缩放并反向传播
    scaler.step(optimizer)    # 更新参数(自动unscaling)
    scaler.update()    # 基于动态Loss Scale更新loss_scaling系数

模型训练

迁移成功后的脚本可在昇腾AI处理器上执行单卡训练,也可以在多卡上执行分布式训练。

执行训练前用户需要确保已经完成CANN基础环境变量的配置,并已经将数据集上传到运行环境中。

1. 拉起训练脚本。

   用户可以点击链接下载基于ImageNet数据集的ResNet50训练脚本main.py,训练脚本通过自动迁移方式迁移到昇腾AI处理器后,执行如下示例命令拉起训练进程。

   单卡训练示例:

python3 main.py /home/data/resnet50/imagenet --batch-size 128 --lr 0.1 --epochs 90 --arch resnet50 --world-size 1 --rank 0 --workers 40 --momentum 0.9 --weight-decay 1e-4 --gpu 0

    多卡分布式训练示例:

python3 main.py /home/data/resnet50/imagenet --workers 160 --lr 0.8 --arch resnet50 --dist-url 'tcp://127.0.0.1:**' --dist-backend 'hccl' --multiprocessing-distributed --world-size 1 --batch-size 2048 --epochs 90 --rank 0 --amp

    --dist-url:为多卡训练时使用的端口号,配置为任一空闲端口号即可。

    --amp:代表开启混合精度,仅多卡训练时需要显示开启,单卡训练时已默认开启。

2. 查看训练后是否生成权重文件,生成了如下图模型文件则说明迁移训练成功。

二维码.png

以上就是PyTorch模型迁移训练的相关知识点,更多详细操作可参见“昇腾文档中心”,您也可以在“昇腾社区在线课程”板块学习视频课程,学习过程中的任何疑问,都可以在“昇腾论坛”互动交流!

相关参考:

[1]昇腾文档中心

[2]昇腾社区在线课程

[3]昇腾论坛

标签:脚本,训练,--,模型,PyTorch,NPU,迁移
From: https://www.cnblogs.com/shuimuqingyang/p/18001357

相关文章

  • Git仓库迁移
    主页个人微信公众号:密码应用技术实战个人博客园首页:https://www.cnblogs.com/informatics/背景我们在代码管理中,偶尔会碰到仓库迁移,由于代码版本当前基本都是使用Git管理,Git提交记录对于版本维护、代码合并等具有重要作用。因此在迁移时需要保留Git提交信息。Git仓库迁移场......
  • 4个大语言模型训练中的典型开源数据集
    本文分享自华为云社区《浅谈如何处理大语言模型训练数据之三开源数据集介绍》,作者:码上开花_Lancer。随着最近这些年来基于统计机器学习的自然语言处理的算法的发展,以及信息检索研究的需求,特别是近年来深度学习和预训练语言模型的研究以及国内国外许多大模型的开源,研究人员们构建......
  • 读论文-基于用户长短期偏好的序列推荐模型
    前言今天要读的论文名为《基于用户长短期偏好的序列推荐模型》,是一篇于2022年12月29日发表在《计算机科学》上的一篇期刊论文。文章发现了传统的序列推荐模型忽略了不同用户的个性化行为,导致模型不能充分捕获用户动态偏好而产生的兴趣漂移等问题,提出了一种基于用户长短期偏好......
  • 想要成为AIGC大模型工程师, 如何搭建你的知识体系框架?
    AI不会取代你的工作,会取代你的是会AI的人,如何提升自己与他人的知识壁垒,如何学习AIGC?相信在过去2023这个AI爆发的元年,我相信也是很多人的疑问,好像不懂使用点AI工具,例如ChatGpt、Midjourney或者SD,就好像被淘汰了一样,更近一步地我们如何训练自己的AI大模型、如何开发自己的AI产品?是很......
  • R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化
    全文链接:http://tecdat.cn/?p=31996原文出处:拓端数据部落公众号GAMLSS模型是一种半参数回归模型,参数性体现在需要对响应变量作参数化分布的假设,非参数性体现在模型中解释变量的函数可以涉及非参数平滑函数,非参数平滑函数不预先设定函数关系,各个解释变量的非线性影响结果完全取决......
  • 【极简】Pytorch中的register_buffer()
    registerbuffer定义模型能用torch.save保存的、但是不更新参数。使用:只要是nn.Module的子类就能直接self.调用使用:classA(nn.Module):#...self.register_buffer('betas',torch.linspace(beta_1,beta_T,T).double())#...手动定义参数上述的参数显然可以......
  • AIGC、AGI、ChatGPT:揭秘人工智能大模型的变革与创新
    随着科技的不断发展,人工智能(AI)已经深入到我们生活的方方面面,从语音助手到自动驾驶汽车,再到智能家居,AI的影子无处不在。而在近年来,AIGC、AGI和ChatGPT等人工智能大模型的出现,更是引领了一场前所未有的技术革命。接下来,我们将一起探索这些人工智能大模型的奥秘。一、AIGC:开启全新的......
  • 大模型训练、多模态数据处理与融合:从理论到实践
    一、大模型训练大模型是指具有巨大参数量和计算能力的人工神经网络模型,如GPT(GenerativePre-trainedTransformer)系列模型和BERT(BidirectionalEncoderRepresentationsfromTransformers)模型。大模型的训练需要大量的数据和计算资源,同时需要采用合适的优化算法和技术,以提高模型的......
  • 模型评估与轨道
    模型评估与轨道一、模型评估的基本方法1.1监督学习下的泛化、过拟合与欠拟合在有监督的学习过程中,首先在训练数据上学得模型参数来构建模型,然后根据学得的模型,对新数据做出预测。用来训练的数据集称为训练集,用来测试预测结果是否准确的新数据称为测试集。注意:测试集中的数据不......
  • 02 三维世界与模型
    了解三维世界物体的位置是使用某个坐标轴下的坐标(x,y,z)进行描述。 坐标系分为两种:左手坐标系、右手坐标系。z轴坐标系是这两种坐标系的区别点。OpenGL使用的是右手坐标系。OpenGL做了什么?先确定坐标系(原点、x,y,z得指向),再确定摄像机(观察者)的位置和方向。这样就能渲染出图......