From 78f946c17de8916864b4cc95bd637b75dcd768e4 Mon Sep 17 00:00:00 2001 From: liuquan Date: Mon, 1 Nov 2021 18:37:42 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=96=B0=E5=A2=9E:IR=E6=98=A0=E5=B0=84TBE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\273\203\346\214\207\345\215\227.md" | 98 +++++++++++++++++-- 1 file changed, 92 insertions(+), 6 deletions(-) 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 5f125b6d8b0..913376c9112 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,7 +1,7 @@ # PyTorch网络模型移植&训练指南 -- [概述](#概述md) +- [概述](#概述) - [约束与限制](#约束与限制md) -- [迁移流程](#迁移流程md) +- [迁移流 程](#迁移流程md) - [模型移植评估](#模型移植评估md) - [环境准备](#环境准备md) - [模型迁移](#模型迁移md) @@ -1650,9 +1650,9 @@ def main(): ###### 约束说明 -- 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5md); -- 本功能只提供IR级别的算子溢出检测,且只支持AICORE,不支持Atomic; -- 须在PyTorch源代码“build.sh“文件中添加“USE\_DUMP=1”字段。 +- 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5md)。 +- 本功能只提供IR级别的算子溢出检测,且只支持AICORE,不支持Atomic。 +- 须在PyTorch源代码“build.sh“文件中添加“USE\_DUMP=1”字段。 ``` 修改前: DEBUG=0 USE_DISTRIBUTED=1 USE_HCCL=1 USE_MKLDNN=0 USE_CUDA=0 USE_NPU=1 BUILD_TEST=0 USE_NNPACK=0 python3 setup.py build bdist_wheel @@ -1680,7 +1680,93 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load ###### 解决方法 -请将算子溢出的打印截图及采集到的.h5文件通过Issue附件形式反馈给华为开发人员。 +1. 将采集到的.h5文件映射到TBE算子,映射方法请参见[IR与TBE算子映射](#IR与TBE算子映射)。 + +2. 请将算子溢出的打印截图及映射后的TBE算子输入输出文件通过Issue附件形式反馈给华为开发人员。 + +##### IR与TBE算子映射 + +###### 前提条件 + +- 开启PyTorch框架dump功能。 + + 在PyTorch源代码 “build.sh“ 文件中添加“USE\_DUMP=1”字段,编译安装PyTorch框架。 + +- 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5md)。 +- 设置环境变量`export ACL_DUMP_DATA=0`。 +- 在脚本中避免使用`torch.npu.init.dump()`和`torch.npu.set.dump()`接口。 + +###### 操作步骤 + +1. 准备好需要映射的算子.h5文件。 + + - 算子溢出检测场景下,单算子溢出检测已生成需要映射的算子.h5文件。 + + - 精度对比场景下,需根据精度对比结果,参照下面命令提取需要映射的算子.h5文件。 + + ``` + h5copy -pv -i "./input.h5" -o "./output.h5" -s "/op1/seqid/" -d "/op1/seqid/" + ``` + + -i 为输入精度对比结果的后文件路径 + + -o 为输出需要映射的算子.h5文件路径 + + -s 为需要提取的源算子名称及seqid + + -d 为需要提取的目的算子名称及seqid + + 若需要提取多个算子,则修改-s、-d参数,多次执行该命令,可以把多算子追加提取到output.h5中。 + + 该命令需-s和-d参数相同。 + + 示例: + + ``` + h5copy -pv -i "./dump_npu.h5" -o "./output.h5" -s "/numpy_T/1/" -d "/numpy_T/1/" + ``` + + 该示例表示从“./dump_npu.h5”中抽取seqid为1的numpy_T算子的输入、输出数据到"./output.h5"文件中。 + +2. 配置acl.json文件。 + + 在模型目录下创建acl dump功能所需的的配置文件acl.json + + ``` + { + "dump": + { + "dump_list":[] + "dump_path":"./oupput_IR2TBE"# 映射结果输出路径 + "dump_mode":"all" + "dump_op_switch":"on" + } + + } + ``` + + 需将`dump_path`修改为结果输出路径,其他字段不需要修改。 + +3. 修改训练脚本。 + + 在训练脚本中添加`with`语句开启IR映射TBE功能。 + + ```python + with torch.utils.dumper(use_load=True, dump_path="./",load_file_path="./output.h5", load_with_acl_dump=True) as dump: + # 模型计算代码,此处省略 + ``` + +4. 模型运行。 + + 运行一步完整的模型计算过程,在计算过程中load遇到output.h5中的数据后,自动开启acl dump功能,执行IR,并dump出IR相对应的TBE算子的输入输出数据,IR执行结束,acl dump结束。 + +5. 获得映射文件。 + + 运行成功后,在acl.json配置文件中的`dump_path`路径下查看输出结果文件。 + + + +
整网调测
-- Gitee From ca59aaf3c625645f6fadb42e04bf652b917a1e8d Mon Sep 17 00:00:00 2001 From: liuquan Date: Mon, 1 Nov 2021 18:42:41 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5&\350\256\255\347\273\203\346\214\207\345\215\227.md" | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 913376c9112..5f92889a765 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,7 +1,7 @@ # PyTorch网络模型移植&训练指南 -- [概述](#概述) +- [概述](#概述md) - [约束与限制](#约束与限制md) -- [迁移流 程](#迁移流程md) +- [迁移流程](#迁移流程md) - [模型移植评估](#模型移植评估md) - [环境准备](#环境准备md) - [模型迁移](#模型迁移md) @@ -1764,10 +1764,6 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load 运行成功后,在acl.json配置文件中的`dump_path`路径下查看输出结果文件。 - - - -
整网调测
用户也可通过分析整个网络的方式来进行网络模型的精度调测。 -- Gitee From ba0cdcc6f55d342aa12a548aa733636d76a12429 Mon Sep 17 00:00:00 2001 From: liuquan Date: Wed, 10 Nov 2021 16:46:54 +0800 Subject: [PATCH 3/6] =?UTF-8?q?profiler=20=E6=96=B0=E5=A2=9E=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\273\203\346\214\207\345\215\227.md" | 109 +++++++++++++----- 1 file changed, 81 insertions(+), 28 deletions(-) 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 5f92889a765..2c543fdf6d5 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" @@ -1155,48 +1155,101 @@ def main(): 请参见以下方式进行profiling数据的获取,并根据实际情况选择需要的数据采集方式。 -- PyTorch层面Profiling数据采集。 - 1. 获取chrome\_trace文件。 +- PyTorch层面Profiling数据采集。 + 1. 获取chrome\_trace文件。 - 使用profile接口对原始代码的loss计算和优化过程进行改造。 + 使用profile接口对原始代码的loss计算和优化过程进行改造。 + ``` + # 使用ascend-pytorch适配的profile接口,即可获得,推荐只运行一个step + with torch.autograd.profiler.profile(use_npu=True) as prof: + out = model(input_tensor) + loss=loss_func(out) + loss.backward() + optimizer.zero_grad() + optimizer.step() + # 打印profiler结果信息 + print(prof) + # 导出chrome_trace文件到指定路径 + output_path = '/home/HwHiAiUser/profile_data.json' + prof.export_chrome_trace(output_path) + ``` + + 2. 运行成功后会打印出profiler结果信息。 + + 打印结果包含CPU和NPU的耗时等相关信息,详细信息参见[表2](#表2 profiler结果字段表)。 + + **表2** profiler结果字段表 + + | Name | Self CPU % | Self CPU | CPU total % | CPU total | CPU time avg | Self NPU % | Self NPU | NPU total | NPU time avg | # of Calls | + | ---- | ---------- | -------- | ----------- | --------- | ------------ | ---------- | -------- | --------- | ------------ | :--------: | + + 3. 查看chrome\_trace文件。 + + chrome\_trace文件可以通过以下方式打开查看:在Chrome浏览器 中输入“chrome://tracing“地址,然后将落盘文件拖到空白处即可打开文件内容,通过键盘W、A、S、D键,可以对profiler的结果进行缩放和移动。 + + 4. profiler其他功能。 + - 获取算子输入tensor的shape信息。 + + ```python + # 添加record_shapes参数,获取算子输入tensor的shape信息 + with torch.autograd.profiler.profile(use_npu=True, record_shapes=True) as prof: + # 添加模型计算过程 + print(prof) ``` - # 使用ascend-pytorch适配的profile接口,即可获得,推荐只运行一个step - with torch.autograd.profiler.profile(use_npu=True) as prof: - out = model(input_tensor) - loss=loss_func(out) - loss.backward() - optimizer.zero_grad() - optimizer.step() + + 打印结果中增加了每个算子的`Input Shape`信息。 + + - 获取使用NPU的内存信息。 + + ```python + # 添加profile参数,获取算子内存占用信息 + with torch.autograd.profiler.profile(use_npu=True, profile_memory=True) as prof: + # 添加模型计算过程 + print(prof) + ``` + + 打印结果中增加了每个算子的`CPU Mem`、`Self CPU Mem`、`NPU Mem`、`Self NPU Mem`信息。 + + >![](public_sys-resources/icon-note.gif) **说明:** + > + >该功能仅支持PyTorch1.8版本以上。 + + - 获取简洁的算子性能信息。 + + 该功能只打印每个算子栈最底层的算子信息,使分析结果更简洁。 + + ```python + # 添加use_npu_simple参数,获取简洁的算子信息 + with torch.autograd.profiler.profile(use_npu=True, use_npu_simple=True) as prof: + # 添加模型计算过程 # 导出chrome_trace文件到指定路径 output_path = '/home/HwHiAiUser/profile_data.json' prof.export_chrome_trace(output_path) ``` - 2. 查看chrome\_trace文件。 + 在Chrome浏览器中打开chrome\_trace结果文件,可查看简洁的算子性能信息。 - chrome\_trace文件可以通过以下方式打开查看:在Chrome浏览器中输入“chrome://tracing“地址,然后将落盘文件拖到空白处即可打开文件内容,通过键盘W、A、S、D键,可以对profiler的结果进行缩放和移动。 +- CANN层面Profiling数据采集。 + 1. 获取性能数据文件。 -- CANN层面Profiling数据采集。 - 1. 获取性能数据文件。 + ``` + profiler_result_path = "/home/profiling_data" # profiling 数据保存的文件夹,需提前手动创建,请根据实际指定。 + with torch.npu.profile(profiler_result_path): + out = model(input_tensor) + loss=loss_func(out,target) + loss.backward() + optimizer.zero_grad() + optimizer.step() + ``` - ``` - profiler_result_path = "/home/profiling_data" # profiling 数据保存的文件夹,需提前手动创建,请根据实际指定。 - with torch.npu.profile(profiler_result_path): - out = model(input_tensor) - loss=loss_func(out,target) - loss.backward() - optimizer.zero_grad() - optimizer.step() - ``` - - >![](public_sys-resources/icon-note.gif) **说明:** - >获取性能数据文件时,model、input\_tensor、target需要下发到npu上。 + >![](public_sys-resources/icon-note.gif) **说明:** + >获取性能数据文件时,model、input\_tensor、target需要下发到npu上。 - 2. 解析性能数据文件。 + 2. 解析性能数据文件。 - 请参见《CANN 开发辅助工具指南》中“Profiling工具使用指南(训练)”章节。 + 请参见《CANN 开发辅助工具指南》中“Profiling工具使用指南(训练)”章节。 -- Gitee From 62c4f91fff7f90313041d25c60da6b5339eff16e Mon Sep 17 00:00:00 2001 From: liuquan Date: Wed, 10 Nov 2021 17:17:15 +0800 Subject: [PATCH 4/6] modify format --- ...55\347\273\203\346\214\207\345\215\227.md" | 267 +++++++----------- 1 file changed, 98 insertions(+), 169 deletions(-) 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 2c543fdf6d5..f998981726e 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,97 +1,25 @@ # PyTorch网络模型移植&训练指南 + - [概述](#概述md) - [约束与限制](#约束与限制md) - [迁移流程](#迁移流程md) - [模型移植评估](#模型移植评估md) - [环境准备](#环境准备md) - [模型迁移](#模型迁移md) - - [工具迁移](#工具迁移md) - - [功能介绍](#功能介绍md) - - [操作指南](#操作指南md) - - [结果解析](#结果解析md) - - [手工迁移](#手工迁移md) - - [单P训练模型迁移](#单P训练模型迁移md) - - [多P训练模型迁移](#多P训练模型迁移md) - - [PyTorch接口替换](#PyTorch接口替换md) - - [混合精度](#混合精度md) - [模型训练](#模型训练md) - [性能调优和分析](#性能调优和分析md) - - [前提条件](#前提条件md) - - [调测过程](#调测过程md) - - [总体思路](#总体思路md) - - [采集训练过程相关数据](#采集训练过程相关数据md) - - [host侧性能优化](#host侧性能优化md) - - [概述](#概述-0md) - - [修改CPU性能模式(X86服务器)](#修改CPU性能模式X86服务器md) - - [修改CPU性能模式(ARM服务器)](#修改CPU性能模式ARM服务器md) - - [安装高性能pillow库(X86服务器)](#安装高性能pillow库X86服务器md) - - [(可选)安装指定版本OpenCV库](#可选安装指定版本OpenCV库md) - - [训练过程性能优化](#训练过程性能优化md) - - [亲和库](#亲和库md) - - [来源介绍](#来源介绍md) - - [功能介绍](#功能介绍-1md) - [精度调测](#精度调测md) - - [前提条件](#前提条件-2md) - - [调测过程](#调测过程-3md) - - [总体思路](#总体思路-4md) - - [精度调优方法](#精度调优方法md) - - [单算子溢出检测](#单算子溢出检测md) - - [整网调测](#整网调测md) - [模型保存与转换](#模型保存与转换md) - - [简介](#简介md) - - [模型保存](#模型保存md) - - [导出ONNX模型](#导出ONNX模型md) - [样例说明](#样例说明md) - [ResNet50模型迁移示例](#ResNet50模型迁移示例md) - - [样例获取](#样例获取md) - - [训练脚本迁移](#训练脚本迁移md) - - [单P训练修改](#单P训练修改md) - - [分布式训练修改](#分布式训练修改md) - - [脚本执行](#脚本执行md) - [ShuffleNet模型调优示例](#ShuffleNet模型调优示例md) - - [样例获取](#样例获取-5md) - - [模型评估](#模型评估md) - - [网络迁移](#网络迁移md) - - [网络调测](#网络调测md) - [参考信息](#参考信息md) - - [单算子样例编写说明](#单算子样例编写说明md) - - [单算子dump方法](#单算子dump方法md) - - [常用环境变量说明](#常用环境变量说明md) - - [dump op方法](#dump-op方法md) - - [编译选项设置](#编译选项设置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) - - [在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): 0 INTERNAL ASSERT”](#在模型运行时遇到报错-terminate-called-after-throwing-an-instance-of-c10-Error-what-0-INTERNAL-ASSERTmd) - - [在模型运行时遇到报错“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-6md) - - [在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭export-TASK_QUEUE_ENABLE-0后仍然遇到报错-HelpACLExecutemd) - - [在模型运行时遇到报错“55056 GetInputConstDataOut: ErrorNo: -1\(failed\)”](#在模型运行时遇到报错-55056-GetInputConstDataOut-ErrorNo--1failedmd) - [模型调测常见问题](#模型调测常见问题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处理器的方案为在线对接方案。 @@ -1177,7 +1105,7 @@ def main(): 2. 运行成功后会打印出profiler结果信息。 - 打印结果包含CPU和NPU的耗时等相关信息,详细信息参见[表2](#表2 profiler结果字段表)。 + 打印结果包含CPU和NPU的耗时等相关信息,详细信息参见 [表2](#表2 profiler结果字段表) 。 **表2** profiler结果字段表 @@ -2800,6 +2728,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # **表 2** 整网排查 +

序号

time(ms)

@@ -3046,26 +2975,26 @@ Python侧优化主要是通过一些同等语义的修改,使网络在NPU上 return out ``` -- 同等语义改写。 - -``` -def channel_shuffle_index_select(x, groups=2): - N, C, H, W = x.shape - inp = C - # channel_shuffle操作是对C维按一定规则的重排的工作,可以被表达为一次简单的重排 - group_len = inp // groups - index = torch.from_numpy(np.array(list(range(inp))).reshape(groups, group_len).transpose(1, 0).flatten()).long() - - x = x.index_select(1, index) - return x - -# 对两个操作进行结果对比,可以看到语义是相等的 -x = torch.randn(2, 232, 14, 14) -for group in [2, 4, 8]: - out1 = channel_shuffle(x, group) - out2 = channel_shuffle_index_select(x, group) - print((out1 - out2).sum()) -``` +- 同等语义改写。 + + ``` + def channel_shuffle_index_select(x, groups=2): + N, C, H, W = x.shape + inp = C + # channel_shuffle操作是对C维按一定规则的重排的工作,可以被表达为一次简单的重排 + group_len = inp // groups + index = torch.from_numpy(np.array(list(range(inp))).reshape(groups, group_len).transpose(1, 0).flatten()).long() + + x = x.index_select(1, index) + return x + + # 对两个操作进行结果对比,可以看到语义是相等的 + x = torch.randn(2, 232, 14, 14) + for group in [2, 4, 8]: + out1 = channel_shuffle(x, group) + out2 = channel_shuffle_index_select(x, group) + print((out1 - out2).sum()) + ``` - 昇腾AI处理器亲和写法。 @@ -3672,15 +3601,15 @@ ACL_OP_COMPILER_CACHE_DIR:用于配置算子编译磁盘缓存的目录。该

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

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

在模型运行或者算子运行时遇到报错“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:”

-##### 现象描述 +**现象描述** ![](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:”

-##### 现象描述 +**现象描述** ![](figures/FAQ3.png) -##### 可能原因 +**可能原因** 目前HelpACLExecute的报错信息无法直接找到报错位置,此处在task任务下发时报错,是由于开启了TASK多线程下发(export TASK\_QUEUE\_ENABLE=1),上层封装了报错信息,导致无法获取更加详细的报错日志。 -##### 处理方法 +**处理方法** 可通过如下两种方式处理: @@ -3765,7 +3694,7 @@ pip3.7 install pillow==5.3.0安装失败。

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

-##### 现象描述 +**现象描述** ``` import torch @@ -3792,11 +3721,11 @@ if __name__ == "__main__": ![](figures/zh-cn_image_0000001208897433.png) -##### 可能原因 +**可能原因** 在运行backward运算后,通过set\_decice\(\)方法手动设置device设备,导致报错。在运行backward运算时,若没有设置device,程序会自动默认初始化device为0,相当于执行了set\_device\("npu:0"\)。由于目前不支持切换device进行计算,若再通过set\_decice\(\)方法手动设置device设备,则可能出现该错误。 -##### 处理方法 +**处理方法** 在运行backward运算前,通过set\_decice\(\)方法手动设置device。修改如下。 @@ -3809,25 +3738,25 @@ if __name__ == "__main__":

在模型运行时遇到报错“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.”

-##### 现象描述 +**现象描述** ![](figures/FAQ9.png) -##### 可能原因 +**可能原因** 根据报错信息,初步判断为npu设备初始化错误。进一步查找host日志报错信息如下: @@ -3835,7 +3764,7 @@ if __name__ == "__main__": 根据日志信息定位报错原因为系统在拉起npu设备时报错。 -##### 处理方法 +**处理方法** 可通过以下步骤解决该问题。 @@ -3861,15 +3790,15 @@ if __name__ == "__main__":

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

-##### 现象描述 +**现象描述** ![](figures/FAQ10.png) -##### 可能原因 +**可能原因** pytorch内调用npu类型算子时,强依赖于te、cce、tvm组件,pytorch、CANN/nnae和te版本需要一致。在更新CANN/nnae后,te等组件不会自动更新,当版本不匹配时,则会出现该报错。 -##### 处理方法 +**处理方法** 更新te等组件版本,具体需要更新te-_\*.whl和topi-\*_.whl安装包。在安装的CANN或者nnae的lib64子目录下(以root安装用户为例:默认安装路径在/usr/local/Ascend/ascend-toolkit/latest/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。 @@ -3877,7 +3806,7 @@ pytorch内调用npu类型算子时,强依赖于te、cce、tvm组件,pytorch

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

-##### 现象描述 +**现象描述** 脚本: @@ -3926,7 +3855,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和日志报错信息,两者报错信息不匹配。 @@ -3934,7 +3863,7 @@ shell报错是在同步操作中和AI CPU错误,而日志报错信息却是在 报错信息滞后可能是由于AI CPU算子的异步执行,导致报错信息滞后。 -##### 处理方法 +**处理方法** 对于该报错需要根据实际的错误来定位,可参考如下步骤进行处理: @@ -3946,7 +3875,7 @@ shell报错是在同步操作中和AI CPU错误,而日志报错信息却是在

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

-##### 现象描述 +**现象描述** 脚本: @@ -3995,7 +3924,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和日志报错信息,两者报错信息不匹配。 @@ -4003,7 +3932,7 @@ shell报错是在同步操作中和ai cpu错误,而日志报错信息却是在 报错信息滞后可能是由于AI cpu算子的异步执行,导致报错信息滞后。 -##### 处理方法 +**处理方法** 对于该报错需要根据实际的错误来定位,可参考如下步骤进行处理: @@ -4015,15 +3944,15 @@ shell报错是在同步操作中和ai cpu错误,而日志报错信息却是在

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

-##### 现象描述 +**现象描述** ![](figures/FAQ8.png) -##### 可能原因 +**可能原因** pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子。由于在上层报错信息显示为HelpACLExecute. 时,内部也正在对报错信息与日志进行完善,导致部分算子发生错误时,报错信息获取异常。 -##### 处理方法 +**处理方法** 查看host日志,确定报错算子和位置,日志默认路径为/var/log/npu/slog/host-0。查找对应时间的log文件,搜索ERROR字段,查找错误信息。如对上述的错误,查询日志中的ERROR字段为: @@ -4035,17 +3964,17 @@ pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子

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

-##### 现象描述 +**现象描述** 模型训练过程中,查看host训练日志(路径:“/root/ascend/log/plog/“),可能出现如下报错信息。 ![](figures/20210720-102720(WeLinkPC).png) -##### 可能原因 +**可能原因** 该报错信息是由于调用某一公共API接口导致。 -##### 处理方法 +**处理方法** 该报错信息不影响训练功能与性能,可忽略该报错信息。 @@ -4062,45 +3991,45 @@ pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子

在模型调测时遇到报错“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.”

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

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

-##### 现象描述 +**现象描述** ![](figures/FAQ6.png) ![](figures/FAQ6-1.png) -##### 可能原因 +**可能原因** 在模型搭建中,算子输入参数是多样的。某些算子(如MaxPoolGradWithArgmaxV1算子和max算子)在特定参数下,计算报错或者不支持,根据报错信息可以定位到具体算子。 -##### 处理方法 +**处理方法** 根据报错信息定位到具体算子,解决步骤如下: @@ -4118,15 +4047,15 @@ pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子

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

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

cuda流同步操作报错

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

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

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

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

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

动态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

-##### 现象描述 +**现象描述** ``` [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失败

-##### 现象描述 +**现象描述** ``` Traceback (most recent call last): @@ -4260,11 +4189,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跳过: @@ -4291,17 +4220,17 @@ return result

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

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

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

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

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

-##### 现象描述 +**现象描述** ![](figures/1234.png) -##### 可能原因 +**可能原因** 模型进行分布式训练时,系统防火墙可能会阻截HCCL的集合通信端口的通信。需要根据报错信息,排查通信端口的开放情况,并进行相应设置。 -##### 处理方法 +**处理方法** 查询出被系统防火墙阻截的集合通信端口,并开放相应端口。 -- Gitee From 3a1a239c76b1e2ec6b46625efb7a17bd288df80e Mon Sep 17 00:00:00 2001 From: liuquan Date: Wed, 10 Nov 2021 17:34:32 +0800 Subject: [PATCH 5/6] modify format --- ...55\347\273\203\346\214\207\345\215\227.md" | 119 ++++++------------ 1 file changed, 39 insertions(+), 80 deletions(-) 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 f998981726e..0af73780b0c 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" @@ -24,7 +24,7 @@ 当前阶段针对PyTorch框架实现的对接适配昇腾AI处理器的方案为在线对接方案。 -### 方案特性及优点 +**方案特性及优点** 昇腾AI处理器的加速实现方式是以各种算子为粒度进行调用(OP-based),即通过AscendCL调用一个或几个D亲和算子组合的形式,代替原有GPU的实现方式。其逻辑模型如[图1](#fig2267112413239)所示。 @@ -149,27 +149,14 @@

模型迁移

-- **[工具迁移](#工具迁移md)** - -- **[手工迁移](#手工迁移md)** - -- **[混合精度](#混合精度md)** -

工具迁移

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

功能介绍

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

操作指南

-##### 参数说明 +**参数说明** **表 1** 参数说明 @@ -547,8 +533,7 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 - -##### 自定义规则文件 +**自定义规则文件** 自定义转换规则样例如下: @@ -641,8 +626,7 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 - -##### 执行转换 +**执行转换** 1. 进入脚本转换工具所在路径。 @@ -676,12 +660,6 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训

手工迁移

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

单P训练模型迁移

@@ -942,7 +920,7 @@ def main():

混合精度

-#### 概述 +**概述** 基于NPU芯片的架构特性,会涉及到混合精度训练,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下好处: @@ -957,7 +935,7 @@ def main(): - Apex在混合精度运算过程中,会对模型的grad进行运算。开启combine\_grad开关,可以加速这些运算。具体为将amp.initialize\(\)接口参数combine\_grad设置为True; - 适配后的Apex针对adadelta/adam/sgd/lamb做了昇腾AI处理器亲和性优化,得到的NPU融合优化器与原生算法保持一致,但运算速度更快。使用时只需将原有优化器替换为apex.optimizers.\*(“\*”为优化器名称,例如NpuFusedSGD)。 -#### 特性支持 +**特性支持** 混合精度模块功能和优化描述如[表1](#table10717173813332)所示。 @@ -997,7 +975,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,代码如下: @@ -1040,12 +1018,6 @@ def main():

性能调优和分析

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

前提条件

@@ -1077,7 +1049,7 @@ def main():

采集训练过程相关数据

-##### Profiling数据采集 +**Profiling数据采集** 当模型训练过程中吞吐量指标不达标时,可以通过采集训练过程中的profiling数据,分析哪个环节、哪个算子导致的性能消耗。Profiling数据采集分为PyTorch层面和CANN层面的采集,PyTorch层面采集的是PyTorch API的数据,CANN层面采集的是TBE算子的数据。 @@ -1181,7 +1153,7 @@ def main(): -##### 获取算子信息OP\_INFO +**获取算子信息OP\_INFO** 网络模型最终是以OP执行的,通过OPInfo日志,我们可以获取实际执行时的算子及其属性。通过get\_ascend\_op\_info.py脚本获取。 @@ -1271,7 +1243,7 @@ def main():
修改CPU性能模式(X86服务器)
-###### 设置电源策略为高性能模式 +**设置电源策略为高性能模式** 提升网络性能需要在X86服务器BIOS设置中将电源策略设为高性能模式,具体操作如下。 @@ -1298,7 +1270,7 @@ def main(): 6. 按下“F10”保存配置并重启服务器。 -###### 将CPU设置为performance模式 +**将CPU设置为performance模式** 请使用root用户执行如下操作。 @@ -1378,7 +1350,7 @@ def main():
修改CPU性能模式(ARM服务器)
-###### 设置电源策略为高性能模式 +**设置电源策略为高性能模式** 在某些对Host侧CPU要求较高的模型中,例如目标检测类模型,需要进行较为复杂的图像预处理,开启电源高性能模式能一定程度上提高性能和稳定性。ARM服务器提升网络性能需要在BIOS设置中将电源策略设为高性能模式,具体操作如下。 @@ -1465,7 +1437,7 @@ def main():

训练过程性能优化

-##### 算子瓶颈优化 +**算子瓶颈优化** 1. 获取训练过程中的Profiling数据,参见[Profiling数据采集](#采集训练过程相关数据md)。 2. 分析Profiling数据,得到耗时较大的算子。 @@ -1473,8 +1445,7 @@ def main(): - 规避方案:使用同等语义其他高效算子替代。 - 解决方案:改进算子性能。 - -##### copy瓶颈优化 +**copy瓶颈优化** 1. 获取训练过程中的Profiling数据,参见[Profiling数据采集](#采集训练过程相关数据md)。 2. 分析Profiling数据分析整网中的D2DCopywithStreamSynchronize/PTCopy/format\_contiguous的耗时。 @@ -1482,8 +1453,7 @@ def main(): - 方案一:(规避方案)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)。 2. 分析OP\_INFO中算子的规格和调用关系,定位是否插入了多余的算子,重点关注transdata是否合理。 @@ -1497,8 +1467,7 @@ def main(): - Conv2D相关:Weight 可设置为FZ格式,如第424行。 - Linear相关的参数,可设置为NZ格式,如第409行。 - -##### 编译瓶颈优化 +**编译瓶颈优化** 1. 获取训练过程中算子信息OP\_INFO,参见[获取算子信息OP\_INFO](#采集训练过程相关数据md)。 2. 查看INFO日志,观察第一个step以后的aclopCompile::aclOp关键字,如果后续接了Match op inputs/type failed或To compile op则说明该算子存在动态编译,需要优化。 @@ -1510,10 +1479,6 @@ def main():

亲和库

-- **[来源介绍](#来源介绍md)** - -- **[功能介绍](#功能介绍-1md)** -

来源介绍

@@ -1566,10 +1531,6 @@ def main():

精度调测

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

前提条件

@@ -1629,7 +1590,7 @@ def main(): 用户通过算子溢出检测功能检测算子是否有溢出,然后采集溢出算子的数据,从而帮助开发人员快速定位并解决算子精度问题。 -###### 约束说明 +约束说明: - 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5md)。 - 本功能只提供IR级别的算子溢出检测,且只支持AICORE,不支持Atomic。 @@ -1644,7 +1605,7 @@ def main(): - 使用单算子溢出检测功能时,请不要同时开启apex的动态loss scale模式和使用tensor融合功能。 -###### 采集溢出算子数据 +采集溢出算子数据: ``` # check_overflow为溢出检测控制开关 @@ -1655,19 +1616,19 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load 模型运行过程中,如果有算子溢出,会打印出相应IR的名字。 -###### 查看Dump数据 +查看Dump数据: 如果训练过程中采集到了Dump数据,则会在\{dump\_path\}路径下生成dump数据的.h5文件,用户可进入路径自行查看。 -###### 解决方法 +解决方法: 1. 将采集到的.h5文件映射到TBE算子,映射方法请参见[IR与TBE算子映射](#IR与TBE算子映射)。 2. 请将算子溢出的打印截图及映射后的TBE算子输入输出文件通过Issue附件形式反馈给华为开发人员。 -##### IR与TBE算子映射 +**IR与TBE算子映射** -###### 前提条件 +前提条件: - 开启PyTorch框架dump功能。 @@ -1677,7 +1638,7 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load - 设置环境变量`export ACL_DUMP_DATA=0`。 - 在脚本中避免使用`torch.npu.init.dump()`和`torch.npu.set.dump()`接口。 -###### 操作步骤 +操作步骤: 1. 准备好需要映射的算子.h5文件。 @@ -1903,11 +1864,11 @@ Pytorch在训练过程中,通常使用torch.save\(\)来保存Checkpoint文件

导出ONNX模型

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

样例获取

-##### 样例获取 +样例获取 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**。 @@ -2042,7 +2003,7 @@ if __name__ == "__main__": -##### 目录结构 +目录结构 主要文件目录结构如下所示: @@ -2553,15 +2514,15 @@ if __name__ == "__main__":

脚本执行

-##### 准备数据集 +**准备数据集** 准备数据集并上传到运行环境的目录下,例如:/home/data/resnet50/imagenet -##### 配置环境变量 +**配置环境变量** 请参考[配置环境变量](#zh-cn_topic_0000001144082004md)配置环境变量。 -##### 执行命令 +**执行命令** 例如: @@ -2615,7 +2576,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ #

样例获取

-##### 样例获取 +**样例获取** 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。 @@ -2627,8 +2588,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # >![](public_sys-resources/icon-note.gif) **说明:** >ShuffleNet为PyTorch内置模型,了解更多内置模型请前往[Pytorch官网](https://pytorch.org/)。 - -##### 目录结构 +**目录结构** 主要文件目录结构如下所示: @@ -2648,7 +2608,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # 网络调测具体方法请参见[调测过程](#调测过程md)。经排查ShuffleNet运行时相关算子耗时过大,以下给出耗时数据及解决方法。 -##### 前向排查 +**前向排查** 前向排查记录表如下: @@ -2721,7 +2681,7 @@ python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # - 设置weight初始化格式避免计算过程中反复的transdata,如[copy瓶颈优化](#训练过程性能优化md)所描述框架瓶颈。 - 修复了DWCONV weight输出格式指定,避免一些不必要5HD-\>4D。 -##### 整网排查 +**整网排查** 整网排查记录表如下: @@ -2908,8 +2868,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)。 -- Gitee From 3a36da0345517e111268f067b207c833e54fee7a Mon Sep 17 00:00:00 2001 From: liuquan Date: Sat, 13 Nov 2021 17:44:27 +0800 Subject: [PATCH 6/6] modify IR2TBE --- ...50\256\255\347\273\203\346\214\207\345\215\227.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 0af73780b0c..73bc7283119 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" @@ -1077,7 +1077,7 @@ def main(): 2. 运行成功后会打印出profiler结果信息。 - 打印结果包含CPU和NPU的耗时等相关信息,详细信息参见 [表2](#表2 profiler结果字段表) 。 + 打印结果包含CPU和NPU的耗时等相关信息,详细信息参见表2 。 **表2** profiler结果字段表 @@ -1614,7 +1614,7 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load # 需要检测算子溢出的代码片段 ``` -模型运行过程中,如果有算子溢出,会打印出相应IR的名字。 +运行一个step,模型运行过程中,如果有算子溢出,会打印出相应IR的名字。 查看Dump数据: @@ -1650,7 +1650,7 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load h5copy -pv -i "./input.h5" -o "./output.h5" -s "/op1/seqid/" -d "/op1/seqid/" ``` - -i 为输入精度对比结果的后文件路径 + -i 为输入精度对比文件 -o 为输出需要映射的算子.h5文件路径 @@ -1679,7 +1679,7 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load "dump": { "dump_list":[] - "dump_path":"./oupput_IR2TBE"# 映射结果输出路径 + "dump_path":"./output_IR2TBE"# 映射结果输出路径 "dump_mode":"all" "dump_op_switch":"on" } @@ -1695,7 +1695,8 @@ with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load ```python with torch.utils.dumper(use_load=True, dump_path="./",load_file_path="./output.h5", load_with_acl_dump=True) as dump: - # 模型计算代码,此处省略 + # 模型计算代码,需用户自己添加 + # x = model(input_data) ``` 4. 模型运行。 -- Gitee