diff --git a/docs/en/PyTorch Online Inference Guide/PyTorch Online Inference Guide.md b/docs/en/PyTorch Online Inference Guide/PyTorch Online Inference Guide.md index 1407a95918637d75d169779563113ca4c6cd9533..7c63e3dc291cd0b1e9c8982674f4953704a12560 100644 --- a/docs/en/PyTorch Online Inference Guide/PyTorch Online Inference Guide.md +++ b/docs/en/PyTorch Online Inference Guide/PyTorch Online Inference Guide.md @@ -18,7 +18,7 @@ In this way, PyTorch-based inference apps can be directly ported to the Ascend Ascend 910 AI Processor -Ascend 710 AI Processor +Ascend 310P AI Processor

Basic Workflow

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" similarity index 82% rename from "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" rename to "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 69b54da410fad5a2e09e547395a90d5654866fcf..161952488969b3c5ff81529f83f668e951b0ff69 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,18 +1,18 @@ -# PyTorch算子开发指南 +# PyTorch 算子开发指南 - [简介](#简介md) - [算子开发流程](#算子开发流程md) - [算子开发准备](#算子开发准备md) - [环境准备](#环境准备md) - - [算子速查](#算子速查md) -- [算子适配开发](#算子适配开发md) + - [API速查](#API速查md) +- [API适配开发](#API适配开发md) - [前提条件](#前提条件md) - [获取PyTorch源码](#获取PyTorch源码md) - - [注册算子开发](#注册算子开发md) + - [注册API开发](#注册API开发md) - [概述](#概述md) - - [PyTorch1.8.1 注册算子开发](#PyTorch1-8-1-注册算子开发md) - - [算子适配插件开发](#算子适配插件开发md) + - [PyTorch1.8.1 注册API开发](#PyTorch1-8-1-注册API开发md) + - [API适配插件开发](#API适配插件开发md) - [编译和安装PyTorch框架](#编译和安装PyTorch框架md) -- [算子功能验证](#算子功能验证md) +- [API功能验证](#API功能验证md) - [概述](#概述-0md) - [实现过程](#实现过程md) - [FAQ](#FAQmd) @@ -26,7 +26,7 @@ - [PyTorch编译失败,提示“error: call of overload ....”](#PyTorch编译失败-提示-error-call-of-overloadmd) - [附录](#附录md) - [CMake安装方法](#CMake安装方法md) - - [自定义算子导出方法](#自定义算子导出方法md) + - [自定义API导出方法](#自定义API导出方法md)

简介

### 概述 @@ -35,23 +35,23 @@

算子开发流程

-PyTorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。 +PyTorch算子开发包含TBE算子开发和PyTorch框架下的API适配。 -1. TBE算子开发:昇腾AI软件栈中不包含相应的算子,需要先完成TBE算子的开发,再进行PyTorch框架下的算子适配。 +1. TBE算子开发:昇腾AI软件栈中不包含相应的算子,需要先完成TBE算子的开发,再进行PyTorch框架下的API适配。 TBE算子开发流程及方法请参见《CANN TBE自定义算子开发指南》。 -2. PyTorch框架下的算子适配:昇腾AI软件栈中已实现了相应的TBE算子,可直接进行PyTorch框架适配。 +2. PyTorch框架下的API适配:昇腾AI软件栈中已实现了相应的TBE算子,可直接进行PyTorch框架适配。 - PyTorch框架下的算子适配流程如下所示。 + PyTorch框架下的API适配流程如下所示。 - **图 1** PyTorch框架下的算子适配流程 + **图 1** PyTorch框架下的API适配流程 ![](figures/PyTorch框架下的算子适配流程.png "PyTorch框架下的算子适配流程") - **表 1** 算子开发步骤详解 + - - - - - - - - -

序号

步骤

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

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

算子开发准备

+

算子开发准备

2

算子速查

+

API速查

查看TBE算子支持列表和PyTorch算子适配列表。

-
  • 当前昇腾AI处理器支持的算子列表及支持的算子的详细规格约束。
  • 当前PyTorch适配的算子列表。
+

查看TBE算子支持列表和PyTorchAPI适配列表。

+
  • 当前昇腾AI处理器支持的算子列表及支持的算子的详细规格约束。
  • 当前PyTorch适配的API列表。

3

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

获取昇腾社区PyTorch源码。

