diff --git "a/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227.md" "b/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227.md" index 945e19de1d02bdeef48968952b82620641a08bc0..06a959e3ca99dcf6a6df0317edf75abfb9a35649 100644 --- "a/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227.md" +++ "b/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227.md" @@ -1,48 +1,48 @@ # PyTorch在线推理指南 -- [使用场景](#使用场景.md) -- [基本使用流程](#基本使用流程.md) - - [前提条件](#前提条件.md) - - [在线推理流程](#在线推理流程.md) - - [环境变量配置](#环境变量配置.md) - - [样例参考](#样例参考.md) -- [专题](#专题.md) - - [混合精度](#混合精度.md) -- [安装7.3.0版本gcc](#安装7-3-0版本gcc.md) -

使用场景

+- [使用场景](#使用场景) +- [基本使用流程](#基本使用流程) + - [前提条件](#前提条件) + - [在线推理流程](#在线推理流程) + - [环境变量配置](#环境变量配置) + - [样例参考](#样例参考) +- [专题](#专题) + - [混合精度](#混合精度) +- [安装7.3.0版本gcc](#安装730版本gcc) +## 使用场景 在线推理是在AI框架内执行推理的场景,例如在PyTorch框架上,加载模型后,通过“model.eval\(\)“将模型切换为推理模式。 相比于离线推理场景,使用在线推理可以方便将原来基于PyTorch框架做推理的应用快速迁移到昇腾AI处理器,适用于数据中心推理场景。 -## 支持的芯片型号 +### 支持的芯片型号 昇腾910 AI处理器 昇腾710 AI处理器 -

基本使用流程

+## 基本使用流程 -- **[前提条件](#前提条件.md)** +- **[前提条件](#前提条件)** -- **[在线推理流程](#在线推理流程.md)** +- **[在线推理流程](#在线推理流程)** -- **[环境变量配置](#环境变量配置.md)** +- **[环境变量配置](#环境变量配置)** -- **[样例参考](#样例参考.md)** +- **[样例参考](#样例参考)** -

前提条件

+## 前提条件 已完成PyTorch框架及混合精度模块的安装,详情请参见《PyTorch安装指南》进行PyTorch相关运行环境搭建。 -

在线推理流程

+## 在线推理流程 在线推理流程如[图1](#fig13802941161818)所示。 **图 1** 在线推理流程图 ![](figures/在线推理流程图.png "在线推理流程图") -

环境变量配置

+## 环境变量配置 PyTorch在线推理进程启动所依赖的环境变量: @@ -133,9 +133,9 @@ export TASK_QUEUE_ENABLE=0 >![](public_sys-resources/icon-note.gif) **说明:** >更多日志信息,请参见《CANN 日志参考》。 -

样例参考

+## 样例参考 -## 样例代码 +### 样例代码 在进行推理应用时,应尽量保证应用在生命周期内不频繁初始化。推理模式通过模型model.eval\(\)进行设置,并且推理过程要在“with torch.no\_grad\(\):”代码分支下运行。 @@ -406,7 +406,7 @@ if __name__ == '__main__': main() ``` -## 样例执行 +### 样例执行 以ResNet50模型为例,执行在线推理样例。 @@ -420,7 +420,7 @@ if __name__ == '__main__': 3. 执行推理。 - 参考[环境变量配置](#环境变量配置.md)设置环境变量,并执行命令: + 参考[环境变量配置](#环境变量配置)设置环境变量,并执行命令: ``` python3 pytorch-resnet50-apex.py --data /data/imagenet \ @@ -433,14 +433,14 @@ if __name__ == '__main__': >上述为样例输入,用户可根据实际修改传入参数。 -

专题

+## 专题 -- **[混合精度](#混合精度.md)** +- **[混合精度](#混合精度)** -

混合精度

+### 混合精度 -## 概述 +#### 概述 基于NPU芯片的架构特性,模型运算会涉及到混合精度,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下好处: @@ -450,7 +450,7 @@ if __name__ == '__main__': 但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况,为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里采用混合精度模块Apex来达到以上效果。混合精度模块Apex是一个集优化性能、精度收敛于一身的综合优化库。 -## 特性支持 +#### 特性支持 混合精度模块功能和优化描述如[表1](#zh-cn_topic_0278765773_table10717173813332)所示。 @@ -489,7 +489,7 @@ if __name__ == '__main__': >![](public_sys-resources/icon-note.gif) **说明:** >当前版本的实现方式主要为python实现,不支持AscendCL或者CUDA优化。 -## 混合精度模型初始化 +#### 混合精度模型初始化 1. 使用apex混合精度模块需要首先从apex库中导入amp,代码如下: @@ -503,20 +503,20 @@ if __name__ == '__main__': model, optimizer = amp.initialize(model, optimizer) ``` - 也可参考[样例代码](#样例参考.md)中的“初始化混合精度模型”: + 也可参考[样例代码](#样例参考)中的“初始化混合精度模型”: ``` model, optimizer = amp.initialize(model, optimizer, opt_level="O2", loss_scale=1024, verbosity=1) ``` -## 混合精度推理 +#### 混合精度推理 按混合精度模型初始化后,正常执行模型正向计算即可。 -参考代码:可参考[样例代码](#样例参考.md)实现。 +参考代码:可参考[样例代码](#样例参考)实现。 -

安装7.3.0版本gcc

+## 安装7.3.0版本gcc 以下步骤请在root用户下执行。 diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227.md" "b/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227.md" index d27a2c35236e16a366f2a6af96246c1053100c28..dd5825ed5389ca7d7707f5a68f478b9bccd82774 100644 --- "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227.md" +++ "b/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227.md" @@ -1,37 +1,37 @@ # PyTorch算子开发指南 -- [简介](#简介.md) -- [算子开发流程](#算子开发流程.md) -- [算子开发准备](#算子开发准备.md) - - [环境准备](#环境准备.md) - - [算子速查](#算子速查.md) -- [算子适配开发](#算子适配开发.md) - - [前提条件](#前提条件.md) - - [获取PyTorch源码](#获取PyTorch源码.md) - - [注册算子开发](#注册算子开发.md) - - [算子适配插件开发](#算子适配插件开发.md) - - [编译和安装PyTorch框架](#编译和安装PyTorch框架.md) -- [算子功能验证](#算子功能验证.md) - - [概述](#概述.md) - - [实现过程](#实现过程.md) -- [FAQ](#FAQ.md) - - [Pillow==5.3.0安装失败](#Pillow-5-3-0安装失败.md) - - [pip3.7 install torchvision安装失败](#pip3-7-install-torchvision安装失败.md) - - [安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md) - - [如何查看测试的运行日志](#如何查看测试的运行日志.md) - - [为什么我实现的“自定义TBE算子”无法调用到?](#为什么我实现的-自定义TBE算子-无法调用到.md) - - [如何确定“TBE算子”是否被“PyTorch适配”正确调用](#如何确定-TBE算子-是否被-PyTorch适配-正确调用.md) - - [PyTorch编译失败,提示“error: ld returned 1 exit status”](#PyTorch编译失败-提示-error-ld-returned-1-exit-status.md) - - [PyTorch编译失败,提示“error: call of overload ....”](#PyTorch编译失败-提示-error-call-of-overload.md) -- [附录](#附录.md) - - [CMake安装方法](#CMake安装方法.md) - - [自定义算子导出方法](#自定义算子导出方法.md) -

简介

- -## 概述 +- [简介](#简介) +- [算子开发流程](#算子开发流程) +- [算子开发准备](#算子开发准备) + - [环境准备](#环境准备) + - [算子速查](#算子速查) +- [算子适配开发](#算子适配开发) + - [前提条件](#前提条件-1) + - [获取PyTorch源码](#获取pytorch源码) + - [注册算子开发](#注册算子开发) + - [算子适配插件开发](#算子适配插件开发) + - [编译和安装PyTorch框架](#编译和安装pytorch框架) +- [算子功能验证](#算子功能验证) + - [概述](#概述-2) + - [实现过程](#实现过程) +- [FAQ](#faq) + - [Pillow==5.3.0安装失败](#pillow530安装失败) + - [pip3.7 install torchvision安装失败](#pip37-install-torchvision安装失败) + - [安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装torch-whl-提示torch-150xxxx与torchvision所依赖的版本不匹配) + - [如何查看测试的运行日志](#如何查看测试的运行日志) + - [为什么我实现的“自定义TBE算子”无法调用到?](#为什么我实现的自定义tbe算子无法调用到) + - [如何确定“TBE算子”是否被“PyTorch适配”正确调用](#如何确定tbe算子是否被pytorch适配正确调用) + - [PyTorch编译失败,提示“error: ld returned 1 exit status”](#pytorch编译失败提示error-ld-returned-1-exit-status) + - [PyTorch编译失败,提示“error: call of overload ....”](#pytorch编译失败提示error-call-of-overload-) +- [附录](#附录) + - [CMake安装方法](#cmake安装方法) + - [自定义算子导出方法](#自定义算子导出方法) +## 简介 + +### 概述 为了实现PyTorch深度学习框架在昇腾AI处理器上运行,需要将框架算子用TBE自定义开发。 -

算子开发流程

+## 算子开发流程 Pytorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。 @@ -66,7 +66,7 @@ Pytorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。

准备算子开发及运行验证所依赖的开发环境与运行环境。

-

算子开发准备

+

算子开发准备

2

@@ -83,7 +83,7 @@ Pytorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。

获取昇腾社区PyTorch源码。

-

算子适配开发

+

算子适配开发

4

@@ -113,25 +113,25 @@ Pytorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。

在真实的硬件环境中验证算子功能。

-

算子功能验证

+

算子功能验证

-

算子开发准备

+## 算子开发准备 -- **[环境准备](#环境准备.md)** +- **[环境准备](#环境准备)** -- **[算子速查](#算子速查.md)** +- **[算子速查](#算子速查)** -

环境准备

+### 环境准备 -## 前提条件 +#### 前提条件 - 需完成CANN开发或运行环境的安装,具体操作请参考《CANN 软件安装指南》。 -- 需安装3.12.0及以上版本的CMake,安装方法请参考[CMake安装方法](#CMake安装方法.md)。 +- 需安装3.12.0及以上版本的CMake,安装方法请参考[CMake安装方法](#CMake安装方法)。 - 需确保已安装7.3.0以上版本的gcc,7.3.0版本gcc具体安装及使用方式请参见《CANN 软件安装指南》中的“安装7.3.0版本gcc”章节。 - 需确保环境中已安装git工具,以Ubuntu和CentOS系统为例,命令如下: - Ubuntu系统 @@ -148,7 +148,7 @@ Pytorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。 -## 安装PyTorch依赖环境 +#### 安装PyTorch依赖环境 如果使用非root用户安装Python及其依赖,用户需要在每句命令末尾加上**--user**,保证安装的正常进行。命令示例为:**pip3.7 install pyyaml --user** @@ -159,9 +159,9 @@ pip3.7 install Pillow==5.3.0 ``` >![](public_sys-resources/icon-note.gif) **说明:** ->若以上过程出错,请参考[FAQ](#FAQ.md)尝试解决问题。 +>若以上过程出错,请参考[FAQ](#FAQ)尝试解决问题。 -

算子速查

+### 算子速查 进行算子开发时,您可以查询当前昇腾AI处理器中支持的算子列表和当前PyTorch适配的算子列表。根据查询结果进行算子开发或PyTorch算子适配。 @@ -177,25 +177,25 @@ pip3.7 install Pillow==5.3.0 - 当前PyTorch适配的算子列表可以参见《PyTorch适配算子清单》。 -

算子适配开发

+## 算子适配开发 -- **[前提条件](#前提条件.md)** +- **[前提条件](#前提条件-1)** -- **[获取PyTorch源码](#获取PyTorch源码.md)** +- **[获取PyTorch源码](#获取pytorch源码)** -- **[注册算子开发](#注册算子开发.md)** +- **[注册算子开发](#注册算子开发)** -- **[算子适配插件开发](#算子适配插件开发.md)** +- **[算子适配插件开发](#算子适配插件开发)** -- **[编译和安装PyTorch框架](#编译和安装PyTorch框架.md)** +- **[编译和安装PyTorch框架](#编译和安装pytorch框架)** -

前提条件

+### 前提条件 -- 完成开发及运行环境准备及相关依赖的安装,详情请参见[环境准备](#环境准备.md)。 +- 完成开发及运行环境准备及相关依赖的安装,详情请参见[环境准备](#环境准备)。 - 完成相关的TBE算子开发及部署,详情请参见《CANN TBE自定义算子开发指南》。 -

获取PyTorch源码

+### 获取PyTorch源码 从gitee上获取适配昇腾AI处理器的PyTorch源代码,获取地址为: [https://gitee.com/ascend/pytorch-develop](https://gitee.com/ascend/pytorch-develop) 。用户可以通过执行下面git命令行下载源代码。 @@ -208,13 +208,13 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 >![](public_sys-resources/icon-note.gif) **说明:** >如无权限获取代码,请联系华为技术支持申请加入“Ascend”组织。 -

注册算子开发

+### 注册算子开发 -## 概述 +#### 概述 当前制定的NPU适配派发原则是NPU算子的派发不经过框架公共函数,直接派发成NPU适配的函数,即算子执行调用栈中只包含NPU适配的函数调用,不包含框架公共函数。PyTorch框架在编译时,会根据 native\_functions.yaml 的定义,按框架中定义的类型和设备分发原则,生成相应的新算子的中间层的调用说明。对于NPU,会生成在 build/aten/src/ATen/NPUType.cpp。 -## 注册算子开发方法 +#### 注册算子开发方法 1. 打开native\_functions.yaml文件。 @@ -258,7 +258,7 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 >该格式供参考,算子适配开发过程中的函数名需与NPU\_Adapt\_Fun\_Name保持一致。 -## 示例 +#### 示例 以torch.add\(\)算子为例介绍注册算子开发过程。 @@ -344,13 +344,13 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 -

算子适配插件开发

+### 算子适配插件开发 -## 简介 +#### 简介 用户通过开发算子适配插件,实现PyTorch原生算子的输入参数、输出参数和属性的格式转换,使转换后的格式与TBE算子的输入参数、输出参数和属性的格式相同。适配昇腾AI处理器的PyTorch源代码中提供了适配关联、类型转换和判别、处理动态shape等相关的方法供用户使用。 -## 适配插件实现 +#### 适配插件实现 1. 创建适配插件文件。 @@ -372,7 +372,7 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 实现算子适配主题函数,根据TBE算子原型构造得到对应的input、output、attr。 -## 示例 +#### 示例 以torch.add\(\)算子为例介绍算子适配开发过程。 @@ -529,9 +529,9 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 >![](public_sys-resources/icon-note.gif) **说明:** >AddKernelNpu.cpp的详细实现代码请参见pytorch/aten/src/ATen/native/npu/AddKernelNpu.cpp文档。 -

编译和安装PyTorch框架

+### 编译和安装PyTorch框架 -## 编译PyTorch框架 +#### 编译PyTorch框架 1. 进入PyTorch工作目录 :“pytorch“。 2. 给脚本文件赋权限: @@ -547,9 +547,9 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 4. 编译成功后,会在“**pytorch/dist**” 下生成 torch-\*.whl 包,例如:torch-1.5.0a0-cp37-cp37m-linux\_x86.whl。 -## 安装PyTorch框架 +#### 安装PyTorch框架 -1. 将[编译和安装PyTorch框架](#编译和安装PyTorch框架.md)生成的torch-\*.whl包上传到服务器任一路径。 +1. 将[编译和安装PyTorch框架](#编译和安装PyTorch框架)生成的torch-\*.whl包上传到服务器任一路径。 2. 进入torch-\*.whl 所在的目录,使用pip命令完成torch安装。 当前登录用户为root用户时,执行: @@ -569,34 +569,34 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 >- 修改代码之后,需要重新执行“编译”和“安装”PyTorch过程。 >- 安装过程中,可能会出现错误提示"torchvision 0.6.0" 版本不匹配,此问题无影响,忽略即可。 -

算子功能验证

+## 算子功能验证 -- **[概述](#概述.md)** +- **[概述](#概述-2)** -- **[实现过程](#实现过程.md)** +- **[实现过程](#实现过程)** -

概述

+### 概述 -## 简介 +#### 简介 完成算子适配开发后,可通过运行适配昇腾处理器的PyTorch算子,验证算子运行结果是否正确。 算子功能验证会覆盖算子开发的所有交付件,包含实现文件,算子原型定义、算子信息库以及算子适配插件。本节仅对验证的方法做介绍。 -## 测试用例及测试工具 +#### 测试用例及测试工具 进行自定义算子功能验证,通过PyTorch前端构造自定义算子的函数并运行验证。 在https://gitee.com/ascend/pytorch-develop中 "pytorch/test/test\_npu/test\_network\_ops"目录下提供了测试用例及测试工具,供用户参考。 -

实现过程

+### 实现过程 -## 简介 +#### 简介 本章通过具体例子,完成PyTorch算子的功能测试步骤。 -## 操作步骤 +#### 操作步骤 1. 设置环境变量。 @@ -673,36 +673,36 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 ``` -

FAQ

+## FAQ -- **[Pillow==5.3.0安装失败](#Pillow-5-3-0安装失败.md)** +- **[Pillow==5.3.0安装失败](#pillow530安装失败)** -- **[pip3.7 install torchvision安装失败](#pip3-7-install-torchvision安装失败.md)** +- **[pip3.7 install torchvision安装失败](#pip37-install-torchvision安装失败)** -- **[安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md)** +- **[安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装torch-whl-提示torch-150xxxx与torchvision所依赖的版本不匹配)** -- **[如何查看测试的运行日志](#如何查看测试的运行日志.md)** +- **[如何查看测试的运行日志](#如何查看测试的运行日志)** -- **[为什么我实现的“自定义TBE算子”无法调用到?](#为什么我实现的-自定义TBE算子-无法调用到.md)** +- **[为什么我实现的“自定义TBE算子”无法调用到?](#为什么我实现的自定义TBE算子无法调用到)** -- **[如何确定“TBE算子”是否被“PyTorch适配”正确调用](#如何确定-TBE算子-是否被-PyTorch适配-正确调用.md)** +- **[如何确定“TBE算子”是否被“PyTorch适配”正确调用](#如何确定tbe算子是否被pytorch适配正确调用)** -- **[PyTorch编译失败,提示“error: ld returned 1 exit status”](#PyTorch编译失败-提示-error-ld-returned-1-exit-status.md)** +- **[PyTorch编译失败,提示“error: ld returned 1 exit status”](#pytorch编译失败提示error-ld-returned-1-exit-status)** -- **[PyTorch编译失败,提示“error: call of overload ....”](#PyTorch编译失败-提示-error-call-of-overload.md)** +- **[PyTorch编译失败,提示“error: call of overload ....”](#pytorch编译失败提示error-call-of-overload-)** -

Pillow==5.3.0安装失败

+### Pillow==5.3.0安装失败 -## 现象描述 +#### 现象描述 pillow==5.3.0安装失败。 -## 可能原因 +#### 可能原因 缺少必要的依赖,如:libjpeg、python-devel、 zlib-devel 、libjpeg-turbo-devel等等。 -## 处理方法 +#### 处理方法 执行以下命令安装所需依赖。 @@ -710,17 +710,17 @@ pillow==5.3.0安装失败。 apt-get install libjpeg python-devel zlib-devel libjpeg-turbo-devel ``` -

pip3.7 install torchvision安装失败

+### pip3.7 install torchvision安装失败 -## 现象描述 +#### 现象描述 pip3.7 install torchvision安装失败。 -## 可能原因 +#### 可能原因 torch与torchvision版本不匹配。 -## 处理方法 +#### 处理方法 执行以下命令。 @@ -728,9 +728,9 @@ torch与torchvision版本不匹配。 pip3.7 install torchvision --no-deps ``` -

安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配

+### 安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配 -## 现象描述 +#### 现象描述 安装“torch-\*.whl”时,提示"ERROR:torchvision 0.6.0 has requirement torch==1.5.0, but you'll have torch 1.5.0a0+1977093 which is incompatible"。 @@ -738,15 +738,15 @@ pip3.7 install torchvision --no-deps 但实际安装成功 -## 可能原因 +#### 可能原因 安装torch时,会自动触发torchvision进行依赖版本检查,环境中安装的torchvision版本为0.6.0,检查时发现我们安装的torch-\*.whl的版本号与要求的1.5.0不一致,所以提示了一条错误 。 -## 处理方法 +#### 处理方法 对实际结果无影响,无需处理。 -

如何查看测试的运行日志

+### 如何查看测试的运行日志 测试运行过程提示错误,但直接可参考的信息太少,如何才能看到更详细的运行日志? @@ -767,21 +767,21 @@ pip3.7 install torchvision --no-deps ``` -

为什么我实现的“自定义TBE算子”无法调用到?

+### 为什么我实现的“自定义TBE算子”无法调用到? -## 现象描述 +#### 现象描述 完成“自定义TBE算子”开发,和“PyTorch”适配开发,但执行测试用例,发现无法调用到新开发的算子。 -## 可能原因 +#### 可能原因 - 环境变量没有正确设置。 - yaml存在错误,导致没有正确分发。 - 自定义TBE算子实现存在问题,导致无法调用到。 -## 处理方法 +#### 处理方法 -1. 参考“[算子功能验证](#算子功能验证.md)”章节,完成运行环境设置,特别注意: +1. 参考“[算子功能验证](#算子功能验证)”章节,完成运行环境设置,特别注意: ``` . /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh @@ -821,7 +821,7 @@ pip3.7 install torchvision --no-deps -

如何确定“TBE算子”是否被“PyTorch适配”正确调用

+### 如何确定“TBE算子”是否被“PyTorch适配”正确调用 不管是“custom”算子,还是“built-in”算子,在安装后,都是以\*.py源码的方式存放在安装目录下,所以我们可以通过编辑源码,在API入口增加日志的方式,打印输出入参,确定输入的参数是否正确。 @@ -871,15 +871,15 @@ pip3.7 install torchvision --no-deps ![](figures/zh-cn_image_0000001144082072.png) -

PyTorch编译失败,提示“error: ld returned 1 exit status”

+### PyTorch编译失败,提示“error: ld returned 1 exit status” -## 现象描述 +#### 现象描述 PyTorch编译失败,提示“ error: ld returned 1 exit status”。 ![](figures/zh-cn_image_0000001190201973.png) -## 可能原因 +#### 可能原因 通过日志分析,大概原因为XxxxKernelNpu.cpp中实现的适配函数,与PyTorch框架算子要求的分发实现接口参数不匹配。在上面的例子中,是“binary\_cross\_entropy\_npu”,打开对应的XxxxKernelNpu.cpp文件,找到相应的适配函数。 @@ -887,13 +887,13 @@ PyTorch编译失败,提示“ error: ld returned 1 exit status”。 可以看出实现中,最后一个参数是"int" ,与要求的“long”不匹配。 -## 处理方法 +#### 处理方法 修改XxxxKernelNpu.cpp中实现的适配函数,在上面的例子中,修改“binary\_cross\_entropy\_npu”方法最后一个参数类型为“int64\_t”\(cpp中“long”的类型使用"int64\_t"\)。 -

PyTorch编译失败,提示“error: call of overload ....”

+### PyTorch编译失败,提示“error: call of overload ....” -## 现象描述 +#### 现象描述 PyTorch编译失败,提示“error: call of overload ....”。 @@ -901,7 +901,7 @@ PyTorch编译失败,提示“error: call of overload ....”。 ![](figures/zh-cn_image_0000001190201935.png) -## 可能原因 +#### 可能原因 通过日志分析,错误出在XxxxKernelNpu.cpp中30行位置,NPUAttrDesc的参数不合法。在上面的例子中,是“binary\_cross\_entropy\_attr”,打开对应的XxxxKernelNpu.cpp文件,找到相应的适配函数。 @@ -909,20 +909,20 @@ PyTorch编译失败,提示“error: call of overload ....”。 可以看出实现中,NPUAttrDesc的入参,第二个参数是"int" ,与NPUAttrDesc定义不匹配。 -## 处理方法 +#### 处理方法 1、将binary\_cross\_entropy\_attr\(\)中错误的行代码替换为上面的注释中的代码 2、binary\_cross\_entropy\_attr\(\)入参类型修改为 int64\_t。 -

附录

+## 附录 -- **[CMake安装方法](#CMake安装方法.md)** +- **[CMake安装方法](#cmake安装方法)** -- **[自定义算子导出方法](#自定义算子导出方法.md)** +- **[自定义算子导出方法](#自定义算子导出方法)** -

CMake安装方法

+### CMake安装方法 以CMake版本升级为3.12.1为例说明。 @@ -961,17 +961,17 @@ PyTorch编译失败,提示“error: call of overload ....”。 显示“cmake version 3.12.1”则表示安装成功。 -

自定义算子导出方法

+### 自定义算子导出方法 -## 简介 +#### 简介 PyTorch训练模型中包含自定义算子,将自定义算子导出成onnx单算子模型,方便转移到其他AI框架中使用。自定义算子导出有三种形式,适配NPU的TBE算子导出、C++算子导出、纯Python算子导出。 -## 前提条件 +#### 前提条件 安装PyTorch框架。 -## TBE算子导出 +#### TBE算子导出 TBE算子导出有两种方式。 @@ -1126,7 +1126,7 @@ TBE算子导出有两种方式。 >![](public_sys-resources/icon-note.gif) **说明:** >详细实现代码请参见[test\_custom\_ops\_npu\_demo.py](https://gitee.com/ascend/pytorch/blob/master/test/test_npu/test_onnx/torch.onnx/custom_ops_demo/test_custom_ops_npu_demo.py),如无权限获取代码,请联系华为技术支持申请加入“Ascend”组织。 -## C++算子导出 +#### C++算子导出 1. 自定义算子 @@ -1192,7 +1192,7 @@ TBE算子导出有两种方式。 >![](public_sys-resources/icon-note.gif) **说明:** >详细实现代码请参见[test\_custom\_ops\_demo.py](https://gitee.com/ascend/pytorch/blob/master/test/test_npu/test_onnx/torch.onnx/custom_ops_demo/test_custom_ops_demo.py),如无权限获取代码,请联系华为技术支持申请加入“Ascend”组织。 -## 纯Python算子导出 +#### 纯Python算子导出 1. 自定义算子 diff --git "a/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227.md" index b6b81b80e9786c3b99052e2e6404510efff49285..c3dba1bcc7f1117758882cde1f34685367467416 100644 --- "a/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -1,102 +1,102 @@ # PyTorch网络模型移植&训练指南 -- [概述](#概述.md) -- [约束与限制](#约束与限制.md) -- [迁移流程](#迁移流程.md) -- [模型移植评估](#模型移植评估.md) -- [环境准备](#环境准备.md) - - [准备运行环境](#准备运行环境.md) - - [配置环境变量](#配置环境变量.md) -- [模型迁移](#模型迁移.md) - - [工具迁移](#工具迁移.md) - - [功能介绍](#功能介绍.md) - - [操作指南](#操作指南.md) - - [结果解析](#结果解析.md) - - [手工迁移](#手工迁移.md) - - [单P训练模型迁移](#单P训练模型迁移.md) - - [多P训练模型迁移](#多P训练模型迁移.md) - - [PyTorch接口替换](#PyTorch接口替换.md) - - [混合精度](#混合精度.md) - - [性能优化](#性能优化.md) - - [概述](#概述-0.md) - - [修改CPU性能模式(X86服务器)](#修改CPU性能模式(X86服务器).md) - - [修改CPU性能模式(ARM服务器)](#修改CPU性能模式(ARM服务器).md) - - [安装高性能pillow库(X86服务器)](#安装高性能pillow库(X86服务器).md) - - [(可选)安装指定版本OpenCV库](#(可选)安装指定版本OpenCV库.md) -- [模型训练](#模型训练.md) -- [性能调优和分析](#性能调优和分析.md) - - [前提条件](#前提条件.md) - - [调测过程](#调测过程.md) - - [总体思路](#总体思路.md) - - [采集训练过程相关数据](#采集训练过程相关数据.md) - - [性能优化](#性能优化-1.md) - - [亲和库](#亲和库.md) - - [来源介绍](#来源介绍.md) - - [功能介绍](#功能介绍-2.md) -- [精度调测](#精度调测.md) - - [前提条件](#前提条件-3.md) - - [调测过程](#调测过程-4.md) - - [总体思路](#总体思路-5.md) - - [精度调优方法](#精度调优方法.md) - - [单算子溢出检测](#单算子溢出检测.md) - - [整网调测](#整网调测.md) -- [模型保存与转换](#模型保存与转换.md) - - [简介](#简介.md) - - [模型保存](#模型保存.md) - - [导出ONNX模型](#导出ONNX模型.md) -- [样例说明](#样例说明.md) - - [ResNet50模型迁移示例](#ResNet50模型迁移示例.md) - - [样例获取](#样例获取.md) - - [训练脚本迁移](#训练脚本迁移.md) - - [单P训练修改](#单P训练修改.md) - - [分布式训练修改](#分布式训练修改.md) - - [脚本执行](#脚本执行.md) - - [ShuffleNet模型调优示例](#ShuffleNet模型调优示例.md) - - [样例获取](#样例获取-6.md) - - [模型评估](#模型评估.md) - - [网络迁移](#网络迁移.md) - - [网络调测](#网络调测.md) -- [参考信息](#参考信息.md) - - [单算子样例编写说明](#单算子样例编写说明.md) - - [单算子dump方法](#单算子dump方法.md) - - [常用环境变量说明](#常用环境变量说明.md) - - [dump op方法](#dump-op方法.md) - - [安装7.3.0版本gcc](#安装7-3-0版本gcc.md) - - [编译安装hdf5](#编译安装hdf5.md) -- [FAQ](#FAQ.md) - - [软件安装常见问题](#软件安装常见问题.md) - - [pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败.md) - - [模型和算子运行常见问题](#模型和算子运行常见问题.md) - - [在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”](#在模型运行或者算子运行时遇到报错-RuntimeError-ExchangeDevice.md) - - [在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”](#在模型运行或者算子运行时遇到报错-Error-in-atexit-_run_exitfuncs.md) - - [在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”](#在模型运行时遇到报错-terminate-called-after-throwing-an-instance-of-c10-Error-what()-HelpACLExecute.md) - - [在模型运行时遇到报错“ImportError: libhccl.so.”](#在模型运行时遇到报错-ImportError-libhccl-so.md) - - [在模型运行时遇到报错“RuntimeError: Initialize.”](#在模型运行时遇到报错-RuntimeError-Initialize.md) - - [在模型运行时遇到报错“TVM/te/cce error.”](#在模型运行时遇到报错-TVM-te-cce-error.md) - - [在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed.md) - - [在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed-7.md) - - [在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭(export-TASK_QUEUE_ENABLE-0)后仍然遇到报错-HelpACLExecute.md) - - [在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”](#在模型运行时遇到报错-55056-GetInputConstDataOut-ErrorNo--1(failed).md) - - [模型调测常见问题](#模型调测常见问题.md) - - [在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”](#在模型调测时遇到报错-RuntimeError-malloc-pytorch-c10-npu-NPUCachingAllocator-cpp-293-NPU-error-error-code-is-5.md) - - [在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”](#在模型调测时遇到报错-RuntimeError-Could-not-run-aten-trunc-out-with-arguments-from-the-NPUTensorId-backend.md) - - [在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错](#在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错.md) - - [在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”](#在调用torch时遇到报错-ModuleNotFoundError-No-module-named-torch-_C.md) - - [其他操作相关问题](#其他操作相关问题.md) - - [cuda流同步操作报错](#cuda流同步操作报错.md) - - [aicpu\_kernels/libpt\_kernels.so不存在](#aicpu_kernels-libpt_kernels-so不存在.md) - - [使用npu-smi info查看显存时发现python进程残留](#使用npu-smi-info查看显存时发现python进程残留.md) - - [动态shape报错“match op inputs failed”](#动态shape报错-match-op-inputs-failed.md) - - [Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported](#Op-type-SigmoidCrossEntropyWithLogitsV2-of-ops-kernel-AIcoreEngine-is-unsupported.md) - - [Hook失败](#Hook失败.md) - - [加载权重时遇到报错“load state\_dict error.”](#加载权重时遇到报错-load-state_dict-error.md) - - [模型分布式训练常见问题](#模型分布式训练常见问题.md) - - [在进行模型分布式训练时遇到报错“host not found.”](#在进行模型分布式训练时遇到报错-host-not-found.md) - - [在进行模型分布式训练时遇到报错“RuntimeError:connect\(\) timed out.”](#在进行模型分布式训练时遇到报错-RuntimeError-connect()-timed-out.md) -

概述

+- [概述](#概述md) +- [约束与限制](#约束与限制md) +- [迁移流程](#迁移流程md) +- [模型移植评估](#模型移植评估md) +- [环境准备](#环境准备md) + - [准备运行环境](#准备运行环境md) + - [配置环境变量](#配置环境变量md) +- [模型迁移](#模型迁移md) + - [工具迁移](#工具迁移md) + - [功能介绍](#功能介绍md) + - [操作指南](#操作指南md) + - [结果解析](#结果解析md) + - [手工迁移](#手工迁移md) + - [单P训练模型迁移](#单P训练模型迁移md) + - [多P训练模型迁移](#多P训练模型迁移md) + - [PyTorch接口替换](#PyTorch接口替换md) + - [混合精度](#混合精度md) + - [性能优化](#性能优化md) + - [概述](#概述-0md) + - [修改CPU性能模式(X86服务器)](#修改CPU性能模式(X86服务器)md) + - [修改CPU性能模式(ARM服务器)](#修改CPU性能模式(ARM服务器)md) + - [安装高性能pillow库(X86服务器)](#安装高性能pillow库(X86服务器)md) + - [(可选)安装指定版本OpenCV库](#(可选)安装指定版本OpenCV库md) +- [模型训练](#模型训练md) +- [性能调优和分析](#性能调优和分析md) + - [前提条件](#前提条件md) + - [调测过程](#调测过程md) + - [总体思路](#总体思路md) + - [采集训练过程相关数据](#采集训练过程相关数据md) + - [性能优化](#性能优化-1md) + - [亲和库](#亲和库md) + - [来源介绍](#来源介绍md) + - [功能介绍](#功能介绍-2md) +- [精度调测](#精度调测md) + - [前提条件](#前提条件-3md) + - [调测过程](#调测过程-4md) + - [总体思路](#总体思路-5md) + - [精度调优方法](#精度调优方法md) + - [单算子溢出检测](#单算子溢出检测md) + - [整网调测](#整网调测md) +- [模型保存与转换](#模型保存与转换md) + - [简介](#简介md) + - [模型保存](#模型保存md) + - [导出ONNX模型](#导出ONNX模型md) +- [样例说明](#样例说明md) + - [ResNet50模型迁移示例](#ResNet50模型迁移示例md) + - [样例获取](#样例获取md) + - [训练脚本迁移](#训练脚本迁移md) + - [单P训练修改](#单P训练修改md) + - [分布式训练修改](#分布式训练修改md) + - [脚本执行](#脚本执行md) + - [ShuffleNet模型调优示例](#ShuffleNet模型调优示例md) + - [样例获取](#样例获取-6md) + - [模型评估](#模型评估md) + - [网络迁移](#网络迁移md) + - [网络调测](#网络调测md) +- [参考信息](#参考信息md) + - [单算子样例编写说明](#单算子样例编写说明md) + - [单算子dump方法](#单算子dump方法md) + - [常用环境变量说明](#常用环境变量说明md) + - [dump op方法](#dump-op方法md) + - [安装7.3.0版本gcc](#安装7-3-0版本gccmd) + - [编译安装hdf5](#编译安装hdf5md) +- [FAQ](#FAQmd) + - [软件安装常见问题](#软件安装常见问题md) + - [pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败md) + - [模型和算子运行常见问题](#模型和算子运行常见问题md) + - [在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”](#在模型运行或者算子运行时遇到报错-RuntimeError-ExchangeDevicemd) + - [在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”](#在模型运行或者算子运行时遇到报错-Error-in-atexit-_run_exitfuncsmd) + - [在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”](#在模型运行时遇到报错-terminate-called-after-throwing-an-instance-of-c10-Error-what()-HelpACLExecutemd) + - [在模型运行时遇到报错“ImportError: libhccl.so.”](#在模型运行时遇到报错-ImportError-libhccl-somd) + - [在模型运行时遇到报错“RuntimeError: Initialize.”](#在模型运行时遇到报错-RuntimeError-Initializemd) + - [在模型运行时遇到报错“TVM/te/cce error.”](#在模型运行时遇到报错-TVM-te-cce-errormd) + - [在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failedmd) + - [在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed-7md) + - [在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭(export-TASK_QUEUE_ENABLE-0)后仍然遇到报错-HelpACLExecutemd) + - [在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”](#在模型运行时遇到报错-55056-GetInputConstDataOut-ErrorNo--1(failed)md) + - [模型调测常见问题](#模型调测常见问题md) + - [在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”](#在模型调测时遇到报错-RuntimeError-malloc-pytorch-c10-npu-NPUCachingAllocator-cpp-293-NPU-error-error-code-is-5md) + - [在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”](#在模型调测时遇到报错-RuntimeError-Could-not-run-aten-trunc-out-with-arguments-from-the-NPUTensorId-backendmd) + - [在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错](#在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错md) + - [在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”](#在调用torch时遇到报错-ModuleNotFoundError-No-module-named-torch-_Cmd) + - [其他操作相关问题](#其他操作相关问题md) + - [cuda流同步操作报错](#cuda流同步操作报错md) + - [aicpu\_kernels/libpt\_kernels.so不存在](#aicpu_kernels-libpt_kernels-so不存在md) + - [使用npu-smi info查看显存时发现python进程残留](#使用npu-smi-info查看显存时发现python进程残留md) + - [动态shape报错“match op inputs failed”](#动态shape报错-match-op-inputs-failedmd) + - [Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported](#Op-type-SigmoidCrossEntropyWithLogitsV2-of-ops-kernel-AIcoreEngine-is-unsupportedmd) + - [Hook失败](#Hook失败md) + - [加载权重时遇到报错“load state\_dict error.”](#加载权重时遇到报错-load-state_dict-errormd) + - [模型分布式训练常见问题](#模型分布式训练常见问题md) + - [在进行模型分布式训练时遇到报错“host not found.”](#在进行模型分布式训练时遇到报错-host-not-foundmd) + - [在进行模型分布式训练时遇到报错“RuntimeError:connect\(\) timed out.”](#在进行模型分布式训练时遇到报错-RuntimeError-connect()-timed-outmd) +

概述

当前阶段针对PyTorch框架实现的对接适配昇腾AI处理器的方案为在线对接方案。 -## 方案特性及优点 +### 方案特性及优点 昇腾AI处理器的加速实现方式是以各种算子为粒度进行调用(OP-based),即通过AscendCL调用一个或几个D亲和算子组合的形式,代替原有GPU的实现方式。其逻辑模型如[图1](#fig2267112413239)所示。 @@ -113,7 +113,7 @@ 4. 扩展性好。在打通流程的通路之上,对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用。 5. 与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,只需在Python侧和Device相关操作中,指定device为昇腾AI处理器,即可完成用昇腾AI处理器在PyTorch对网络的开发、训练以及调试,用户无需进一步关注昇腾AI处理器具体的底层细节。这样可以确保用户的最小化修改,迁移成本较低。 -

约束与限制

+

约束与限制

- infershape阶段算子不支持unknowshape的推导。 - cube计算的算子只支持float16。 @@ -127,7 +127,7 @@ - 只支持int8,int32,float16和float32数据类型。 -

迁移流程

+

迁移流程

模型迁移主要指将开源社区中实现过的模型迁移到昇腾AI处理器上,主要流程如[图1](#fig759451810422)所示。 @@ -145,12 +145,12 @@

模型选取

-

详情请参见模型选取

+

详情请参见模型选取

模型移植评估

-

详情请参见模型移植评估

+

详情请参见模型移植评估

算子开发

@@ -160,17 +160,17 @@

环境准备

-

详情请参见环境准备

+

详情请参见环境准备

模型迁移

-

详情请参见模型迁移

+

详情请参见模型迁移

模型训练

-

详情请参见模型训练

+

详情请参见模型训练

错误分析

@@ -180,17 +180,17 @@

性能调优和分析

-

详情请参见性能调优和分析

+

详情请参见性能调优和分析

精度调测

-

详情请参见精度调测

+

详情请参见精度调测

模型保存与转换

-

详情请参见模型保存与转换《CANN 开发辅助工具指南》中“ATC工具使用指南”章节。

+

详情请参见模型保存与转换《CANN 开发辅助工具指南》中“ATC工具使用指南”章节。

应用软件开发

@@ -200,33 +200,33 @@

FAQ

-

主要涉及环境准备、模型迁移、模型调测和其他常见问题的解决方法。详情请参见FAQ

+

主要涉及环境准备、模型迁移、模型调测和其他常见问题的解决方法。详情请参见FAQ

-

模型移植评估

+

模型移植评估

1. 在选取模型时,尽可能选取权威Pytorch模型实现仓作为标杆,包括但不限于Pytorch\([example](https://github.com/pytorch/examples/tree/master/imagenet)/[vision](https://github.com/pytorch/vision)等\)、facebookresearch\([Detectron](https://github.com/facebookresearch/Detectron)/[detectron2](https://github.com/facebookresearch/detectron2)等\)和open-mmlab\([mmdetection](https://github.com/open-mmlab/mmdetection)/[mmpose](https://github.com/open-mmlab/mmpose)等\)。 -2. 查看算子适配情况。将原始模型及训练脚本迁移到昇腾AI处理器上之前,可以将原始模型及训练脚本在CPU上进行训练,使用dump op方法获取算子信息,与《PyTorch适配算子清单》算子进行比较,查看是否支持。dump op方法参见[dump op方法](#dump-op方法.md),当有不支持算子时参见《PyTorch算子开发指南》进行算子开发。 +2. 查看算子适配情况。将原始模型及训练脚本迁移到昇腾AI处理器上之前,可以将原始模型及训练脚本在CPU上进行训练,使用dump op方法获取算子信息,与《PyTorch适配算子清单》算子进行比较,查看是否支持。dump op方法参见[dump op方法](#dump-op方法md),当有不支持算子时参见《PyTorch算子开发指南》进行算子开发。 >![](public_sys-resources/icon-note.gif) **说明:** >查看算子适配情况也可以先将模型及训练脚本迁移到昇腾AI处理器(迁移方法参见下文)进行训练来查看报错信息。一般会提示不能在昇腾AI处理器的backend下运行某个算子(第一个不支持的算子)。 -

环境准备

+

环境准备

-- **[准备运行环境](#准备运行环境.md)** +- **[准备运行环境](#准备运行环境md)** -- **[配置环境变量](#配置环境变量.md)** +- **[配置环境变量](#配置环境变量md)** -

准备运行环境

+

准备运行环境

请参见《PyTorch安装指南》进行PyTorch相关运行环境搭建。 -

配置环境变量

+

配置环境变量

安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch。建议构建启动脚本,例如构建set\_env.sh脚本,使用source set\_env.sh配置当前窗口的环境变量。set\_env.sh脚本内容如下(以root用户安装,安装路径为默认路径,python版本为3.7.5为例,用户可根据软件包实际安装路径修改配置项。)。 @@ -295,7 +295,7 @@ export HCCL_IF_IP="1.1.1.1" # “1.1.1.1”为示例使用的host网卡IP,请

LD_LIBRARY_PATH

动态库的查找路径,参考上述举例配置。

-

若训练所在系统环境需要升级gcc(例如CentOS、Debian和BClinux系统),则“LD_LIBRARY_PATH”配置项处动态库查找路径需要添加“${install_path}/lib64”,其中“{install_path}”为gcc升级安装路径。请参见5

+

若训练所在系统环境需要升级gcc(例如CentOS、Debian和BClinux系统),则“LD_LIBRARY_PATH”配置项处动态库查找路径需要添加“${install_path}/lib64”,其中“{install_path}”为gcc升级安装路径。请参见5

PYTHONPATH

@@ -350,31 +350,31 @@ export HCCL_IF_IP="1.1.1.1" # “1.1.1.1”为示例使用的host网卡IP,请 -

模型迁移

+

模型迁移

-- **[工具迁移](#工具迁移.md)** +- **[工具迁移](#工具迁移md)** -- **[手工迁移](#手工迁移.md)** +- **[手工迁移](#手工迁移md)** -- **[混合精度](#混合精度.md)** +- **[混合精度](#混合精度md)** -- **[性能优化](#性能优化.md)** +- **[性能优化](#性能优化md)** -

工具迁移

+

工具迁移

Ascend平台提供了脚本转换工具使用户能通过命令行方式将训练脚本迁移到昇腾AI处理器上进行训练,命令行方式工具详细使用说明参见下文。除命令行方式外,用户也可通过MindStudio中集成的PyTorch GPU2Ascend功能进行迁移,详情请参见《MindStudio 用户指南》。 -- **[功能介绍](#功能介绍.md)** +- **[功能介绍](#功能介绍md)** -- **[操作指南](#操作指南.md)** +- **[操作指南](#操作指南md)** -- **[结果解析](#结果解析.md)** +- **[结果解析](#结果解析md)** -

功能介绍

+

功能介绍

-## 简介 +##### 简介 昇腾NPU是AI算力的后起之秀,但目前训练和在线推理脚本大多是基于GPU的。由于NPU与GPU的架构差异,基于GPU的训练和在线推理脚本不能直接在NPU上使用,脚本转换工具提供了将基于GPU的脚本转换为基于NPU的脚本的自动化方法,节省了人工手动进行脚本迁移的学习成本与工作量,大幅提升了迁移效率。 @@ -671,17 +671,17 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 -## 系统要求 +##### 系统要求 脚本转换工具支持Ubuntu 18.04、CentOS 7.6或EulerOS 2.8。 -## 环境准备 +##### 环境准备 详情请参考《CANN 软件安装指南》安装开发环境。 -

操作指南

+

操作指南

-## 参数说明 +##### 参数说明 **表 1** 参数说明 @@ -754,7 +754,7 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 -## 自定义规则文件 +##### 自定义规则文件 自定义转换规则样例如下: @@ -848,7 +848,7 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 -## 执行转换 +##### 执行转换 1. 进入脚本转换工具所在路径。 @@ -867,7 +867,7 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 3. 完成脚本转换。 -

结果解析

+

结果解析

脚本转换完成后,进入脚本转换结果输出路径查看结果文件,以GPU单卡脚本转换为NPU多卡脚本为例。 @@ -880,16 +880,16 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 │ ├── run_distributed_npu.sh // 多卡启动shell脚本。 ``` -

手工迁移

+

手工迁移

-- **[单P训练模型迁移](#单P训练模型迁移.md)** +- **[单P训练模型迁移](#单P训练模型迁移md)** -- **[多P训练模型迁移](#多P训练模型迁移.md)** +- **[多P训练模型迁移](#多P训练模型迁移md)** -- **[PyTorch接口替换](#PyTorch接口替换.md)** +- **[PyTorch接口替换](#PyTorch接口替换md)** -

单P训练模型迁移

+

单P训练模型迁移

当前在线对接方案优点在于保证在昇腾AI处理器上训练与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,**只需在Python侧和Device相关操作中,指定device为昇腾AI处理器**,即可完成用昇腾AI处理器在PyTorch对网络的开发、训练以及调试。针对单P模型训练,主要迁移改动如下。 @@ -919,9 +919,9 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 target = target.to(CALCULATE_DEVICE) ``` -更多迁移细节请参见[单P训练修改](#单P训练修改.md)。 +更多迁移细节请参见[单P训练修改](#单P训练修改md)。 -

多P训练模型迁移

+

多P训练模型迁移

多P训练模型迁移除了需在**Python侧和Device相关操作中,指定device为昇腾AI处理器**外,依然通过PyTorch的DistributedDataParallel方式来进行分布式训练,即在模型初始化阶段执行init\_process\_group,再将模型初始化为DistributedDataParallel模型。但须注意的是在初始化init\_process\_group时需要将**backend**配置为**hccl**并屏蔽掉初始化方式。 @@ -945,9 +945,9 @@ def main(): lr_scheduler) ``` -更多迁移细节请参见[分布式训练修改](#分布式训练修改.md)。 +更多迁移细节请参见[分布式训练修改](#分布式训练修改md)。 -

PyTorch接口替换

+

PyTorch接口替换

1. 为了使昇腾AI处理器使用PyTorch框架的能力,需要对原生的PyTorch框架进行一定Device层面的适配,对外呈现是需要将跟cpu和cuda相关的接口进行切换;在进行网络迁移时,需要将某些设备相关的接口转换成跟昇腾AI处理器相关的接口,当前适配的设备相关接口请参见[表1](#table1922064517344): @@ -1146,9 +1146,9 @@ def main(): 更多接口请参见《PyTorch API支持清单》。 -

混合精度

+

混合精度

-## 概述 +#### 概述 基于NPU芯片的架构特性,会涉及到混合精度训练,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下好处: @@ -1163,7 +1163,7 @@ def main(): - Apex在混合精度运算过程中,会对模型的grad进行运算。开启combine\_grad开关,可以加速这些运算。具体为将amp.initialize\(\)接口参数combine\_grad设置为True; - 适配后的Apex针对adadelta/adam/sgd/lamb做了昇腾AI处理器亲和性优化,得到的NPU融合优化器与原生算法保持一致,但运算速度更快。使用时只需将原有优化器替换为apex.optimizers.\*(“\*”为优化器名称,例如NpuFusedSGD)。 -## 特性支持 +#### 特性支持 混合精度模块功能和优化描述如[表1](#table10717173813332)所示。 @@ -1203,7 +1203,7 @@ def main(): >- 当前版本的实现方式主要为python实现,不支持AscendCL或者CUDA优化。 >- 当前昇腾AI设备暂不支持原始Apex的FusedLayerNorm接口模块,如果模型原始脚本文件使用了FusedLayerNorm接口模块,需要在模型迁移过程中将脚本头文件“from apex.normalization import FusedLayerNorm“替换为“from torch.nn import LayerNorm“。 -## 将混合精度模块集成到PyTorch模型中 +#### 将混合精度模块集成到PyTorch模型中 1. 使用apex混合精度模块需要首先从apex库中导入amp,代码如下: @@ -1237,29 +1237,29 @@ def main(): ``` -

性能优化

+

性能优化

-- **[概述](#概述-0.md)** +- **[概述](#概述-0md)** -- **[修改CPU性能模式(X86服务器)](#修改CPU性能模式(X86服务器).md)** +- **[修改CPU性能模式(X86服务器)](#修改CPU性能模式(X86服务器)md)** -- **[修改CPU性能模式(ARM服务器)](#修改CPU性能模式(ARM服务器).md)** +- **[修改CPU性能模式(ARM服务器)](#修改CPU性能模式(ARM服务器)md)** -- **[安装高性能pillow库(X86服务器)](#安装高性能pillow库(X86服务器).md)** +- **[安装高性能pillow库(X86服务器)](#安装高性能pillow库(X86服务器)md)** -- **[(可选)安装指定版本OpenCV库](#(可选)安装指定版本OpenCV库.md)** +- **[(可选)安装指定版本OpenCV库](#(可选)安装指定版本OpenCV库md)** -

概述

+

概述

在进行PyTorch模型迁移训练时,部分网络模型会出现1秒内识别的图像数(fps)较低、性能不达标的情况。此时需要针对服务器进行以下优化。 - 修改CPU性能模式。 - 安装高性能pillow库。 -

修改CPU性能模式(X86服务器)

+

修改CPU性能模式(X86服务器)

-## 设置电源策略为高性能模式 +##### 设置电源策略为高性能模式 提升网络性能需要在X86服务器BIOS设置中将电源策略设为高性能模式,具体操作如下。 @@ -1286,7 +1286,7 @@ def main(): 6. 按下“F10”保存配置并重启服务器。 -## 将CPU设置为performance模式 +##### 将CPU设置为performance模式 请使用root用户执行如下操作。 @@ -1364,9 +1364,9 @@ def main(): 4. 再次执行[步骤1](#li158435131344)查看当前CPU模式是否已设置为performance模式。 -

修改CPU性能模式(ARM服务器)

+

修改CPU性能模式(ARM服务器)

-## 设置电源策略为高性能模式 +##### 设置电源策略为高性能模式 在某些对Host侧CPU要求较高的模型中,例如目标检测类模型,需要进行较为复杂的图像预处理,开启电源高性能模式能一定程度上提高性能和稳定性。ARM服务器提升网络性能需要在BIOS设置中将电源策略设为高性能模式,具体操作如下。 @@ -1393,7 +1393,7 @@ def main(): 6. 按下“F10”保存配置并重启服务器。 -

安装高性能pillow库(X86服务器)

+

安装高性能pillow库(X86服务器)

1. 安装高性能pillow库相关依赖,命令如下。 @@ -1431,7 +1431,7 @@ def main(): >``` -3. 修改torchvision代码解决pillow-simd缺少PILLOW\_VERSION问题。torchvision安装参见[样例获取](#样例获取.md)。 +3. 修改torchvision代码解决pillow-simd缺少PILLOW\_VERSION问题。torchvision安装参见[样例获取](#样例获取md)。 将/usr/local/python3.7.5/lib/python3.7/site-packages/torchvision/transforms/functional.py第5行代码修改如下: @@ -1444,45 +1444,45 @@ def main(): ``` -

(可选)安装指定版本OpenCV库

+

(可选)安装指定版本OpenCV库

如模型依赖OpenCV,基于训练性能考虑,建议安装OpenCV-3.4.10版本。 1. 获取源码:[获取地址](https://opencv.org/releases/)。 2. 安装指导:[获取地址](https://docs.opencv.org/3.4.10/d7/d9f/tutorial_linux_install.html)。 -

模型训练

+

模型训练

-训练脚本迁移完成后,需要参见[配置环境变量](#配置环境变量.md)设置环境变量,然后执行**python3** _xxx_进行模型训练。具体样例请参考[脚本执行](#脚本执行.md)。 +训练脚本迁移完成后,需要参见[配置环境变量](#配置环境变量md)设置环境变量,然后执行**python3** _xxx_进行模型训练。具体样例请参考[脚本执行](#脚本执行md)。 >![](public_sys-resources/icon-note.gif) **说明:** >执行“python3 xxx“命令时,须将python3软链接到与当前pytorch适配版本的python安装路径。 -

性能调优和分析

+

性能调优和分析

-- **[前提条件](#前提条件.md)** +- **[前提条件](#前提条件md)** -- **[调测过程](#调测过程.md)** +- **[调测过程](#调测过程md)** -- **[亲和库](#亲和库.md)** +- **[亲和库](#亲和库md)** -

前提条件

+

前提条件

-1. 参见[样例说明](#样例说明.md)改造开源代码,使模型能够正常运行,包括数据预处理,前向计算,loss计算,混合精度,反向计算,参数更新等。 +1. 参见[样例说明](#样例说明md)改造开源代码,使模型能够正常运行,包括数据预处理,前向计算,loss计算,混合精度,反向计算,参数更新等。 2. 模型迁移阶段优先关注模型是否能跑通,现有算子是否能满足,如果遇到不满足的算子需参见《PyTorch算子开发指南》进行算子适配开发。 3. 优先打通单卡功能,再打通多卡功能。 -

调测过程

+

调测过程

-- **[总体思路](#总体思路.md)** +- **[总体思路](#总体思路md)** -- **[采集训练过程相关数据](#采集训练过程相关数据.md)** +- **[采集训练过程相关数据](#采集训练过程相关数据md)** -- **[性能优化](#性能优化-1.md)** +- **[性能优化](#性能优化-1md)** -

总体思路

+

总体思路

1. 通过训练执行结果,判断吞吐量指标是否达到预期要求。 2. 当吞吐量指标不达标时,需要找出制约性能瓶颈的原因,主要为以下几个方面: @@ -1493,9 +1493,9 @@ def main(): 3. 针对以上制约性能瓶颈的原因进行分析与优化。 -

采集训练过程相关数据

+

采集训练过程相关数据

-## Profiling数据采集 +##### Profiling数据采集 当模型训练过程中吞吐量指标不达标时,可以通过采集训练过程中的profiling数据,分析哪个环节、哪个算子导致的性能消耗。Profiling数据采集分为PyTorch层面和CANN层面的采集,PyTorch层面采集的是PyTorch API的数据,CANN层面采集的是TBE算子的数据。 @@ -1543,7 +1543,7 @@ def main(): -## 获取算子信息OP\_INFO +##### 获取算子信息OP\_INFO 网络模型最终是以OP执行的,通过OPInfo日志,我们可以获取实际执行时的算子及其属性。通过get\_ascend\_op\_info.py脚本获取。 @@ -1610,29 +1610,29 @@ def main(): 6. 分析TaskInfo中额外的task,尤其关注transdata。 -

性能优化

+

性能优化

-## 算子瓶颈优化 +##### 算子瓶颈优化 -1. 获取训练过程中的Profiling数据,参见[Profiling数据采集](#采集训练过程相关数据.md)。 +1. 获取训练过程中的Profiling数据,参见[Profiling数据采集](#采集训练过程相关数据md)。 2. 分析Profiling数据,得到耗时较大的算子。 -3. 参见[单算子样例编写说明](#单算子样例编写说明.md)构建耗时较大算子的单算子样例,通过与CPU或GPU运行单算子样例时间进行对比,若发现性能不足,则有以下两种方案解决。 +3. 参见[单算子样例编写说明](#单算子样例编写说明md)构建耗时较大算子的单算子样例,通过与CPU或GPU运行单算子样例时间进行对比,若发现性能不足,则有以下两种方案解决。 - 规避方案:使用同等语义其他高效算子替代。 - 解决方案:改进算子性能。 -## copy瓶颈优化 +##### copy瓶颈优化 -1. 获取训练过程中的Profiling数据,参见[Profiling数据采集](#采集训练过程相关数据.md)。 +1. 获取训练过程中的Profiling数据,参见[Profiling数据采集](#采集训练过程相关数据md)。 2. 分析Profiling数据分析整网中的D2DCopywithStreamSynchronize/PTCopy/format\_contiguous的耗时。 3. 若发现耗时较大,则需参照以下两种方案解决。 - 方案一:(规避方案)PyTorch中View类型框架类算子会导致非连续转连续操作。优化思路为尽量使用计算类算子代替View类框架算子,常见的View类框架算子如View、Permute、Transpose等。更多View类框架算子可参考[https://pytorch.org/docs/stable/tensor\_view.html](https://pytorch.org/docs/stable/tensor_view.html)。 - 方案二:(解决方案)加速转连续操作。 -## 框架瓶颈优化 +##### 框架瓶颈优化 -1. 获取训练过程中算子信息OP\_INFO,参见[获取算子信息OP\_INFO](#采集训练过程相关数据.md)。 +1. 获取训练过程中算子信息OP\_INFO,参见[获取算子信息OP\_INFO](#采集训练过程相关数据md)。 2. 分析OP\_INFO中算子的规格和调用关系,定位是否插入了多余的算子,重点关注transdata是否合理。 3. 优化方案:通过指定部分算子初始化格式,对多余的格式转换算子进行消除。 4. 在pytorch/torch/nn/modules/module.py中,在cast\_weight中指定算子初始化格式,如下图。 @@ -1645,27 +1645,27 @@ def main(): - Linear相关的参数,可设置为NZ格式,如第409行。 -## 编译瓶颈优化 +##### 编译瓶颈优化 -1. 获取训练过程中算子信息OP\_INFO,参见[获取算子信息OP\_INFO](#采集训练过程相关数据.md)。 +1. 获取训练过程中算子信息OP\_INFO,参见[获取算子信息OP\_INFO](#采集训练过程相关数据md)。 2. 查看INFO日志,观察第一个step以后的aclopCompile::aclOp关键字,如果后续接了Match op iunputs/type failed或To compile op则说明该算子存在动态编译,需要优化。 3. 需参照以下两种方案解决。 - 规避方案:在理解模型语义和相关API基础上,使用固定Shape的方式代替动态Shape。 - 解决方案:减少编译或不需要编译该算子。 -

亲和库

+

亲和库

-- **[来源介绍](#来源介绍.md)** +- **[来源介绍](#来源介绍md)** -- **[功能介绍](#功能介绍-2.md)** +- **[功能介绍](#功能介绍-2md)** -

来源介绍

+

来源介绍

针对公版模型中常见的网络结构和函数,我们针对性地对其进行了优化,使得运算性能大幅度提升,同时,将其集成到Pytorch框架中,便于模型性能调优中使用。 -

功能介绍

+

功能介绍

函数名

@@ -1710,30 +1710,30 @@ def main(): >![](public_sys-resources/icon-note.gif) **说明:** >该部分调优内容会随着版本不断增强和更新,请以实际PyTorch版本中对应路径下的内容为准。 -

精度调测

+

精度调测

-- **[前提条件](#前提条件-3.md)** +- **[前提条件](#前提条件-3md)** -- **[调测过程](#调测过程-4.md)** +- **[调测过程](#调测过程-4md)** -

前提条件

+

前提条件

优先在同等语义和超参下,跑一定的epoch(推荐完整epoch数的20%),使精度,loss等对齐GPU相应水平,完成后再对齐最终精度。 -

调测过程

+

调测过程

-- **[总体思路](#总体思路-5.md)** +- **[总体思路](#总体思路-5md)** -- **[精度调优方法](#精度调优方法.md)** +- **[精度调优方法](#精度调优方法md)** -

总体思路

+

总体思路

精度问题排查需要找出是哪一步出现的问题,主要以下几个方面: 1. 模型网络计算错误。 - - 定位思路:在网络中加入hook进行排查判断是哪个地方有较大嫌疑,然后构建[单算子用例](#单算子样例编写说明.md)逐渐缩小错误范围,证明该算子在当前网络场景下计算有误,可以对比CPU或GPU结果证明。 + - 定位思路:在网络中加入hook进行排查判断是哪个地方有较大嫌疑,然后构建[单算子用例](#单算子样例编写说明md)逐渐缩小错误范围,证明该算子在当前网络场景下计算有误,可以对比CPU或GPU结果证明。 - 规避方案:使用同等语义其他算子替代。 @@ -1762,22 +1762,22 @@ def main(): -

精度调优方法

+

精度调优方法

模型出现精度问题一般有:因算子溢出导致的训练loss不收敛或者精度不达标问题,整个网络训练引起的性能不达标问题。用户可通过单算子溢出检测和整网调测适度解决模型精度不达标问题。 -- **[单算子溢出检测](#单算子溢出检测.md)** +- **[单算子溢出检测](#单算子溢出检测md)** -- **[整网调测](#整网调测.md)** +- **[整网调测](#整网调测md)** -

单算子溢出检测

+
单算子溢出检测
用户通过采集训练过程中各算子的运算结果(即Dump数据),然后查看算子是否产生溢出,从而帮助开发人员快速定位并解决算子精度问题。 -## 约束说明 +###### 约束说明 -- 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5.md); +- 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5md); - 本功能只提供IR级别的算子溢出检测,且只支持AICORE的溢出检测,不支持Atomic溢出检测; - 须在PyTorch源代码“build.sh“文件中添加“USE\_DUMP=1”字段。 @@ -1790,7 +1790,7 @@ def main(): - 使用单算子溢出检测功能时,请不要同时开启apex的动态loss scale模式和使用tensor融合功能。 -## 采集算子Dump数据 +###### 采集算子Dump数据 ``` # check_overflow为溢出检测控制开关 @@ -1801,15 +1801,15 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load 模型运行过程中,如果有算子溢出,会打印出相应IR的名字。 -## 查看Dump数据 +###### 查看Dump数据 如果训练过程中采集到了Dump数据,则会在\{dump\_path\}路径下生成dump数据的.h5文件,用户可进入路径自行查看。 -## 解决方法 +###### 解决方法 请将算子溢出的打印截图及采集到的.h5文件通过Issue附件形式反馈给华为开发人员。 -

整网调测

+
整网调测
用户也可通过分析整个网络的方式来进行网络模型的精度调测。 @@ -1871,16 +1871,16 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load ``` -

模型保存与转换

+

模型保存与转换

-- **[简介](#简介.md)** +- **[简介](#简介md)** -- **[模型保存](#模型保存.md)** +- **[模型保存](#模型保存md)** -- **[导出ONNX模型](#导出ONNX模型.md)** +- **[导出ONNX模型](#导出ONNX模型md)** -

简介

+

简介

模型训练完成后,通过Pytorch提供的接口保存模型文件并导出ONNX模型,然后通过ATC工具将其转换为适配昇腾AI处理器的.om文件用于离线推理。 @@ -1892,7 +1892,7 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load ![](figures/zh-cn_image_0000001144082132.png) -

模型保存

+

模型保存

Pytorch在训练过程中,通常使用torch.save\(\)来保存Checkpoint文件,根据模型文件的后续用途会保存为两种格式的模型文件: @@ -1965,13 +1965,13 @@ Pytorch在训练过程中,通常使用torch.save\(\)来保存Checkpoint文件 >![](public_sys-resources/icon-notice.gif) **须知:** >通常情况下,训练图和推理图中对同一个算子处理方式不同(例如BatchNorm和dropout等算子),在输入格式上也有差别,因此在运行推理或导出ONNX模型之前,必须调用model.eval\(\) 来将dropout和batch normalization层设置为推理模式。 -

导出ONNX模型

+

导出ONNX模型

-## 简介 +#### 简介 昇腾AI处理器Pytorch模型的部署策略是基于Pytorch官方支持的ONNX模块实现的。ONNX是业内目前比较主流的模型格式,广泛用于模型交流及部署。本节主要介绍如何将Checkpoint文件通过torch.onnx.export\(\)接口导出为ONNX模型。 -## .pth或.pt文件导出ONNX模型 +#### .pth或.pt文件导出ONNX模型 保存的.pth或.pt文件可以通过Pytorch构建模型再加载权重的方法恢复,然后导出ONNX模型,样例如下。 @@ -2013,7 +2013,7 @@ if __name__ == "__main__": >- 样例脚本中的model来自于torchvision模块中的定义,用户使用自己的模型时需自行指定。 >- 构造输入输出需要对应训练时的输入输出,否则无法正常推理。 -## .pth.tar文件导出ONNX模型 +#### .pth.tar文件导出ONNX模型 .pth.tar在导出ONNX模型时需要先确定保存时的信息,有时保存的节点名称和模型定义中的节点会有差异,例如会多出前缀和后缀。在进行转换的时候,可以对节点名称进行修改。转换代码样例如下。 @@ -2052,25 +2052,25 @@ if __name__ == "__main__": convert() ``` -

样例说明

+

样例说明

-- **[ResNet50模型迁移示例](#ResNet50模型迁移示例.md)** +- **[ResNet50模型迁移示例](#ResNet50模型迁移示例md)** -- **[ShuffleNet模型调优示例](#ShuffleNet模型调优示例.md)** +- **[ShuffleNet模型调优示例](#ShuffleNet模型调优示例md)** -

ResNet50模型迁移示例

+

ResNet50模型迁移示例

-- **[样例获取](#样例获取.md)** +- **[样例获取](#样例获取md)** -- **[训练脚本迁移](#训练脚本迁移.md)** +- **[训练脚本迁移](#训练脚本迁移md)** -- **[脚本执行](#脚本执行.md)** +- **[脚本执行](#脚本执行md)** -

样例获取

+

样例获取

-## 样例获取 +##### 样例获取 1. 本样例基于PyTorch官网提供的Imagenet数据集训练模型进行适配昇腾910 AI处理器的迁移改造,样例获取路径为[https://github.com/pytorch/examples/tree/master/imagenet](https://github.com/pytorch/examples/tree/master/imagenet)。 2. 本样例依赖torchvision,需要安装torchvision依赖,如果使用非root用户安装, 则需在命令末尾加上**--user**。 @@ -2098,7 +2098,7 @@ if __name__ == "__main__": >![](public_sys-resources/icon-note.gif) **说明:** >Resnet50为PyTorch内置模型,了解更多内置模型请前往[Pytorch官网](https://pytorch.org/)。 - 2. 在脚本执行中直接指定参数arch为resnet50,内容如下,本样例迁移采用该种方式,请参见[脚本执行](#脚本执行.md)。 + 2. 在脚本执行中直接指定参数arch为resnet50,内容如下,本样例迁移采用该种方式,请参见[脚本执行](#脚本执行md)。 ``` --arch resnet50 @@ -2106,7 +2106,7 @@ if __name__ == "__main__": -## 目录结构 +##### 目录结构 主要文件目录结构如下所示: @@ -2114,14 +2114,14 @@ if __name__ == "__main__": ├──main.py ``` -

训练脚本迁移

+

训练脚本迁移

-- **[单P训练修改](#单P训练修改.md)** +- **[单P训练修改](#单P训练修改md)** -- **[分布式训练修改](#分布式训练修改.md)** +- **[分布式训练修改](#分布式训练修改md)** -

单P训练修改

+
单P训练修改
1. main.py增加头文件以支持基于PyTorch框架的模型在昇腾910 AI处理器上训练: @@ -2264,7 +2264,7 @@ if __name__ == "__main__": ``` -

分布式训练修改

+
分布式训练修改
1. main.py增加头文件以支持基于PyTorch框架的模型在昇腾910 AI处理器上训练及进行混合精度训练。 @@ -2615,17 +2615,17 @@ if __name__ == "__main__": ``` -

脚本执行

+

脚本执行

-## 准备数据集 +##### 准备数据集 准备数据集并上传到运行环境的目录下,例如:/home/data/resnet50/imagenet -## 配置环境变量 +##### 配置环境变量 -请参考[配置环境变量](#配置环境变量.md)配置环境变量。 +请参考[配置环境变量](#配置环境变量md)配置环境变量。 -## 执行命令 +##### 执行命令 例如: @@ -2666,20 +2666,20 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # >![](public_sys-resources/icon-note.gif) **说明:** >dist-backend需配置成hccl以支持在昇腾AI设备上进行分布式训练。 -

ShuffleNet模型调优示例

+

ShuffleNet模型调优示例

-- **[样例获取](#样例获取-6.md)** +- **[样例获取](#样例获取-6md)** -- **[模型评估](#模型评估.md)** +- **[模型评估](#模型评估md)** -- **[网络迁移](#网络迁移.md)** +- **[网络迁移](#网络迁移md)** -- **[网络调测](#网络调测.md)** +- **[网络调测](#网络调测md)** -

样例获取

+

样例获取

-## 样例获取 +##### 样例获取 1. 本样例基于PyTorch官网提供的Imagenet数据集训练模型进行适配昇腾910 AI处理器的迁移改造,样例获取路径为[https://github.com/pytorch/examples/tree/master/imagenet](https://github.com/pytorch/examples/tree/master/imagenet)。 2. ShuffleNet模型参考PyTorch官网模型[ShuffleNet V2](https://pytorch.org/hub/pytorch_vision_shufflenet_v2/),实际使用在脚本执行中直接指定参数arch为shufflenet\_v2\_x1\_0。 @@ -2692,7 +2692,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # >ShuffleNet为PyTorch内置模型,了解更多内置模型请前往[Pytorch官网](https://pytorch.org/)。 -## 目录结构 +##### 目录结构 主要文件目录结构如下所示: @@ -2700,19 +2700,19 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # ├──main.py ``` -

模型评估

+

模型评估

模型评估主要关注算子适配情况,使用dump op方法获取ShuffleNet网络算子信息,与《PyTorch适配算子清单》算子进行对比,若是发现某个算子当前暂不支持,对于简单场景我们可以考虑先暂时替换成类似的算子或者把该算子单独放到cpu上执行两种方式规避,复杂场景不支持算子需要参见《PyTorch算子开发指南》进行算子开发。 -

网络迁移

+

网络迁移

-训练脚本迁移请参见[单P训练修改](#单P训练修改.md)和[分布式训练修改](#分布式训练修改.md)。脚本执行时注意选择参数--arch shufflenet\_v2\_x1\_0。 +训练脚本迁移请参见[单P训练修改](#单P训练修改md)和[分布式训练修改](#分布式训练修改md)。脚本执行时注意选择参数--arch shufflenet\_v2\_x1\_0。 -

网络调测

+

网络调测

-网络调测具体方法请参见[调测过程](#调测过程.md)。经排查ShuffleNet运行时相关算子耗时过大,以下给出耗时数据及解决方法。 +网络调测具体方法请参见[调测过程](#调测过程md)。经排查ShuffleNet运行时相关算子耗时过大,以下给出耗时数据及解决方法。 -## 前向排查 +##### 前向排查 前向排查记录表如下: @@ -2779,13 +2779,13 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # 详细说明如下: -- 由于原生实现的torch.transpose\(x, 1, 2\).contiguous\(\)是使用了View类框架算子transpose,造成了非连续场景,如[copy瓶颈优化](#性能优化-1.md)所描述Copy瓶颈,使用channel\_shuffle\_index\_select,在语义相同的情况下使用计算类算子替换框架类算子,从而减少耗时。 -- 由于shufflenetv2中含有大量的chunk操作,而chunk操作在Pytorch中为框架类算子,其结果会将一个tensor分割为几个等长的非连续的tensor,而非连续转连续这个操作目前耗时较长,故使用计算类算子消除非连续,如[copy瓶颈优化](#性能优化-1.md)所描述Copy瓶颈。 +- 由于原生实现的torch.transpose\(x, 1, 2\).contiguous\(\)是使用了View类框架算子transpose,造成了非连续场景,如[copy瓶颈优化](#性能优化-1md)所描述Copy瓶颈,使用channel\_shuffle\_index\_select,在语义相同的情况下使用计算类算子替换框架类算子,从而减少耗时。 +- 由于shufflenetv2中含有大量的chunk操作,而chunk操作在Pytorch中为框架类算子,其结果会将一个tensor分割为几个等长的非连续的tensor,而非连续转连续这个操作目前耗时较长,故使用计算类算子消除非连续,如[copy瓶颈优化](#性能优化-1md)所描述Copy瓶颈。 - 适配层在适配算子时默认指定输出格式为输入格式,但是concat不支持C轴非16整数倍的5HD的格式,会转为4D进行处理,又由于concat后面接的是gatherv2算子,也是仅支持4D格式的算子,所以导致数据格式转换过程为5HD-\>4D-\>concat-\>5HD-\>4D-\>gatherv2-\>5HD,解决方法是修改concat输出格式,当非16整数倍时指定输出格式为4D,优化后数据格式转换过程为5HD-\>4D-\>concat-\>gatherv2-\>5HD,当前针对ShuffleNet的做法具体可参考pytorch/aten/src/ATen/native/npu/CatKernelNpu.cpp 第121行。 -- 设置weight初始化格式避免计算过程中反复的transdata,如[copy瓶颈优化](#性能优化-1.md)所描述框架瓶颈。 +- 设置weight初始化格式避免计算过程中反复的transdata,如[copy瓶颈优化](#性能优化-1md)所描述框架瓶颈。 - 修复了DWCONV weight输出格式指定,避免一些不必要5HD-\>4D。 -## 整网排查 +##### 整网排查 整网排查记录表如下: @@ -2972,7 +2972,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # 15. 使用针对ShufflenetV2场景再次优化后的Gatherv3算子后,整体性能还能继续提升。 -## Python侧优化细节 +##### Python侧优化细节 Python侧优化主要是通过一些同等语义的修改,使网络在NPU上边的更加亲和。当前非连续转连续容易成为性能瓶颈,而ShufflenetV2中的channel\_shuffle操作就涉及了permute后转连续的操作,导致整网性能在NPU上较差。通过对channel\_shuffle操作进行同等语义的修改,加上和concat操作的融合,使得整网性能得到飞升。采用的是torchvision版本参见[开源链接](https://github.com/pytorch/vision/blob/master/torchvision/models/shufflenetv2.py)。 @@ -3207,24 +3207,24 @@ for group in [2, 4, 8]: ``` -

参考信息

+

参考信息

-- **[单算子样例编写说明](#单算子样例编写说明.md)** +- **[单算子样例编写说明](#单算子样例编写说明md)** -- **[单算子dump方法](#单算子dump方法.md)** +- **[单算子dump方法](#单算子dump方法md)** -- **[常用环境变量说明](#常用环境变量说明.md)** +- **[常用环境变量说明](#常用环境变量说明md)** -- **[dump op方法](#dump-op方法.md)** +- **[dump op方法](#dump-op方法md)** -- **[安装7.3.0版本gcc](#安装7-3-0版本gcc.md)** +- **[安装7.3.0版本gcc](#安装7-3-0版本gccmd)** -- **[编译安装hdf5](#编译安装hdf5.md)** +- **[编译安装hdf5](#编译安装hdf5md)** -

单算子样例编写说明

+

单算子样例编写说明

-在模型中遇到问题时,使用整网复现问题成本较大,可以构建测试用例来复现精度或性能问题,便于定位解决。构建测试用例一般有如下两种方式。单算子dump方法请参见[单算子dump方法](#单算子dump方法.md)。 +在模型中遇到问题时,使用整网复现问题成本较大,可以构建测试用例来复现精度或性能问题,便于定位解决。构建测试用例一般有如下两种方式。单算子dump方法请参见[单算子dump方法](#单算子dump方法md)。 1. 单算子测试用例构建,直接调用该算子即可复现错误场景。 @@ -3317,9 +3317,9 @@ for group in [2, 4, 8]: ``` -

单算子dump方法

+

单算子dump方法

-## 采集Dump数据 +#### 采集Dump数据 当前适配昇腾AI处理器的PyTorch通过torch.npu中的init\_dump\(\)、set\_dump\(\)和finalize\_dump接口来进行算子dump数据的采集。首先init\_dump\(\)会进行初始化dump配置,然后通过set\_dump\(\)接口通过传入配置文件来配置dump参数,最后通过finalize\_dump来结束dump。以下以add\_算子为例,介绍算子dump数据采集方法。 @@ -3383,7 +3383,7 @@ torch.npu.finalize_dump()
-## 查看溢出数据 +#### 查看溢出数据 采集的dump数据会在\{dump\_path\}/\{time\}/\{deviceid\}/\{model\_id\}/\{data\_index\}目录下生成例如:“/home/HwHiAiUser/output/20200808163566/0/0”目录。 @@ -3396,7 +3396,7 @@ torch.npu.finalize_dump() - model\_id:子图ID。 - dump文件:命名规则如\{op\_type\}.\{op\_name\}.\{taskid\}.\{stream\_id\}.\{timestamp\},如果op\_type、op\_name出现了“.”、“/”、“\\”、空格时,会转换为下划线表示。 -## 解析溢出算子的dump文件 +#### 解析溢出算子的dump文件 1. 请根据实际情况,将\{op\_type\}.\{op\_name\}.\{taskid\}.\{stream\_id\}.\{timestamp\}上传到安装有Toolkit软件包的环境。 2. 进入解析脚本所在路径,假设Toolkit软件包安装目录为:/home/HwHiAiUser/Ascend/ascend-toolkit/latest。 @@ -3425,7 +3425,7 @@ torch.npu.finalize_dump() 转换为.txt格式文件后,维度信息、Dtype均不存在。详细的使用方法请参考numpy官网介绍。 -

常用环境变量说明

+

常用环境变量说明

1. 开启TASK多线程下发,绝大多数情况下,打开该功能会进一步提升整网训练性能。 @@ -3443,7 +3443,7 @@ torch.npu.finalize_dump() **export DUMP\_GRAPH\_LEVEL=3** -

dump op方法

+

dump op方法

1. 使用profile接口对原始代码训练脚本的loss计算和优化过程进行改造,打印算子信息。代码样例如下: @@ -3458,7 +3458,7 @@ torch.npu.finalize_dump() 2. 将改造后的训练脚本在CPU上进行训练,屏幕会打印相关算子信息。 -

安装7.3.0版本gcc

+

安装7.3.0版本gcc

以下步骤请在root用户下执行。 @@ -3540,7 +3540,7 @@ torch.npu.finalize_dump() >本步骤为用户在需要用到gcc升级后的编译环境时才配置环境变量。 -

编译安装hdf5

+

编译安装hdf5

以下步骤请在root用户下执行。 @@ -3577,35 +3577,35 @@ torch.npu.finalize_dump() ``` -

FAQ

+

FAQ

-- **[软件安装常见问题](#软件安装常见问题.md)** +- **[软件安装常见问题](#软件安装常见问题md)** -- **[模型和算子运行常见问题](#模型和算子运行常见问题.md)** +- **[模型和算子运行常见问题](#模型和算子运行常见问题md)** -- **[模型调测常见问题](#模型调测常见问题.md)** +- **[模型调测常见问题](#模型调测常见问题md)** -- **[其他操作相关问题](#其他操作相关问题.md)** +- **[其他操作相关问题](#其他操作相关问题md)** -- **[模型分布式训练常见问题](#模型分布式训练常见问题.md)** +- **[模型分布式训练常见问题](#模型分布式训练常见问题md)** -

软件安装常见问题

+

软件安装常见问题

-- **[pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败.md)** +- **[pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败md)** -

pip3.7 install Pillow==5.3.0安装失败

+

pip3.7 install Pillow==5.3.0安装失败

-## 现象描述 +##### 现象描述 pip3.7 install pillow==5.3.0安装失败。 -## 可能原因 +##### 可能原因 缺少必要的依赖,如:libjpeg、python-devel、 zlib-devel 、libjpeg-turbo-devel等等。 -## 处理方法 +##### 处理方法 安装相关依赖,通过如下命令安装: @@ -3618,95 +3618,95 @@ pip3.7 install pillow==5.3.0安装失败。 **apt-get install libjpeg python-devel zlib-devel libjpeg-turbo-devel** -

模型和算子运行常见问题

+

模型和算子运行常见问题

-- **[在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”](#在模型运行或者算子运行时遇到报错-RuntimeError-ExchangeDevice.md)** +- **[在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”](#在模型运行或者算子运行时遇到报错-RuntimeError-ExchangeDevicemd)** -- **[在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”](#在模型运行或者算子运行时遇到报错-Error-in-atexit-_run_exitfuncs.md)** +- **[在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”](#在模型运行或者算子运行时遇到报错-Error-in-atexit-_run_exitfuncsmd)** -- **[在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”](#在模型运行时遇到报错-terminate-called-after-throwing-an-instance-of-c10-Error-what()-HelpACLExecute.md)** +- **[在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”](#在模型运行时遇到报错-terminate-called-after-throwing-an-instance-of-c10-Error-what()-HelpACLExecutemd)** -- **[在模型运行时遇到报错“ImportError: libhccl.so.”](#在模型运行时遇到报错-ImportError-libhccl-so.md)** +- **[在模型运行时遇到报错“ImportError: libhccl.so.”](#在模型运行时遇到报错-ImportError-libhccl-somd)** -- **[在模型运行时遇到报错“RuntimeError: Initialize.”](#在模型运行时遇到报错-RuntimeError-Initialize.md)** +- **[在模型运行时遇到报错“RuntimeError: Initialize.”](#在模型运行时遇到报错-RuntimeError-Initializemd)** -- **[在模型运行时遇到报错“TVM/te/cce error.”](#在模型运行时遇到报错-TVM-te-cce-error.md)** +- **[在模型运行时遇到报错“TVM/te/cce error.”](#在模型运行时遇到报错-TVM-te-cce-errormd)** -- **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed.md)** +- **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failedmd)** -- **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed-7.md)** +- **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed-7md)** -- **[在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭(export-TASK_QUEUE_ENABLE-0)后仍然遇到报错-HelpACLExecute.md)** +- **[在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭(export-TASK_QUEUE_ENABLE-0)后仍然遇到报错-HelpACLExecutemd)** -- **[在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”](#在模型运行时遇到报错-55056-GetInputConstDataOut-ErrorNo--1(failed).md)** +- **[在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”](#在模型运行时遇到报错-55056-GetInputConstDataOut-ErrorNo--1(failed)md)** -

在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”

+

在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”

-## 现象描述 +##### 现象描述 ![](figures/FAQ1.png) -## 可能原因 +##### 可能原因 目前在一个线程内,只能调用一个NPU设备,当切换不同的npu device时,出现上述错误。 -## 处理方法 +##### 处理方法 检查代码中在调用torch.npu.set\_device\(device\)、tensor.to\(device\)或者model.to\(device\)时,同一个线程内前后调用时device名称不一致。对于多个线程情况(如多卡训练),每个线程同样只能调用固定的npu device。 -

在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”

+

在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”

-## 现象描述 +##### 现象描述 ![](figures/FAQ2.png) -## 可能原因 +##### 可能原因 在torch初始化时,若未通过torch.npu.device\(id\)指定npu设备,则默认使用device 0设备。若直接使用其他NPU设备,如指定在device 1上创建tensor,那么在运行时会出现上述错误。 -## 处理方法 +##### 处理方法 在调用NPU设备之前,通过torch.npu.set\_device\(device\)指定需要使用的NPU设备即可。 -

在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”

+

在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”

-## 现象描述 +##### 现象描述 ![](figures/FAQ3.png) -## 可能原因 +##### 可能原因 目前HelpACLExecute的报错信息无法直接找到报错位置,此处在task任务下发时报错,是由于开启了TASK多线程下发(export TASK\_QUEUE\_ENABLE=1),上层封装了报错信息,导致无法获取更加详细的报错日志。 -## 处理方法 +##### 处理方法 可通过如下两种方式处理: - 查看具体的host报错日志信息。日志默认路径为/var/log/npu/slog/host-0/,根据时间标识查找以host-0为前缀的日志文件,打开日志文件,搜索“ERROR”,查询具体的报错信息。 - 关闭多线程下发\(export TASK\_QUEUE\_ENABLE=0\),再次运行代码,一般可根据终端报错信息定位错误原因。 -

在模型运行时遇到报错“ImportError: libhccl.so.”

+

在模型运行时遇到报错“ImportError: libhccl.so.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ7.png) -## 可能原因 +##### 可能原因 目前对外发布的pytorch安装包,默认使用NPU和HCCL功能,因此在调用时需要将HCCL模块路径添加到环境变量中。根据报错信息“can not find libhccl.so”,出现上述错误原因为缺少hccl库文件。 -## 处理方法 +##### 处理方法 将hccl模块的路径添加到环境变量中,一般情况下hccl库文件路径为安装包下的.../fwkacllib/python/site-packages/hccl。 -

在模型运行时遇到报错“RuntimeError: Initialize.”

+

在模型运行时遇到报错“RuntimeError: Initialize.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ9.png) -## 可能原因 +##### 可能原因 根据报错信息,初步判断为npu设备初始化错误。进一步查找host日志报错信息如下: @@ -3714,7 +3714,7 @@ pip3.7 install pillow==5.3.0安装失败。 根据日志信息定位报错原因为系统在拉起npu设备时报错。 -## 处理方法 +##### 处理方法 可通过以下步骤解决该问题。 @@ -3738,25 +3738,25 @@ pip3.7 install pillow==5.3.0安装失败。 4. 联系华为工程师。 -

在模型运行时遇到报错“TVM/te/cce error.”

+

在模型运行时遇到报错“TVM/te/cce error.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ10.png) -## 可能原因 +##### 可能原因 pytorch内调用npu类型算子时,强依赖于te、cce、tvm组件,pytorch、toolkit/nnae和te版本需要一致。在更新toolkit/nnae后,te等组件不会自动更新,当版本不匹配时,则会出现该报错。 -## 处理方法 +##### 处理方法 更新te等组件版本,具体需要更新te-_\*.whl和topi-\*_.whl安装包。在安装的toolkit或者nnae的fwkacllib子目录下(以root安装用户为例:默认安装路径在/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64目录下,更新安装包即可。在该目录下有安装包topi-0.4.0-py3-none-any.whl和te-0.4.0-py3-none-any.whl,分别执行pip3 install --upgrade topi-0.4.0-py3-none-any.whl,pip install --upgrade te-0.4.0-py3-none-any.whl。 ![](figures/FAQ10-1.png) -

在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”

+

在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”

-## 现象描述 +##### 现象描述 脚本: @@ -3805,7 +3805,7 @@ shell报错信息: [ERROR] RUNTIME(12731,python3.7):2021-02-02-22:23:56.475.717 [../../../../../../runtime/feature/src/api_c.cc:224]12828 rtKernelLaunch:ErrCode=207001, desc=[module new memory error], InnerCode=0x70a0002 ``` -## 可能原因 +##### 可能原因 根据shell和日志报错信息,两者报错信息不匹配。 @@ -3813,7 +3813,7 @@ shell报错是在同步操作中和AI CPU错误,而日志报错信息却是在 报错信息滞后可能是由于AI CPU算子的异步执行,导致报错信息滞后。 -## 处理方法 +##### 处理方法 对于该报错需要根据实际的错误来定位,可参考如下步骤进行处理: @@ -3823,9 +3823,9 @@ shell报错是在同步操作中和AI CPU错误,而日志报错信息却是在 4. 打印stack所有参数的shape、dtype、npu\_format,通过构造单算子用例复现问题。定位到问题原因为减法计算输入参数数据类型不同,导致a-b和b-a结果的数据类型不一致,最终在stack算子中报错。 5. 将stack入参数据类型转换为一致即可临时规避问题。 -

在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”

+

在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”

-## 现象描述 +##### 现象描述 脚本: @@ -3874,7 +3874,7 @@ shell报错信息: [ERROR] RUNTIME(12731,python3.7):2021-02-02-22:23:56.475.717 [../../../../../../runtime/feature/src/api_c.cc:224]12828 rtKernelLaunch:ErrCode=207001, desc=[module new memory error], InnerCode=0x70a0002 ``` -## 可能原因 +##### 可能原因 根据shell和日志报错信息,两者报错信息不匹配。 @@ -3882,7 +3882,7 @@ shell报错是在同步操作中和ai cpu错误,而日志报错信息却是在 报错信息滞后可能是由于AI cpu算子的异步执行,导致报错信息滞后。 -## 处理方法 +##### 处理方法 对于该报错需要根据实际的错误来定位,可参考如下步骤进行处理: @@ -3892,17 +3892,17 @@ shell报错是在同步操作中和ai cpu错误,而日志报错信息却是在 4. 打印stack所有参数的shape、dtype、npu\_format,通过构造单算子用例复现问题。定位到问题原因为减法计算输入参数数据类型不同,导致a-b和b-a结果的数据类型不一致,最终在stack算子中报错。 5. 将stack入参数据类型转换为一致即可临时规避问题。 -

在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”

+

在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ8.png) -## 可能原因 +##### 可能原因 pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子。由于在上层报错信息显示为HelpACLExecute. 时,内部也正在对报错信息与日志进行完善,导致部分算子发生错误时,报错信息获取异常。 -## 处理方法 +##### 处理方法 查看host日志,确定报错算子和位置,日志默认路径为/var/log/npu/slog/host-0。查找对应时间的log文件,搜索ERROR字段,查找错误信息。如对上述的错误,查询日志中的ERROR字段为: @@ -3912,74 +3912,74 @@ pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子 在模型代码中查找topk算子调用位置,确定该算子是否可由其他算子代替,若可由其他算子报错,暂时使用代替方案,并将算子报错信息报告华为工程师。若无替代算子,请将算子报错信息通知华为工程师解决。 -

在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”

+

在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”

-## 现象描述 +##### 现象描述 模型训练过程中,查看host训练日志(路径:“/root/ascend/log/plog/“),可能出现如下报错信息。 ![](figures/20210720-102720(WeLinkPC).png) -## 可能原因 +##### 可能原因 该报错信息是由于调用某一公共API接口导致。 -## 处理方法 +##### 处理方法 该报错信息不影响训练功能与性能,可忽略该报错信息。 -

模型调测常见问题

+

模型调测常见问题

-- **[在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”](#在模型调测时遇到报错-RuntimeError-malloc-pytorch-c10-npu-NPUCachingAllocator-cpp-293-NPU-error-error-code-is-5.md)** +- **[在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”](#在模型调测时遇到报错-RuntimeError-malloc-pytorch-c10-npu-NPUCachingAllocator-cpp-293-NPU-error-error-code-is-5md)** -- **[在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”](#在模型调测时遇到报错-RuntimeError-Could-not-run-aten-trunc-out-with-arguments-from-the-NPUTensorId-backend.md)** +- **[在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”](#在模型调测时遇到报错-RuntimeError-Could-not-run-aten-trunc-out-with-arguments-from-the-NPUTensorId-backendmd)** -- **[在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错](#在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错.md)** +- **[在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错](#在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错md)** -- **[在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”](#在调用torch时遇到报错-ModuleNotFoundError-No-module-named-torch-_C.md)** +- **[在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”](#在调用torch时遇到报错-ModuleNotFoundError-No-module-named-torch-_Cmd)** -

在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”

+

在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ4.png) -## 可能原因 +##### 可能原因 对于NPUCachingAllocator中malloc类型的错误原因一般为NPU显存不足,所需显存大于npu上可用显存。 -## 处理方法 +##### 处理方法 在模型调测中,可用通过减小batch size参数来减少NPU显存的分配,解决该问题。 -

在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”

+

在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ5.png) -## 可能原因 +##### 可能原因 目前npu设备仅支持pytorch部分算子,对于不支持的算子在使用时均会报上述错误,算子正在不断开发中。算子支持情况可参考[PyTorch原生算子](https://support.huaweicloud.com/opl-pytorch/atlasptol_09_0001.html),持续更新。 -## 处理方法 +##### 处理方法 在模型调测中,可通过减小batch size参数,来减少NPU显存的占用,解决该问题。 -

在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错

+

在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错

-## 现象描述 +##### 现象描述 ![](figures/FAQ6.png) ![](figures/FAQ6-1.png) -## 可能原因 +##### 可能原因 在模型搭建中,算子输入参数是多样的。某些算子(如MaxPoolGradWithArgmaxV1算子和max算子)在特定参数下,计算报错或者不支持,根据报错信息可以定位到具体算子。 -## 处理方法 +##### 处理方法 根据报错信息定位到具体算子,解决步骤如下: @@ -3993,50 +3993,50 @@ pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子 前述图中,根据报错信息,定位到是MaxPoolGradWithArgmaxV1算子和max算子报错。MaxPoolGradWithArgmaxV1是在反向计算过程中报错,那么构建测试用例时需要构建对应的反向场景;而对于max算子,是正向计算时报错,构建正向场景即可。 -在模型中遇到算子报错,首选是仅构建单算子测试用例,确定报错场景和原因即可;若无法在单算子中构建单算子用例,则需要构建基于上下文的单算子场景, 可以参考[单算子样例编写说明](#单算子样例编写说明.md)编写用例。 +在模型中遇到算子报错,首选是仅构建单算子测试用例,确定报错场景和原因即可;若无法在单算子中构建单算子用例,则需要构建基于上下文的单算子场景, 可以参考[单算子样例编写说明](#单算子样例编写说明md)编写用例。 -

在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”

+

在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”

-## 现象描述 +##### 现象描述 ![](figures/FAQ11.png) -## 可能原因 +##### 可能原因 首先确定报错位置,上述报错路径为.../code/pytorch/torch/\_\_init\_\_.py,而当前运行路径在.../code/pytorch下,在执行import torch时,默认首先在当前目录下查找torch文件夹,因此报错。此处应是调用在系统目录下安装的torch包,而不是当前目录下的torch。 -## 处理方法 +##### 处理方法 切换到其他目录执行脚本。 -

其他操作相关问题

+

其他操作相关问题

-- **[cuda流同步操作报错](#cuda流同步操作报错.md)** +- **[cuda流同步操作报错](#cuda流同步操作报错md)** -- **[aicpu\_kernels/libpt\_kernels.so不存在](#aicpu_kernels-libpt_kernels-so不存在.md)** +- **[aicpu\_kernels/libpt\_kernels.so不存在](#aicpu_kernels-libpt_kernels-so不存在md)** -- **[使用npu-smi info查看显存时发现python进程残留](#使用npu-smi-info查看显存时发现python进程残留.md)** +- **[使用npu-smi info查看显存时发现python进程残留](#使用npu-smi-info查看显存时发现python进程残留md)** -- **[动态shape报错“match op inputs failed”](#动态shape报错-match-op-inputs-failed.md)** +- **[动态shape报错“match op inputs failed”](#动态shape报错-match-op-inputs-failedmd)** -- **[Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported](#Op-type-SigmoidCrossEntropyWithLogitsV2-of-ops-kernel-AIcoreEngine-is-unsupported.md)** +- **[Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported](#Op-type-SigmoidCrossEntropyWithLogitsV2-of-ops-kernel-AIcoreEngine-is-unsupportedmd)** -- **[Hook失败](#Hook失败.md)** +- **[Hook失败](#Hook失败md)** -- **[加载权重时遇到报错“load state\_dict error.”](#加载权重时遇到报错-load-state_dict-error.md)** +- **[加载权重时遇到报错“load state\_dict error.”](#加载权重时遇到报错-load-state_dict-errormd)** -

cuda流同步操作报错

+

cuda流同步操作报错

-## 现象描述 +##### 现象描述 ![](figures/model_faq11_20210728.jpg) -## 可能原因 +##### 可能原因 npu未使用npu的流同步方法。 -## 处理方法 +##### 处理方法 使用NPU的流同步方法: @@ -4045,17 +4045,17 @@ stream = torch.npu.current_stream() stream.synchronize() ``` -

aicpu\_kernels/libpt\_kernels.so不存在

+

aicpu\_kernels/libpt\_kernels.so不存在

-## 现象描述 +##### 现象描述 ![](figures/FAQ13.png) -## 可能原因 +##### 可能原因 未导入AICPU。 -## 处理方法 +##### 处理方法 导入AICPU(以root用户安装Toolkit软件包,安装路径为默认路径为例): @@ -4063,17 +4063,17 @@ stream.synchronize() export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest ``` -

使用npu-smi info查看显存时发现python进程残留

+

使用npu-smi info查看显存时发现python进程残留

-## 现象描述 +##### 现象描述 ![](figures/FAQ14.png) -## 可能原因 +##### 可能原因 python进程残留,需要kill。 -## 处理方法 +##### 处理方法 终止python进程: @@ -4081,40 +4081,40 @@ python进程残留,需要kill。 pkill -9 python ``` -

动态shape报错“match op inputs failed”

+

动态shape报错“match op inputs failed”

-## 现象描述 +##### 现象描述 ![](figures/FAQ15.png) -## 可能原因 +##### 可能原因 PTIndexPut编译的算子和输入的shape不一致, 并有acl\_dynamic\_shape\_op打头的日志字样,确定为动态shape报错。 -## 处理方法 +##### 处理方法 PTIndexPut对应tensor\[indices\] = value,需要在代码中找到对应的地方将动态shape修改为固定shape。 -

Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported

+

Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported

-## 现象描述 +##### 现象描述 ``` [ERROR] GE(24836,python3.7):2021-01-27-18:27:51.562.111 [../../../../../../graphengine/ge/engine_manager/dnnengine_manager.cc:266]25155 GetDNNEngineName: ErrorNo: 1343242282(assign engine failed) GetDNNEngineName:Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported, reason:Op SigmoidCrossEntropyWithLogitsV2 not supported reason: The type of this op is not found in op store, check whether the op store has this type of op. Op store name is tbe-custom. The dtype, format or shape of input in op desc is not supported in op store, check the dtype, format or shape of input between the op store and the graph. Op store name is tbe-builtin. ``` -## 可能原因 +##### 可能原因 SigmoidCrossEntropyWithLogitsV2算子输入了不支持的数据类型,可能是输入int64类型导致的错误。 -## 处理方法 +##### 处理方法 检查对应python代码中输入的数据类型,并修改。 -

Hook失败

+

Hook失败

-## 现象描述 +##### 现象描述 ``` Traceback (most recent call last): @@ -4139,11 +4139,11 @@ Traceback (most recent call last): StopIteration ``` -## 可能原因 +##### 可能原因 mmdet的loss部分结构触发了pytorch原生hook的bug,导致死循环。 -## 处理方法 +##### 处理方法 解决方案是在/usr/local/python3.7.5/lib/python3.7/site-packages/torch/nn/modules/module.py这个文件的658行加上try跳过: @@ -4168,19 +4168,19 @@ if len(self._backward_hooks) > 0: return result ``` -

加载权重时遇到报错“load state\_dict error.”

+

加载权重时遇到报错“load state\_dict error.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ18.png) ![](figures/FAQ18-1.png) -## 可能原因 +##### 可能原因 模型训练后保存的state\_dict的key值与加载时state\_dict的key值不一致,保存时会在每个key的最前面多一个module前缀。 -## 处理方法 +##### 处理方法 加载权重时先遍历state\_dict字典,修改key值,并使用新建的字典,具体用例参考demo.py。 @@ -4197,38 +4197,38 @@ return result model.load_state_dict(state_dict) ``` -

模型分布式训练常见问题

+

模型分布式训练常见问题

-- **[在进行模型分布式训练时遇到报错“host not found.”](#在进行模型分布式训练时遇到报错-host-not-found.md)** +- **[在进行模型分布式训练时遇到报错“host not found.”](#在进行模型分布式训练时遇到报错-host-not-foundmd)** -- **[在进行模型分布式训练时遇到报错“RuntimeError:connect\(\) timed out.”](#在进行模型分布式训练时遇到报错-RuntimeError-connect()-timed-out.md)** +- **[在进行模型分布式训练时遇到报错“RuntimeError:connect\(\) timed out.”](#在进行模型分布式训练时遇到报错-RuntimeError-connect()-timed-outmd)** -

在进行模型分布式训练时遇到报错“host not found.”

+

在进行模型分布式训练时遇到报错“host not found.”

-## 现象描述 +##### 现象描述 ![](figures/FAQ19.png) -## 可能原因 +##### 可能原因 对模型进行分布式训练时,会调用集合通信模块HCCL,需要根据实际情况设置IP和端口信息。根据报错信息,确定是IP地址设置错误。 -## 处理方法 +##### 处理方法 在运行脚本中设置正确的IP地址,对于单机情况,设置为本机的IP地址即可;对于多机情况,每个服务器上脚本中的IP需要设置为master节点的IP。 -

在进行模型分布式训练时遇到报错“RuntimeError:connect\(\) timed out.”

+

在进行模型分布式训练时遇到报错“RuntimeError:connect\(\) timed out.”

-## 现象描述 +##### 现象描述 ![](figures/1234.png) -## 可能原因 +##### 可能原因 模型进行分布式训练时,系统防火墙可能会阻截HCCL的集合通信端口的通信。需要根据报错信息,排查通信端口的开放情况,并进行相应设置。 -## 处理方法 +##### 处理方法 查询出被系统防火墙阻截的集合通信端口,并开放相应端口。