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

news2025/1/18 6:43:06

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

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

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

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

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

脚本迁移

将PyTorch训练脚本迁移到昇腾平台有自动迁移(推荐)、工具迁移和手工迁移三种方式。

自动迁移

在训练脚本中导入脚本转换库,然后拉起脚本执行训练。训练脚本在运行的同时,会自动将脚本中的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. 配置训练相关环境变量。

新建环境变量shell脚本env.sh,写入以下代码并执行:

#将Host日志输出到串口,0-关闭/1-开启
export ASCEND_SLOG_PRINT_TO_STDOUT=0
#多机多卡训练时,自动获取IP环境变量
export HCCL_IF_IP=$(hostname -I |awk '{print $1}')

#配置PyTorch框架环境变量
ulimit -SHn 512000
path_lib=$(python3.7 -c """
import sys
import re
result=''
for index in range(len(sys.path)):
    match_sit = re.search('-packages', sys.path[index])
    if match_sit is not None:
        match_lib = re.search('lib', sys.path[index])

        if match_lib is not None:
            end=match_lib.span()[1]
            result += sys.path[index][0:end] + ':'

        result+=sys.path[index] + '/torch/lib:'
print(result)"""
)

echo ${path_lib}

export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib/:${path_lib}:$LD_LIBRARY_PATH

2. 拉起训练脚本。

    单卡训练示例:

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:代表开启混合精度,仅多卡训练时需要显示开启,单卡训练时已默认开启。

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

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

相关参考:

[1]昇腾文档中心

[2]昇腾社区在线课程

[3]昇腾论坛

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Attribution

Maps that use Mapbox map designs, data or software usually must display the Mapbox logo and text attribution. This guide explains when, why, and how you are required to add these forms of attribution, and any exceptions. 使用 Mapbox 地图设计、数据或软件的…

Redis整条完整数据复制黏贴-客户端操作

1.先安装可视化工具: Another-Redis-Desktop-Manager.1.5.9 2.链接上redis服务器 3.打开Another-Redis-Desktop-Manager.1.5.9 4.选中你要复制那条记录,然后点击右上角的copy command 5.把复制下单数据,修改相关key,value等…

Redis:常见的面试题和答案

1、Redis 是什么?它的主要用途是什么? 答案: Redis 是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息代理。它支持多种数据结构,例如字符串、列表、哈希表、集合和有序集合。Redis 的主要用途包括缓存、会话存储、排…

【C++】第12章: 类和动态内存分配

文章目录第12章 类和动态内存分配12.1 动态内存和类12.1.1 复习示例和静态类成员12.1.2 特殊成员函数12.1.2.1 默认构造函数12.1.2.2 复制构造函数12.1.2.3 何时调用复制构造函数?12.1.2.4 默认的复制构造函数12.1.3 赋值运算符12.2 改进后的新String类12.2.1 修订后…

中创|香港Web3嘉年华精彩回顾:探索Web3的未来与机遇!

持续四天的Web3新纪元:香港Web3嘉年华重塑数字世界与现实世界的交融! 4月12日,香港会议展览中心,2023香港Web3嘉年华盛大开幕,来自全球的Web3项目方、投资机构、基础设施建设提供商、港府重要议员云集于此&#xff0c…

某程序员哀叹:辛辛苦苦写几年代码,做了些业务,有了点成就感,但回头一看80%都没用,没法写到简历上!...

什么事情会让你脊背一凉,细思极恐?一位程序员说了一件很可怕的事:辛辛苦苦写了几年代码,做了些业务,在一片祥和中有了点成就感。然而回头一看,80%是没啥用的,甚至没法写到简历上&…

持续集成——接口测试集成实战

文章目录一、接口测试持续集成的好处二、环境准备三、Jenkins节点挂载1、新建node节点2、编辑节点信息四、节点环境的配置1、Python3环境2、allure-commandline工具3、allure插件五、本地运行待测代码1、Pycharm拉取代码执行2、命令行运行代码,并生成报告六、库文件…

fMRIflows:全自动单变量和多变量fMRI处理管道的联合体