算子适配开发

+

API适配开发

4

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

5

算子适配层开发

+

API适配层开发

算子适配层开发,将基于第三方框架的算子属性映射成适配昇腾AI处理器的算子属性。

+

API适配层开发,将基于第三方框架的算子属性映射成适配昇腾AI处理器的算子属性。

6

@@ -111,21 +111,23 @@ PyTorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。

7

算子功能验证

+

API功能验证

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

+

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

算子功能验证

+

API功能验证

+ +

算子开发准备

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

环境准备

@@ -151,30 +153,30 @@ PyTorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。 -

算子速查

+

API速查

-进行算子开发时,您可以查询当前昇腾AI处理器中支持的算子列表和当前PyTorch适配的算子列表。根据查询结果进行算子开发或PyTorch算子适配。 +进行API开发时,您可以查询当前昇腾AI处理器中支持的算子列表和当前PyTorch适配的API列表。根据查询结果进行算子开发或PyTorchAPI适配。 -- 若昇腾AI处理器不支持算子,则需要进行TBE算子开发和PyTorch框架算子适配。 -- 若昇腾AI处理器支持算子但PyTorch框架没有算子适配,仅需要进行PyTorch框架下算子适配。 -- 若PyTorch框架已经适配算子,直接使用算子即可,不需要开发和适配。 +- 若昇腾AI处理器不支持算子,则需要进行TBE算子开发和PyTorch框架API适配。 +- 若昇腾AI处理器支持算子但PyTorch框架没有API适配,仅需要进行PyTorch框架下API适配。 +- 若PyTorch框架已经适配API,直接使用API即可,不需要开发和适配。 -昇腾AI处理器和PyTorch适配的算子查询方式如下。 +昇腾AI处理器和PyTorch适配的API查询方式如下。 -- 当前昇腾AI处理器中支持的算子以及对应的算子约束可以通过以下两种方式查询。 +- 当前昇腾AI处理器中支持的算子以及对应的API约束可以通过以下两种方式查询。 - 命令行开发方式下,您可以参见《CANN 算子清单 \(Ascend 910\)》进行离线查询。 - MindStudio开发方式下,您可以通过MindStudio进行在线查询,详细查看方法可参见《MindStudio 用户指南》中的“算子&模型速查”章节。 -- 当前PyTorch适配的算子列表可以参见[《PyTorch API支持清单》](https://gitee.com/ascend/pytorch/blob/master/docs/zh/PyTorch%20API%E6%94%AF%E6%8C%81%E6%B8%85%E5%8D%95.md)。 +- 当前PyTorch适配的API列表可以参见[《PyTorch API支持清单》](https://gitee.com/ascend/pytorch/blob/master/docs/zh/PyTorch%20API%E6%94%AF%E6%8C%81%E6%B8%85%E5%8D%95.md)。 -

算子适配开发

+

API适配开发

- **[前提条件](#前提条件md)** - **[获取PyTorch源码](#获取PyTorch源码md)** -- **[注册算子开发](#注册算子开发md)** +- **[注册API开发](#注册API开发md)** -- **[算子适配插件开发](#算子适配插件开发md)** +- **[API适配插件开发](#API适配插件开发md)** - **[编译和安装PyTorch框架](#编译和安装PyTorch框架md)** @@ -186,52 +188,52 @@ PyTorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。

获取PyTorch源码

-针对pytorch1.8.1版本,PyTorch源码获取请参见[《PyTorch安装指南》](https://gitee.com/ascend/pytorch/blob/master/docs/zh/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97.md)中“安装PyTorch框架”章节,完成在"pytorch/pytorch_v1.8.1"目录生成适配昇腾AI处理器的全量代码步骤。将在pytorch/pytorch目录中进行PyTorch 算子适配开发。 +针对pytorch1.8.1版本,PyTorch源码获取请参见[《PyTorch安装指南》](https://gitee.com/ascend/pytorch/blob/master/docs/zh/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/PyTorch%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97.md)中“安装PyTorch框架”章节,完成在"pytorch/pytorch_v1.8.1"目录生成适配昇腾AI处理器的全量代码步骤。将在pytorch/pytorch目录中进行PyTorch API适配开发。 -

注册算子开发

+

注册API开发

- **[概述](#概述md)** -- **[PyTorch1.8.1 注册算子开发](#PyTorch1-8-1-注册算子开发md)** +- **[PyTorch1.8.1 注册API开发](#PyTorch1-8-1-注册API开发md)**

概述

-当前制定的NPU适配派发原则是NPU算子的派发不经过框架公共函数,直接派发成NPU适配的函数,即算子执行调用栈中只包含NPU适配的函数调用,不包含框架公共函数。PyTorch框架在编译时,会根据 native\_functions.yaml 的定义,按框架中定义的类型和设备分发原则,生成相应的新算子的中间层的调用说明。对于NPU,会生成在 build/aten/src/ATen/NPUType.cpp。 +当前制定的NPU适配派发原则是NPUAPI的派发不经过框架公共函数,直接派发成NPU适配的函数,即API执行调用栈中只包含NPU适配的函数调用,不包含框架公共函数。PyTorch框架在编译时,会根据 native\_functions.yaml 的定义,按框架中定义的类型和设备分发原则,生成相应的新API的中间层的调用说明。对于NPU,会生成在 build/aten/src/ATen/NPUType.cpp。 -

PyTorch1.8.1 注册算子开发

+

PyTorch1.8.1 注册API开发

-##### 注册算子开发方法 +##### 注册API开发方法 1. 打开native\_functions.yaml文件。 - native\_functions.yaml 文件中,定义了所有算子函数原型,包括函数名称和参数等信息,每个算子函数支持不同硬件平台的派发信息。该文件所在路径为pytorch/aten/src/ATen/native/native\_functions.yaml。 + native\_functions.yaml 文件中,定义了所有API函数原型,包括函数名称和参数等信息,每个API函数支持不同硬件平台的派发信息。该文件所在路径为pytorch/aten/src/ATen/native/native\_functions.yaml。 2. 确定需要派发函数。 - - yaml 中已存在的算子 + - yaml 中已存在的API - 将所有与待适配算子相关的函数进行派发。 + 将所有与待适配API相关的函数进行派发。 - - yaml中未存在的自定义算子 + - yaml中未存在的自定义API - 由于yaml中没有相关算子的信息,需要手动添加相关函数,包括函数名,参数信息,返回类型信息。添加规则及方法请参见“pytorch/aten/src/ATen/native/README.md“。 + 由于yaml中没有相关API的信息,需要手动添加相关函数,包括函数名,参数信息,返回类型信息。添加规则及方法请参见“pytorch/aten/src/ATen/native/README.md“。 ``` - - func:适配算子名称(输入参数信息) -> 返回类型 + - func:适配API名称(输入参数信息) -> 返回类型 ``` ##### 示例 -以torch.add\(\)算子为例介绍注册算子开发过程。 +以torch.add\(\)API为例介绍注册API开发过程。 1. 打开native\_functions.yaml文件。 2. 搜索相关函数。 - 在yaml中搜索add,找到与add算子相关的函数描述func。由于add是PyTorch内置算子,不需要手动添加func。若是自定义算子,需要手动添加func。 + 在yaml中搜索add,找到与addAPI相关的函数描述func。由于add是PyTorch内置API,不需要手动添加func。若是自定义API,需要手动添加func。 -3. 确定算子相关函数名称及其类型的func描述。 +3. 确定API相关函数名称及其类型的func描述。 - add.Tensor 的函数分发描述。 ``` @@ -287,18 +289,18 @@ PyTorch算子开发包含TBE算子开发和PyTorch框架下的算子适配。 -

算子适配插件开发

+

API适配插件开发

#### 简介 -用户通过开发算子适配插件,实现PyTorch原生算子的输入参数、输出参数和属性的格式转换,使转换后的格式与TBE算子的输入参数、输出参数和属性的格式相同。适配昇腾AI处理器的PyTorch源代码中提供了适配关联、类型转换和判别、处理动态shape等相关的方法供用户使用。 +用户通过开发API适配插件,实现PyTorch原生API的输入参数、输出参数和属性的格式转换,使转换后的格式与TBE算子的输入参数、输出参数和属性的格式相同。适配昇腾AI处理器的PyTorch源代码中提供了适配关联、类型转换和判别、处理动态shape等相关的方法供用户使用。 #### npu_native_functions.yaml文件介绍 ``` backend: NPU # Backend类型 -cpp_namespace: at_npu::native # 插件中开发算子的命名空间 -supported: # 已支持的和PyTorch Native Functions对齐的算子 +cpp_namespace: at_npu::native # 插件中开发API的命名空间 +supported: # 已支持的和PyTorch Native Functions对齐的API - add.Tensor - add.Scalar - slow_conv3d.out @@ -311,10 +313,10 @@ supported: # 已支持的和PyTorch Native Functions对齐的算子 - addcdiv_ - addcdiv.out -autograd: # 已支持的和PyTorch Native Functions对齐的继承自Function的具有前反向操作的算子 +autograd: # 已支持的和PyTorch Native Functions对齐的继承自Function的具有前反向操作的API - maxpool2d -custom: # 自定义算子,需要提供算子格式定义 +custom: # 自定义API,需要提供API格式定义 - func: npu_dtype_cast(Tensor self, ScalarType dtype) -> Tensor variants: function, method - func: npu_dtype_cast_(Tensor(a!) self, Tensor src) -> Tensor(a!) @@ -324,21 +326,21 @@ custom: # 自定义算子,需要提供算子格式定义 - func: npu_get_float_status(Tensor self) -> Tensor variants: function, method -custom_autograd: # 自定义继承自Function的自定义算子 +custom_autograd: # 自定义继承自Function的自定义API - func: npu_convolution(Tensor input, Tensor weight, Tensor? bias, ...) -> Tensor ``` -官方提供的native_functions.yaml文件定义了PyTorch Native Functions的具体算子定义和分发细节,在NPU设备上适配官方已定义算子,我们不需要重新定义,只需要注册NPU分发即可。由于我们可以根据已支持的算子(supported,autograd)对应解析官方yaml文件得到每个函数的具体格式,所以对应的函数声明和注册分发可以自动化完成,算子迁移和开发的时候只需要关注对应的实现细节即可。对于自定义算子,由于没有具体的算子定义,我们需要在npu_native_functions.yaml文件中给出定义,以便对算子进行结构化解析从而实现自动化注册和Python接口绑定。 +官方提供的native_functions.yaml文件定义了PyTorch Native Functions的具体API定义和分发细节,在NPU设备上适配官方已定义API,我们不需要重新定义,只需要注册NPU分发即可。由于我们可以根据已支持的API(supported,autograd)对应解析官方yaml文件得到每个函数的具体格式,所以对应的函数声明和注册分发可以自动化完成,API迁移和开发的时候只需要关注对应的实现细节即可。对于自定义API,由于没有具体的API定义,我们需要在npu_native_functions.yaml文件中给出定义,以便对API进行结构化解析从而实现自动化注册和Python接口绑定。 #### 适配插件实现 -1. 注册算子。 +1. 注册API。 - 根据npu_native_functions.yaml文件介绍,添加相应算子信息。 + 根据npu_native_functions.yaml文件介绍,添加相应API信息。 2. 创建适配插件文件。 - NPU TBE算子适配文件保存在pytorch/torch_npu/csrc/aten/ops目录下,命名风格采用大驼峰,命名格式:<算子名\> + .cpp,如:AddKernelNpu.cpp。 + NPU TBE算子适配文件保存在pytorch/torch_npu/csrc/aten/ops目录下,命名风格采用大驼峰,命名格式: + .cpp,如:AddKernelNpu.cpp。 3. 引入依赖头文件。 @@ -347,25 +349,25 @@ custom_autograd: # 自定义继承自Function的自定义算子 >![](public_sys-resources/icon-note.gif) **说明:** >工具的功能和使用方法,可查看头文件和源码获得。 -4. 定义算子适配主体函数。 +4. 定义API适配主体函数。 - 根据注册算子开发中的分发函数确定自定义算子适配主体函数。 + 根据注册API开发中的分发函数确定自定义API适配主体函数。 5. 分别实现适配主体函数。 - 实现算子适配主题函数,根据TBE算子原型构造得到对应的input、output、attr。 + 实现API适配主题函数,根据TBE算子原型构造得到对应的input、output、attr。 #### 示例 -以torch.add\(\)算子为例介绍算子适配开发过程。 +以torch.add\(\)API为例介绍API适配开发过程。 -1. 注册算子。 +1. 注册API。 - 将add算子添加到npu_native_functions.yaml文件的对应位置,用于自动化声明和注册。 + 将addAPI添加到npu_native_functions.yaml文件的对应位置,用于自动化声明和注册。 ``` - supported: #已支持的Pytorch Native Functions 对齐的算子 + supported: #已支持的Pytorch Native Functions 对齐的API add.Tensor add_.Tensor add.out @@ -395,7 +397,7 @@ custom_autograd: # 自定义继承自Function的自定义算子 >" CalcuOpUtil.h "中主要包含类型转换和判别的函数。 >" OpAdapter.h"文件中主要包含适配关联的头文件。 -4. 定义算子适配主体函数。 +4. 定义API适配主体函数。 ``` at::Tensor NPUNativeFunctions::add(const at::Tensor &self, const at::Tensor &other, at::Scalar alpha) @@ -407,7 +409,7 @@ custom_autograd: # 自定义继承自Function的自定义算子 > ![](public_sys-resources/icon-note.gif) **说明:** > - > NPUNativeFunctions是算子定义需要添加的命名空间约束。 + > NPUNativeFunctions是API定义需要添加的命名空间约束。 5. 分别实现适配主体函数。 @@ -594,7 +596,7 @@ pip3 install --upgrade torch_npu-1.8.1rc1-cp37-cp37m-linux_{arch}.whl 修改代码之后,需要重新执行“编译”和“安装”PyTorch插件过程。 -

算子功能验证

+

API功能验证

- **[概述](#概述-0md)** @@ -605,13 +607,13 @@ pip3 install --upgrade torch_npu-1.8.1rc1-cp37-cp37m-linux_{arch}.whl #### 简介 -完成算子适配开发后,可通过运行适配昇腾处理器的PyTorch算子,验证算子运行结果是否正确。 +完成API适配开发后,可通过运行适配昇腾处理器的PyTorchAPI,验证API运行结果是否正确。 -算子功能验证会覆盖算子开发的所有交付件,包含实现文件,算子原型定义、算子信息库以及算子适配插件。本节仅对验证的方法做介绍。 +API功能验证会覆盖API开发的所有交付件,包含实现文件,API原型定义、API信息库以及API适配插件。本节仅对验证的方法做介绍。 #### 测试用例及测试工具 -进行自定义算子功能验证,通过PyTorch前端构造自定义算子的函数并运行验证。 +进行自定义API功能验证,通过PyTorch前端构造自定义API的函数并运行验证。 在https://gitee.com/ascend/pytorch 中 "pytorch/test/test_network_ops"目录下提供了测试用例及测试工具,供用户参考。 @@ -619,7 +621,7 @@ pip3 install --upgrade torch_npu-1.8.1rc1-cp37-cp37m-linux_{arch}.whl #### 简介 -本章通过具体例子,完成PyTorch算子的功能测试步骤。 +本章通过具体例子,完成PyTorchAPI的功能测试步骤。 #### 操作步骤 @@ -632,7 +634,7 @@ pip3 install --upgrade torch_npu-1.8.1rc1-cp37-cp37m-linux_{arch}.whl ${HOME}/Ascend/ascend-toolkit/set_env.sh ``` -2. 编写测试脚本。以add算子为例,在“pytorch/test/test\_network\_ops“路径下编写测试脚本文件: test\_add.py。 +2. 编写测试脚本。以addAPI为例,在“pytorch/test/test\_network\_ops“路径下编写测试脚本文件: test\_add.py。 ``` # 引入依赖库 @@ -789,12 +791,11 @@ pip3.7 install torchvision --no-deps python3.7 test_add.py > test_log.txt ``` -

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

#### 现象描述 -完成“自定义TBE算子”开发,和“PyTorch”适配开发,但执行测试用例,发现无法调用到新开发的算子。 +完成“自定义TBE算子”开发,和“PyTorch”适配开发,但执行测试用例,发现无法调用到新开发的API。 #### 可能原因 @@ -804,15 +805,15 @@ pip3.7 install torchvision --no-deps #### 处理方法 -1. 参考“[算子功能验证](#算子功能验证md)”章节,完成运行环境设置,特别注意: +1. 参考“[API功能验证](#API功能验证md)”章节,完成运行环境设置,特别注意: ``` . /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh ``` -2. 检查yaml文件中对应算子的分发配置,是否正确的完整分发; +2. 检查yaml文件中对应API的分发配置,是否正确的完整分发; 3. 分析排查代码实现,建议手段: - 1. 修改"pytorch"中的算子适配实现,让“test\_add.py”可以调用到“自定义算子包”中的TBE算子; + 1. 修改"pytorch"中的API适配实现,让“test\_add.py”可以调用到“自定义API包”中的TBE算子; "pytorch/aten/src/ATen/native/npu/AddKernelNpu.cpp" @@ -828,43 +829,44 @@ pip3.7 install torchvision --no-deps 至此步骤,不应该有错误,屏幕应该输出 "add" 中增加的日志打印。若出错,请完成代码清理排查,保证无新开发的代码影响测试。 - 3. 将新开发的“自定义TBE算子”合并到"cann"中,在对应的在算子入口增加日志打印,作为运行标识。 - 4. 完成上面的"cann"编译、安装,调用“python3.7.5 test\_add.py”进行测试。 - - >![](public_sys-resources/icon-note.gif) **说明:** - >根据Ascend的设计逻辑,用户开发安装的“custom”算子包优先级高于“built-in”的内置算子包,在运行加载时,会优先加载调度“custom”包中的算子。过程中,若解析“custom”中的算子信息文件失败,则会跳过“custom”算子包,不加载调度任何“custom”算子包中的任何算子。 - >- 若此步骤出错,或屏幕未输出 "add" 中增加的日志打印,则说明新开发的“自定义TBE算子”有错误,影响了“自定义算子包”的加载,建议**优先排查新开发的“自定义TBE算子”中的“算子信息定义”是否正确**。 - >- 若此步骤正确,至少说明 **新开发的“自定义TBE算子”中的“算子信息定义”不影响运行**。 + 3. 将新开发的“自定义TBE算子”合并到"cann"中,在对应的在API入口增加日志打印,作为运行标识。 + 4. 完成上面的"cann"编译、安装,调用“python3.7.5 test\_add.py”进行测试。 + >![](public_sys-resources/icon-note.gif) **说明:** + >根据Ascend的设计逻辑,用户开发安装的“custom”API包优先级高于“built-in”的内置API包,在运行加载时,会优先加载调度“custom”包中的API。过程中,若解析“custom”中的API信息文件失败,则会跳过“custom”API包,不加载调度任何“custom”API包中的任何API。 + > + >- 若此步骤出错,或屏幕未输出 "add" 中增加的日志打印,则说明新开发的“自定义TBE算子”有错误,影响了“自定义API包”的加载,建议**优先排查新开发的“自定义TBE算子”中的“API信息定义”是否正确**。 + >- 若此步骤正确,至少说明 **新开发的“自定义TBE算子”中的“API信息定义”不影响运行**。 + 5. 调用“python3.7.5 xxx\_testcase.py”进行测试; - + >![](public_sys-resources/icon-note.gif) **说明:** - >- 若屏幕正常输出新开发的“自定义TBE算子”中增加的日志打印,则至少说明调度到了新开发的算子。 + >- 若屏幕正常输出新开发的“自定义TBE算子”中增加的日志打印,则至少说明调度到了新开发的API。 >- 若屏幕未输出新开发的“自定义TBE算子”中增加的日志打印,则问题可能出现在“PyTorch适配”中,需要排查这一部分的实现代码,较多的可能会出现在“XxxxKernelNpu.cpp”中的输入、输出未能正确适配。

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

-不管是“custom”算子,还是“built-in”算子,在安装后,都是以\*.py源码的方式存放在安装目录下,所以我们可以通过编辑源码,在API入口增加日志的方式,打印输出入参,确定输入的参数是否正确。 +不管是“custom”API,还是“built-in”API,在安装后,都是以\*.py源码的方式存放在安装目录下,所以我们可以通过编辑源码,在API入口增加日志的方式,打印输出入参,确定输入的参数是否正确。 >![](public_sys-resources/icon-caution.gif) **注意:** >该操作存在风险,建议在操作前备份计划修改的文件。若未备份,损坏后无法恢复,请及时联系支持人员。 -下面以"built-in"算子中的"zn\_2\_nchw"算子为例: +下面以"built-in"API中的"zn\_2\_nchw"API为例: -1. 打开安装在用户目录下的算子包安装目录。 +1. 打开安装在用户目录下的API包安装目录。 ``` cd ~/.local/Ascend/opp/op_impl/built-in/ai_core/tbe/impl ll ``` - 可以看到相应的算子\*.py源码文件均为“只读”,即此时不可编辑。 + 可以看到相应的API\*.py源码文件均为“只读”,即此时不可编辑。 ![](figures/zh-cn_image_0000001190081791.png) -2. 修改算子\*.py源码文件属性,增加“可写”权限。 +2. 修改API\*.py源码文件属性,增加“可写”权限。 ``` sudo chmod +w zn_2_nchw.py @@ -873,7 +875,7 @@ pip3.7 install torchvision --no-deps ![](figures/zh-cn_image_0000001190081803.png) -3. 打开算子\*.py源码文件,增加日志,保存退出。 +3. 打开API\*.py源码文件,增加日志,保存退出。 ``` vi zn_2_nchw.py @@ -884,8 +886,8 @@ pip3.7 install torchvision --no-deps 上面例子只加了个标识,实际调测时,可以增加打印输入参数信息。 4. 调用脚本执行测试用例,通过打印日志分析“输入参数信息”。 -5. 完成测试分析后,重新打开算子\*.py源码文件,删除增加的日志,保存退出。 -6. 修改算子\*.py源码文件属性,删除“可写”权限。 +5. 完成测试分析后,重新打开API\*.py源码文件,删除增加的日志,保存退出。 +6. 修改API\*.py源码文件属性,删除“可写”权限。 ``` sudo chmod -w zn_2_nchw.py @@ -904,7 +906,7 @@ PyTorch编译失败,提示“ error: ld returned 1 exit status”。 #### 可能原因 -通过日志分析,大概原因为XxxxKernelNpu.cpp中实现的适配函数,与PyTorch框架算子要求的分发实现接口参数不匹配。在上面的例子中,是“binary\_cross\_entropy\_npu”,打开对应的XxxxKernelNpu.cpp文件,找到相应的适配函数。 +通过日志分析,大概原因为XxxxKernelNpu.cpp中实现的适配函数,与PyTorch框架API要求的分发实现接口参数不匹配。在上面的例子中,是“binary\_cross\_entropy\_npu”,打开对应的XxxxKernelNpu.cpp文件,找到相应的适配函数。 ![](figures/zh-cn_image_0000001144241896.png) @@ -942,7 +944,7 @@ PyTorch编译失败,提示“error: call of overload ....”。 - **[CMake安装方法](#CMake安装方法md)** -- **[自定义算子导出方法](#自定义算子导出方法md)** +- **[自定义API导出方法](#自定义API导出方法md)**

CMake安装方法

@@ -988,7 +990,7 @@ PyTorch编译失败,提示“error: call of overload ....”。 #### 简介 -PyTorch训练模型中包含自定义算子,将自定义算子导出成onnx单算子模型,方便转移到其他AI框架中使用。自定义算子导出有三种形式,适配NPU的TBE算子导出、C++算子导出、纯Python算子导出。 +PyTorch训练模型中包含自定义API,将自定义API导出成onnx单API模型,方便转移到其他AI框架中使用。自定义API导出有三种形式,适配NPU的TBE算子导出、C++API导出、纯PythonAPI导出。 #### 前提条件 @@ -1000,10 +1002,10 @@ TBE算子导出有两种方式。 方式一: -1. 定义和注册算子 +1. 定义和注册API ``` - # 定义算子 + # 定义API @parse_args('v', 'v', 'f', 'i', 'i', 'i', 'i') def symbolic_npu_roi_align(g, input, rois, spatial_scale, pooled_height, pooled_width, sample_num, roi_end_mode): args = [input, rois] @@ -1015,7 +1017,7 @@ TBE算子导出有两种方式。 return g.op('torch::npu_roi_align',*args, **kwargs) - # 注册算子 + # 注册API import torch.onnx.symbolic_registry as sym_registry def register_onnx_sym_npu_roi_align(): sym_registry.register_op('npu_roi_align', symbolic_npu_roi_align, '', 11) @@ -1070,7 +1072,7 @@ TBE算子导出有两种方式。 1. 定义方法类 ``` - # 实现算子方法类及符号导出实现的方法 + # 实现API方法类及符号导出实现的方法 class CustomClassOp_Func_npu_roi_align(Function): @staticmethod def forward(ctx, input, rois, spatial_scale, pooled_height, pooled_width , sample_num, roi_end_mode): @@ -1088,10 +1090,10 @@ TBE算子导出有两种方式。 return g.op('torch::npu_roi_align',*args, **kwargs) ``` -2. 自定义算子模型 +2. 自定义API模型 ``` - # 实现算子模型 + # 实现API模型 class NpuOp_npu_roi_align_Module(torch.nn.Module): def __init__(self): super(NpuOp_npu_roi_align_Module, self).__init__() @@ -1149,15 +1151,15 @@ 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++API导出 -1. 自定义算子 +1. 自定义API ``` import torch import torch_npu import torch.utils.cpp_extension - # 定义C++实现的算子 + # 定义C++实现的API def test_custom_add(): op_source = """ #include @@ -1178,10 +1180,10 @@ TBE算子导出有两种方式。 test_custom_add() ``` -2. 注册自定义算子 +2. 注册自定义API ``` - # 定义算子注册方法并注册算子 + # 定义API注册方法并注册API from torch.onnx import register_custom_op_symbolic def symbolic_custom_add(g, self, other): @@ -1193,16 +1195,16 @@ TBE算子导出有两种方式。 3. 建立模型 ``` - # 建立算子模型 + # 建立API模型 class CustomAddModel(torch.nn.Module): def forward(self, a, b): return torch.ops.custom_namespace.custom_add(a, b) ``` -4. 导出算子onnx模型 +4. 导出APIonnx模型 ``` - # 将算子导出onnx模型 + # 将API导出onnx模型 def do_export(model, inputs, *args, **kwargs): out = torch.onnx._export(model, inputs, "custom_demo.onnx", *args, **kwargs) @@ -1216,9 +1218,9 @@ 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算子导出 +#### 纯PythonAPI导出 -1. 自定义算子 +1. 自定义API ``` import torch @@ -1235,7 +1237,7 @@ TBE算子导出有两种方式。 import math from torch.nn import init - # 定义算子类方法 + # 定义API类方法 class CustomClassOp_Add_F(Function): @staticmethod def forward(ctx, input1,input2): @@ -1255,7 +1257,7 @@ TBE算子导出有两种方式。 2. 建立模型 ``` - # 注册算子并建立模型 + # 注册API并建立模型 class CustomClassOp_Add(torch.nn.Module): def __init__(self): super(CustomClassOp_Add, self).__init__() @@ -1281,7 +1283,7 @@ TBE算子导出有两种方式。 return rtn ``` -3. 导出算子onnx模型 +3. 导出APIonnx模型 ``` ONNX_FILE_NAME = "./custom_python_module_demo.onnx" @@ -1296,7 +1298,7 @@ TBE算子导出有两种方式。 output = model(input) do_export(model, input, opset_version=11) - # 将算子导出到onnx模型 + # 将API导出到onnx模型 test_class_export() ``` diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082048.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082048.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082048.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082048.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082056.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082056.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082056.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082056.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082064.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082064.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082064.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082064.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082072.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082072.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082072.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082072.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082088.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082088.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082088.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144082088.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144241896.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144241896.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144241896.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001144241896.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081791.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081791.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081791.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081791.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081803.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081803.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081803.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190081803.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201935.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201935.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201935.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201935.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201951.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201951.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201951.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201951.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201973.png" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201973.png" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201973.png" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/figures/zh-cn_image_0000001190201973.png" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-caution.gif" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-caution.gif" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-caution.gif" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-caution.gif" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-danger.gif" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-danger.gif" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-danger.gif" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-danger.gif" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-note.gif" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-note.gif" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-note.gif" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-note.gif" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-notice.gif" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-notice.gif" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-notice.gif" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-notice.gif" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-tip.gif" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-tip.gif" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-tip.gif" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-tip.gif" diff --git "a/docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-warning.gif" "b/docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-warning.gif" similarity index 100% rename from "docs/zh/PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-warning.gif" rename to "docs/zh/PyTorch \347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227/public_sys-resources/icon-warning.gif" 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 d77a4ab3a38b5d923ef59f2dd9de809cdbc47164..2524fda461e5ea737f93ff39ec7c8089f3787553 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" @@ -18,7 +18,7 @@ 昇腾910 AI处理器 -昇腾710 AI处理器 +昇腾310P AI处理器

基本使用流程