00 前言

本文将围绕模型迁移展开,先简述模型迁移的概念及进行迁移的缘由,随后着重介绍昇腾迁移分析工具在模型迁移中的运用,涵盖迁移分析、迁移训练等方面,详细展示了具体操作流程及示例,为使用昇腾迁移分析工具进行模型迁移提供全面的参考指导。

01 什么是模型迁移

将原本设计用于GPU或其他三方平台的深度学习模型训练代码,经过模型代码修改等适配操作,来适应NPU的架构和编程,让模型能在NPU上进行高性能运行。

02 为什么要做模型迁移

昇腾NPU是AI算力的后起之秀,但目前训练和在线推理脚本大多是基于GPU的。由于NPU与GPU的架构差异,基于GPU的训练和在线推理脚本不能直接在NPU上使用。在将模型从其他三方平台迁移到NPU时,由于硬件特性和性能特点差异、计算架构差异及深度学习框架差异,涉及到一系列底层到上层的适配操作。

03 如何做模型迁移

要将模型从其他三方平台迁移到NPU,昇腾分析迁移工具必不可少,它提供了PyTorch训练脚本一键式迁移至昇腾NPU的功能,开发者可做到少量代码修改或零代码完成迁移。该工具提供PyTorch Analyse功能,帮助用户分析PyTorch训练脚本的API、三方库API、亲和API分析以及动态shape的支持情况。同时提供了自动迁移和PyTorch GPU2Ascend工具两种迁移方式,将基于GPU的脚本迁移为基于NPU的脚本,这种自动化方法节省了人工手动进行脚本迁移的学习成本与工作量,大幅提升了迁移效率。

3.1 迁移分析

迁移分析流程示意

<p style="text-align: center">
迁移分析流程示意
</p>

如上迁移分析流程示意图所示,在选定模型之后、在进行模型迁移之前,需要进行模型迁移评估,分析算子满足度。这个过程中,PyTorch Analyse工具提供分析脚本,帮助用户在执行迁移操作前,分析基于GPU平台的PyTorch训练脚本中API、三方库套件、亲和API分析以及动态shape的支持情况,以便更好地进行后续迁移工作。

下面展示如何利用PyTorch Analyse工具在昇腾环境进行模型的迁移分析,并以googlenet模型为例,展示迁移分析后的主要结果文件。

首先,进入分析工具所在路径:

cd Ascend-cann-toolkit安装目录/ascend-toolkit/latest/tools/ms\_fmk\_transplt/

执行如下命令启动分析任务:

./pytorch\_analyse.sh -i 待分析脚本路径 -o 分析结果输出路径 -v 待分析脚本框架版本 \[-m 分析模式\]

其中“[]”表示可选参数,实际使用可不用添加。“-m/--mode”参数指定分析模式,默认为torch\_apis(API支持情况分析),除此之外还有third\_party(三方库套件分析)、affinity\_apis(亲和API分析)和dynamic\_shape(动态shape分析)模式可选。以默认的torch\_apis(API支持情况分析)为例,分析结果及每个文件对应的内容如下所示:

├── xxxx\_analysis // 分析结果输出目录
│ ├── cuda\_op\_list.csv //cuda API列表
│ ├── unknown\_api.csv //支持情况存疑的API列表,具体请参见PyTorch原生API
│ ├── unsupported\_api.csv //不支持的API列表
│ ├── api\_precision\_advice.csv //API精度调优的专家建议
│ ├── api\_performance\_advice.csv //API性能调优的专家建议
│ ├── pytorch\_analysis.txt // 分析过程日志

以googlenet模型为例的不支持的unsupported\_api.csv中API列表示例如下图:

不支持的API列表结果示意

<p style="text-align: center">
不支持的API列表结果示意
</p>
至此,便快速得到了迁移前的算子、API等支持度 ,若有不支持的算子则需要进行算子开发或联系昇腾工程师协助处理。

3.2 迁移训练
  • 迁移要点
    正式的迁移训练过程,实际是将PyTorch训练脚本从GPU平台迁移至昇腾NPU平台。而迁移方式又分为自动迁移、工具迁移和手工迁移,不论哪种迁移方式,核心迁移要点都是一样的:设备类型:cuda->npu,分布式backend:nccl->hccl,混合精度:若没有则添加,若有则无需改动。
  • 自动迁移
    由于涉及以上多种迁移要点,手工迁移往往不推荐,而自动迁移方式较简单,且修改内容最少,只需在训练脚本中导入库代码,底层做了什么无从得知,像是一个黑盒。下面是自动迁移的使用方法。

在训练入口.py文件的首行,插入以下引用内容。例如train.py中的首行插入以下引用内容:

import torch
import torch_npu
from torch_npu.contrib import transfer_to_npu
.....

而后即可参考训练配置及原始脚本提供的训练流程,在昇腾NPU平台直接运行修改后的模型脚本。

  • 工具迁移

工具迁移的方式则是笔者比较推荐使用的,如下工具迁移示意图所示,只需要运行PyTorch GPU2Ascend工具的脚本命令,自动将PyTorch训练脚本中的cuda接口更换为对应的昇腾AI处理器支持的接口,生成一套昇腾AI处理器上的训练脚本,同时生成迁移报告(脚本转换过程日志、不支持算子列表、脚本修改记录),训练时,直接运行迁移后的训练脚本。迁移过程记录详细,既实现了自动化的迁移,又提供了足够的过程信息,让迁移过程有迹可循,不再是黑盒。

工具迁移示意

<p style="text-align: center">
工具迁移示意
</p>

  • 基于昇腾迁移工具的模型训练迁移
    下面展示如何利用PyTorch GPU2Ascend工具在昇腾环境进行模型的迁移工作,并以yolox模型为例,展示工具迁移过程产生的主要文件。

首先,在环境中下载好yolox模型源码,进入昇腾迁移工具所在路径:

cd Ascend-cann-toolkit安装目录/ascend-toolkit/latest/tools/ms\_fmk\_transplt/

然后,以单卡为例启动工具迁移任务:

./pytorch\_gpu2npu.sh -i /home/train/ -o /home/out -v 2.1.0

其中-i为要进行迁移的原始脚本文件所在文件夹路径,-o为脚本迁移结果文件输出路径,-v为torch版本。

最后,参考训练配置及原始脚本提供的训练流程,在昇腾NPU平台直接运行修改后的模型脚本。还可以进入脚本迁移结果输出路径查看结果文件,如下图分别是以yolox模型为例的脚本修改记录、不支持算子列表、脚本转换过程日志:

脚本修改记录

<p style="text-align: center">
脚本修改记录
</p>

不支持算子列表

<p style="text-align: center">
不支持算子列表
</p>

脚本转换过程日志

<p style="text-align: center">
脚本转换过程日志
</p>

至此,我们便熟悉了从迁移分析到训练迁移的完整过程,更多详细的指导及参数的解释可以访问昇腾社区的参考资料MindStudio分析迁移工具

04 小结

本文主要介绍了模型迁移的相关内容,包括什么是模型迁移、为何要做模型迁移以及如何进行模型迁移。并结合昇腾迁移分析工具的使用,针对如何进行模型迁移进行了迁移分析和迁移训练两个过程的讲解。