导读 如何分析fMRI数据取决于研究人员和所使用的工具箱。为每个新数据集重写处理管道的情况并不少见。因此,代码透明度、质量控制和客观分析管道对于提高神经影像研究的可重复性非常重要。Nipype和fMRIPrep等工具箱的广泛使用已经证明了研究人员对自动化预处理分析…

Anaconda3 安装python3.6 默认安装pip (9.0.1) 旧版本异常问题集锦 - 如何配置永久生效的 pip 国内镜像源

一、问题集锦 python3.6 是一个转折点,因为笔者发现 ≤ python3.6 的 anaconda3 安装都是默认安装 ≤ pip-9.0.1,而 python3.6 以上 python 解释器版本都是已经是 20 几号的 pip 版本了,所以如此之大的版本差距,很容易出现各种版本…

HttpServletRespon

1、HttpServletRespon对象 在Servlet API中,定义了一个HttpResponse接口,它继承于ServletResponse接口,专门用于封装HTTP响应消息 HTTP响应消息分为响应状态行、响应消息头、响应消息体三部分,所以HttpResponse接口中定义了向客…

ARMv8如何读取cache line中MOESI 状态以及Tag信息(tag RAM dirty RAM)

本文以Cortex-A53处理器为例,通过访问 处理器中的内部存储单元(tag RAM和dirty RAM),来读取cache line 中的MOESI信息。 Cortex-A53提供了一种通过读取一些系统寄存器,来访问Cache 和 TLB使用的一些内部存储单元的机制…

Zabbix的介绍和部署

目录 一、zabbix是什么? 1.zabbix的官方网站 为什么要使用监控? 2.zabbxi是什么组成的 3.zabbix是如何进行数据采集的 4.zabbix收集数据的方式有哪些,并且说明模式的含义? 5.zabbix监控有哪些? 6.安装zabbix使…

Linux共享内存(System V)

前言:在前面章节,我们学习了2种进程间通信方式,一个是通过继承方式的匿名管道,一个是通过让有血缘关系的进程在内存中看到同一份文件进行通信。此外,还可以在内存中开辟一块物理内存,通过页表映射到进程的进…

前段时间面了15个人,发现这些测试人都有个通病......

前段时间面了15个人,怎么说呢,基本上没有符合要求的,其实一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。看简历很多都是3年工作经验&…

C++——一种特殊的二叉搜索树之AVL树

目录序言1 AVL树的概念2 AVL树节点的定义3 AVL树的插入是否继续更新依据:子树的高度是否变化4 AVL树的旋转旋转的原则:1. 新节点插入较高左子树的左侧---左左:右单旋2. 新节点插入较高右子树的右侧---右右:左单旋3. 新节点插入较高…

Java基础之File

文章目录一、File的声明二、File的创建2.1 创建一个文件2.2 创建一个文件夹2.3 创建一个多级文件夹三、File的删除四、File的获取与判断4.1 获取一个文件夹孩子层所有文件和文件夹,并存入数组4.2 判断一个File对象是否为文件4.3 判断一个File对象是否为文件夹4.4 判…

Abp框架安全升级指南

本文将从GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》规定的安全计算环境中解读、摘要若干安全要求,结合Abp框架,对站点进行安全升级。 【身份鉴别】应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别…

实验手册 - 第2周Spark RDD

目录标题1 实验内容实验1实验2实验3实验4实验5实验62 实验总结2.1 Spark应用开发步骤2.2 字符串的split()方法列表解析式2.3 常用的Action操作2.4 常用的Transformation操作2.5 RDD间的Transformation操作1 实验内容 查看当前工作目录 import os os.getcwd()D:\\juniortwo\\s…

【JUC】Java内存模型之JMM

【JUC】Java内存模型之JMM 文章目录【JUC】Java内存模型之JMM1. 概念2. JMM三大特性2.1 可见性2.2 原子性2.3 有序性3. 多线程对变量的读写过程4. 先行发生原则——happens-before4.1 happens-before八条规则4.1.1 次序规则4.1.2 锁定规则4.1.3 volatile变量规则4.1.4 传递规则…

【Unity入门】13.脚本外置参数

【Unity入门】脚本外置参数 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)外置脚本参数 (1)外置自转脚本的速度参数 我们在RotateLogic的时候,为了实现自…