From 829faa9699137e53c84af174ca09877da6e20fc0 Mon Sep 17 00:00:00 2001 From: ZijunYin Date: Thu, 26 Aug 2021 10:11:03 +0800 Subject: [PATCH] update 2.0.3.B030 docs --- ...50\347\220\206\346\214\207\345\215\227.md" | 7 +- ...6\346\265\201\347\250\213\345\233\276.png" | Bin 17375 -> 17045 bytes ...3\347\244\272\346\204\217\345\233\276.png" | Bin 10725 -> 0 bytes ...11\350\243\205\346\214\207\345\215\227.md" | 13 +- .../figures/zh-cn_image_0000001190081735.png" | Bin ...00\345\217\221\346\214\207\345\215\227.md" | 35 +- .../figures/zh-cn_image_0000001144082048.png" | Bin .../figures/zh-cn_image_0000001144082056.png" | Bin .../figures/zh-cn_image_0000001144082064.png" | Bin .../figures/zh-cn_image_0000001144082072.png" | Bin .../figures/zh-cn_image_0000001144082088.png" | Bin .../figures/zh-cn_image_0000001144241896.png" | Bin .../figures/zh-cn_image_0000001172886189.png" | Bin 44685 -> 0 bytes .../figures/zh-cn_image_0000001190081791.png" | Bin .../figures/zh-cn_image_0000001190081803.png" | Bin .../figures/zh-cn_image_0000001190201935.png" | Bin .../figures/zh-cn_image_0000001190201951.png" | Bin .../figures/zh-cn_image_0000001190201973.png" | Bin ...55\347\273\203\346\214\207\345\215\227.md" | 344 +- .../figures/FAQ12.png" | Bin 13066 -> 0 bytes .../figures/model_faq11_20210728.jpg" | Bin 0 -> 59980 bytes .../figures/zh-cn_image_0000001106176216.png" | Bin 44685 -> 0 bytes .../figures/zh-cn_image_0000001144082132.png" | Bin .../figures/zh-cn_image_0000001144082138.png" | Bin .../figures/zh-cn_image_0000001144241932.png" | Bin .../figures/zh-cn_image_0000001190201999.png" | Bin .../figures/zh-cn_image_0000001190202013.png" | Bin ...7\346\265\201\347\250\213\345\233\276.png" | Bin 28406 -> 0 bytes ...27\345\255\220\346\270\205\345\215\225.md" | 7042 +++++++++++++++-- docs/zh/RELEASENOTE/RELEASENOTE.md | 139 - .../public_sys-resources/icon-caution.gif" | Bin .../public_sys-resources/icon-danger.gif" | Bin .../public_sys-resources/icon-note.gif" | Bin .../public_sys-resources/icon-notice.gif" | Bin .../public_sys-resources/icon-tip.gif" | Bin .../public_sys-resources/icon-warning.gif" | Bin ...27\345\255\220\346\270\205\345\215\225.md" | 4618 +++++++++++ 37 files changed, 11063 insertions(+), 1135 deletions(-) delete mode 100644 "docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/figures/\346\235\203\351\207\215\346\233\264\346\226\260\346\265\201\347\250\213\347\244\272\346\204\217\345\233\276.png" rename "docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/figures/zh-cn_image_0000001152776305.png" => "docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/figures/zh-cn_image_0000001190081735.png" (100%) rename "docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/figures/zh-cn_image_0000001180656411.png" => "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" (100%) rename "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_0000001173046111.png" => "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" (100%) rename "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_0000001127006340.png" => "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" (100%) rename "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_0000001126846512.png" => "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" (100%) rename "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_0000001126846510.png" => "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" (100%) rename "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_0000001172886193.png" => "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" (100%) delete mode 100644 "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_0000001172886189.png" rename "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_0000001127006336.png" => "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" (100%) rename "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_0000001172886191.png" => "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" (100%) rename "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_0000001126846514.png" => "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" (100%) rename "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_0000001173046109.png" => "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" (100%) rename "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_0000001127006338.png" => "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" (100%) delete mode 100644 "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/figures/FAQ12.png" create mode 100644 "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/figures/model_faq11_20210728.jpg" delete mode 100644 "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/figures/zh-cn_image_0000001106176216.png" rename "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/figures/zh-cn_image_0000001106176222.png" => "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/figures/zh-cn_image_0000001144082132.png" (100%) rename "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/figures/zh-cn_image_0000001152616281.png" => "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/figures/zh-cn_image_0000001144082138.png" (100%) rename "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/figures/zh-cn_image_0000001106016350.png" => "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/figures/zh-cn_image_0000001144241932.png" (100%) rename "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/figures/zh-cn_image_0000001152736233.png" => "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/figures/zh-cn_image_0000001190201999.png" (100%) rename "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/figures/zh-cn_image_0000001152616289.png" => "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/figures/zh-cn_image_0000001190202013.png" (100%) delete mode 100644 "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/figures/\347\216\257\345\242\203\345\207\206\345\244\207\346\265\201\347\250\213\345\233\276.png" delete mode 100644 docs/zh/RELEASENOTE/RELEASENOTE.md rename docs/zh/RELEASENOTE/public_sys-resources/icon-caution.gif => "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-caution.gif" (100%) rename docs/zh/RELEASENOTE/public_sys-resources/icon-danger.gif => "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-danger.gif" (100%) rename docs/zh/RELEASENOTE/public_sys-resources/icon-note.gif => "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-note.gif" (100%) rename docs/zh/RELEASENOTE/public_sys-resources/icon-notice.gif => "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-notice.gif" (100%) rename docs/zh/RELEASENOTE/public_sys-resources/icon-tip.gif => "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-tip.gif" (100%) rename docs/zh/RELEASENOTE/public_sys-resources/icon-warning.gif => "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-warning.gif" (100%) create mode 100644 "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" 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 ff47abe64a..945e19de1d 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" @@ -445,7 +445,7 @@ if __name__ == '__main__': 基于NPU芯片的架构特性,模型运算会涉及到混合精度,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下好处: - 对于中间变量的内存占用更少,节省内存的使用。 -- 因内存使用会减少,所以数据传出的时间也会减少。 +- 因内存使用会减少,所以数据传出的时间也会相应减少。 - float16的计算单元可以提供更快的计算性能。 但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况,为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里采用混合精度模块Apex来达到以上效果。混合精度模块Apex是一个集优化性能、精度收敛于一身的综合优化库。 @@ -465,12 +465,12 @@ if __name__ == '__main__':

O1配置模式

-

Conv, Matmul等使用float16计算,其他如Softmax、BN使用float32

+

Conv, Matmul等使用float16计算,其他如Softmax、BN使用float32。

O2配置模式

-

BN使用float32,其他绝大部分使用float16

+

BN使用float32,其他绝大部分使用float16。

静态Loss Scale功能

@@ -540,7 +540,6 @@ if __name__ == '__main__': apt-get install bzip2 ``` - 4. 编译安装gcc。 1. 进入gcc-7.3.0.tar.gz源码包所在目录,解压源码包,命令为: diff --git "a/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/figures/\345\234\250\347\272\277\346\216\250\347\220\206\346\265\201\347\250\213\345\233\276.png" "b/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/figures/\345\234\250\347\272\277\346\216\250\347\220\206\346\265\201\347\250\213\345\233\276.png" index a6aebc6309a376c2a80c2dcb1de1072936233b9b..3e69dda120f04dc07f6f9e88d94c66ab822653ba 100644 GIT binary patch literal 17045 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 w=OKWe!7V+AX)+s5MIvDm@@CKf4eDurzyJUM diff --git "a/docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227.md" "b/docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227.md" index ea7376bab9..e9b00f847b 100644 --- "a/docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227.md" +++ "b/docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227.md" @@ -14,7 +14,7 @@ - [安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md)

简介

-用户在准备相关环境进行PyTorch模型的移植及训练时,可以选择在训练服务器中手动编译安装PyTorch框架相关模块,或直接获取Ascend Hub镜像中心提供的基础镜像(镜像中已安装PyTorch模块和混合精度模块),进行模型的移植与训练。 +用户在准备相关环境进行基于PyTorch框架模型的开发、运行时,可以选择在服务器中手动编译安装PyTorch框架相关模块,或直接获取Ascend Hub镜像中心提供的基础镜像(镜像中已安装PyTorch模块和混合精度模块),进行模型的开发、运行。 **图 1** 环境准备流程图 ![](figures/环境准备流程图.png "环境准备流程图") @@ -118,7 +118,6 @@ git submodule update --init --recursive ``` - >![](public_sys-resources/icon-note.gif) **说明:** >受网络波动影响,源码获取时间可能较长,下载过程中请耐心等待。 下载完成之后若没有报错,即生成了PyTorch及其依赖的第三方代码。 @@ -141,7 +140,6 @@ 生成的二进制包在当前的dist目录下,即“pytorch/pytorch/dist”文件夹目录下。 - 5. 安装PyTorch。 进入“pytorch/pytorch/dist“文件夹目录,执行如下命令安装。 @@ -159,7 +157,7 @@

配置环境变量

-安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch。建议构建启动脚本,例如构建set\_env.sh脚本,使用source set\_env.sh配置当前窗口的环境变量。set\_env.sh脚本内容如下(以root用户安装,安装路径为默认路径为例)。 +安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch。建议构建启动脚本,例如构建set\_env.sh脚本,使用source set\_env.sh配置当前窗口的环境变量。set\_env.sh脚本内容如下(以root用户安装,,安装路径为默认路径,python版本为3.7.5为例,用户可根据软件包实际安装路径修改配置项。)。 ``` cpu_type=$(echo $HOSTTYPE) @@ -341,7 +339,6 @@ export HCCL_IF_IP="1.1.1.1" # “1.1.1.1”为示例使用的host网卡IP,请 cd .. ``` - >![](public_sys-resources/icon-note.gif) **说明:** >受网络波动影响,源码获取时间可能较长,下载过程中请耐心等待。 @@ -364,7 +361,6 @@ export HCCL_IF_IP="1.1.1.1" # “1.1.1.1”为示例使用的host网卡IP,请 生成的二进制包在当前的dist目录下,即“apex/apex/dist”文件夹目录下。 - 4. 安装apex。 进入“apex/apex/dist“文件夹目录,执行如下命令安装。 @@ -391,7 +387,7 @@ export HCCL_IF_IP="1.1.1.1" # “1.1.1.1”为示例使用的host网卡IP,请 ## 前提条件 -- 已完成CANN开发或运行环境的安装,具体操作请参考《CANN 软件安装指南》。 +- 已准备好相应硬件环境驱动和固件的安装,请参见各硬件产品[“驱动和固件安装升级指南”](https://support.huawei.com/enterprise/zh/category/ai-computing-platform-pid-1557196528909)。需要在硬件设备上安装与CANN版本配套的固件与驱动。 - 宿主机上已安装Docker。 ## 获取并使用镜像 @@ -497,7 +493,6 @@ CMake版本升级为3.12.1的方法 apt-get install bzip2 ``` - 4. 编译安装gcc。 1. 进入gcc-7.3.0.tar.gz源码包所在目录,解压源码包,命令为: @@ -561,7 +556,7 @@ CMake版本升级为3.12.1的方法 安装“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"。 -![](figures/zh-cn_image_0000001180656411.png) +![](figures/zh-cn_image_0000001190081735.png) ## 可能原因 diff --git "a/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/figures/zh-cn_image_0000001152776305.png" "b/docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/figures/zh-cn_image_0000001190081735.png" similarity index 100% rename from "docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227/figures/zh-cn_image_0000001152776305.png" rename to "docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/figures/zh-cn_image_0000001190081735.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/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 32e95bc371..d27a2c3523 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" @@ -18,7 +18,6 @@ - [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) - - [测试运行输出的NPU错误码是什么意思,有无对应的含义解释?](#测试运行输出的NPU错误码是什么意思-有无对应的含义解释.md) - [为什么我实现的“自定义TBE算子”无法调用到?](#为什么我实现的-自定义TBE算子-无法调用到.md) - [如何确定“TBE算子”是否被“PyTorch适配”正确调用](#如何确定-TBE算子-是否被-PyTorch适配-正确调用.md) - [PyTorch编译失败,提示“error: ld returned 1 exit status”](#PyTorch编译失败-提示-error-ld-returned-1-exit-status.md) @@ -30,7 +29,7 @@ ## 概述 -为了实现PyTorch深度学习框架在昇腾AI处理器上运行,需要将框架算子用TBE自定义开发。用户通过完成TBE自定义算子适配PyTorch框架,实现PyTorch框架中算子在昇腾AI处理器上运行。 +为了实现PyTorch深度学习框架在昇腾AI处理器上运行,需要将框架算子用TBE自定义开发。

算子开发流程

@@ -234,7 +233,6 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 - func:适配算子名称(输入参数信息) -> 返回类型 ``` - 3. 修改native\_functions.yaml文件,添加实现该算子相关函数的分发描述。 yaml 文件编写规范: @@ -253,7 +251,6 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 NPU: NPU_Adapt_Fun_Name ``` - >![](public_sys-resources/icon-note.gif) **说明:** >NPU\_Adapt\_Fun\_Name的格式为 : >- 如果原Fun\_Name无"\_"后缀,则格式:Fun\_Name + "\_" + "npu",如:add --\> add\_npu。 @@ -656,7 +653,7 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 format_list = [0, 3, 29] shape_format = [ [np.float32, i, [5, 256]] for i in format_list - ] + ] self.add_result(shape_format) instantiate_device_type_tests(TestAdd, globals(), except_for="cpu") @@ -686,8 +683,6 @@ git clone https://gitee.com/ascend/pytorch-develop.git --deepth=1 - **[如何查看测试的运行日志](#如何查看测试的运行日志.md)** -- **[测试运行输出的NPU错误码是什么意思,有无对应的含义解释?](#测试运行输出的NPU错误码是什么意思-有无对应的含义解释.md)** - - **[为什么我实现的“自定义TBE算子”无法调用到?](#为什么我实现的-自定义TBE算子-无法调用到.md)** - **[如何确定“TBE算子”是否被“PyTorch适配”正确调用](#如何确定-TBE算子-是否被-PyTorch适配-正确调用.md)** @@ -739,7 +734,7 @@ pip3.7 install torchvision --no-deps 安装“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"。 -![](figures/zh-cn_image_0000001172886189.png) +![](figures/zh-cn_image_0000001144082048.png) 但实际安装成功 @@ -772,10 +767,6 @@ pip3.7 install torchvision --no-deps ``` -

测试运行输出的NPU错误码是什么意思,有无对应的含义解释?

- -参考“[错误码定义](https://support.huaweicloud.com/adevg-A300_3000_3010/atlasdevelopment_01_0256.html)”。 -

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

## 现象描述 @@ -802,7 +793,7 @@ pip3.7 install torchvision --no-deps "pytorch/aten/src/ATen/native/npu/AddKernelNpu.cpp" - ![](figures/zh-cn_image_0000001126846510.png) + ![](figures/zh-cn_image_0000001144082088.png) 2. 完成上两步的编译、安装,调用“python3.7 test\_add.py”进行测试。 @@ -848,7 +839,7 @@ pip3.7 install torchvision --no-deps 可以看到相应的算子\*.py源码文件均为“只读”,即此时不可编辑。 - ![](figures/zh-cn_image_0000001127006336.png) + ![](figures/zh-cn_image_0000001190081791.png) 2. 修改算子\*.py源码文件属性,增加“可写”权限。 @@ -857,7 +848,7 @@ pip3.7 install torchvision --no-deps ll ``` - ![](figures/zh-cn_image_0000001172886191.png) + ![](figures/zh-cn_image_0000001190081803.png) 3. 打开算子\*.py源码文件,增加日志,保存退出。 @@ -865,7 +856,7 @@ pip3.7 install torchvision --no-deps vi zn_2_nchw.py ``` - ![](figures/zh-cn_image_0000001173046109.png) + ![](figures/zh-cn_image_0000001190201951.png) 上面例子只加了个标识,实际调测时,可以增加打印输入参数信息。 @@ -877,7 +868,7 @@ pip3.7 install torchvision --no-deps sudo chmod -w zn_2_nchw.py ``` - ![](figures/zh-cn_image_0000001126846512.png) + ![](figures/zh-cn_image_0000001144082072.png)

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

@@ -886,13 +877,13 @@ pip3.7 install torchvision --no-deps PyTorch编译失败,提示“ error: ld returned 1 exit status”。 -![](figures/zh-cn_image_0000001127006338.png) +![](figures/zh-cn_image_0000001190201973.png) ## 可能原因 通过日志分析,大概原因为XxxxKernelNpu.cpp中实现的适配函数,与PyTorch框架算子要求的分发实现接口参数不匹配。在上面的例子中,是“binary\_cross\_entropy\_npu”,打开对应的XxxxKernelNpu.cpp文件,找到相应的适配函数。 -![](figures/zh-cn_image_0000001172886193.png) +![](figures/zh-cn_image_0000001144241896.png) 可以看出实现中,最后一个参数是"int" ,与要求的“long”不匹配。 @@ -906,15 +897,15 @@ PyTorch编译失败,提示“ error: ld returned 1 exit status”。 PyTorch编译失败,提示“error: call of overload ....”。 -![](figures/zh-cn_image_0000001173046111.png) +![](figures/zh-cn_image_0000001144082056.png) -![](figures/zh-cn_image_0000001126846514.png) +![](figures/zh-cn_image_0000001190201935.png) ## 可能原因 通过日志分析,错误出在XxxxKernelNpu.cpp中30行位置,NPUAttrDesc的参数不合法。在上面的例子中,是“binary\_cross\_entropy\_attr”,打开对应的XxxxKernelNpu.cpp文件,找到相应的适配函数。 -![](figures/zh-cn_image_0000001127006340.png) +![](figures/zh-cn_image_0000001144082064.png) 可以看出实现中,NPUAttrDesc的入参,第二个参数是"int" ,与NPUAttrDesc定义不匹配。 diff --git "a/docs/zh/PyTorch\345\256\211\350\243\205\346\214\207\345\215\227/figures/zh-cn_image_0000001180656411.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\345\256\211\350\243\205\346\214\207\345\215\227/figures/zh-cn_image_0000001180656411.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_0000001173046111.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_0000001173046111.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_0000001127006340.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_0000001127006340.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_0000001126846512.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_0000001126846512.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_0000001126846510.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_0000001126846510.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_0000001172886193.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_0000001172886193.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_0000001172886189.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_0000001172886189.png" deleted file mode 100644 index ede83f4bc1b0ed21a9c746c358c45681d5ffb49a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44685 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�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 z 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

算子开发

-

详情请参见《PyTorch算子开发指南》

+

详情请参见《PyTorch算子开发指南》

环境准备

@@ -172,7 +175,7 @@

错误分析

-

详情请参见《CANN 日志参考》《CANN 开发辅助工具指南》中“AI Core Error分析工具使用指南”章节。

+

详情请参见《CANN 日志参考》《CANN 开发辅助工具指南》中“AI Core Error分析工具使用指南”章节。

性能调优和分析

@@ -187,12 +190,12 @@

模型保存与转换

-

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

+

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

应用软件开发

-

详情请参见《CANN 应用软件开发指南(C&C++, 推理)》

+

详情请参见《CANN 应用软件开发指南(C&C++, 推理)》

FAQ

@@ -225,7 +228,7 @@

配置环境变量

-安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch。建议构建启动脚本,例如构建set\_env.sh脚本,使用source set\_env.sh配置当前窗口的环境变量。set\_env.sh脚本内容如下(以root用户安装,安装路径为默认路径为例)。 +安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch。建议构建启动脚本,例如构建set\_env.sh脚本,使用source set\_env.sh配置当前窗口的环境变量。set\_env.sh脚本内容如下(以root用户安装,安装路径为默认路径,python版本为3.7.5为例,用户可根据软件包实际安装路径修改配置项。)。 ``` cpu_type=$(echo $HOSTTYPE) @@ -291,18 +294,18 @@ 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

-

Python搜索路径,参考上述举例配置。

+

Python搜索路径,参考上述举例配置。

PATH

-

可执行程序的查找路径,参考上述举例配置。

+

可执行程序的查找路径,参考上述举例配置。

ASCEND_OPP_PATH

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

HCCL_WHITELIST_DISABLE

配置在使用HCCL时是否开启通信白名单。

-
  • 0:开启白名单,无需校验HCCL通信白名单。
  • 1:关闭白名单,需校验HCCL通信白名单。
+
  • 0:开启白名单
  • 1:关闭白名单

缺省值为0,默认开启白名单。

@@ -680,51 +683,78 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 ## 参数说明 -**表 1** 参数说明 +1. + + **表 1** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

参数说明

+

取值示例

+

-i

+

--input

+
  • 要进行转换的原始脚本文件所在文件夹路径或文件路径。
  • 必选。
+
  • /home/username/fmktransplt
  • /home/username/fmktransplt.py
+

-o

+

--output

+
  • 脚本转换结果文件输出路径。会在该路径下输出带有msft后缀的文件夹。
  • 必选。
+

/home/username/fmktransplt_output

+

-r

+

--rule

+
  • 用户自定义通用转换规则的json文件路径,主要分为:函数参数修改、函数名称修改和模块名称修改三部分。
  • 可选。
+

/home/username/fmktransplt_rule.json

+

-s

+

--specify-device

+
  • 可以通过环境变量设置指定device作为高级特性,但有可能导致原本脚本中分布式功能失效。
  • 可选。
+

-

+

-sim

+

--similar

+
  • 用功能相似的API替换某些不支持的API,但有可能导致准确性和性能下降。
  • 可选。
+

-

+

distributed

+

将GPU单卡脚本转换为NPU多卡脚本,仅支持使用torch.utils.data.DataLoader方式加载数据的场景,指定此参数时,才可以指定以下两个参数。

+
  • -m,--main:训练脚本的入口python文件,必选。
  • -t,--target model:目标模型变量名,默认为'model',可选。
+

-

+

-h

+

--help

+

显示帮助信息。

+

-

+
- - - - - - - - - - - - - - - - - - - - - - - -

参数

-

参数说明

-

取值示例

-

-i

-

--input

-
  • 要进行转换的原始脚本文件所在文件夹路径或文件路径。
  • 必选。
-
  • /home/username/fmktransplt
  • /home/username/fmktransplt.py
-

-o

-

--output

-
  • 脚本转换结果文件输出路径。会在该路径下输出带有msft后缀的文件夹。
  • 必选。
-

/home/username/fmktransplt_output

-

-r

-

--rule

-
  • 用户自定义通用转换规则的json文件路径,主要分为:函数参数修改、函数名称修改和模块名称修改三部分。
  • 可选。
-

/home/username/fmktransplt_rule.json

-

-h

-

--help

-

显示帮助信息。

-

-

-
## 自定义规则文件 @@ -813,7 +843,8 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训

parent_module

-

父级模块名称

+

父级模块全名

+

例如torch.cuda.amp,amp的父级模块全名为torch.cuda。

@@ -830,20 +861,25 @@ Ascend平台提供了脚本转换工具使用户能通过命令行方式将训 2. 执行脚本转换工具。 ``` - python3 ms_fmk_transplt.py -i 原始脚本路径 -o 脚本转换结果输出路径 [-r 自定义规则json文件路径] + python3 ms_fmk_transplt.py -i 原始脚本路径 -o 脚本转换结果输出路径 [-r 自定义规则json文件路径] [-s] [-sim] [distributed -m 训练脚本的入口文件 -t 目标模型变量名] ``` + >![](public_sys-resources/icon-note.gif) **说明:** + >distributed及其参数-m、-t在语句最后指定。 + 3. 完成脚本转换。

结果解析

-脚本转换完成后,进入脚本转换结果输出路径查看结果文件。 +脚本转换完成后,进入脚本转换结果输出路径查看结果文件,以GPU单卡脚本转换为NPU多卡脚本为例。 ``` ├── xxx_msft // 脚本转换结果输出目录,默认为原始脚本路径。xxx为原始脚本所在文件夹名称。 │ ├── 生成脚本文件 // 与转换前的脚本文件目录结构一致。 │ ├── msFmkTranspltlog.txt // 脚本转换过程日志文件。 │ ├── unsupported_op.xlsx // 不支持算子列表文件。 +│ ├── change_list.csv // 修改记录文件。 +│ ├── run_distributed_npu.sh // 多卡启动shell脚本。 ```

手工迁移

@@ -1119,7 +1155,7 @@ def main(): 基于NPU芯片的架构特性,会涉及到混合精度训练,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下好处: - 对于中间变量的内存占用更少,节省内存的使用。 -- 因内存使用会减少,所以数据传出的时间也会减半。 +- 因内存使用会减少,所以数据传出的时间也会相应减少。 - float16的计算单元可以提供更快的计算性能。 但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况,为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里采用混合精度模块Apex来达到以上效果。混合精度模块Apex是一个集优化性能、精度收敛于一身的综合优化库。 @@ -1144,12 +1180,12 @@ def main():

O1配置模式

-

Conv,Matmal等使用float16计算,其他如Softmax、BN使用float32

+

Conv,Matmul等使用float16计算,其他如Softmax、BN使用float32。

O2配置模式

-

除了BN使用float32外,其他绝大部分使用float16

+

除了BN使用float32外,其他绝大部分使用float16。

静态Loss Scale功能

@@ -1234,12 +1270,12 @@ def main(): **图 1** 远程登录控制台 ![](figures/远程登录控制台.png "远程登录控制台") -2. 在虚拟界面工具栏中,单击启动项工具![](figures/zh-cn_image_0000001106016350.png),弹出启动项配置界面,如[图2](#fig744814574243)。 +2. 在虚拟界面工具栏中,单击启动项工具![](figures/zh-cn_image_0000001144241932.png),弹出启动项配置界面,如[图2](#fig744814574243)。 **图 2** 启动项工具 ![](figures/启动项工具.png "启动项工具") -3. 在启动项配置界面选择,选择“BIOS设置”,然后在虚拟界面工具栏中单击重启工具![](figures/zh-cn_image_0000001152616281.png),重启服务器。 +3. 在启动项配置界面选择,选择“BIOS设置”,然后在虚拟界面工具栏中单击重启工具![](figures/zh-cn_image_0000001190201999.png),重启服务器。 4. 系统重启后进入BIOS配置界面,依次选择“Advanced”\>“Socket Configuration”,如[图3](#fig4546303814)所示。 **图 3** Socket Configuration @@ -1322,7 +1358,6 @@ def main(): systemctl start cpupower ``` - 3. 设置CPU为performance模式。 ``` @@ -1342,12 +1377,12 @@ def main(): **图 1** 远程登录控制台 ![](figures/远程登录控制台-0.png "远程登录控制台-0") -2. 在虚拟界面工具栏中,单击启动项工具![](figures/zh-cn_image_0000001152616289.png),弹出启动项配置界面,如[图2](#fig744814574243)。 +2. 在虚拟界面工具栏中,单击启动项工具![](figures/zh-cn_image_0000001190202013.png),弹出启动项配置界面,如[图2](#fig744814574243)。 **图 2** 启动项工具 ![](figures/启动项工具-1.png "启动项工具-1") -3. 在启动项配置界面选择,选择“BIOS设置”,然后在虚拟界面工具栏中单击重启工具![](figures/zh-cn_image_0000001152736233.png),重启服务器。 +3. 在启动项配置界面选择,选择“BIOS设置”,然后在虚拟界面工具栏中单击重启工具![](figures/zh-cn_image_0000001144082138.png),重启服务器。 4. 系统重启后进入BIOS配置界面,依次选择“Advanced”\>“ Performance Config”,如[图3](#fig4546303814)所示。 **图 3** Performance Config @@ -1420,7 +1455,10 @@ def main():

模型训练

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

性能调优和分析

@@ -1461,23 +1499,51 @@ def main(): ## Profiling数据采集 -当吞吐量指标不达标时,需要通过采集训练过程中的profiling数据,分析哪个环节、哪个算子导致的性能消耗。请参见以下步骤进行profiling数据的获取。 +当模型训练过程中吞吐量指标不达标时,可以通过采集训练过程中的profiling数据,分析哪个环节、哪个算子导致的性能消耗。Profiling数据采集分为PyTorch层面和CANN层面的采集,PyTorch层面采集的是PyTorch API的数据,CANN层面采集的是TBE算子的数据。 -1. 获取chrome\_trace文件。使用profile接口对原始代码的loss计算和优化过程进行改造。 +请参见以下方式进行profiling数据的获取,并根据实际情况选择需要的数据采集方式。 + +- PyTorch层面Profiling数据采集。 + 1. 获取chrome\_trace文件。 + + 使用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() + # 导出chrome_trace文件到指定路径 + output_path = '/home/HwHiAiUser/profile_data.json' + prof.export_chrome_trace(output_path) + ``` + + 2. 查看chrome\_trace文件。 + + chrome\_trace文件可以通过以下方式打开查看:在Chrome浏览器中输入“chrome://tracing“地址,然后将落盘文件拖到空白处即可打开文件内容,通过键盘W、A、S、D键,可以对profiler的结果进行缩放和移动。 + + +- CANN层面Profiling数据采集。 + 1. 获取性能数据文件。 + + ``` + profiler_result_path = "/home/profiling_data" # profiling 数据保存的文件夹,需提前手动创建,请根据实际指定。 + with torch.npu.profile(profiler_result_path) as prof: + out = model(input_tensor) + loss=loss_func(out) + loss.backward() + optimizer.zero_grad() + optimizer.step() + ``` + + 2. 解析性能数据文件。 + + 请参见《CANN 开发辅助工具指南》中“Profiling工具使用指南(训练)”章节。 - ``` - # 使用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() - # 导出chrome_trace文件到指定路径 - prof.export_chrome_trace(output_path) - ``` -2. chrome\_trace文件可以通过以下方式打开查看:在Chrome浏览器中输入“chrome://tracing“地址,然后将落盘文件拖到空白处即可打开文件内容,通过键盘W、A、S、D键,可以对profiler的结果进行缩放和移动。 ## 获取算子信息OP\_INFO @@ -1541,7 +1607,7 @@ def main(): 5. 解析host侧日志会在当前目录下得到OPInfo信息ascend\_op\_info\_summary.txt。 ``` - python3.7 get_ascend_op_info.py --host_log_folder $HOME/ascend/log/plog + python3 get_ascend_op_info.py --host_log_folder $HOME/ascend/log/plog ``` 6. 分析TaskInfo中额外的task,尤其关注transdata。 @@ -1675,7 +1741,6 @@ def main(): - 解决方案:改进算子精度或功能问题。 - 2. loss计算错误。 - 定位思路:由于Loss的特殊性和可以自定义,在判断Loss计算错误后建议dump网络中的loss的输入来测试而非随机同shape tensor,这样才能更好地复现证明。 @@ -1683,7 +1748,6 @@ def main(): - 解决方案:改进算子精度或功能问题(loss也是由算子构成)。 - 3. 参数更新错误。 - 定位思路:在每个optim.step\(\)前对网络中的参数逐个打印其grad进行排查判断是哪个地方有较大嫌疑,然后构建单算子用例逐渐缩小错误范围,证明该算子在当前网络场景下梯度计算有误,可以对比CPU或GPU结果证明。该项优先级应低于[1.](#li17755175510322)与[2.](#li25281726103316),因为1与2的错误同样可以造成grad异常。 @@ -1692,7 +1756,6 @@ def main(): - 解决方案:改进计算grad的算子精度或功能问题。 - 4. 多卡计算错误。 - 定位思路:在保证单卡精度OK的前提下,稳定复现多卡不收敛。 @@ -1703,6 +1766,55 @@ def main():

精度调优方法

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

单算子溢出检测

+ +用户通过采集训练过程中各算子的运算结果(即Dump数据),然后查看算子是否产生溢出,从而帮助开发人员快速定位并解决算子精度问题。 + +## 约束说明 + +- 需要安装hdf5工具以支持算子dump功能,安装详情请参见[编译安装hdf5](#编译安装hdf5.md); +- 本功能只提供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 + 修改后: DEBUG=0 USE_DISTRIBUTED=1 USE_HCCL=1 USE_MKLDNN=0 USE_CUDA=0 USE_NPU=1 BUILD_TEST=0 USE_NNPACK=0 USE_DUMP=1 python3 setup.py build + ``` + + 并参见《PyTorch安装指南》的“手动编译安装”章节重新编译并安装PyTorch。 + +- 使用单算子溢出检测功能时,请不要同时开启apex的动态loss scale模式和使用tensor融合功能。 + +## 采集算子Dump数据 + +``` +# check_overflow为溢出检测控制开关 +# dump_path为dump文件保存路径 +with torch.utils.dumper(check_overflow=check_overflow, dump_path=dump_path, load_file_path='') as dump: + # 需要算子采集的代码片段 +``` + +模型运行过程中,如果有算子溢出,会打印出相应IR的名字。 + +## 查看Dump数据 + +如果训练过程中采集到了Dump数据,则会在\{dump\_path\}路径下生成dump数据的.h5文件,用户可进入路径自行查看。 + +## 解决方法 + +请将算子溢出的打印截图及采集到的.h5文件通过Issue附件形式反馈给华为开发人员。 + +

整网调测

+ +用户也可通过分析整个网络的方式来进行网络模型的精度调测。 + 1. 通过对比CPU和昇腾AI处理器的结果,判断在昇腾AI处理器上计算是否正确。 代码样例(本样例只体现基本方法,禁止直接复制)如下: @@ -1780,7 +1892,7 @@ def main(): 离线推理应用构建请参考《CANN 应用软件开发指南\(C&C++, 推理\)》。整体流程如下: -![](figures/zh-cn_image_0000001106176222.png) +![](figures/zh-cn_image_0000001144082132.png)

模型保存

@@ -1813,7 +1925,6 @@ Pytorch在训练过程中,通常使用torch.save\(\)来保存Checkpoint文件 model.eval() ``` - >![](public_sys-resources/icon-notice.gif) **须知:** >保存.pth或.pt文件扩展名的文件时要提供模型定义文件,否则无法部署。 @@ -2061,10 +2172,10 @@ if __name__ == "__main__": # if not torch.cuda.is_available(): # print('using CPU, this will be slow') # elif args.distributed: - ############## npu modify begin ############# + ############## npu modify begin ############# # 迁移后为直接判断是否进行分布式训练,去掉判断是否在GPU上进行训练 if args.distributed: - ############## npu modify end ############# + ############## npu modify end ############# # For multiprocessing distributed, DistributedDataParallel constructor # should always set the single device scope, otherwise, # DistributedDataParallel will use all available devices. @@ -2122,7 +2233,6 @@ if __name__ == "__main__": ############## npu modify end ############# ``` - - 代码位置:main.py文件中的validate\(\)函数(修改部分为字体加粗部分): ``` @@ -2142,7 +2252,6 @@ if __name__ == "__main__": ############## npu modify end ############# ``` - 6. 设置当前正在使用的device。 代码位置:main.py文件中的主函数入口(修改部分为字体加粗部分): @@ -2395,7 +2504,7 @@ if __name__ == "__main__": if args.amp: model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) - model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) # optionally resume from a checkpoint if args.resume: @@ -2525,7 +2634,7 @@ if __name__ == "__main__": 单卡: ``` -python3.7 main.py /home/data/resnet50/imagenet --batch-size 128 \ # 训练批次大小 +python3 main.py /home/data/resnet50/imagenet --batch-size 128 \ # 训练批次大小 --lr 0.1 \ # 学习率 --epochs 90 \ # 训练迭代轮数 --arch resnet50 \ # 模型架构 @@ -2539,7 +2648,7 @@ python3.7 main.py /home/data/resnet50/imagenet --batch-size 128 \ # 训练 分布式: ``` -python3.7 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # 示例IP地址,请根据实际修改 +python3 main.py /home/data/resnet50/imagenet --addr='1.1.1.1' \ # 示例IP地址,请根据实际修改 --seed 49 \ # 随机种子 --workers 160 \ # 加载数据进程数 --lr 0.8 \ @@ -3112,6 +3221,8 @@ for group in [2, 4, 8]: - **[安装7.3.0版本gcc](#安装7-3-0版本gcc.md)** +- **[编译安装hdf5](#编译安装hdf5.md)** +

单算子样例编写说明

@@ -3303,7 +3414,7 @@ torch.npu.finalize_dump() 4. 调用Python,转换numpy文件为txt文件。举例: - **$ python3.7.5** + **$ python3** **\>\>\> import numpy as np** @@ -3431,6 +3542,43 @@ torch.npu.finalize_dump() >本步骤为用户在需要用到gcc升级后的编译环境时才配置环境变量。 +

编译安装hdf5

+ +以下步骤请在root用户下执行。 + +1. 获取代码。 + + ``` + git clone https://github.com/HDFGroup/hdf5.git + ``` + +2. 切换到hdf5-1\_10\_7分支。 + + ``` + cd hdf5 + git checkout remotes/origin/hdf5_1_10_7 + ``` + +3. 编译hdf5。 + + ``` + ./configure --prefix=/usr/local/hdf5 --enable-cxx + make -j72 #-j 后的数值可以根据CPU的核数设置 + make check # run test suite. + make install + make check-install # verify installation. + ``` + +4. 添加环境变量。 + + ``` + export PATH=/usr/local/hdf5/bin:$PATH + export LD_LIBRARY_PATH=/usr/local/hdf5/lib:$LD_LIBRARY_PATH + export LIBRARY_PATH=/usr/local/hdf5/lib:$LIBRARY_PATH + export CPATH=/usr/local/hdf5/include:$CPATH + ``` + +

FAQ

- **[软件安装常见问题](#软件安装常见问题.md)** @@ -3488,7 +3636,7 @@ pip3.7 install pillow==5.3.0安装失败。 - **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed.md)** -- **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”1](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed-1.md)** +- **[在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed-7.md)** - **[在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭(export-TASK_QUEUE_ENABLE-0)后仍然遇到报错-HelpACLExecute.md)** @@ -3677,7 +3825,7 @@ shell报错是在同步操作中和AI CPU错误,而日志报错信息却是在 4. 打印stack所有参数的shape、dtype、npu\_format,通过构造单算子用例复现问题。定位到问题原因为减法计算输入参数数据类型不同,导致a-b和b-a结果的数据类型不一致,最终在stack算子中报错。 5. 将stack入参数据类型转换为一致即可临时规避问题。 -

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

+

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

## 现象描述 @@ -3884,7 +4032,7 @@ pytorch算子在npu上运行,通过ACL接口调用底层经过优化的算子 ## 现象描述 -![](figures/FAQ12.png) +![](figures/model_faq11_20210728.jpg) ## 可能原因 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/figures/FAQ12.png" "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/figures/FAQ12.png" deleted file mode 100644 index dfe1d90a7e99b19c64039c771b8f0f3ee095489d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13066 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�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 z z^h6c5^2$-I$KsnEqu{CY$9eU2ucCMV9xg&^Rvk;opGZ5r@+nItW{%8fC8|V-7H304 zUr^bHS_deNS)t0R->2wKdh?imzs`<^=B{TiY{x9CPb0A;1rPY$9IpJ*`qFAI?e0O$+z9H^P88EF3x=n`UqXQp}?Vf72jG~w)QpJyW(FUtps(UGB zCvsrbME1em6ii#DUB@z1IKu^s_K{|@`WHS`{kfO+ zK_WbeYyYnoe?3qH~s+_L{i-HZ5WF8?pU<9S@DOgYEfr z_9^=m#Zwv2(r_1!>^8$+snpa?Xv6sTD)_3x%dqtqusy&@mLR_B78{rj9hm$gEIqRJ zKPas~@N7b|LdIh;^M50-!r&yy522W<{|p*FF?ybhRi|<#|M?mf7d5P5Pj73j;GXyW zmurlFG6sHFBY^jt=fu~jF%yUmh&p)~qlP;ec4iIXYbb8o;*8_NDn3cm8J6lfDa}AM zvrMw;!R`z&RaWllFNgkmUs!n`|9-!BG+BFv3pXF=l|)TbPzf}y2xh!c*Jq&Cu8CM1 zU3Tn294}~{?7r0lp|jk4DsR5D*QS)bd48P@EL69N7cqJo4B3ccOE<0=*pvhtG$O@L z+H!qD4V9++SFLn9UdAitkrlGcl4~W|Y-)t3w7nUCM@Qr?Z@QBUDNPVMfk-;-l|aT& zr}FycqbCoIg>f=FNc)7-W4B4pC?-?gs|Qx4IOz_TI@)Bq zQcg%+)upmbiMx)eSyZJJxfVEm(L3VtGLQ1xTWhDduQ6-9qy=}Gy9yI@Lywn&3% z6zB7jRnytcKL|_92zRcMwq3U>xQib+wD(+~)PGo7Ka!+ac_ZHf*K;x`!w8=@Gt~C4ZCo$SZ};c`6Z^|!6REOkK6Ejkb>}$tm!1c#zQX-OjC5rv=6X%* zY*MI)sdq)M-yIrNdcg=K3%3P&@4ovI$lkTQFVQR!KgaV_;|CqA-^zXN*Mrdl0_$d% z=A7BEHsX_5#vUeylHf85T$ff3W)5Lhb6{^=*}^(bNZR~3JX3ee@X4)Kd(A7k0%6XIqK+@2U|-dpUo4mjx5T zOTm3pg9JC}cK5>zr6z=j{20HhV%9Za2PjlcaI@w`_S(d_xWDmi&aXnAm7++9B~jis z9?1i^CBGCxUb^w-=_&?Okw#j@kEF=sQ4>n>mevy>8n5y*eR)7n*DI0@PLDF!L zJc@8!h?;kgB~1#%MO@4~U;#=RJ~D-VOCqE9(RS{n_5qGIPO@o1G?}Wj>ca#d#X7XM z3ynI;N+XMD_Q0DStb&u#<5&Zmp*Np4KN`AVR8T?+XD7COT5tKzTgNe9ndRHAlP09m zjFNCkt*~rOElMN5YUcs+W;LU)dR461J+VDQ&u+7cGuYi?5^meFCQ}x2Et5ynAl~;A zhe(-zCdP*oWj}|-0EcWzSEW0|eY}IBR65HIp-Xs@C!U1r!$(If7gp*nsvl-EYrv$o zolB^Xu1uouvD*<_ig#ya1f9bh{JrThs9$Xr6)93Na2m&M^hI@`x*%pV+8jGqT_p4_ zldrO)t7}&E>|tJ)9KMD~YWS4SE{N@j#)sD$+H7tIQa~LKnxd#Bv7}|iIlWb<^WJqsgZm-9<;%AY zlb|#7Ro~4s^7C@)7Xt!%HglhkbV%md1j=#&(EwQ!w zmzHB@u=??y4cV{7Z7MziAOV+4EWi6{;I*uphn{DCM#Q8D(^t5nklUO5aJJGTG5mut zaZ_HcJ#PHiwM}A|-wV03bf!%$!M82UH&$2Pa|oOT%6z7jmowB zz{t^^&VRJJG&Pw%F$^dFI3p9PnXUQ_9P>Dk+JEo_U3!SWJU4yw_ga}+wANQnqzTZE zFD70~gtIyl1by(ui(HDh%B?}i7IEUW)A+$US^8f_v6x0cm01UF+g;6_;l^X0q37gz zU10q?r118AIC)XGw>hvik%w;Y7+!(vGJdNX)9+m!_{|QK4@AV9nPzLn*eAq)12UTRL$*`Z&Q zpD&igJpm5Q3k$`2#gI9ySLEI@r6f)UZH!XN#HUCPpjD}^pNa{UGP@FlbJ>;ps~No+ z;W#*@1N9g*p_L}T)FQon^GH$uOw21%JyLarIzqTo^A>S(3DZl7ctN$|^!b{jbY<1C zm$Veuq={^voP^;qsS|vh2GyVVJz~S{nok8SlrE5@voilC zy9Jh&f#+wNI=sM!c&Uqv;y{_(FvA%UW%4+yIg#f)N#i8@KOk7Gs#26H_v4exp-nG! zLZI=_eXO7TGPb!|0%8!kypODm4SSZMs%IA?visKNsD{c?Rklqk9Y)y3oHlwL#NC4ma6)xom z)E_HAXR9+H+`{FhnnRqjO4p8*rJg0SJ@s^jzM?wJF{~l?PUwn{Wi_-APsy;2Nr5>b z=6TI(!*COroArOwjS{db)U0by@+6wS@4|TDkJ9x1(&5Jl+Br>-Hk>vtzyt8k+f_fq zW=cpY=`|$2^OU^&Dy}->2ETo!-6typ*>mB6(mYPHRMBUyisIV%r$vJQ*1u1qCiTMm zU+ea9m%CYAzs8~)cwP5{oT^XP^YA&cv>OLB2jaU7_x1~O#Lg3fdttXx*dJd9>B?>m zEAx6d&MCaP2+${#jWD!{q*j3I!yVf3ji&TMKh4sJhFV}7(+v;{OsAot`*TRM)}vQ&Y~K#aF!F=sI{>-YM5;Pa!| z;yA8wLoBr#)o9(9=$x(=*DqvWa7_s*Gid&;ruOY}4$n(0AM7D|-@Dg}e{jKhsLEH* z37A1gqx~R@t~oS2X4zCGE_>YT%3ArY585jCG3aUPZh{wKBlk(~oP7BWsaUF|Rvn+d zkec;wCP+(W-KN6Bq&Oo`mqX^P+)SV_>1qDbzTpJ7t|TkpGURKMHc+p9p0C?h)ycX{ z!A4xaMQ!hZQRV-%1W1yoX+L|&%d7SL+tKPP+`|Rkn$-mb;2d)wS|CoH$a)=Zbda*1 zsswt{OfFAd=BdpB9nfDss8>`2D4Q7VGKNT9SPcKLD2D8+5srwB-r&=CR-H^gS9bCB zle?`*zSwkTTkNJE{;`{I=gsr*ky_wAIPgQMoblZ~;2DY2r>s?VnmZBaqE9^gAX0>F z$f}gfPFPjwoniM{_EUF(l0pQ02VC)d9l4~l=DHqS0eydLwWir=0sWi@?NEaMS|g|6 zZu0$X{{6V#`Ew@;e(86vM3+gLdU%uVspdp_)SRAPR)bbD9=Fva!lRwXeN-PsXSe4! z@d$EtWB>LgijsiCe!9o|>G{a3!EP|Skj@PH+iLZ>f7q?+9bMOh!-DT0^Zvv>`PcAQ z*#Ed$nC)S#4@icH~-;PvlCy;!|rm>w_L)dKA`;r9a^V6V+m#*ut&OO zsh@4dEOFiUK!o|1mOky}I+8uh&J*=;!7^ zq?pqm@%tm-mJbxVVE{g5$9Ar`t{yPf(4dESn45Pd?Hya&lQ?~f*TB-+6pIyK9)(GA zURLuLK{|{vw z6-d4k+Y;poW8;qee-Y>e-(D;j(muS%U7D|0kCt72>^rf{dJTMus3w+CzR#7h-X;Zi z_6>c+5A{vzh}iwJCtLq$-OW2<^~nM43pcE(7uT|I=hTNibJvB&WIS`FaN~%d8J0Gd ziL@Wjyk#X%H+=(}Zj>^AB@fvvK0i-N!F5wUd%~%AW5b(y~`aImrhPDrx zwa@#~?2g+k6_N+(n{<|QX5nfRpQA&|eV3r%oCYITk~Vi6TTn0De2TB$vy0j$y~j6V z7y6J@5G(f8-^1$9xI^b+C!0UqDK-{PMVj|oP}%WMJz;!^$R-BE*K3mcb6tPJMJ2vi&RgBdpFI&hwK9ydFyfmj+{7SIU0b8i9Yx(oO*-PX9 zBgwCKln|pGZndE2?b+ZuSY1kH9?lVAEhRn+_RN}bx*F?GnH}^teR)eszrYH7EbuuG z)*l^{I=1^Oy04Y^e(>g#YJ6Jr1mC}M1`#gLYcEr@cx&EX3FN)7|g zu7`&;_;LT*V+)o@--g5%s{n&Y{A;MyQ?WK1ku4%_fR*70wX86FH5%?a1~=s#FLyB- zq39#qk-dNyw7gW|Tl15Fem}kAI=Th5`tn=X2U({cJxJI)nG%mup%wwfg@r(Vss`pi zskHZ5u*rJ7&PW^aGcB?ND6Q8c=s%+*?o~%dFQyL9{MyFkh?mRn&3--y2Ar6EcA&M2 zcXx63QHrJ7apW1)=C@?5X(qGb@Vy`Fl3MG2lHtp{cX!JLbd~c0{RTln*LA3tweI(ywvj9@&#Ge-b zcbL#tlFGWfcS_9>wr)4Lzap#Y;d>OmZ#geGnE-cK;Yj266Bf@#g#YNjcJ zXB`P=H_EHaX1=}MH@xm9rzwVdPnv@gljDKq@np7|X@zKPL3#4)D3_Io*Xt-2hU|~n z1$0OEM>gZs1rt^dCMbay)wvG1zi^^O>V3mcrpv=GEZvKSoI7RaL-0V}FTmz7{{4q> zTtkG=l&;Ke+}rj(7XlRLA-MeoHV>Ec#?3k6O;f)Q}UeD!XvPUh|+{4I7 zOhit-;FX%yTiLjT$Zag^h|5aU&vVtzRWww3IiIiS|5U;qss>bJL>$r_QQt99>8Fsskt5xu5tiX<#-xTQ#IRYC+*i zyS5l(V&f#HUdEBe8DEuIDV838Zr6#i>ePv71lF#3Z)*sfmg=6Z$#+AwiCH3hGG zSY4+J(%Z?(f5NciP-{fMf&MX!&6#3*JVCWh8`Z(UXm>4H-pqturH@+=+4gBn!L!`) zj_cRPhKGEr&5++0rnOF$7n9n?2>k>JNChKJbh4-lvwar2Y)6L$D$5zY5MMfn zOPd&#v2qx_oxlUGuF5=n0T6m^4xfv2Y6?w zHqqXFYpEZlz21erO;uB7#j-+IlC!0`*0(LV_I11E)i(8$49ikT2Zqls6W<3H8YOh8 zQQu-pAzMjb?or#}P3*|fn&IUN*8&2|RXn0fY6NnYv=k7p2_J-?q!tc>`XJdBk6++v zW;npM;uZd@UTe)a>~(1(DJOt|R19NF_c^*zmEL4c+G{x1K0Yf>rJ*u0nLvF6S`~w3 z+ooFLKTu+GG0}#|LKwxMb4?Fap`c9JXpe`YgDu6C1V^S^tve>>n>3*xR-O;{mL%y; z8Nm<|_HZ}R(G)dX*IV-FY81I?P z%9}o7^}aR;IY!58360(;O!*tf+jPcP_ITlqEUd~Xt|<_ zcc0;)#NKbC@`2|8_m0%Micr^ly7U}?0`R<+dOt1dw4-c-w=3(Xr5n}0p1CoLm>g1cuO)?9PjL>i zBd2^k)e0y^lo_GH9vGDTZnGZJS2in%f$LCUyT@^`W`^WghrIYQ59&AyNE0=*(?%-L zH*uHxi^x8Xb%g4_+Bv(3j$i4d*O=(-Y#8+McOBm&yit(TM+lS(q>*@;~sp zTIQ7;C){)XdBc~igDY~)+Edd5gc{F0l~=(rNOU$;2V;UP03L|HO_3hwV=l`AJ4z#I zS3#efjZfck=TA+SmRpw}Tw&5{E3eLQ*a0A19#w_uKPidlMCz`U1%IA-k+tifvW?T7 z{Fo36U|kW`nE&xwTU1B;4ayOpO%!{KG^R5PW;EcfL~uW;J8s+ohpN?yDSJEb9E%Om zJ<{nU+ZV}I_Qx53ulT7$#J`Yf9Aw+j!iQKtVqLPBKHjrJeyohhBH-e>#x?uk#$2nr za&;|L!K(h8NG#^oO913qg+KR#x1=KlM|kdggPQk75F~~ZVKC_ap4nM8x`%xFDbGt{ zeNVbk(A9rmt8gfK&Xd6^0Q-X8lv4L?n#sPwKwv>qn^ie3QdAtP$BgMGvTL`>Et4f<`;o0F zW1-z~#TCvb{Z%qjh1BNKw4;(5k0+$QmSZ9ni(TX3+w$C$Iq%#na~h#T096#4l2>FjyNnRjzRlOfZLK^7E7-2)a}(euzt8fay8-a zyeZFa@JzhSX6=Wq;H*^s*=;OL*PQ%nN~r_7KX`^*=% zQ2~(?vxxir-Yq|RNS2RcS{Z4C1TkmczP&K6lg7I=hlpd`{Uy`?DX6uFcVkwkwMuvq zoF3q&{Ig%94L~}LBs1?V822d#G}$`mQ8ARu6aG?b-%rLU!%~)0F7lA$D4^QZjATm> zb5i+jp@9oNGxlyBmkPl?j#WNJ&X&44$%t?BFoxZzL7q_ghTX~H^tjc}ZolCt-V)MDMfR~y8V@f$E>k{c~ z>(ZOO-i*lUz{6w4gnj`ReS`e2U zIJho?$sMWUbMe*QLwfA>93gCF48+Od~biRmlw4y&Ei{avGj^^5D4_5aq~?E!Hm_N8lmSJTIbVofNH8Z{`I?#kPE!uTi#v*-WXj z@$Eafq` zjbPTSxqf1m%d1(ZS9his{dlyIH^=*Rm;cJgF?m`RA)*&kudk`EbgF{oYMe|6s`p+H z=7^HaPsAgie@gt?t#}filpkPukGNaFYJ$~=>ACvjb2zMc5gcM6=LnXb&pp+8LwXpB zX)0{W4t$p#xG6%^yi;fJiP3pSCiBba+_!Z9pTVR(A46u6;+HEeF|x*$y2X|cFP0jp7gU+;dX@JksOJ?4+?rADFol%J<$j52#8~JyP5{xnrr3 z8PT1r-*66Wj1Q&+eJ_z+)JMrB8Ortu%I1z)fe~|}Qx2S*X#@kx7s!7p=KA!*mNOFH zhU^Rk#s{8{zj0aD2(HT>1Qz~JU0)uSWY)&rzD%j5Wu_G~nNgXcl}m19nTDpc%;cJs zOYTxyxdJn7YKo+mR+i)zl^JfhrO=|7nwcx^q~wC2ga{(*cbu8`eZT9wuJ3P=`LzVwQh5GXb>B^(Dx_W~BJKU(GK(a|qZft;^7KVnL z3vN7quhV8+3?waMv;-iK@MBlrQGyoE11&;P8cYmkhg$J!#kIu(@26<> z>bNx0Esx5+(X5MUw4Ea8_Lpm4DZ_n?Q#+k@82GN!8_D0mjX=pcQ0yuqb zI4E)csGa@P6V!#TtY16ex>L;WIJ~jQ=d8{>C3JcnKmErAT{ zdNv9D0{>Ww%m>s%hpS&*MZ%vw_HFR&#l$cdrAiO(SQ(taJCOqcpt)}TLgjh*l;iC6 z=%E4lmFOl#VdIvUZNwHau>CX$SK7%|apCO*F2j)4Q`&_+BY!#LHEO?;OZ-agQJm}~ z*WW|6fs((?=H9ux(*;5v9zF`zv0w3_16>5x@w>KJuy;t6ktXiaBlH)Q=-0?~*DDRT z`0e_FFYKcpm^g;ZS|nqcC}`evoxa^ zxpei!XS^G0X6P+p=Jaj~?GEPA7>htbrvhqlK1W{&eTh#{>Qzhq^X?eRQ@He{CE#(z}NV255(VQR-oVV z$jm30Tp>eZihrf;UqkJ{uAt-;5xk_qV{xH)+>7_=W%)cQZ1{{$7rG#wg8P0W zL<)ltU1$YzJ==cL!5cD{3JtFRhv3zWqUn&P%3{xA=i~5Wf8PgPc%L8?!+r{NjDk9igIUL$H}_ig zOp$UZ9>;vLLVj8M0hy-K6UMD5RcgBOo3iG?4dAVH&e#MkE1b@nf>ok>+EO6L%8=#Y zv3Oy$R{rK0+*l}?d<%k-+QuMs52gnLXGg&umu1f>YTJw zus=!?$_0G3UR@x9NhtrW3G+RLir<$ld7hh&PY{k)WA!B;Z z+T7@JeY`RDt!bRec&4qW&0LxxY4;D5S8z36p@onUUjZqY;SRAyVugluGR)ulB=`9 zs+B(~g|55iez*>0Wu)m<8R~vtT47H&A^Fv0t(KoC3LyRvl0W`*x|cZk$T&#O_Iq+& znT>rir~|rHy2)qiAIdWhI1j^Tnn-Gd+w^qnt-q+Wa41(|4b zWf0oRm%gTVf7F&AKD%Gb91$L>v9Isfnv$~KE(Kn&Pq;k+d7u&m>ICpd@I-E45n7WA zd6GV8SBOEtgB4e|wpyo3HY#JDdMh>zO9B=e%aliCEH>?i+<%vpH==l;`UVs0Mhtw~ zGwmpFECci9Xkq6>sfsr3IV81b%ScUpCAEsrt7qhE#izlXblVN7r$7b2o6{u)@p*#b6ZV5s|kMgJFP$XHnH0|+;3Zga*k zIc=LI`oLC*S(T?I__KR4Zb|IQ|GfG?n>p}-Wh)X(wqJF`wSTmD6Q*;odpYg%A7b}p z=xWB&VWTw%miBDPvKmGSl9+;Y@3D1td9!-^FAx{u(thRt2QK|H7$Cme|H5yq(kw^a z^|m}xr3$`s<`PbeaCF+IVsK)xLvmXV`G3&Tix7a7mU;Dh`h$2ofm7Dg5tw>?d`&C* z3^_AXXEfaBaJfaG&wd^-)~vYJsk$ZO@n7b5q% z%MgqpJxO%L^qTtAqbyutO! zfmBK0Z@BiR*t(PP^Qr@@-)*<4nzR32xHLCm;nmepDzN0mM<@B#u zlRPg7ae3tqcr1iD%*gcc4~>hGY9WUK4T$vlL#@JRHseO$G7e#gbkfrB?;ir(HshHJ z%l8u+P1dPZo)S)5W=eX1GBcTXu72W`kU1cOZw}_cNVz?QU*YS=(um^=NokV{)}_vW z3d-0ndmAopNc%nRP+?1~sdWbAUd-8x2#l&9UK0HqT{f5K;!NjZCJO8MU zyF~uI5tXjhiTg`&ZoQf{S28^w)M9Qr&nutVC%w=l>kp2zrTeoXAB4)yWZ3NjxX&;| zM_8CRh-ww@^}8_mU>?LKuAsvwbCO%qVnuFs)l-jyuY_B@Y8wf_{_+t}n8)>J>vNl26CUrsTg}QC`|VV3c}LeOOk~!&?xO zRs$+Ut~^cR#kR^qyckVk&uG!l4qSpPX00NDNuvR)^QQzAf&B%~OrUuZr3W_5 zb^RPbh0#LZy^Y&Q=#Y&EpHD`V+R)60x4c>Uy&R0FbTsc@Th3l~NFH1B{Q;5l{N?g= z&A^%?D%ahdm-aBymnBIbt$c9~^^51)Fr3p-jt1%7F!IJCsH%|;FZ0wU(XaTx;`m{e zhM6p<=}6XS!w-BUYHKsHIse8SwqT{7tCkzCW~~SIb%;(o^OFvVLxO;)M(%XuXo9 z2U>u;(TAo@OJI{{j{kBKdr-8_X6v?3wtjBEeA$^k*t8pWMtd1U)mhaGbF5j&dGC~- z%gB@Iw`)#n`1dnxY0X}gr{usNk}h=Rl{Ku?{>=N=$nEG5sv?j0A|^@#%#Q_JopziT zc3V8d8YSQs_BDbdiaLTeJAOJt2+r4s3`{BNt=2_y#v450ij0J<(V7gY@|Ed1NuIs8 z&aUmY7R*YsQ3fmvm$(2{Qa|$eYu;}JG?U|)*hSSu1y6gF{!p0L<0F)(uHWRt*r>J^ zZIH)1(Xj{*ov0j`(JNN)Lh(rAZ(IV(%{BjuQr2 z(y4FG<%Mo@nA6F!rZyR$P;3UVlxk_-mm zc1eV~R>G4yGHl02kWwDh-sZ!WKWvVgM;cg{?*9&lsvfTPCw>;^?x!#{d-;X)%$I}_dFU;Px6@~S#Xy#e!-3ObV_F9;n z4`rRsWoqq{YO=CC*Cm(rfQmt!RCXvn+%Xt{!pA+rRCB??>QInQA+mfyZ{;K;+oG8c zLRuT)7Y@0%b6E?O`}Ievz4B5=Zg>|wcZ+d*SXUpr^FY_`Og}a zjCWL9A!AhkHR|@{hn8954P`k?_dDE%0OkyR(3Z?b|0Ye5$GspF35S;X$!E%BwmCx5pKN+g1#nN;Yc8q7&Z-SUKSJ3D`-qmv++tB)A@q-i>vkuQFwV{ zRYlP}X}YrW*7hNq8zDn+LT)8Rn^^~Y8MaP9?cp%RZicqRuU5q9hvjZ5QgK)09x(NQ zAh*#jT9`N|kE!Udc2T`Oa|pKI{bEG)Z-xfZPh^`O3F|q+M=LKs$JU&$Ehf+nJ0CYz z?|h!=43Z!%VpS#70k(@D#kj+@rqpMsy6&9x00>rYtTSDlLdcCLCs zWmhgO-jv!wosH}bRjy}rE^Miq-N03x=kP}XDj#T~3=|iYR-6S&r}*LRyGMJ62 zPBxvO0J-2mJ)}W}5NVAC2s*1xSa#tR&LE|zs-zzph3TBKpFoBZZH6iD!Z1BjXgS}H z)-N&2d_qLbZ#g1*IX&m_+>4f>&;wz40Fy_Sp?npAwsV3}ST|z&%S7ag#j5P+rxLqf zkoV1_P`CB3m)K$1YLb6vz19Z}_{uQapQ?Z9uQ*fv**!ccFQY7kOICY%EkL_nLgqve z(ce((Cu3eC30Wygh_{v2SHNYct>$T3?a-;SEV=a8WD9g-vMk)Du+CwInZCzafHmeeqfU&YL0vuL+Syqs<# zvZ9H$LB8yrh#yl1qfk2~9(+Ic#0S=RjqZ`lJNX)QxFG(e(cuv3FdoUPu$5iYX`9u#Vok1l*Mp}U?P(aSrdp94d z_CT?&*Az%94v&6)0`HL+;F+Z;j;w;-SQ?{*e+G)cFkQ^4b)gJ_kHOxY!)$bITNJBRAflom=iu`5BAI$V%DJ)PWamrL|^wP998*q7+1e{#= zH|6Gik&oU5(feWHyBlFc)C9D8Q~q9EGA~yX`Tqxj9$fY}{;UK2?|DVE z;(xq1fUmlRmn9layVwM|dwq>uYbier%JxM5SYk;8FlZMo|C2wOKHmQ`&AYZfVik9J zkSGdQv#Cn?SMazxKTEPc2$N^hN+Wh-lZd+jtO#XmnUQediqDuZ_{F)FI~7D73=G zX?h}gZ=X>S{1{@xUWI5^R`h6G(g7xrF5gOD;}J;@H<$%!4DG>(_B$ zVw^CO6n17N{SqLz#8|G0AE+yyzg0qF?hrDlz)NXSg{zjdBI$VpEq#XS@b!E@?usuT`y{xa& z5hkPfvpvG=QI+Ph7g@)Y`3XO_OY(KCLOU2ZUftWctA@Mf!+!v6W{&i9ZQcvrn9sSN z6o5Q%yqZkZHKjvJU=VGJ$RJ#r=d>!u>X_U@A&~J(=-A{j91J@?n~QG5dZM!6$uCgZ z#LnAGq!#Kl4>swy(8>JBOFxbGE;KydXH-E~_&qLoBzQMJ_N#xcz;weu@F}PB=?}AD z3TVcyv;@o>$(OUr>=?y{9?9h5G5(eOcoawaM93^tUL*p$n<1i^NrBlu#!B&0Fj++|0-w!NtN{Wk&U@hMd&PgeFbNju;d1m*0@f@@$9M2V?zdCPHbHp!3wG%w=8H6t?Lh8QMm0wX^C4Q(QfEK z=$9$-*$jz?=t0PR&JETW?a{$Aa+6}^c~|~plP^PeZy>zCEP}7shui@{GF(0;!b|MS z+Nxz){gw?fgb-mGjhU0N`jlOYtHQ`1XU-DSG!4?ve8(^M{8Q2O72F zE5Oh!BTZ^LYPtzd>TF|mfkqUm4p(=S>E^IqN_SzQjN8KB?rkEmYgo)lv17&*nT)!N z)n81yV7vz*={Mu3Kc~XOSl@;w1xx3TH{J@r)rC&>QYtumc^AWUH3^ zX>|o;kvAxIZbU_~F)RC3j(Upg6zPN1oDGg@cGVd3`a1%x;ItC45YO+K z?-3HuOfxsopmp$ei~Hu%_IGzXENUd!QcouQr*XGJzj1=zM(2BU=E9AVlyvdHlXC-T zBwxcu)OJm#o+@-9pqNy4|2?x*?t`}$pr$~CC|g{+bv9N<3IUkl=NE}aI}NHD)@|)% z~?x1Z&10dkbA%5+t#glmD)}%2Ht5(1=WnTy%Ii$F)BxVbr)vHr9T~&F{!H z^LjEryeEbj78Bk9m)FuB;2&@0oUz%CwQ4ybZiwChB~?lqK$Y2g5=-2 zktD%Iy*{7?dSfxv1ev@MY~9{WuChf&)QS~N%bsaE@m!F}cNn2rnm?%1sU@v}k7veh zaA)-Uq0#a}!?<+sou-%Z?zou8mxpL1;_i9St$6t=rRZ+lgO0m#%SDp;Inr!~Quj>> zr1H`NvA=lKKFzV>A=iG_cBrs%;ZTo|btv@D*He2KT17K_D9v8)e#=3K|R!ZZ?cU86rp*q^0;5_Zhkonkp+78kq`0Yw-cLkq| zQ&mPu$QP7bn-sBC@Pg&ROs^h)ZPImVhpdB3yAcNru&P6D(P5MJ`N9)bGb2T?Fqs8E z(&3}X!&nL10{3&n>nUChoENU6lPj?s`z6~7k~`13w9$sex(eNTVJq+$vug*ieGc(% z6`0M}T}cBfhVAaA*5A#)DZJM>6NFpF>aHY;@0$#NkBbt;5{zEP1Ciz79avCLjI>S(}t~+E)+k z7+Wpfjk!}WU$|>^Tb3hzwd#RPpjj&hxcqys|GxUaySXL646Xt=MH3VzBpEki8op3Z-hnEdikda3hFfk&Sz9NRI;LKWSty<0i%;X3>9CQR5x#hq zeWey1!kJNAiHn=M?sghbWcFOnHo52VpHGs0@7qoHlJ=t^sD+P&goA1huj{;bQ7spW zSb7^OP8sfZO1843S^_hR6I++4|CiwKe%i<}c?dJ-)96C;uw0lMLRnEo?E~g(hKJ;z z`INN#!9JctH7V%!I$luL| znF2+Inn^t5jie$SZfzL+)#p^+k9m zXWx$PgBEuDMzwek+e-3vsTk;F9S@@^x5*t~3-Z*d;R%x?sqL?s#!&hrC~wjMK_cUkPwUR=b@z`! zvOc4DlGuVw`4CNxN2s@@M;uEY*fA+2B*QLvJkrw9Ae`{PBWj**npBOneRy9>b>_n3 zk)}k_Oa$(}?i=V0vol8JZJXrZE?tQm&9$%<#h=O`Oi!*|;piOS7LSk~S$nAY-KT&^ z*Vb7QYh(k`@TU!M&z|Hs#yngd)n*OClrmH~&xV?zF?Or1ikq=^fWOb5%teq_1=0T2x+=QwO;tCo9=r$ZMC}n+{^*V7Zfc{o+FLCdSA6k z>Z=9Ci!WSsqcOFbCw95J(0BvshujZNb%730_nf8!!8uRsga)1j@khmZpSWUMwe5p< zZ$TjIS4;293>{Awe7bo3sP7I{!UcKUhA)VO5{#YsMZ2*#Fb)d3YEPesr(;=_3BUxn&|U&^g$$5gpRqr`agitaXE+o6G#yjuyBUZoD-I!g zmO_;34?TW^$quYJ{xn_gQ%78Byb~NbJU{zwt=CyfehM_+k?$vL4m{Wh@ zz`RbQ3vh0l`|;|Fo`w&GIk)L)=AQD!A9CCiv!vi40f}TEE!xg){xs^@BTQ9IS}9!W z@-5FceS-7HzzJz8|HSv@ycu<$g()a^bKbg})9kw}s{2N@!8)O!)Nc>qrnW+4OR$pqAgI6jHDRpMnpOo2yoy;j*m~z;<+x%bIN!5YN$mBBz z*_$0!T^)U)=suY?Upl8Kft@18G&hwS;2wsb%H2qglsiet+17#|w==XH5BkTQJ+ilY ztm)jcZ&9yLd7J&b5l`8>P@JuHTl7J$FqEILn!e(uIEae=S;*;ZsVP`~K-e;tzr1vJ zTT^-oTJlHjtc&u6$)qZc?(*z#l?wYPYRV6f1bYhV!^1!6yi~eLmkV`Yi^=aYI!LJ- zI~)Ey*+$!^fY^ggY0C{GJUrTddK$hJ-iJQrn|ytMi%P+O3txubm)A$Qrau8$a1k$E zTBP{((CDWuCXiy9QuiEb`!ikF(_?MTYbQ^fIe{R^Nww=Lx(GrP z0>3^|lEZh_T+Y3M|53SIH*rT0+D5`JqE_d3cMyaVQB%31?~}ST<{iMGdQ7p_vt)Jx zPusq{L`I29Hs<6@6Mvh*_mAGdMc42 zr{cy=TH<59+LyamV@Ai^lZc6ksVY|w{!XhpdD(iexcyvR`MN|yf+5Qzw>%lL-)wfu z&Fm@SL*AeWf7C58j;bbpqmoCJ$rZx$pV#V$wAmSu>lYZ1wgfb?HC;$rdEu(7QAqqv zUHBb^y}q7_C{bd9B8d?UewY6Qf=5l~@F6H{L`K&C+Y5-Q&Sk{1*^CbB#FKpDVZ3qb zCO=5=oFvf0R>ee$*>!i(q^nVYqDcLzm@F*T!Qosw+@aQWq^FYV|9 zlfJTNshc^H8V6i*a&q4nJZOJ-2Ie~qo=V-6NzQ(v&+zs+ifcGe;3OU;fDj+Sb`<d4~g2zM?Tz%3ecC*A#BGZ2RO9 zNexy?pB03hSjHQvDx?crq-{v)Tlo6i>wI!{?P(Sk`;*kvr6xj&>B-q$?P)nWudhBh zKHThaG#d=B?#nk^6pZ8Uno14+iq2coWX4LK#*V({Q;#$n_S5KNGP^%US$T>Ni9O9L zCbo`MQE9RbZ(J|4LMxIC33j?!v=~$LN%mB&!kxFLZZ=03a~l|3{mh9rgs4(D! zOcQ5sVpQ&9@Op`}n(#sOUtT?-=hZ|banf@!KOM{es;Q~v)JPm2tk#Q2w8)jdcI$RH zf!ROL&0Ry8ndEJLkC^K`I~k&Tn#C~hV&jxcS(&jAwSj@gbDPRDxFwuM-+-@O*~s!# znAKO}kcNf^@9*Eg=NsmEKIvNsphbk3Zg3#)!>j@d7yYt@I(@UR8Zy{~*eBmVucmHj z;7N&yw(#5*N_>yV-TyZ=HRaVPTBZM9clKCP!=1O4NIF)u79TA_Yc{Ayq%`=K*KAfO zT8s$E%?%=*JlDNvyHlrc@UPdYB57TL33pSpg`7hnK)UneDsLz%hbUEOUn?Y*H3mxR z86Gu8bVzKO!>v{uiV7BQVam%LBMkXEQJeMvlB~ggZC- zko4`2?{Q*@7dkh3R!G(22J&*N)D8MIPMtb+yJlz3McR+3jfRHiP-xI~gS|qe(+yv^ zxURZkOUeJ4a6GgI|6W7}5M-`~3@4;aX>~oWtchKy1`XAra4ztUNp~VQzpR3S!lqm6 zDXcLZbzZ#B872RjQ5}@-JspIzf>c!}mjsQ$M|BY z!fgU{%tmFggj50;{P}4AVa%!i2IacYT+RF3+~4V+;vZRg_LBa;{l9tavR?U; zB1=J}4GX{_{JyZnoqH4wjm>6{S%tZ|RS-&%6+e_)sSd|~k4OId%=16}jSaKY;@sRb zO1Ey^`jukFf{lE}w{imI_B=4f8M%Jrh65WbtL&cbVAxEI*!KP>*I&l2gRdFrk@?N@ zN7)TgXRFQ#T$!Gpp5JjLQB_s#ox5@PEK}isW!VzS5KC1ex|~^FIk}n(b2U7OTH>sK zVZ4P-JUNu;=Rv(ISW1536M-edG~Ihx>RR2wKInb!CD>+*}vAQOU zFD5111nTu?Wd$5%qrtz&NSjv3Mm14HDqc z+{(f=y4YW%?wlVoa)6fxRgID-O%AB`;JNA4zXUkX`?%qlyD z9W7kkH(gzR_3D*4Zs~i1=22nb6KXoTB0>C%Z2Ms)WHPnhuGrX?mzz7)Wlqn)lW{H} zDvM80-$27Qx{D~5uXBSJu}rpAM&|CA)X@X?^Ip_owWxHPjSREOCtYL0EvfZM)`MVp z?oh#`s$)*FR*-G~t7x{A6V}4unG{hakgPdkIICIl)3HLLg$Ma`BXL#>@G%B8tv1NG z$6g{7Jkv4UA{vc!%ivMRy`F&-1O{RW!@yCeQ;N^cJ)RrCG#3zwvd$}9obcn20HiDD zR?|C8Pw!2#8|SWIk~o`lUTs(aKaWfP9S-ux>zo1wY<#_ag&I6vc)q=jtR^Iu!f9OhtD&n{ou3(zFzr?#v81O~vGBq4iVLHTHzG(CqsJ7s*2I_2(v3+$xB|qofc<8Qop^IZA&GlI z-XyX0Mw~}RZf+m-a8ec@YbeT3A>|L^bFHsTq=r5eHFvXbsRw-!Q@z(ZOAFi;Yx8rA zuJ}gWoBPN(3X4C1iDSV{u!OCz{4BN8B38O{=Z^Nhdw)oxi?2O=_|RH=);~<}_PZ zK6j@joM#eTx=F|-(3PJ*2AsX5Yic@5iu6TRpT)<1&$*rw^6=3kJK`6f(@j+22i&l5 z@}v#wNKAtRWe)RW_amzn6^u$C;ykCm*oZz@7s#Etsjj|%Lnrq^_5Aq43m zDJL*qVl9`Oo06^A1C&7cR%fRuFkgS;ENQOl$6w`rKG%T zlWfawk~k>K_SBhZ$t|tzHZnw(`HEZZ_(is_A*EPrEnW3kP?8loxTUq#t}5-Gf6)1B1DdcdW@KUXGGWBMe8H7R?k8|DUeEf7(SP0v*xPK-*BhElVDl$6&KZZ#?~F)?puZ!=2F z+X=v}KFM=vTm?0TX};=64zaW9sBD>DB?p^v7Cw(6BrLkvB2Ck-%wfWxTP>NpbAz+x zg$AVix)2(Xx;EAU4}ycC;HucJ4qu>6(f1W%iDf@GuERZLJi!O zgWatbv-moMQo6hjZ2p{1&r_VrejF9WiehH=cKrSIrB$=*;ls9)!<&S&va+?d=2AW8 z6uj$Zv+U(B-@W%}WiWN~1>w-vpZY6wqKrp$T`w#1d65!E>+8(0M%rc1$EYu8sIPR* zwL=gS%ndSTgY|AXq2b}zlCx!W4f^Hi#)*)*0OAl$q}%`eAbD(@U;#O9=_I(8E8T7R z$M=#420q3lM;G$|VrCn}y-`3$weBk$^cPKD{1WA^kRVom#h{+(bdt|_nd9B%`Gi%EkhUjBy*xU6oc%oI>lOUQDF@I zCkkFf{ta?do%tkPtfd3kLwM~hh%8+VAd7>c$ywfCCfY+Cn$yT)(tF!!VU z{(Jwx6}eUjb*@rk6kNRXt6jS}7_p8CHhW} z^O|VOxLx!zGnOy9_+nKd2Q3{Pov4QU%WQjjBBjJx*D$LgB5j28%?oYh6BUm}vi=28 zQ5R<1(rYNvDWlsUF2hr@WkSTt=@DWQl3*8UwiVtiLF7~4l*^}_sJnMce`fQZKYxE~ zxcSa1&smHLcL;6ecP=ze&vaA9U^aCXaS0PEziQC`IrM!_mu)q3!x%DdWbjvVZggt= zx5wpGo9JG)8~AumSp5&M`mHRuyik;I%M(`bwOiX($-gC$^aXJ|ia$A9l|-h~lo+ltef7pISVj#4gC6?k6$Qk=U~`cKm7D7{m8y8B*f@~~_#NP~05yFPX?0(&W(zr2 z$XoNW+1giway`)~(E^X^aqkwS#GJK_4g`;2I_NL(>yHH|o`L=Za!K3K(J_@ zy3mgD4P%1{!e(yIIF?q2jfh14_|z6sPkMS^Z883UnyyNBMPZH6xI6=cwAHk;@Si>U zss$1OyEX43ZAi3MW2DhnE)c29qI9Wc2+So@BEKHb=P8$H>u55EWUqa{KdO|K3X(Ki z6w& z`YNj3CmH;l+rG>`Sp(!stb6})8p@grw?wy!lV}m3#5{FKmcn?;YxLzepcjSk#*4Sa z%P2ysLs7?~Et>YpQYCx}Nm)vbN{=%He9(7IP1)qx+@GLv6XGq_El=6~e}+#LCOFu9 zr0_Je;8gq09$lll;YX?%X5IROzWt8|jpoOX?4ZEJr`NdZ_AS z&!0d4@3Tw>Y)TO}Vmpr8vr{Ca%a-~S_Qz%S-_c&et&r-_{!WegA$k8oNLOT*998Bk zl(k@pW^OL62YZg8uI_h>aT}Srz);kvX!K*IsM!Y)2~=j=2RSC&-ftO71&zRhTs6H> zONmic7FanE>tKCLC~*!EB8g3ijg3vU;8Bb76Kknc!DMfvu%st2B{k+0#zKj78hwW+ z*MznuQpL&#J}Ocp`0((gVq+m+rhM1SX?bW|ju2C)KjN61yB*8TPaX2?#fwh>Kq2l5 zJ7>maF>fN^gpswE9L8FqIa0FsE{2dqW;rI=_+|lY580Mh&M}k_`-sWPRyUYv=E3Pt zcds+iiGPAz2Fk9i5NpXr&|lDfGIQ?0or7v|lKc?Hd}^H9rB|X>)iH#3On^6@8?S&O zj}}YJwZC-T37*Bs%eyTcRy1meK#-=Kgv2?b|oE%Jkn|jkcws+~?2RAflTiXPKC6anYf$x$ITR ze!o}pFSM)c@`4d9vO~8BwY+$c8otLpGkX6bxeKCnCd8w~I1)AeFxy_wR8<(nyiLsx zBMN1io0|;ThERP6`e3YjqE%LKE&!JxU~rj@ke~RI%mqBpw%3}ufPxPzH5PIxFkFrU0NF>z`}r+h|B-0X|q>Fz}53FCM5!TXTaI(P4NA`dTWM0Gm*tEi~FjgF4~4Pg{3 zqpCf)01LCh)~brm61LCil-P-B-8V{-ENqzb{0IZyy-tRY@11`@z+vcNIs61hP1j;o za&VK&xw0dM;)6&%L=rJl8WI>nKmjC*TcX7@)$g(K=u;No9{g*9Wb&!g_eoA%r1|xX zV3Dq>sOY;%vk6|*@IPJHP9!sTF%-3GTrjXgMMcHpRb88FpUg2^x~ha+BsyG3oA>Jo zkaFYU3!qox!z~H-NgfdIk~Gj0XeI(RErn?kSt*I*)-W&g46am9#HfWI#f#B@Y(h@~nT$~?Bu9j^3FQU%IG=euo^+>_&jyV%dGO#t z?brdFj433pz|f&;XZ?F$-*OyxbCr2A#H?VCK60!5nfL4IBogwj?V)TLA~hRapq&&T zun~j1nS4*8jc+oy8UX7U9bAMN5}S~4@pjxBX;qzj=&<#yykAEbcQ)Qv;=g>%e103G zKGo_Vgiehz6>s0ZU8cv*8|Hm{G}z9;6m?!$R@Ogn@Oz;)!z>9BIQ{EaAi2bkcRJ@} z;QQ4FAB8$&z^M^QlTO$fw_VIaw8hCli>Yb{~HGroA^>>0X&*_`#)n1dQfHK%^*y zujk?LWi001qXoRv=;LX0FbnC71rbhMt3}Kmp2cUQ(Px_4lU>b5+j^};=pdjj+y1Gv z|F&bCQ0FEZC+Cg9G@Tx#DY1$cTRq~W4{1V|5~HEwc>5$%Ad8%%t|D=9@6z~-L3q@@ z&o?zSS(tU^j<=#0X)@zb*5bJQM<8o#Ow36vi@4S5QxyXDEf9`RJLfyy1d(eSDU1WM zMM9nQEVu%i#(DdXw@C1)Ktb?FVtjn_frw?a38L?!cnbWOUSHYZ2|qe+3bK$CK1s>4 z)c$*E%P!Ja&-3!;FvQ2WABCZ^zUirwP=2^o&ee=;{1curRizsM15G57LzN|Y+x>6iDe%A>PXx)KP6U!%Lb zyBsjL5*fcl^NSK8B_(}>Ah@sO4eU$8(PF%A$p(IcksI8&rB8yf#*pMbaaWM4|0UWI zqLkky5F8^h9vBeK*|9CjIHtNF!N6VoV76zaS`x=^^lRz6>qZYQPFy$8-=jvX*ZFhjGZFLg7tFhf4g$F3(`LzltE z7}RAlK;ShGvk8FB-hnBX{2!jR%o|?Q!iZbqMvW=&*}0mR-dWZ3B9H}!x(6xF)tn2d zFkSt4$<1@xSH$u8e_lCyDAd_!O5L#~xb|pUIX5@Gh+uT{`fsWAm9e+&jcli%uDNAx zJzbBWKy=(ihmow2_7{RLqL}&0KI?J0^LpGC1#Zb5qv9OZT+$#Kje)qOTP7ppV5q8a z7117))rfmzbdHNFJt`(fk;*c6kptOsoznrAjQWz5`{!WX#>OO_+_IDqLcFc*kO8ph zlO*9*6X3BF`NYS~Afd!G-bs{QTJxp%g&K??DCzcAqYVg@=zo;_==-xo7`7 zI4)0cddjPq^b4KbY8&}F!uVL^=5ucTG12Is&~)e(bT&a2u3WkDL(7E>q-y#VxZ)nB zGM&WPSJ;Thh?kwM?S+Kd)Hyda?g}=dmB`WMa@q~kg-#E%<1=eLnsS4T3)c{JGsHz} zGmUjFz}>~g9EvLRI^Lf5!*OvLES275l|EkwH4@xXF>U->6TXgWzlly$jf zNF16Yoh7Et3m$b8oIR=`4#$X_VJnF!eM20;{UahGqE&7l9tDTepJ$+6pxxU< z4O7R5jFJNJ&f-x-N%s5C5L4^uE-8&oyPblfywdy0+4kugxi<%Ac`dsAQ*JiL0aw8^(-eB(!I86o&&6^>w z?2}7JC+-i<;6;qy>%PTWT25}JZf4+73BW3^bMFNNwNgUMOD%4z1eJ9X=lI}&Hr8EX z!rmYH@KFjJhpk*U>nt zFe??#oS$Df;(OZK_+0ReIH4PquHB;1e~@nAJO}_Un@v1=T{uTN>dPw8qDlOrt)vDU z_Xd}3f8><>yK${nuWd)W^6BjucLj*pFN`mwZbI;LrN_+vjgh6LB}vOr8uFBQw^y>u zBrLe#>b|Mf~hWLESkY#Fxua^LNneKZuDKbN=tLs9RMbh0&`kOz@j0p<`(TDU3p z-`vOo6Zs;WCDDSnKLM2L)i&SZVx^;cK zyT||uXsI00mc+|x-G-4_`pnpXN2y+i!HC?+hHsv=vIv~Gw^(iMZ`O!#XxmHKZwnsg z@!a+zA^M=s9PZ!kQF|%o#f;0pfXmmu5k^c<2aJuP=~ueHzw%_k)nAX3JdeSA{ztmz z4=SAt?-TBxE{sR#F8bBv=9UuOq=2A>T(l+3wc8&QE^AovkBh9!5|LSw%vcW%P0b)d zNy)7#L5NdkY8eBc?N{ioa?zqflRJk!nTnX#>P% zTYSXX6Kl{vFjz`rHW(8c7Ut!WMymJBy&|z_W@d)LB++i6s;&n@&J}@R+J?(Wtc{F$ z+?#V?9$k{GqH96HI`d^(a4Iqi8s3EKu+6rwGt-uM>#+CTdCANFS4ar5Q!1RkTG+QR z+J+u^79Z~+kWn&0@(Hu(5`R^a`J2XMRn@IR`&&6*5?!ARu@G?r&W1vVMPZRDJUrY; z?fUiWqCshuCwz1?t4K0D$+^HVpiuo30a#pZ>YV~&W8 z+Z-<1KqheCBT}gIc)dbXPAx9o`-wL%-jssC47s_BjH)KO4XN^Qobypx@*y!7H5QRU zW!X6H0&xxZ%X6a#_bwSziqQoPJ)XPgS7kQnc}pWYmKD#0uP4GPD|hloZa96s*T3OG z3F|l*>hQAJ;e6-DqEdI(dLa+{>U}dat#kf-k>B5B;@r9iXDa^azP|c|SZ1zw<>{Bs z;*sSinH!1*vNJl5$n^BeD|D%lvuYf>g-D(pD<8Ez^BIWcY7)Ve& ze^vQ!QV9*{ric`6w!YFN$|>v7W9GFL|tG3B*SlMJc*NRe^jce zQ}17xK>eV)Nr^f7?~XhCPfe%)Ye0hkS+dmqjv}5kQ~6sA=_p;@Kt@JJgAB243k)f| zQe{ZF4lY1Ci#)@7ptSMv*D2`Enyyw2 z+aV8$;Bc)!qM$1j`JJ0^hS0-1pV(}@KsFh-ID3B3L05%v4eI%|{yS%J(SfuLpV0>a ztK+q;k=2@SsS2n}BcYx3_}{@!-|9M(l=sRg$-=_Ilc?&m&G!$sm+y{MdAb_C9!e0t zy*=6X>|6>%?+WP?Vy-u&H?*{z+34x@M*I1^wpeCfT=u;8%$!D>9`)av4*7prF7;H! zqup~_ppv*~8b4uLW&O8>${l~YDQ}y_5t^0^k&RPI^+EpvzB38m!b7`prd>8**Jaeb zM?T`|)2kjHl9xT^L%f!UG0@VEYz1TZIp3r-;5!~QKURGSq`gh2X4+*&5Pn_H$BQf! z;cPJ*J2gi#O2f@FE*cJhyW@h7B|gcaz{V_MPKvz9eyki$`^tNDJbgJwE92_*>y(K? zCev!S%kG}C#^J>Lw(bg0~jC#^k!JU7wZa#564u5Ifr%~_1#fyw!42?fn5+RnqTAtkP%RY&4o;yb}*PW*P zv&80EVj_8;SjU( zGh83^1P64cEBT`G)vM&>H0a6Ff8`@ijbq*uPs++9L7411j#M~vWW9b(G-G;2ac2}} zsagV(-tF#81nU&sx`-%26}!%V!<0EsoQ37OJM;lV%O)KX9Ze&2yPW3d&z~QRg<`p> zoNNCwow;;0vDDU?DBL*T`Gydng-|4o+J#gDZ=vEmeuJ!5PpLLd>iNB`F zGQ$_DIhtwTUMW-blxJ(C{I(}14vC1MOug)R;-kahRW~>BT>bac{F}|p7MXzu+q+O3 zv8k!i|^iO{tplN{;^E#VVX0Rt=g!I%3Jc z`Ncnf{)`42ROPYoaA(|~4i+}XE(JwQ8%_e!(HN?FdwIm@UEsL)MBwgJIEQw%*Zrl@ zN_r@&9mj*;Db646w4V<6_jfS8tQgnIB`$tiNmDi$$^d3W#BeP%h)kD;`|qz;ip*s? z$vC845crGr)+539?g_v;$5;gaV?1{?x&ap>|NCe8-CnMY8rty2z5xAX!t%}tN=VQ@ z=h490+VU`om`B6keSLqVJpGx{isoRtyuV+Ee!;E&K4)!hdhHac`=X9RqFaCZsTT(d zHciK>JL`9+qd=spz@}|4{d@%Zh;MlYtbOp|It6r9LN9y%K@hK%(Z_^ifTcuayw3tD z)J`8nMMNm6sE`K1Z3+JF>gd3_xU4a5j@=_*=LRDiTl86ZzsbVtl`nP~fnjh_xc#jK z<4U*lA*r5zt#DWNec7+BJ~`vt!Tf_11laj_5sR}Kf!i$52Ms9vG2uJMu5~msb0@

J(3TH)?mLf?W4oVt!Ak(iULQkkkzOuO)6K=K_o?`~Qa zaZ=?lnsv3#BD#j#9v)>{^syCC*uGEK`?M6N>JC<_r~PXU{`cJy6r^qprvrjU+jgfu zUg*pD1s95h0G%{SYRGMUQy!}Em8ko-eY?!@=V>H1EsZcj#)-iYZ9>xcn4Z^VrtK5} zY(s;R$I2)R;YJ*#SP5I__xBGGqM0uD`0b6P>7}2g(w=`9Ac`t>pVRdC^MguDZk-g? zCbT(6>?o&9Se|70Ajcv>xJ)ckr4R9bSSfV0~{^_B7)bNhFez!xYMZ*3f!9S zB_UiXXsX^yce_Kt&7t!9tmRH)kx-#oLI3ve4&<{CuAw_k7OXn4toO>6J@FX{Tbj$> zE77sBsIvPbOo97bpOxw4@lXX8I|o8~**DX3!Ugr;g*eykweT({Sp;2a3_DqL;B%e| zrgN@807&)QnkT}L!c9E_=$I<)QD_8uS!JoV$iB%!fFd|`pF@a9)_SjTSV4X6tvJKE zAfR^Q1+&N#i~^SH)6MfgOL<{I9+lr8$x?gHqp(+6QnEJeQ1t5NOY!-E0@je!Im&FU zjHg!~ky{Oy+28%~uGh1+mB6N#FQ0K3$Zy|_e#nZW0Sl_YKJb?4KbQ8Uv9b7Gzd+Ao zd_054>bQK*i(Sy$aAeNF2p8E(=YoedOa`StS48lkp;L;-ds+|lLkdA$Vm)q+Jh?ihgxiaEp z55ci~Y=({QncDK}`!D)77hW%IfMJClv=mshQV+dB@g%p|FMQ zWFcIM2??RVN|s;nRLy1ya&ga}_rAVH_b&IAWx8!wven+ktnYX4;Dgr`%SsMA(foV8%kS5W??IA|urq zu>l67jDo^^2t#p?;xU`N|2DpHssUIis`@g1wB)XD9}HG1ovQL#=Yp~ggBM-{YVR(U z_5_r#j#SVQz<_Wn;52Xu8s@J#9)Ke1%{P$%jLQP;w)<~qf(Qwx<7j!VrSKRI+-qpm z3{|@4p;=)<6!N)3dm^hbv>%zaI0Z zH-ID|2&k>aLAt6!5(IilVnK&Kqru1jqyu(E_qUg$2vnz862&aiGU8nS1c2+;&wCIh&67D|v)=~y#=qZl;4rk!Wdze=NMWlM z)g)+0!mK7?uIHUuwbZS$yAPn^E#c>1h~dbevdKJzy(B_lY<**?4@h)(^3g67OHq{q z3kwTEn3T@D0LkCRsBkI}OYY9|+n|*|XB7G?9&yXd*Sg-kd6Qt-dhKFyuxF}%VoDlH zs&}A>LHkkwOa0la2t4otmC~Fe@yWV55-ny;3THZ$paei9@fj7e(XwBTx61&<+5!a` z1~F`2p%$0|6dE1zoL9^5JD#t~#-KAnaE?k`sXOhl6*@`SeX@aQ)U}me)sO<)_V*Q{ zO&WBteCZHY9xZB#K;u~cn6OrbX4QTxv>?H#H2PeiE(z@UPA`WR3M}3CHwy@0ijngB zkFxCvlzPGRQwVGu7idC)WCR3S2l4+4>M11K-Y8#BNeMX{xTRC`Z+k@AXN?oC8b8$- zPQsV0^zDO{vg1S@J3l`^Y^l)x&MIAaBT=8Eyl<)|FF{rS3R}%~Bp6pXv6IuX`HZ#l z;2BQdBNiZb7%XgN_a2>M>HoD%C^v%e^51dFH!dcw_FBe*YD$*0e^}{0M~v`jrcxq4 z>&?uNUAv6julP@?7To&y!EILkX1W{;0hi#Yy3VC}Pj8Pni|E(F0I8_k%yqfHKlCP3 zaUJpeL#1{-7sqsF;P@zl%AtS(n|CIqJUm+I(M?S%(rmN{!7dU&#$(|-8S@2GC3t_) z;G=-DyS>v@F&dPW#gT;tnRu8nqJOgmzY8WznC#b`c2+%<2Pq09@n1Z!Q8*9y0Ea-t zwUD2t&F3yNjN;X=-W7(#z2VCGd>509-T3-nUwH z%Oe%I>88ivVH4*bk7oq!Q}y=tg8!~t5(9r41|7xgaWELYHu;Fo`s)iZf_rtWgrmzP zEG#^6zb{)u8QdH7CKL7S+az-={JFQtqCTL)dGu3nPTfS%fiS2mB7{&1_Q~&zi@A_Y zC{eI@uXtBM5q|L9v?a(eh$_(1E}Um1?@s!PUf|?JifXrSJ*#ELwjFCDYb8+TLS|Jz zHuswz(+^d9i-6u;Rg?9YkL_vy3$UsLR(&1dB@4WLM07N1EIl9i&=9ap4NeuWL8T*Z zXP>HrTDT1}dAdB*Di=#`Qt+-0vq@%i!er1g-pdPak%YHB9RMFoG<3 z9sCVM8QFt`d#Cf7oM1UX8-BU>aT;*oD(vC6w>Ov(nJZu9bdjvoyMx}j+6_Bq*9FoA^(0(=t#xdu#^blRz@rD z_GXbC9d2s@Vivw#z9na~WLW8Db2CGM z9T+P-H+Sfh>$$UFt>k7e-54bFE2Xt?28|)%NOyZX<;2wXa*!G! zm{qt2O8_)TekW?6*nHMLQ$R8>dJ-+l*)y>NFfZrbq}1(;sSm#zMM4&0N?>xi!?i|A z8k(lSow0Bre*f|`8FzAku&dxkI}!wwa+YS=pUZ0~K}v*#fIHkR%YZSqQQpiM!`D|& zB1!=Pa>EtQt1>cGpjBz$Q|Bk@k8LJe0fu5=pC*TjafJOf58AVl+nafgxDAgcf!L;^ z=dpzP{IptkAZpjmMzGHy@IS-3g0|n&XXmbE0sbIvJmpc46m86Qo;rQ{Aw(@C0Mh^Y zl9hE)W@Vt@wtSxf^r)s2jLbj3l(5qVonN!jA&9u82Nc4Y0M9~aU|?1H^8?su!nWXA zqKS~2zXP{-XP#@xUHJet%77Gphl`Y-PSow{se0D+v0;TX3FET4phO{R2h1Do|_He zH{^Vog^WW)>JK-r8dYoaAv4wx1o*63%B?ri??PVit;FU=PkB-O(HYq5R;Z@+#iDvH zP+a}F2Aht-V7UX6LlAQbOugJ*EfGeUYwXMA24gNJl@b8Zw`fqY_&OvuwYaF75mQ8oyif>TmY_eW7pf)}& z7FNrBM%pS#)`FIo4eL_mgOB7084n0HVnpF+7e~W>xlG#z06qe&wiTpeXvHA8?hM74 zOA|0J(*0vCMt=JR@9OMIos-lFq>^B#LFzV8a0G%J zN5C2p0M2q{M;NRiW>jRu0j4tf&4!+ObyG}c}9qwBA$F5U7rp!{blZ?qLr zQ6gDcS!V`?IpPd zV3AFl9XSv(VKgk$eGFoEzi|o~e?S0*6bW9y{yTTT@xLA8k~?a3|0rfQYKqMDbamIj zVfYPX@bRq@&x08*b@;9i9o z0FXND^|cu5_PF!D1C3sn(*Tb@=KNFS=Wlnx1A~m)?GMpm&+N*&5(;P7Xs^}%J7cubExS4ifK5oxu0CaZ z3`KQLSh%Zie3c-{(=%$5UfhJZAL?D_<2?f?ZDu&_7YT9?WG5FtKb1wmIvE78ZvCE{ zcGS!lnjoN&FX~B?4d2@Gkb@wUEYZF{ml3j)M?f|+CYf!vrBnSz7G2&`T+S8yV@vJN zc|Xgvf^l_$CUvm}i+rlUl@K;kmf_AGs& zpvW-v1f!_?@0-vqI0a*MDmQP^5X8t>wfAeIBJ&{tI~y%iZjn_xZGsH=nsSM5wPy3F zRyv@pC9J8!=Y2RZpTTy^6`fc60uBX+Ekgi5=0*~aLEB{kbt6vys!hBt`7P??p2D$& zm=lo+)FoI^NatJ+cU=jb1xlp>aC04Uf-KixE$Q^t{_&HrAjP1SGon7ng%O7&!Dmhu zRE&RlqxSq8%z5=Jr`jj`Y<68bMNdx>)%@_q3p9XEn|r6v(V;IqNOE>@u;?1__|egU zGuvekN+`6?06bR7Jf}~ehJ@uQEZd%(k<0mti6Gf~Ki)l{Q#?dbGYRqOza%0dpL}VT z{u!uueg1WfHRw-c*dd!vP=f3tHEYC##0+j4U?5)jw$wz3K`b2W2kt8@R|ku6*Ya;y z&_V>)48Q_D*>z=9hLHC{uAc4&hJ!GK{_VXU@68mclY}J)Q)`7L2N@9qCU@%SVD%bQ z`Ux}UIGB2gX1zqaIoGqJ*3;4P1yZmL8j~8>&&~YdZHOf%V-$}X2v(Yag3r?-O9AHE zHH{zb@GgbWhzRMKu!9XHAPlTJ0ZzeAbXQRE2@9VjKrNh)!0jaPu@k|^?9k2YbkB!$ z;9rTdjx*B<#N4U=pI5;CLJr^Uav>P6BZ!ctB}YPT2mG^{N+_|=qkjj#U{A1+@ER7G zKY^(F6$r|AMnz`{c>s*CO+usV5j0c4P7qpQsq+3z1g{2JOt3+k10YH(tkU{7WjaQI zWBAc1z#4Vj3W7_YsZeG@ z`p|Iiqct4+UD&~5j|JTx14$Q$iLSFUZlr`ahuqo2U^dsNXhj0rWCZye01?oKpN`ix zG@3!|T7EoQ^;rDp?kd3Ykq-m;j+pm~>EYq#nLB1W|Hmvq4dcu)LL3XTk7)5b*Xs_T^?Hra=JZ;M0Qe?pvyXyh79n&)VPu$KFzT#p2^l(| z8#7uGdX1^P%aALIeE7B1&YQ6nowWvbvp%3m-D_!RYO@L(dP3Wv|34-P*g+;+GYztH zLrd^pz~N8r(5BEgTZi`QD=-`|Amy8U3T9D0fVbLOo#23O7eOLDOGub~f8(us0!Y!U z)0@}a1*uM)_(G@&mr11n$Vz;+f7*dfhC4eT4qvo|J}KZF!9YNE1P?Hfa^{@dCCFUh zUeS9$_}PX?z=LJox0*N@i{J%HFio_z(xh%)GH0-;y| zxfv~O^6{(B{!wq}FZ!?rIU2*Kt_6=sn3)QwfJ8|-06^3lI@-SF!e&+a5F43pe}Wz_ z12oH+;1n`LK~6(HWMr^9UE(~U@GLp`*8HJ7NQbyz-yKP)o_dN6#}*49lQtQwm@D4c_@ z=lT76$wzr5RqN1ZxnTcTfc&aa=Z zgyyx-IcrSvRZ6h6gbBmAMAkd-{Hn=v(=7L##!+-vasc zmLNShx;tF+erZLQaE%QD61ZLQte9fcyjUcDCwj z&L996Z`U9NVA{6>8u$X92M_j*64VdV1+yw{ryNU!@*(FP8yhMZ#$|v*#|Nk~RWRIw z>?SG1Bbk>Pk#A*oJ!diScyF8Y$ll6Cy$H+{IK&GwoPegue!))0s&n~kF62ZDK!R?kcjJ9@Z&0{n-NZ~I6iU&epGEm%~DxexiTqf zus*o%9|;Ormzp}N#Hq#K>h4`Wkwqy~;N3f_@zl-vuj%j!2?;1h#^&Hwx)(7qS{}Bx z+1zy>7_O;X*hb>ur@g(roNlY9JRiTCscUUx(;R#)7qwe`s7YBv{=af9|K(+OoOf_o zj2VBEI-WWc_J}8ou7$(U(6Gx!{Ab2P&W7P(zZg!+K+-GM5le%CCwY`U@M*Jgy6;VC zIE_$v3}Sw?S%H14D}3QswgDOzL?CI#ZLco4Zn+adBe7HuV>y#LcM@Ft1ZZGM5^lpr zSdjP}^-OODC%%stMIzpfMuLz@YQKX)N^HbUuEWy@0VWmixu)V{8PPfT!!=j+>jLk} za_}=|@WI9ab14u36y~Q~nZ+k18NCl;v1CU5_qOGKEQR)G7pC(98sNjPYiSuB=$++f zIKjsdd3q3@47&yc#j=jQ;SX>`26CyYkJW|11i@*Q(ACphpYJ{QPG5k~qJXAHGlUgu zyX!cxr8o0~_qXhUt_@9BfISHDKjKSa0MLMDW&H&W1ekbJ0!%}Ya9Va<|FJxvns9=) zYk-5T4dDnp@Pr@`ti}}8ce9cW4-7DY06J5o=sHbWXi-ml?ON;UTIZKH!@%_a0-Y~Z zJ`VcE5>lY@x1!+sz6}h7rKH?`yls{)iU^?J>Q)-VL-?J7rF?JQ;ZAQtgM!c=fff#z zfWQg3Z$f%~tK5-)0E~UiZfROt+VCRyvuHx+37MRlB9fJrmAv~6x#T=f(Dnb(3rg@{ z6fy~45mGc*4Z@5HuuVgII~BNRRK*^Mdn+IWQE_pB@?~>#bHW4>uo&U~kOmmIc%?7U zTV}5(1Udt{zmJNFoL?2i#KeRb6ck+D11Hj3>+kKl2RinQ=Lx@~Lz$Zz8c_v$=3;P1 zm8Nw?AR4K}U*@xK*y<45>127o1uO-ZMio-y^a30;hL@MZ&(9Cwak`4Y`5A9BEZ*N2Dg@3Bq8~z1yIYM_uwNOh_vjs9Gi;?k-2qJAFdk2T$0^Ro)h(*ca z(yaLs)CsK-@Xie|s08l;A7Ro;~|e zUVfomzS?`W1x%l0$FJ$>$zQ)70meyRzHGg_HYM#bkAj=chk7DuTg>X{>LNqH|J+Vhv=M71bC=C{xS=`Q%vqtolfScC`1_m$> zIiqKV)b-h}puT0PQV)%coP&5u#G+0m=BzyG^l9P*b+Rj{Onrg=KXaX+slkRwmcQ2* zpcWqN>k}*&J`qX`4Ig-3HoWDsySqC)#Lxhh3+-$q1k`fUynI+_s1-;bkS4fio>ybe zK7p8z^U@_|;ExbaN=Twe5QdTC43P^LXkm*Wr8#t%u=C~miNt=pd4oQTjzi&9KI?j6 z{05C$TmqCEq>SfeWp6Ksa6ldlo-h*v4uo_2BZ(4>Y`GjC1wum2kRWKp)M+5VsF|T4 ze8KL{ok_x+7^K96_Nk2f?}$M{17&JvhV;gb8<2TeLhMG^``6&qfyW%HS+W4 zE6B*t%)7cjsCDf{t}n*vl0WD-v{fN62x->6NOBqlOJVDSJx4hL%K zOhr(~tlRFvL1RNh=C^;)T{2sa=21{E7xsYENhCkQ{l|1pfvSVI`%5k7|sW zSXkb>hHKV+_#nDIEf70cVPUGcx47Q~!-kK)e!WRB3HN3Roi-55#kO5%o{$83c}ch}K#f*0xW z*ImN_IL266r(Te$Q%wQ|#e*Y#129lPM zc?GWiQ^1}$II1u(PK>vL+hQ>=i=|)vu0WgbM< z1~rHj3lK#qf-ETE`}peRK|Oz6EU7K#Oxj$*jdTPO;=Z~2m$ zmpgCr%ALvFi9tC3*?X_`wY5PBHW`p`SKAoJi|R&p4b$I}t2bu&1q&P_PTc~cGa24h=`_MyYo+aP>ofQ0qFYlDFUjJkg8Q_VQ#J>F0Fci3`g@0 z$!qmbp77ux*Wm7$suoH3BDHp6Wm1pcy)*L-TZI@9Agm@rt<=N9bg?>J0|QZL5aLKz zIy*b(15rh#Gy<1?(Qyuej`;&5d z5G`1SuhTi+a@c!qQAyqDXMo%{`4aBlbqJla^b;$+3pz67E9PR?a8s@NegKZF>+H-4 zwPb^04|7?oB7P|Bd|h}enHkqEUR;fu!GrB2>t^1OYcS_03=H+18(agazBMUtb2F#( zbtu{dODy)Vd01H3a^cI7N$Kfig5TCSu|9$?y%HEnd*Oe@m|mQ~<~7pV>|#4*b-CNS zC$~apA%VZc)-k--uUoS-7sMnOg@EPJ3jZAZzt?#0VmRY0j*gBdrly$o(z_SXQzwM8 zYg80901-nI2c7v4C3zz*?)&J={*d9_E>)t~SG2ViKN3G4FgNW0G9tnZe|Wq^Ibd!j zr2GZUmAE+2ktGcEC}eOmslIYab?~96y8^LPq`atCPNT`+Gupu(T zbEI37jh#K_aEFG`j0oeRrmL%4H2J2naq*%>i^3x!3{D;|=?s>~T-cFJV8d={?X`Qa zm!WTyAcD)Pv?KEFcODqTH{J!Dtki3iu)|Nzwt{WX6*)C3$6twh%O7a6U4R^U$9`XQ zRna9{$~evD^*vK$iGxE!*)1$BZEb7<(ToIVW)Nku>wlB=%VYZ^J@MN-YtTBYd*ISH zKNm|kNR6=6)figJdXpCt!cV?0cLY2=p{S_X+t+ss=kLfS=^nnyLa^6$g50S1DN!0% zhA=DHUAdup8DgzuK;k5qx3zs+Q&WQ|hZ-0@v8k-~^!KUw3uU#noV#}IB6yLX?|pu? z#sbO_SLvsC}-M4xkJ_OnLkKhjp2)iw-?-x z9fQg-vG2f{d)B3*IXO89Y==-{_I`45XkcKVL?(;i@4ygO@K}(_EbZgb>AS#&T|GTd z7Zz>{EOP4^>L|5Ns_n8a^1^t#>iA%r`Sr?}@OCkdvQo^+vite@J+j}JUFZwq83JW2 zb>Y=5NZK%g$;pz~i9`jnUHSobs(?7F6OSEpcc%nw*0qCZzIi7nW$^ddw6wGc$e{@m zRJ^2}>?N?@EMR0X@7g*cPG3pGO z|9W5Hnl3aXbn$Fk&w>7a5hjzU>+km*RQK#TTeI%Afju$VX9M!g9DB0C8SF^xuoYND z*oluEhkPGTq6^zO=xb|h`wZM}riu;8>1B;<9QMXhCntjYn?e5@nrA8Xi3pjQ>8@R2 z?|d`O%*;d-j*37T13Kaj2nfg)Kl!4m3GN5)h;!opwJ!jx47aV1h>otoCVy2E-({(q zSvws)hVu3en!&~5k~PKOaFm(jy24tBV6OjalFaIdr~+5~aN>k@yyk8lo%A>Uqd|Vt zp}2EG6WJHEi(C7!``A4_J)b71h+#VINUq}{2M1OLXk=giGSw1v;zVe+R}@`DA!$qP zy*CT?mzST9GWhGGlFu--Ql4EsKJm#I8MVCw61f&uY1W6rdl$+x?H4dwQ1hKgbvz5u zxXuO!Ro|@tYiV0I`Y&5Gep(ljTTu*__dR>|j1H!<&p6j*S?e00HP_J(yEp&b#72fB zo<`2`wX`ozh=vYkq7{(riSQPcOYAIGqzkkFaCkC000bd2S|3=N z45*YH*@_Y>GdjDZv9Ol$;v63ze>qcyvy><=`w7)HGG6mvXyPKuUUGp&_b)*G??R-8 z(rYMc+~(#jcAqt%nx8@S>?TTBa6I+h?N=~*LLwu1;I)0t7U8^J+2(oQtEHEgDJKRY zytTSFR8x(*|4ih%A>azRETtjtIwD%Gzd!#r`yuuTp%po_sr8CmwrB!gMEZ(pj1S5& z?M-;*&4={0;Y&f;9fl6O8b(xfbTq0rDv01v%;fMe|4?N>JnFwV()1XAssN-R4H$P- z2+w4c%E6itNDwUX91>M_(hA=@nx)Hjz7G{~wU%M9B*=h5r z#~pQ&mFy%;%MdkUWo4x(Gt@QsK1-0M*3Y!sPA(a01x=LSzaPBDC z&i23Kq=QafuXN)RD8n}51vIOSj{Nc#yu)g<%=c=BIkL?em zH=N1U(dgkk9lYi*QR?qPkkq98#+**T9&8JX2#3Dab0Ir>Ld(Tq zuS;}23%|bi#OatA<707q{h$pV;{8YyGK2veg|8B;|``D6^kctW=6I4 z`p(sFj1hQj#hQ|0II!F4Q&H0miF0+AArW~&rs7xQuc@Y=ltrol@=M|JtW zl$D5F3&1~~a@o%^H8rJygvY)-+3#K6qxmDA?O>{SYtORf%j_2DjPPRtu7lUKJyF#HQxe zawiqp%yK|u9jB9$009eOO-~mOWEMd+G}gOw=MJ4E2-ha|@#xkTh-omyouF2jInClk z!9YqHDL_`N3wC%7QZ}7KL+4Oq%NiT?-|Ir_+>$dbh2jjnta(&RA7MBEvDGrrNk{6N ztphT0?g6~C?L(Xqin;#L_!oC|D_dI3GoF^0v!FwL%|5Dkv;eO?IQV2~l>6GXYiW3^ zuzoTsxO}lO1BIp%=FpZpF=a0X812f{t7$Pv3W&n()B;|l8bm$U;`gpDanTfHniJ8w zVcvxIHQzH0hOSiE)FeQzBH%8WrhpZi2j;(aPSZravRAK!03(CY%liigvW~vpNaop* ziNW^bNb*x%I!YJ@{DO>KBu|CCoAl&zym9*`SZ4#bA}~ zK&O@uTt|IoIzfeq)r0$y$yz!$!$WC!M0rS_j+j8VkMQm2`Gz$xWx&z&7xz0luq`W7-^H)?Q^p~OYc&khCPaIv(uwpJA&G8z&cy$EglepWrj z!%&2WCnsxRybr^(b9{-ae+pM|?3zY-rWc0vvk;b&gCQ>sWlLnc&t}LX8(wF?1H_T9 z3Ve$Z5AsWqw5Iw+6aLA63>2U!cGqJ7pgVUKesN`M>qFNO?&{iCk4K2z8mBwunX zD?b|xWUkYhnX>*9pkxk196&Spnn?j6VHn`5+js7$^Rw}aDvKaZL_=Wk zDcP9^zy4YY$1LLL7(5&}( z;abpOvXCtrDTWkM(a|A>A5DN6i}eePTZkr5K<$8JF`~~fdoZ{N2U`{4oh(RZFePGo z$NVot$`=aE&dz=}ie;2Twj(NdKK(>()QZ#Syb_x?3nE3r!jO~-F^H)OHu4wNLr;){ zH+NmxTL63-IatdxEna=EH;`-n@#9ChJloJPs%MMvDfC^B9ShFS|Ka-e>#p#?sLR87 zLA!$@rsUcgXri)Xhp3E~A_La@e=k*x@(t-aQRcNNFh=B}7DrZPTVrm@Z4#Xz_lP-ew$n!Vm`o zw7Cl%R8B#m22N`<$vS4LYN#?Yjs7oQys)*mAK&NXzaL8?mWQ4yp`>JDaRYfE#GW{@ zBeQ(~T5;g0#4wChjJDIAjI(EXu{ITDWeg&Cm6YDv9t?EyJ-T}XM7*qfHa08aGD9&s zRb0HC=>#%i7)#4G0kJP*5P%jk4FxA035uaar7QeX}#wC_>nt$7kaCjW5g<1*hegv=5&D3@bwcLHs2Y#KRU+ zP*5P}9iD?Lb~U{}6t73mo>e1~+IZ)ucHXE=|JUqJcn_-WZ6*+AH83?Ghj%Q|SL(vc zByrycTc(ppgKdy1D(mXFkZcyjV-dPmyTv!=L+ zdQk}dj)2S3ra|x_NjO5jQ7Ci2myeG+(cwWDDz9S4T0rO{q3zp1Ww*-}{Kd0|;?BtN zT1y{0e%z?=#}+6>@>RGR3YTSs0FW=mBQw^78UlK~_aXu{x~d zGf-8U>Wv=@73V-AE53dOT9`)xah9`H46V!v!NR-L2vs-`-d$hgC z^j2S*Gz>l|kx+H<_R4n5_2D58Ah|v@`b1V9mpo=!Tk^A^YpX-I#7#&D?(_YYoef1G z6eWOiq%=B=Z>^8%PZ~)@geDjQGBUcdR-St61kq;TmneDki-2W^p-x9|<`HS(b1RO* z#<_(m1cl?J39w0GBfHUqbMr`d9TASi*~>z_7n&crXd1Xv0=8I$MCD?JHv34+JPd0& z=@kNzoXvT85 zA4_EU@+2&OZ$lz0Wro07-{awj$Hs!y69d8SQII68bYUpsPdVkl^4`3CtEQ#Ji88O` z|3&GNwj}SugV zWZ(9P9KhsA7mgGq)~$+t?D8`*HXzLtExt31CfSeZ+FlkOaxq#XWemglOKv*pv7r|r z6bN_>wG-RPeB*<14q;mQxTU&!&@i~Cz<{ix;{Go`Y}#Z9b|LB92Q4ZT_*lr?0c0mM z#|3@7dlYfE5Y)$|`3tf4z}nRK*}6bB7o%UUws&w4HdS1+W*16FkckJRE}B}YK>AV~ z`SP7~3~=@CODpIWtmXCfx+Zz9i8TuIm>05BsYk4Z8-A3u`)oQMR_F7)$N84`Y9Cmu znG~h=@0i{;{dIx|+t}3j+kav%%^Gt_B)Rv$ihL>rg!$j(1O8$V|4o!YNo1w|4+jA~ zCr3w*7``4@=ZFgT;K74+eTOdn02OHZ^E=_%i_@xZ(yP)APi>oh?kbJCmiiB2gn#&9 z|DId;_b=^+7k_ronr)AlU21=0$lN*D#wB$f|8Dx)>6hiAsy}WNx$>Ry)U{aMTEak_~kp`>SD%b-NnZSY-%aj<`n~e0Lx}}*X>eLX{M&Rr+fYE7`-f|FTv#2r#iT3NCF06MJ)XjLejl z^2eCN!B<5tiK3QSPjS5{@HIO_hA=?x)~(*9HGHDVWduWz+qsE}c)87+tANfEGcuwe zH&V2jnlL38APY-CB83Zs-|Av*O|lhazaZ`83iR^x(1H;XTeW@rw}3j8sEEjgaRVCi zipWvp1QjcX#zSZwJfad0!ok5oe+V^YFuUyHydi81|9beh@S3OLOrb*CN8`F%} zqveYsxj<2KR8h*x;@M2h&2J%pez@uOHw=y2lQ@nDr_bbI6l5JWh@KcGgwQ3kT;XUq zA}V`ZYY`B4gT>PO=~GGHxw9!6B8<@>*02la0xEYPdKqjrUKbY^#@m6JR%t;)DxIHo zN$f}i^XNF70QP250q8s6z-!seBwh$H(;UWwT&ONXNfDAZM4docaJPQDYmA!@; ze2!D_T~MBE(Tf?7oHAq>y@v0)hq9>lM1wUTo_31jt4{BJQ-d^27XT2LLzxz?XArkQ zLjEY_qmUP=05EogL5cwq;by-#or!rrjP z%K`W?HOoqx9vttGtSouJ??&KE>f6|EwYYQQ50@PRNuEJ?Cr$YAwCo_v7Rsw|B7|Tz z>Cp|2-_PC4%siLAKeM8$iVdo)T^z7a9$Z}&)<=bXT5FzM<99*$uJ^@VK4?6gG1{R( zo~tA!HCqR9EFhGJBMPS}4TXI<`N1DPe(a_@1_&qF+Ma@(Dh?(Ig@|4d+>}NvRMUK5 zxHb!GU|lj|gRs)SPS~LR(+)t77dpv7pA7F-oM@0WQZ?Cyt{_>Va6j;?4s3w0h{;%D z(?v8djFq*%pK~thJ_|U9$2FieilO2gq*#~kpsPbDkBbigC4DD!n5r3U9@-M~J$H8+ zZKdssf!IaBU0*eU@$m;f6Gv#PAaQ{4!)gf8h=tGv4$Ob%nkbSF`Uw2G#yK67g+_vb zttszAeiF@tdwJz~IW&}xfa%d(2PymzeH-puZlf)SP9BQICcw-Dswb8qTm?gAAfQ+` zsi}gw=?)IY31SgaT3TxIy3o^QWQ7-qDCMRBFj9;6uDM9AE0QL+%)DXM08UbDA=@3H z%j^eUh7f7Jap{2j$%3FU z8H^h*efJt2!v=aKFlHcL0P3E_R8qXLc+WRU9H*DPzEvj^jkLU4vcu$hLdL{xU{`{!Ke-*CiVU;6U&*xBtdXFx^j5M^t*bYffYfN_SIvDIrQAhRU*5Az+o X+RvPAPx;~(*)h8{_iEf%w+Z?W@}J4O diff --git "a/docs/zh/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225.md" "b/docs/zh/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225.md" index 6b13eaeb75..c253042254 100644 --- "a/docs/zh/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225.md" +++ "b/docs/zh/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225/PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225.md" @@ -1,868 +1,6184 @@ -# **PyTorch适配算子清单** -- **[PyTorch原生API昇腾算子对应表](#PyTorch原生API昇腾算子对应表.md)** -- **[PyTorch昇腾自定义算子](#PyTorch昇腾自定义算子.md)** -

PyTorch原生API昇腾算子对应表

- -| 序号 | PyTorch 原生算子 | 昇腾适配算子 | -| ---- | ------------------------------------------- | --------------------------------------------- | -| 1 | dropout | dropout_npu | -| 2 | dropout_ | dropout_npu_ | -| 3 | abs | abs_npu | -| 4 | abs_ | abs_npu_ | -| 5 | abs.out | abs_out_npu | -| 6 | acos | acos_npu | -| 7 | acos_ | acos_npu_ | -| 8 | acos.out | acos_out_npu | -| 9 | adaptive_avg_pool1d | adaptive_avg_pool1d_npu | -| 10 | add.Tensor | add_npu | -| 11 | add_.Tensor | add_npu_ | -| 12 | add.out | add_out_npu | -| 13 | add.Scalar | add_npu | -| 14 | add_.Scalar | add_npu_ | -| 15 | addmv | addmv_npu | -| 16 | addmv_ | addmv_npu_ | -| 17 | addmv.out | addmv_out_npu | -| 18 | addr | addr_npu | -| 19 | addr_ | addr_npu_ | -| 20 | addr.out | addr_out_npu | -| 21 | affine_grid_generator | affine_grid_generator_npu | -| 22 | affine_grid_generator_backward | affine_grid_generator_backward_npu | -| 23 | all.dim | all_npu | -| 24 | all.out | all_out_npu | -| 25 | any.dim | any_npu | -| 26 | any.out | any_out_npu | -| 27 | arange | arange_npu | -| 28 | arange.start | arange_npu | -| 29 | arange.start_step | arange_npu | -| 30 | arange.out | arange_out_npu | -| 31 | arange.start_out | arange_out_npu | -| 32 | _dim_arange | _dim_arange_npu | -| 33 | argmax | argmax_npu | -| 34 | argmin | argmin_npu | -| 35 | as_strided | as_strided_npu | -| 36 | as_strided_ | as_strided_npu_ | -| 37 | asin | asin_npu | -| 38 | asin_ | asin_npu_ | -| 39 | asin.out | asin_out_npu | -| 40 | atan | atan_npu | -| 41 | atan_ | atan_npu_ | -| 42 | atan.out | atan_out_npu | -| 43 | baddbmm | baddbmm_npu | -| 44 | baddbmm_ | baddbmm_npu_ | -| 45 | baddbmm.out | baddbmm_out_npu | -| 46 | bartlett_window | bartlett_window_npu | -| 47 | bartlett_window.periodic | bartlett_window_npu | -| 48 | batch_norm | batch_norm_npu_ | -| 49 | _batch_norm_impl_index | _batch_norm_impl_index_npu | -| 50 | _batch_norm_impl_index_backward | _batch_norm_impl_index_backward_npu | -| 51 | bernoulli | bernoulli_npu | -| 52 | bernoulli_.Tensor | bernoulli_npu_ | -| 53 | bernoulli_.float | bernoulli_npu_ | -| 54 | binary_cross_entropy | binary_cross_entropy_npu | -| 55 | binary_cross_entropy.out | binary_cross_entropy_out_npu | -| 56 | binary_cross_entropy_backward | binary_cross_entropy_backward_npu | -| 57 | binary_cross_entropy_backward.grad_input | binary_cross_entropy_backward_out_npu | -| 58 | binary_cross_entropy_with_logits | binary_cross_entropy_with_logits_npu | -| 59 | binary_cross_entropy_with_logits_backward | binary_cross_entropy_with_logits_backward_npu | -| 60 | bitwise_not | bitwise_not_npu | -| 61 | bitwise_not_ | bitwise_not_npu_ | -| 62 | bitwise_not.out | bitwise_not_out_npu | -| 63 | logical_not | logical_not_npu | -| 64 | logical_not_ | logical_not_npu_ | -| 65 | logical_not.out | logical_not_out_npu | -| 66 | logical_and | logical_and_npu | -| 67 | logical_and_ | logical_and_npu_ | -| 68 | logical_and.out | logical_and_out_npu | -| 69 | logical_or | logical_or_npu | -| 70 | logical_or_ | logical_or_npu_ | -| 71 | logical_or.out | logical_or_out_npu | -| 72 | blackman_window | blackman_window_npu | -| 73 | blackman_window.periodic | blackman_window_npu | -| 74 | bmm | bmm_npu | -| 75 | bmm.out | bmm_out_npu | -| 76 | cat | cat_npu | -| 77 | cat.out | cat_out_npu | -| 78 | cat.names | cat_npu | -| 79 | cat.names_out | cat_out_npu | -| 80 | ceil | ceil_npu | -| 81 | ceil_ | ceil_npu_ | -| 82 | ceil.out | ceil_out_npu | -| 83 | clamp | clamp_npu | -| 84 | clamp_ | clamp_npu_ | -| 85 | clamp.out | clamp_out_npu | -| 86 | clamp_max | clamp_max_npu | -| 87 | clamp_max_ | clamp_max_npu_ | -| 88 | clamp_max.out | clamp_max_out_npu | -| 89 | clamp_min | clamp_min_npu | -| 90 | clamp_min_ | clamp_min_npu_ | -| 91 | clamp_min.out | clamp_min_out_npu | -| 92 | constant_pad_nd | constant_pad_nd_npu | -| 93 | contiguous | contiguous_npu | -| 94 | convolution | convolution_npu | -| 95 | _convolution | _convolution_npu | -| 96 | _convolution_nogroup | _convolution_nogroup_npu | -| 97 | conv2d | conv2d_npu_ | -| 98 | conv3d | _conv3d_npu | -| 99 | conv_tbc | conv_tbc_npu | -| 100 | conv_tbc_backward | conv_tbc_backward_npu | -| 101 | conv_transpose2d.input | conv_transpose2d_npu_ | -| 102 | copy_ | copy_npu_ | -| 103 | cos | cos_npu | -| 104 | cos_ | cos_npu_ | -| 105 | cos.out | cos_out_npu | -| 106 | cosh | cosh_npu | -| 107 | cosh_ | cosh_npu_ | -| 108 | cosh.out | cosh_out_npu | -| 109 | cummin | cummin_npu | -| 110 | cummin.out | cummin_out_npu | -| 111 | cummin.dimname | cummin_npu | -| 112 | cummin.dimname_out | cummin_out_npu | -| 113 | cumprod | cumprod_npu | -| 114 | cumprod.out | cumprod_out_npu | -| 115 | cumprod.dimname | cumprod_npu | -| 116 | cumprod.dimname_out | cumprod_out_npu | -| 117 | ctc_loss.IntList | ctc_loss_npu | -| 118 | ctc_loss.Tensor | ctc_loss_npu | -| 119 | _ctc_loss | ctc_loss_npu | -| 120 | _ctc_loss_backward | ctc_loss_backward_npu | -| 121 | fill_diagonal_ | fill_diagonal_npu_ | -| 122 | div.Tensor | div_npu | -| 123 | div_.Tensor | div_npu_ | -| 124 | div.out | div_out_npu | -| 125 | div.Scalar | div_npu | -| 126 | div_.Scalar | div_npu_ | -| 127 | dot | dot_npu | -| 128 | dot.out | dot_out_npu | -| 129 | embedding | embedding_npu | -| 130 | embedding_backward | embedding_backward_npu | -| 131 | embedding_dense_backward | embedding_dense_backward_npu | -| 132 | embedding_renorm_ | embedding_renorm_npu_ | -| 133 | _embedding_bag | _embedding_bag_npu | -| 134 | empty.memory_format | empty_npu | -| 135 | resize_ | resize_npu_ | -| 136 | empty_like | empty_like_npu | -| 137 | empty_strided | empty_strided_npu | -| 138 | erf | erf_npu | -| 139 | erf_ | erf_npu_ | -| 140 | erf.out | erf_out_npu | -| 141 | exp | exp_npu | -| 142 | exp_ | exp_npu_ | -| 143 | exp.out | exp_out_npu | -| 144 | expm1 | expm1_npu | -| 145 | expm1_ | expm1_npu_ | -| 146 | expm1.out | expm1_out_npu | -| 147 | eye | eye_npu | -| 148 | eye.m | eye_npu | -| 149 | eye.out | eye_out_npu | -| 150 | eye.m_out | eye_out_npu | -| 151 | fill_.Scalar | fill_npu_ | -| 152 | fill_.Tensor | fill_npu_ | -| 153 | floor | floor_npu | -| 154 | floor_ | floor_npu_ | -| 155 | floor.out | floor_out_npu | -| 156 | floor_divide | floor_divide_npu | -| 157 | floor_divide_.Tensor | floor_divide_npu_ | -| 158 | floor_divide.out | floor_divide_out_npu | -| 159 | floor_divide.Scalar | floor_divide_npu | -| 160 | floor_divide_.Scalar | floor_divide_npu_ | -| 161 | frac | frac_npu | -| 162 | frac_ | frac_npu_ | -| 163 | frac.out | frac_out_npu | -| 164 | full.names | full_npu | -| 165 | full | full_npu | -| 166 | full.out | full_out_npu | -| 167 | grid_sampler | grid_sampler_npu | -| 168 | grid_sampler_3d | grid_sampler_3d_npu | -| 169 | grid_sampler_3d_backward | grid_sampler_3d_backward_npu | -| 170 | hann_window | hann_window_npu | -| 171 | hann_window.periodic | hann_window_npu | -| 172 | hamming_window | hamming_window_npu | -| 173 | hamming_window.periodic | hamming_window_npu | -| 174 | hamming_window.periodic_alpha | hamming_window_npu | -| 175 | hamming_window.periodic_alpha_beta | hamming_window_npu | -| 176 | ger | ger_npu | -| 177 | ger.out | ger_out_npu | -| 178 | index.Tensor | index_npu | -| 179 | index_put_ | index_put_npu_ | -| 180 | index_put | index_put_npu | -| 181 | _index_put_impl_ | _index_put_impl_npu_ | -| 182 | inverse | inverse_npu | -| 183 | inverse.out | inverse_out_npu | -| 184 | isclose | isclose_npu | -| 185 | isnan | isnan_npu | -| 186 | is_nonzero | is_nonzero_npu | -| 187 | kl_div | kl_div_npu | -| 188 | kl_div_backward | kl_div_backward_npu | -| 189 | kthvalue | kthvalue_npu | -| 190 | kthvalue.values | kthvalue_out_npu | -| 191 | kthvalue.dimname | kthvalue_npu | -| 192 | kthvalue.dimname_out | kthvalue_out_npu | -| 193 | native_layer_norm | layer_norm_npu | -| 194 | native_layer_norm_backward | layer_norm_backward_npu | -| 195 | linspace | linspace_npu | -| 196 | linspace.out | linspace_out_npu | -| 197 | log | log_npu | -| 198 | log_ | log_npu_ | -| 199 | log.out | log_out_npu | -| 200 | log10 | log10_npu | -| 201 | log10_ | log10_npu_ | -| 202 | log10.out | log10_out_npu | -| 203 | log1p | log1p_npu | -| 204 | log1p_ | log1p_npu_ | -| 205 | log1p.out | log1p_out_npu | -| 206 | log2 | log2_npu | -| 207 | log2_ | log2_npu_ | -| 208 | log2.out | log2_out_npu | -| 209 | logspace | logspace_npu | -| 210 | logspace.out | logspace_out_npu | -| 211 | log_softmax.int | log_softmax_npu | -| 212 | log_softmax.Dimname | log_softmax_npu | -| 213 | _log_softmax | _log_softmax_npu | -| 214 | _log_softmax_backward_data | _log_softmax_backward_npu | -| 215 | logsumexp | logsumexp_npu | -| 216 | logsumexp.out | logsumexp_out_npu | -| 217 | logsumexp.names | logsumexp_npu | -| 218 | logsumexp.names_out | logsumexp_out_npu | -| 219 | matmul | matmul_npu | -| 220 | matmul.out | matmul_out_npu | -| 221 | matrix_power | matrix_power_npu | -| 222 | max.dim | max_npu | -| 223 | max.dim_max | max_out_npu | -| 224 | max_values | max_npu | -| 225 | max.names_dim | max_npu | -| 226 | max.names_dim_max | max_out_npu | -| 227 | max_values.names | max_npu | -| 228 | max_pool2d | max_pool2d_npu | -| 229 | quantized_max_pool2d | quantized_max_pool2d_npu | -| 230 | mean | mean_npu | -| 231 | mean.dim | mean_npu | -| 232 | mean.out | mean_out_npu | -| 233 | mean.names_dim | mean_npu | -| 234 | mean.names_out | mean_out_npu | -| 235 | median.dim | median_npu | -| 236 | median.dim_values | median_out_npu | -| 237 | median.names_dim | median_npu | -| 238 | median.names_dim_values | median_out_npu | -| 239 | min.dim | min_npu | -| 240 | min.dim_min | min_out_npu | -| 241 | min_values | min_npu | -| 242 | min.names_dim | min_npu | -| 243 | min.names_dim_min | min_out_npu | -| 244 | min_values.names | min_npu | -| 245 | mm | mm_npu | -| 246 | mm.out | mm_out_npu | -| 247 | mode | mode_npu | -| 248 | mode.values | mode_out_npu | -| 249 | mul.Tensor | mul_npu | -| 250 | mul_.Tensor | mul_npu_ | -| 251 | mul.out | mul_out_npu | -| 252 | mul.Scalar | mul_npu | -| 253 | mul_.Scalar | mul_npu_ | -| 254 | mv | mv_npu | -| 255 | mv.out | mv_out_npu | -| 256 | narrow_copy | narrow_copy_npu | -| 257 | native_batch_norm | batch_norm_npu | -| 258 | native_batch_norm_backward | batch_norm_backward_npu | -| 259 | _nnpack_spatial_convolution | _nnpack_spatial_convolution_npu | -| 260 | ones.names | ones_npu | -| 261 | ones | ones_npu | -| 262 | ones.out | ones_out_npu | -| 263 | ones_like | ones_like_npu | -| 264 | cdist | cdist_npu | -| 265 | _cdist_forward | _cdist_forward_npu | -| 266 | _cdist_backward | _cdist_backward_npu | -| 267 | pdist | pdist_npu | -| 268 | _pdist_forward | _pdist_forward_npu | -| 269 | randperm | randperm_npu | -| 270 | randperm.generator | randperm_npu | -| 271 | randperm.out | randperm_out_npu | -| 272 | randperm.generator_out | randperm_out_npu | -| 273 | range.step | range_npu | -| 274 | range | range_npu | -| 275 | range.out | range_out_npu | -| 276 | reciprocal | reciprocal_npu | -| 277 | reciprocal_ | reciprocal_npu_ | -| 278 | reciprocal.out | reciprocal_out_npu | -| 279 | neg | neg_npu | -| 280 | neg_ | neg_npu_ | -| 281 | neg.out | neg_out_npu | -| 282 | repeat | repeat_npu | -| 283 | repeat_interleave.self_int | repeat_interleave_npu | -| 284 | round | round_npu | -| 285 | round_ | round_npu_ | -| 286 | round.out | round_out_npu | -| 287 | relu | relu_npu | -| 288 | relu_ | relu_npu_ | -| 289 | prelu | prelu_npu | -| 290 | prelu_backward | prelu_backward_npu | -| 291 | gelu | gelu_npu | -| 292 | gelu_backward | gelu_backward_npu | -| 293 | hardshrink | hardshrink_npu | -| 294 | hardshrink_backward | hardshrink_backward_npu | -| 295 | rsqrt | rsqrt_npu | -| 296 | rsqrt_ | rsqrt_npu_ | -| 297 | rsqrt.out | rsqrt_out_npu | -| 298 | selu | selu_npu | -| 299 | selu_ | selu_npu_ | -| 300 | celu | celu_npu | -| 301 | celu_ | celu_npu_ | -| 302 | sigmoid | sigmoid_npu | -| 303 | sigmoid_ | sigmoid_npu_ | -| 304 | sigmoid.out | sigmoid_out_npu | -| 305 | sin | sin_npu | -| 306 | sin_ | sin_npu_ | -| 307 | sin.out | sin_out_npu | -| 308 | sinh | sinh_npu | -| 309 | sinh_ | sinh_npu_ | -| 310 | sinh.out | sinh_out_npu | -| 311 | slogdet | slogdet_npu | -| 312 | softmax.int | softmax_npu | -| 313 | softmax.Dimname | softmax_npu | -| 314 | _softmax | _softmax_npu | -| 315 | _softmax_backward_data | _softmax_backward_npu | -| 316 | stack | stack_npu | -| 317 | stack.out | stack_out_npu | -| 318 | sum | sum_npu | -| 319 | sum.dim_IntList | sum_npu | -| 320 | sum.dim_DimnameList | sum_npu | -| 321 | sum.IntList_out | sum_out_npu | -| 322 | sum.DimnameList_out | sum_out_npu | -| 323 | sqrt | sqrt_npu | -| 324 | sqrt_ | sqrt_npu_ | -| 325 | sqrt.out | sqrt_out_npu | -| 326 | std | std_npu | -| 327 | std.dim | std_dim_npu | -| 328 | std_mean | std_mean_npu | -| 329 | std_mean.dim | std_mean_dim_npu | -| 330 | std_mean.names_dim | std_mean_names_npu | -| 331 | std.out | std_out_npu | -| 332 | std.names_dim | std_names_npu | -| 333 | std.names_out | std_out_npu | -| 334 | prod | prod_npu | -| 335 | prod.dim_int | prod_npu | -| 336 | prod.int_out | prod_out_npu | -| 337 | prod.dim_Dimname | prod_npu | -| 338 | prod.Dimname_out | prod_out_npu | -| 339 | tan | tan_npu | -| 340 | tan_ | tan_npu_ | -| 341 | tan.out | tan_out_npu | -| 342 | tanh | tanh_npu | -| 343 | tanh_ | tanh_npu_ | -| 344 | tanh.out | tanh_out_npu | -| 345 | threshold | threshold_npu | -| 346 | threshold_ | threshold_npu_ | -| 347 | threshold.out | threshold_out_npu | -| 348 | threshold_backward | threshold_backward_npu | -| 349 | one_hot | one_hot_npu1 | -| 350 | flip | flip_npu | -| 351 | roll | roll_npu | -| 352 | true_divide.Tensor | true_divide_npu | -| 353 | true_divide_.Tensor | true_divide_npu_ | -| 354 | true_divide.out | true_divide_out_npu | -| 355 | true_divide.Scalar | true_divide_npu | -| 356 | true_divide_.Scalar | true_divide_npu_ | -| 357 | trunc | trunc_npu | -| 358 | trunc_ | trunc_npu_ | -| 359 | trunc.out | trunc_out_npu | -| 360 | _unique2 | _unique2_npu | -| 361 | var | var_npu | -| 362 | var.dim | var_npu | -| 363 | var.out | var_out_npu | -| 364 | var.names_dim | var_npu | -| 365 | var.names_out | var_out_npu | -| 366 | var_mean | var_mean_npu | -| 367 | var_mean.dim | var_mean_npu | -| 368 | var_mean.names_dim | var_mean_npu | -| 369 | where.self | where_npu | -| 370 | where | where_npu | -| 371 | _s_where | _s_where_npu | -| 372 | zeros.names | zeros_npu | -| 373 | zeros | zeros_npu | -| 374 | zeros.out | zeros_out_npu | -| 375 | zeros_like | zeros_like_npu | -| 376 | norm.ScalarOpt_dtype | norm_npu | -| 377 | norm.Scalar | norm_npu | -| 378 | norm.ScalarOpt_dim_dtype | norm_npu | -| 379 | norm.ScalarOpt_dim | norm_npu | -| 380 | norm.dtype_out | norm_out_npu | -| 381 | norm.out | norm_out_npu | -| 382 | clone | clone_npu | -| 383 | resize_as_ | resize_as_npu_ | -| 384 | pow.Tensor_Scalar_out | pow_out_npu | -| 385 | pow.Tensor_Scalar | pow_npu | -| 386 | zero_ | zero_npu_ | -| 387 | sub.out | sub_out_npu | -| 388 | sub.Tensor | sub_npu | -| 389 | sub_.Tensor | sub_npu_ | -| 390 | sub.Scalar | sub_npu | -| 391 | sub_.Scalar | sub_npu_ | -| 392 | rsub.Tensor | rsub_npu | -| 393 | rsub.Scalar | rsub_npu | -| 394 | addmm.out | addmm_out_npu | -| 395 | addmm | addmm_npu | -| 396 | addmm_ | addmm_npu_ | -| 397 | quantize_per_tensor | quantize_per_tensor_npu | -| 398 | quantize_per_channel | quantize_per_channel_npu | -| 399 | to.dtype_layout | to_npu | -| 400 | to.device | to_device_npu | -| 401 | to.dtype | to_dtype_npu | -| 402 | to.other | to_other_npu | -| 403 | _local_scalar_dense | _local_scalar_dense_npu | -| 404 | lstm.input | lstm_npu | -| 405 | lstm.data | lstm_npu | -| 406 | gru.input | gru_npu_ | -| 407 | _pack_padded_sequence | _pack_padded_sequence_npu | -| 408 | _pad_packed_sequence | _pad_packed_sequence_npu | -| 409 | set_.source_Storage | set_npu_ | -| 410 | set_.source_Storage_storage_offset | set_npu_ | -| 411 | set_.source_Tensor | set_npu_ | -| 412 | set_ | set_npu_ | -| 413 | masked_fill_.Scalar | masked_fill_npu_ | -| 414 | masked_fill_.Tensor | masked_fill_npu_ | -| 415 | masked_scatter_ | masked_scatter_npu_ | -| 416 | view | view_npu | -| 417 | put_ | put_npu_ | -| 418 | index_add_ | index_add_npu_ | -| 419 | index_add | index_add_npu | -| 420 | index_add.dimname | index_add_npu | -| 421 | index_fill_.int_Scalar | index_fill_npu_ | -| 422 | index_fill.int_Scalar | index_fill_npu | -| 423 | index_fill_.int_Tensor | index_fill_npu_ | -| 424 | index_fill.int_Tensor | index_fill_npu | -| 425 | scatter_.src | scatter_npu_ | -| 426 | scatter_.value | scatter_npu_ | -| 427 | scatter_add_ | scatter_add_npu_ | -| 428 | scatter_add | scatter_add_npu | -| 429 | scatter_add.dimname | scatter_add_npu | -| 430 | lt_.Scalar | lt_npu_ | -| 431 | lt_.Tensor | lt_npu_ | -| 432 | gt_.Scalar | gt_npu_ | -| 433 | gt_.Tensor | gt_npu_ | -| 434 | le_.Scalar | le_npu_ | -| 435 | le_.Tensor | le_npu_ | -| 436 | ge_.Scalar | ge_npu_ | -| 437 | ge_.Tensor | ge_npu_ | -| 438 | eq_.Scalar | eq_npu_ | -| 439 | eq_.Tensor | eq_npu_ | -| 440 | ne_.Scalar | ne_npu_ | -| 441 | ne_.Tensor | ne_npu_ | -| 442 | bitwise_and.Tensor_out | bitwise_and_out_npu | -| 443 | bitwise_and.Scalar_out | bitwise_and_out_npu | -| 444 | bitwise_and.Scalar | bitwise_and_npu | -| 445 | bitwise_and.Tensor | bitwise_and_npu | -| 446 | bitwise_and_.Scalar | bitwise_and_npu_ | -| 447 | bitwise_and_.Tensor | bitwise_and_npu_ | -| 448 | and.Scalar | and_npu | -| 449 | and.Tensor | and_npu | -| 450 | bitwise_or.Tensor_out | bitwise_or_out_npu | -| 451 | bitwise_or.Scalar_out | bitwise_or_out_npu | -| 452 | bitwise_or.Scalar | bitwise_or_npu | -| 453 | bitwise_or.Tensor | bitwise_or_npu | -| 454 | bitwise_or_.Scalar | bitwise_or_npu_ | -| 455 | bitwise_or_.Tensor | bitwise_or_npu_ | -| 456 | or.Scalar | or_npu | -| 457 | or.Tensor | or_npu | -| 458 | ior.Scalar | ior_npu | -| 459 | ior.Tensor | ior_npu | -| 460 | bitwise_xor.Tensor_out | bitwise_xor_out_npu | -| 461 | bitwise_xor.Scalar_out | bitwise_xor_out_npu | -| 462 | bitwise_xor.Scalar | bitwise_xor_npu | -| 463 | bitwise_xor.Tensor | bitwise_xor_npu | -| 464 | bitwise_xor_.Scalar | bitwise_xor_npu_ | -| 465 | bitwise_xor_.Tensor | bitwise_xor_npu_ | -| 466 | xor.Scalar | xor_npu | -| 467 | xor.Tensor | xor_npu | -| 468 | atan2_ | atan2_npu_ | -| 469 | tril_ | tril_npu_ | -| 470 | triu_ | triu_npu_ | -| 471 | renorm_ | renorm_npu_ | -| 472 | pow_.Scalar | pow_npu_ | -| 473 | pow_.Tensor | pow_npu_ | -| 474 | lerp_.Scalar | lerp_npu_ | -| 475 | lerp_.Tensor | lerp_npu_ | -| 476 | fmod_.Scalar | fmod_npu_ | -| 477 | fmod_.Tensor | fmod_npu_ | -| 478 | remainder_.Scalar | remainder_npu_ | -| 479 | remainder_.Tensor | remainder_npu_ | -| 480 | addbmm_ | addbmm_npu_ | -| 481 | addbmm.out | addbmm_out_npu | -| 482 | addbmm | addbmm_npu | -| 483 | addcdiv_ | addcdiv_npu_ | -| 484 | random_.from | random_npu_ | -| 485 | random_.to | random_npu_ | -| 486 | random_ | random_npu_ | -| 487 | uniform_ | uniform_npu_ | -| 488 | diag.out | diag_out_npu | -| 489 | diag | diag_npu | -| 490 | cross.out | cross_out_npu | -| 491 | cross | cross_npu | -| 492 | triu.out | triu_out_npu | -| 493 | triu | triu_npu | -| 494 | tril.out | tril_out_npu | -| 495 | tril | tril_npu | -| 496 | ne.Scalar_out | ne_out_npu | -| 497 | ne.Scalar | ne_npu | -| 498 | ne.Tensor_out | ne_out_npu | -| 499 | ne.Tensor | ne_npu | -| 500 | eq.Scalar_out | eq_out_npu | -| 501 | eq.Scalar | eq_npu | -| 502 | eq.Tensor_out | eq_out_npu | -| 503 | eq.Tensor | eq_npu | -| 504 | ge.Scalar_out | ge_out_npu | -| 505 | ge.Scalar | ge_npu | -| 506 | ge.Tensor_out | ge_out_npu | -| 507 | ge.Tensor | ge_npu | -| 508 | le.Scalar_out | le_out_npu | -| 509 | le.Scalar | le_npu | -| 510 | le.Tensor_out | le_out_npu | -| 511 | le.Tensor | le_npu | -| 512 | gt.Scalar_out | gt_out_npu | -| 513 | gt.Scalar | gt_npu | -| 514 | gt.Tensor_out | gt_out_npu | -| 515 | gt.Tensor | gt_npu | -| 516 | lt.Scalar_out | lt_out_npu | -| 517 | lt.Scalar | lt_npu | -| 518 | lt.Tensor_out | lt_out_npu | -| 519 | lt.Tensor | lt_npu | -| 520 | take.out | take_out_npu | -| 521 | take | take_npu | -| 522 | index_select.out | index_select_out_npu | -| 523 | index_select | index_select_npu | -| 524 | index_select.dimname_out | index_select_out_npu | -| 525 | index_select.dimname | index_select_npu | -| 526 | masked_select.out | masked_select_out_npu | -| 527 | masked_select | masked_select_npu | -| 528 | nonzero.out | nonzero_out_npu | -| 529 | nonzero | nonzero_npu | -| 530 | gather.out | gather_out_npu | -| 531 | gather | gather_npu | -| 532 | gather.dimname_out | gather_out_npu | -| 533 | gather.dimname | gather_npu | -| 534 | addcmul.out | addcmul_out_npu | -| 535 | addcmul | addcmul_npu | -| 536 | addcmul_ | addcmul_npu_ | -| 537 | addcdiv.out | addcdiv_out_npu | -| 538 | addcdiv | addcdiv_npu | -| 539 | qr.Q | qr_out_npu | -| 540 | qr | qr_npu | -| 541 | multinomial.out | multinomial_out_npu | -| 542 | multinomial | multinomial_npu | -| 543 | erfinv | erfinv_npu | -| 544 | erfinv_ | erfinv_npu_ | -| 545 | erfinv.out | erfinv_out_npu | -| 546 | sign | sign_npu | -| 547 | sign_ | sign_npu_ | -| 548 | sign.out | sign_out_npu | -| 549 | atan2.out | atan2_out_npu | -| 550 | atan2 | atan2_npu | -| 551 | lerp.Scalar_out | lerp_out_npu | -| 552 | lerp.Tensor_out | lerp_out_npu | -| 553 | lerp.Scalar | lerp_npu | -| 554 | lerp.Tensor | lerp_npu | -| 555 | histc.out | histc_out_npu | -| 556 | histc | histc_npu | -| 557 | fmod.Scalar_out | fmod_out_npu | -| 558 | fmod.Scalar | fmod_npu | -| 559 | fmod.Tensor_out | fmod_out_npu | -| 560 | fmod.Tensor | fmod_npu | -| 561 | remainder.Scalar_out | remainder_out_npu | -| 562 | remainder.Scalar | remainder_npu | -| 563 | remainder.Tensor_out | remainder_out_npu | -| 564 | remainder.Tensor | remainder_npu | -| 565 | min.out | min_out_npu | -| 566 | min.other | min_npu | -| 567 | min | min_npu | -| 568 | max.out | max_out_npu | -| 569 | max.other | max_npu | -| 570 | max | max_npu | -| 571 | median | median_npu | -| 572 | sort.values | sort_out_npu | -| 573 | sort | sort_npu | -| 574 | sort.dimname_values | sort_out_npu | -| 575 | sort.dimname | sort_npu | -| 576 | argsort | argsort_npu | -| 577 | argsort.dimname | argsort_npu | -| 578 | topk.values | topk_out_npu | -| 579 | topk | topk_npu | -| 580 | all | all_npu | -| 581 | any | any_npu | -| 582 | renorm.out | renorm_out_npu | -| 583 | renorm | renorm_npu | -| 584 | unfold | unfold | -| 585 | equal | equal_npu | -| 586 | pow.Tensor_Tensor_out | pow_out_npu | -| 587 | pow.Tensor_Tensor | pow_npu | -| 588 | pow.Scalar_out | pow_out_npu | -| 589 | pow.Scalar | pow_npu | -| 590 | normal_ | normal_npu_ | -| 591 | normal.Tensor_float_out | normal_out_npu | -| 592 | normal.Tensor_float | normal_npu | -| 593 | normal.float_Tensor_out | normal_out_npu | -| 594 | normal.float_Tensor | normal_npu | -| 595 | normal.Tensor_Tensor_out | normal_out_npu | -| 596 | normal.Tensor_Tensor | normal_npu | -| 597 | normal.float_float | normal_npu | -| 598 | normal.float_float_out | normal_out_npu | -| 599 | _addr | _addr_npu | -| 600 | _addr_ | _addr_npu_ | -| 601 | _addr.out | _addr_out_npu | -| 602 | _cumsum | _cumsum_npu | -| 603 | _cumsum.out | _cumsum_out_npu | -| 604 | _cumprod | _cumprod_npu | -| 605 | _cumprod.out | _cumprod_out_npu | -| 606 | _var | _var_npu | -| 607 | _amp_non_finite_check_and_unscale_ | _amp_non_finite_check_and_unscale_npu_ | -| 608 | _cat | _cat_npu | -| 609 | _cat.out | _cat_out_npu | -| 610 | _max | _max_npu | -| 611 | _max.max | _max_out_npu | -| 612 | _min | _min_npu | -| 613 | _min.min | _min_out_npu | -| 614 | mse_loss.out | mse_loss_out_npu | -| 615 | mse_loss | mse_loss_npu | -| 616 | mse_loss_backward.grad_input | mse_loss_backward_out_npu | -| 617 | mse_loss_backward | mse_loss_backward_npu | -| 618 | l1_loss.out | l1_loss_out_npu | -| 619 | l1_loss | l1_loss_npu | -| 620 | l1_loss_backward.grad_input | l1_loss_backward_out_npu | -| 621 | l1_loss_backward | l1_loss_backward_npu | -| 622 | multilabel_margin_loss.out | multilabel_margin_loss_out_npu | -| 623 | multilabel_margin_loss | multilabel_margin_loss_npu | -| 624 | multilabel_margin_loss_forward.output | multilabel_margin_loss_forward_out_npu | -| 625 | multilabel_margin_loss_forward | multilabel_margin_loss_forward_npu | -| 626 | nll_loss.out | nll_loss_out_npu | -| 627 | nll_loss | nll_loss_npu | -| 628 | nll_loss_forward.output | nll_loss_forward_out_npu | -| 629 | nll_loss_forward | nll_loss_forward_npu | -| 630 | nll_loss_backward.grad_input | nll_loss_backward_out_npu | -| 631 | nll_loss_backward | nll_loss_backward_npu | -| 632 | nll_loss2d.out | nll_loss2d_out_npu | -| 633 | nll_loss2d | nll_loss2d_npu | -| 634 | nll_loss2d_forward.output | nll_loss2d_forward_out_npu | -| 635 | nll_loss2d_forward | nll_loss2d_forward_npu | -| 636 | nll_loss2d_backward.grad_input | nll_loss2d_backward_out_npu | -| 637 | nll_loss2d_backward | nll_loss2d_backward_npu | -| 638 | smooth_l1_loss.out | smooth_l1_loss_out_npu | -| 639 | smooth_l1_loss | smooth_l1_loss_npu | -| 640 | smooth_l1_loss_backward.grad_input | smooth_l1_loss_backward_out_npu | -| 641 | smooth_l1_loss_backward | smooth_l1_loss_backward_npu | -| 642 | soft_margin_loss.out | soft_margin_loss_out_npu | -| 643 | soft_margin_loss | soft_margin_loss_npu | -| 644 | soft_margin_loss_backward.grad_input | soft_margin_loss_backward_out_npu | -| 645 | soft_margin_loss_backward | soft_margin_loss_backward_npu | -| 646 | elu.out | elu_out_npu | -| 647 | elu | elu_npu | -| 648 | elu_backward.grad_input | elu_backward_out_npu | -| 649 | elu_backward | elu_backward_npu | -| 650 | elu_ | elu_npu_ | -| 651 | glu.out | glu_out_npu | -| 652 | glu | glu_npu | -| 653 | glu_backward.grad_input | glu_backward_out_npu | -| 654 | glu_backward | glu_backward_npu | -| 655 | hardsigmoid.out | hardsigmoid_out_npu | -| 656 | hardsigmoid | hardsigmoid_npu | -| 657 | hardsigmoid_ | hardsigmoid_npu_ | -| 658 | hardsigmoid_backward | hardsigmoid_backward_npu | -| 659 | hardtanh.out | hardtanh_out_npu | -| 660 | hardtanh | hardtanh_npu | -| 661 | hardtanh_backward.grad_input | hardtanh_backward_out_npu | -| 662 | hardtanh_backward | hardtanh_backward_npu | -| 663 | hardtanh_ | hardtanh_npu_ | -| 664 | leaky_relu.out | leaky_relu_out_npu | -| 665 | leaky_relu | leaky_relu_npu | -| 666 | leaky_relu_backward | leaky_relu_backward_npu | -| 667 | leaky_relu_ | leaky_relu_npu_ | -| 668 | log_sigmoid.out | log_sigmoid_out_npu | -| 669 | log_sigmoid | log_sigmoid_npu | -| 670 | log_sigmoid_forward.output | log_sigmoid_forward_out_npu | -| 671 | log_sigmoid_forward | log_sigmoid_forward_npu | -| 672 | log_sigmoid_backward.grad_input | log_sigmoid_backward_out_npu | -| 673 | log_sigmoid_backward | log_sigmoid_backward_npu | -| 674 | softplus.out | softplus_out_npu | -| 675 | softplus | softplus_npu | -| 676 | softplus_backward.grad_input | softplus_backward_out_npu | -| 677 | softplus_backward | softplus_backward_npu | -| 678 | softshrink.out | softshrink_out_npu | -| 679 | softshrink | softshrink_npu | -| 680 | softshrink_backward.grad_input | softshrink_backward_out_npu | -| 681 | softshrink_backward | softshrink_backward_npu | -| 682 | adaptive_avg_pool2d.out | adaptive_avg_pool2d_out_npu | -| 683 | adaptive_avg_pool2d | adaptive_avg_pool2d_npu | -| 684 | _adaptive_avg_pool2d | _adaptive_avg_pool2d_npu | -| 685 | _adaptive_avg_pool2d_backward | adaptive_avg_pool2d_backward_npu | -| 686 | adaptive_avg_pool3d.out | adaptive_avg_pool3d_out_npu | -| 687 | adaptive_avg_pool3d | adaptive_avg_pool3d_npu | -| 688 | adaptive_avg_pool3d_backward.grad_input | adaptive_avg_pool3d_backward_out_npu | -| 689 | adaptive_avg_pool3d_backward | adaptive_avg_pool3d_backward_npu | -| 690 | adaptive_max_pool2d.out | adaptive_max_pool2d_out_npu | -| 691 | adaptive_max_pool2d | adaptive_max_pool2d_npu | -| 692 | adaptive_max_pool2d_backward.grad_input | adaptive_max_pool2d_backward_out_npu | -| 693 | adaptive_max_pool2d_backward | adaptive_max_pool2d_backward_npu | -| 694 | avg_pool2d.out | avg_pool2d_out_npu | -| 695 | avg_pool2d | avg_pool2d_npu | -| 696 | avg_pool2d_backward.grad_input | avg_pool2d_backward_out_npu | -| 697 | avg_pool2d_backward | avg_pool2d_backward_npu | -| 698 | avg_pool3d.out | avg_pool3d_out_npu | -| 699 | avg_pool3d | avg_pool3d_npu | -| 700 | avg_pool3d_backward.grad_input | avg_pool3d_backward_out_npu | -| 701 | avg_pool3d_backward | avg_pool3d_backward_npu | -| 702 | max_pool2d_with_indices.out | max_pool2d_with_indices_out_npu | -| 703 | max_pool2d_with_indices | max_pool2d_with_indices_npu | -| 704 | max_pool2d_with_indices_backward.grad_input | max_pool2d_with_indices_backward_out_npu | -| 705 | max_pool2d_with_indices_backward | max_pool2d_with_indices_backward_npu | -| 706 | max_pool3d_with_indices.out | max_pool3d_with_indices_out_npu | -| 707 | max_pool3d_with_indices | max_pool3d_with_indices_npu | -| 708 | max_pool3d_with_indices_backward.grad_input | max_pool3d_with_indices_backward_out_npu | -| 709 | max_pool3d_with_indices_backward | max_pool3d_with_indices_backward_npu | -| 710 | reflection_pad2d.out | reflection_pad2d_out_npu | -| 711 | reflection_pad2d | reflection_pad2d_npu | -| 712 | replication_pad2d.out | replication_pad2d_out_npu | -| 713 | replication_pad2d | replication_pad2d_npu | -| 714 | upsample_linear1d.out | upsample_linear1d_out_npu | -| 715 | upsample_linear1d | upsample_linear1d_npu | -| 716 | upsample_linear1d_backward | upsample_linear1d_backward_npu | -| 717 | upsample_bilinear2d.out | upsample_bilinear2d_out_npu | -| 718 | upsample_bilinear2d | upsample_bilinear2d_npu | -| 719 | upsample_bilinear2d_backward.grad_input | upsample_bilinear2d_backward_out_npu | -| 720 | upsample_bilinear2d_backward | upsample_bilinear2d_backward_npu | -| 721 | upsample_bicubic2d.out | upsample_bicubic2d_out_npu | -| 722 | upsample_bicubic2d | upsample_bicubic2d_npu | -| 723 | upsample_bicubic2d_backward.grad_input | upsample_bicubic2d_backward_out_npu | -| 724 | upsample_bicubic2d_backward | upsample_bicubic2d_backward_npu | -| 725 | upsample_trilinear3d.out | upsample_trilinear3d_out_npu | -| 726 | upsample_trilinear3d | upsample_trilinear3d_npu | -| 727 | upsample_trilinear3d_backward.grad_input | upsample_trilinear3d_backward_out_npu | -| 728 | upsample_trilinear3d_backward | upsample_trilinear3d_backward_npu | -| 729 | upsample_nearest1d.out | upsample_nearest1d_out_npu | -| 730 | upsample_nearest1d | upsample_nearest1d_npu | -| 731 | upsample_nearest1d_backward.grad_input | upsample_nearest1d_backward_out_npu | -| 732 | upsample_nearest1d_backward | upsample_nearest1d_backward_npu | -| 733 | upsample_nearest2d.out | upsample_nearest2d_out_npu | -| 734 | upsample_nearest2d | upsample_nearest2d_npu | -| 735 | upsample_nearest2d_backward.grad_input | upsample_nearest2d_backward_out_npu | -| 736 | upsample_nearest2d_backward | upsample_nearest2d_backward_npu | -| 737 | upsample_nearest3d.out | upsample_nearest3d_out_npu | -| 738 | upsample_nearest3d | upsample_nearest3d_npu | -| 739 | upsample_nearest3d_backward.grad_input | upsample_nearest3d_backward_out_npu | -| 740 | upsample_nearest3d_backward | upsample_nearest3d_backward_npu | -| 741 | sigmoid_backward.grad_input | sigmoid_backward_out_npu | -| 742 | sigmoid_backward | sigmoid_backward_npu | -| 743 | tanh_backward.grad_input | tanh_backward_out_npu | -| 744 | tanh_backward | tanh_backward_npu | -| 745 | slow_conv_transpose2d.out | slow_conv_transpose2d_out_npu | -| 746 | slow_conv_transpose2d | slow_conv_transpose2d_npu | -| 747 | slow_conv_transpose2d_backward.grad_output | slow_conv_transpose2d_backward_out_npu | -| 748 | slow_conv_transpose2d_backward.output_mask | slow_conv_transpose2d_backward_npu | -| 749 | thnn_conv2d.out | thnn_conv2d_out_npu | -| 750 | thnn_conv2d | thnn_conv2d_npu | -| 751 | thnn_conv2d_forward.output | thnn_conv2d_forward_out_npu | -| 752 | thnn_conv2d_forward | thnn_conv2d_forward_npu | -| 753 | thnn_conv2d_backward.output_mask | thnn_conv2d_backward_npu | -| 754 | thnn_conv_depthwise2d.out | thnn_conv_depthwise2d_out_npu | -| 755 | thnn_conv_depthwise2d | thnn_conv_depthwise2d_npu | -| 756 | thnn_conv_depthwise2d_forward.out | thnn_conv_depthwise2d_forward_out_npu | -| 757 | thnn_conv_depthwise2d_forward | thnn_conv_depthwise2d_forward_npu | -| 758 | thnn_conv_depthwise2d_backward.grad_input | thnn_conv_depthwise2d_backward_out_npu | -| 759 | thnn_conv_depthwise2d_backward.output_mask | thnn_conv_depthwise2d_backward_npu | -| 760 | slow_conv_dilated2d | slow_conv_dilated2d_npu | -| 761 | slow_conv_dilated2d_backward | slow_conv_dilated2d_backward_npu | -| 762 | col2im.out | im2col_backward_out_npu | -| 763 | col2im | im2col_backward_npu | -| 764 | col2im_backward.grad_input | col2im_backward_out_npu | -| 765 | col2im_backward | col2im_backward_npu | -| 766 | im2col.out | im2col_out_npu | -| 767 | im2col | im2col_npu | -| 768 | im2col_backward.grad_input | im2col_backward_out_npu | -| 769 | im2col_backward | im2col_backward_npu | -| 770 | isfinite | isfinite_npu | +# PyTorch适配算子清单 +- [PyTorch原生算子与昇腾算子对应表](#PyTorch原生算子与昇腾算子对应表.md) +- [PyTorch昇腾自定义算子](#PyTorch昇腾自定义算子.md) +

PyTorch原生算子与昇腾算子对应表

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

序号

+

PyTorch 原生算子

+

昇腾适配算子

+

1

+

dropout

+

dropout_npu

+

2

+

dropout_

+

dropout_npu_

+

3

+

abs

+

abs_npu

+

4

+

abs_

+

abs_npu_

+

5

+

abs.out

+

abs_out_npu

+

6

+

acos

+

acos_npu

+

7

+

acos_

+

acos_npu_

+

8

+

acos.out

+

acos_out_npu

+

9

+

adaptive_avg_pool1d

+

adaptive_avg_pool1d_npu

+

10

+

add.Tensor

+

add_npu

+

11

+

add_.Tensor

+

add_npu_

+

12

+

add.out

+

add_out_npu

+

13

+

add.Scalar

+

add_npu

+

14

+

add_.Scalar

+

add_npu_

+

15

+

addmv

+

addmv_npu

+

16

+

addmv_

+

addmv_npu_

+

17

+

addmv.out

+

addmv_out_npu

+

18

+

addr

+

addr_npu

+

19

+

addr_

+

addr_npu_

+

20

+

addr.out

+

addr_out_npu

+

21

+

affine_grid_generator

+

affine_grid_generator_npu

+

22

+

affine_grid_generator_backward

+

affine_grid_generator_backward_npu

+

23

+

all.dim

+

all_npu

+

24

+

all.out

+

all_out_npu

+

25

+

any.dim

+

any_npu

+

26

+

any.out

+

any_out_npu

+

27

+

arange

+

arange_npu

+

28

+

arange.start

+

arange_npu

+

29

+

arange.start_step

+

arange_npu

+

30

+

arange.out

+

arange_out_npu

+

31

+

arange.start_out

+

arange_out_npu

+

32

+

_dim_arange

+

_dim_arange_npu

+

33

+

argmax

+

argmax_npu

+

34

+

argmin

+

argmin_npu

+

35

+

as_strided

+

as_strided_npu

+

36

+

as_strided_

+

as_strided_npu_

+

37

+

asin

+

asin_npu

+

38

+

asin_

+

asin_npu_

+

39

+

asin.out

+

asin_out_npu

+

40

+

atan

+

atan_npu

+

41

+

atan_

+

atan_npu_

+

42

+

atan.out

+

atan_out_npu

+

43

+

baddbmm

+

baddbmm_npu

+

44

+

baddbmm_

+

baddbmm_npu_

+

45

+

baddbmm.out

+

baddbmm_out_npu

+

46

+

bartlett_window

+

bartlett_window_npu

+

47

+

bartlett_window.periodic

+

bartlett_window_npu

+

48

+

batch_norm

+

batch_norm_npu_

+

49

+

_batch_norm_impl_index

+

_batch_norm_impl_index_npu

+

50

+

_batch_norm_impl_index_backward

+

_batch_norm_impl_index_backward_npu

+

51

+

bernoulli

+

bernoulli_npu

+

52

+

bernoulli_.Tensor

+

bernoulli_npu_

+

53

+

bernoulli_.float

+

bernoulli_npu_

+

54

+

binary_cross_entropy

+

binary_cross_entropy_npu

+

55

+

binary_cross_entropy.out

+

binary_cross_entropy_out_npu

+

56

+

binary_cross_entropy_backward

+

binary_cross_entropy_backward_npu

+

57

+

binary_cross_entropy_backward.grad_input

+

binary_cross_entropy_backward_out_npu

+

58

+

binary_cross_entropy_with_logits

+

binary_cross_entropy_with_logits_npu

+

59

+

binary_cross_entropy_with_logits_backward

+

binary_cross_entropy_with_logits_backward_npu

+

60

+

bitwise_not

+

bitwise_not_npu

+

61

+

bitwise_not_

+

bitwise_not_npu_

+

62

+

bitwise_not.out

+

bitwise_not_out_npu

+

63

+

logical_not

+

logical_not_npu

+

64

+

logical_not_

+

logical_not_npu_

+

65

+

logical_not.out

+

logical_not_out_npu

+

66

+

logical_and

+

logical_and_npu

+

67

+

logical_and_

+

logical_and_npu_

+

68

+

logical_and.out

+

logical_and_out_npu

+

69

+

logical_or

+

logical_or_npu

+

70

+

logical_or_

+

logical_or_npu_

+

71

+

logical_or.out

+

logical_or_out_npu

+

72

+

blackman_window

+

blackman_window_npu

+

73

+

blackman_window.periodic

+

blackman_window_npu

+

74

+

bmm

+

bmm_npu

+

75

+

bmm.out

+

bmm_out_npu

+

76

+

cat

+

cat_npu

+

77

+

cat.out

+

cat_out_npu

+

78

+

cat.names

+

cat_npu

+

79

+

cat.names_out

+

cat_out_npu

+

80

+

ceil

+

ceil_npu

+

81

+

ceil_

+

ceil_npu_

+

82

+

ceil.out

+

ceil_out_npu

+

83

+

clamp

+

clamp_npu

+

84

+

clamp_

+

clamp_npu_

+

85

+

clamp.out

+

clamp_out_npu

+

86

+

clamp_max

+

clamp_max_npu

+

87

+

clamp_max_

+

clamp_max_npu_

+

88

+

clamp_max.out

+

clamp_max_out_npu

+

89

+

clamp_min

+

clamp_min_npu

+

90

+

clamp_min_

+

clamp_min_npu_

+

91

+

clamp_min.out

+

clamp_min_out_npu

+

92

+

constant_pad_nd

+

constant_pad_nd_npu

+

93

+

contiguous

+

contiguous_npu

+

94

+

convolution

+

convolution_npu

+

95

+

_convolution

+

_convolution_npu

+

96

+

_convolution_nogroup

+

_convolution_nogroup_npu

+

97

+

conv2d

+

conv2d_npu_

+

98

+

conv3d

+

_conv3d_npu

+

99

+

conv_tbc

+

conv_tbc_npu

+

100

+

conv_tbc_backward

+

conv_tbc_backward_npu

+

101

+

conv_transpose2d.input

+

conv_transpose2d_npu_

+

102

+

conv_transpose3d.input

+

conv_transpose3d_npu_

+

103

+

copy_

+

copy_npu_

+

104

+

cos

+

cos_npu

+

105

+

cos_

+

cos_npu_

+

106

+

cos.out

+

cos_out_npu

+

107

+

cosh

+

cosh_npu

+

108

+

cosh_

+

cosh_npu_

+

109

+

cosh.out

+

cosh_out_npu

+

110

+

_cummax_helper

+

cummax_helper_npu

+

111

+

_cummin_helper

+

cummin_helper_npu

+

112

+

cumprod

+

cumprod_npu

+

113

+

cumprod.out

+

cumprod_out_npu

+

114

+

cumprod.dimname

+

cumprod_npu

+

115

+

cumprod.dimname_out

+

cumprod_out_npu

+

116

+

ctc_loss.IntList

+

ctc_loss_npu

+

117

+

ctc_loss.Tensor

+

ctc_loss_npu

+

118

+

_ctc_loss

+

ctc_loss_npu

+

119

+

_ctc_loss_backward

+

ctc_loss_backward_npu

+

120

+

fill_diagonal_

+

fill_diagonal_npu_

+

121

+

div.Tensor

+

div_npu

+

122

+

div_.Tensor

+

div_npu_

+

123

+

div.out

+

div_out_npu

+

124

+

div.Scalar

+

div_npu

+

125

+

div_.Scalar

+

div_npu_

+

126

+

dot

+

dot_npu

+

127

+

dot.out

+

dot_out_npu

+

128

+

embedding

+

embedding_npu

+

129

+

embedding_backward

+

embedding_backward_npu

+

130

+

embedding_dense_backward

+

embedding_dense_backward_npu

+

131

+

embedding_renorm_

+

embedding_renorm_npu_

+

132

+

_embedding_bag

+

_embedding_bag_npu

+

133

+

empty.memory_format

+

empty_npu

+

134

+

resize_

+

resize_npu_

+

135

+

empty_like

+

empty_like_npu

+

136

+

empty_strided

+

empty_strided_npu

+

137

+

erf

+

erf_npu

+

138

+

erf_

+

erf_npu_

+

139

+

erf.out

+

erf_out_npu

+

140

+

erfc

+

erfc_npu

+

141

+

erfc_

+

erfc_npu_

+

142

+

erfc.out

+

erfc_out_npu

+

143

+

exp

+

exp_npu

+

144

+

exp_

+

exp_npu_

+

145

+

exp.out

+

exp_out_npu

+

146

+

expm1

+

expm1_npu

+

147

+

expm1_

+

expm1_npu_

+

148

+

expm1.out

+

expm1_out_npu

+

149

+

eye

+

eye_npu

+

150

+

eye.m

+

eye_npu

+

151

+

eye.out

+

eye_out_npu

+

152

+

eye.m_out

+

eye_out_npu

+

153

+

fill_.Scalar

+

fill_npu_

+

154

+

fill_.Tensor

+

fill_npu_

+

155

+

floor

+

floor_npu

+

156

+

floor_

+

floor_npu_

+

157

+

floor.out

+

floor_out_npu

+

158

+

floor_divide

+

floor_divide_npu

+

159

+

floor_divide_.Tensor

+

floor_divide_npu_

+

160

+

floor_divide.out

+

floor_divide_out_npu

+

161

+

floor_divide.Scalar

+

floor_divide_npu

+

162

+

floor_divide_.Scalar

+

floor_divide_npu_

+

163

+

frac

+

frac_npu

+

164

+

frac_

+

frac_npu_

+

165

+

frac.out

+

frac_out_npu

+

166

+

full.names

+

full_npu

+

167

+

full

+

full_npu

+

168

+

full.out

+

full_out_npu

+

169

+

grid_sampler

+

grid_sampler_npu

+

170

+

grid_sampler_3d

+

grid_sampler_3d_npu

+

171

+

grid_sampler_3d_backward

+

grid_sampler_3d_backward_npu

+

172

+

hann_window

+

hann_window_npu

+

173

+

hann_window.periodic

+

hann_window_npu

+

174

+

hamming_window

+

hamming_window_npu

+

175

+

hamming_window.periodic

+

hamming_window_npu

+

176

+

hamming_window.periodic_alpha

+

hamming_window_npu

+

177

+

hamming_window.periodic_alpha_beta

+

hamming_window_npu

+

178

+

ger

+

ger_npu

+

179

+

ger.out

+

ger_out_npu

+

180

+

index.Tensor

+

index_npu

+

181

+

index_put_

+

index_put_npu_

+

182

+

index_put

+

index_put_npu

+

183

+

_index_put_impl_

+

_index_put_impl_npu_

+

184

+

inverse

+

inverse_npu

+

185

+

inverse.out

+

inverse_out_npu

+

186

+

isclose

+

isclose_npu

+

187

+

isnan

+

isnan_npu

+

188

+

is_nonzero

+

is_nonzero_npu

+

189

+

kl_div

+

kl_div_npu

+

190

+

kl_div_backward

+

kl_div_backward_npu

+

191

+

kthvalue

+

kthvalue_npu

+

192

+

kthvalue.values

+

kthvalue_out_npu

+

193

+

kthvalue.dimname

+

kthvalue_npu

+

194

+

kthvalue.dimname_out

+

kthvalue_out_npu

+

195

+

native_layer_norm

+

layer_norm_npu

+

196

+

native_layer_norm_backward

+

layer_norm_backward_npu

+

197

+

linspace

+

linspace_npu

+

198

+

linspace.out

+

linspace_out_npu

+

199

+

log

+

log_npu

+

200

+

log_

+

log_npu_

+

201

+

log.out

+

log_out_npu

+

202

+

log10

+

log10_npu

+

203

+

log10_

+

log10_npu_

+

204

+

log10.out

+

log10_out_npu

+

205

+

log1p

+

log1p_npu

+

206

+

log1p_

+

log1p_npu_

+

207

+

log1p.out

+

log1p_out_npu

+

208

+

log2

+

log2_npu

+

209

+

log2_

+

log2_npu_

+

210

+

log2.out

+

log2_out_npu

+

211

+

logspace

+

logspace_npu

+

212

+

logspace.out

+

logspace_out_npu

+

213

+

log_softmax.int

+

log_softmax_npu

+

214

+

log_softmax.Dimname

+

log_softmax_npu

+

215

+

_log_softmax

+

_log_softmax_npu

+

216

+

_log_softmax_backward_data

+

_log_softmax_backward_npu

+

217

+

logsumexp

+

logsumexp_npu

+

218

+

logsumexp.out

+

logsumexp_out_npu

+

219

+

logsumexp.names

+

logsumexp_npu

+

220

+

logsumexp.names_out

+

logsumexp_out_npu

+

221

+

matmul

+

matmul_npu

+

222

+

matmul.out

+

matmul_out_npu

+

223

+

max.dim

+

max_npu

+

224

+

max.dim_max

+

max_out_npu

+

225

+

max_values

+

max_npu

+

226

+

max.names_dim

+

max_npu

+

227

+

max.names_dim_max

+

max_out_npu

+

228

+

max_values.names

+

max_npu

+

229

+

max_pool2d

+

max_pool2d_npu

+

230

+

mean

+

mean_npu

+

231

+

mean.dim

+

mean_npu

+

232

+

mean.out

+

mean_out_npu

+

233

+

mean.names_dim

+

mean_npu

+

234

+

mean.names_out

+

mean_out_npu

+

235

+

median.dim

+

median_npu

+

236

+

median.dim_values

+

median_out_npu

+

237

+

median.names_dim

+

median_npu

+

238

+

median.names_dim_values

+

median_out_npu

+

239

+

min.dim

+

min_npu

+

240

+

min.dim_min

+

min_out_npu

+

241

+

min_values

+

min_npu

+

242

+

min.names_dim

+

min_npu

+

243

+

min.names_dim_min

+

min_out_npu

+

244

+

min_values.names

+

min_npu

+

245

+

mm

+

mm_npu

+

246

+

mm.out

+

mm_out_npu

+

247

+

mul.Tensor

+

mul_npu

+

248

+

mul_.Tensor

+

mul_npu_

+

249

+

mul.out

+

mul_out_npu

+

250

+

mul.Scalar

+

mul_npu

+

251

+

mul_.Scalar

+

mul_npu_

+

252

+

mv

+

mv_npu

+

253

+

mv.out

+

mv_out_npu

+

254

+

narrow_copy

+

narrow_copy_npu

+

255

+

native_batch_norm

+

batch_norm_npu

+

256

+

native_batch_norm_backward

+

batch_norm_backward_npu

+

257

+

_nnpack_spatial_convolution

+

_nnpack_spatial_convolution_npu

+

258

+

ones.names

+

ones_npu

+

259

+

ones

+

ones_npu

+

260

+

ones.out

+

ones_out_npu

+

261

+

ones_like

+

ones_like_npu

+

262

+

cdist

+

cdist_npu

+

263

+

_cdist_forward

+

_cdist_forward_npu

+

264

+

_cdist_backward

+

_cdist_backward_npu

+

265

+

pdist

+

pdist_npu

+

266

+

_pdist_forward

+

_pdist_forward_npu

+

267

+

randperm

+

randperm_npu

+

268

+

randperm.generator

+

randperm_npu

+

269

+

randperm.out

+

randperm_out_npu

+

270

+

randperm.generator_out

+

randperm_out_npu

+

271

+

range.step

+

range_npu

+

272

+

range

+

range_npu

+

273

+

range.out

+

range_out_npu

+

274

+

reciprocal

+

reciprocal_npu

+

275

+

reciprocal_

+

reciprocal_npu_

+

276

+

reciprocal.out

+

reciprocal_out_npu

+

277

+

neg

+

neg_npu

+

278

+

neg_

+

neg_npu_

+

279

+

neg.out

+

neg_out_npu

+

280

+

repeat

+

repeat_npu

+

281

+

repeat_interleave.self_int

+

repeat_interleave_npu

+

282

+

round

+

round_npu

+

283

+

round_

+

round_npu_

+

284

+

round.out

+

round_out_npu

+

285

+

relu

+

relu_npu

+

286

+

relu_

+

relu_npu_

+

287

+

prelu

+

prelu_npu

+

288

+

prelu_backward

+

prelu_backward_npu

+

289

+

gelu

+

gelu_npu

+

290

+

gelu_backward

+

gelu_backward_npu

+

291

+

hardshrink

+

hardshrink_npu

+

292

+

hardshrink_backward

+

hardshrink_backward_npu

+

293

+

rsqrt

+

rsqrt_npu

+

294

+

rsqrt_

+

rsqrt_npu_

+

295

+

rsqrt.out

+

rsqrt_out_npu

+

296

+

selu

+

selu_npu

+

297

+

selu_

+

selu_npu_

+

298

+

celu

+

celu_npu

+

299

+

celu_

+

celu_npu_

+

300

+

sigmoid

+

sigmoid_npu

+

301

+

sigmoid_

+

sigmoid_npu_

+

302

+

sigmoid.out

+

sigmoid_out_npu

+

303

+

sin

+

sin_npu

+

304

+

sin_

+

sin_npu_

+

305

+

sin.out

+

sin_out_npu

+

306

+

sinh

+

sinh_npu

+

307

+

sinh_

+

sinh_npu_

+

308

+

sinh.out

+

sinh_out_npu

+

309

+

slogdet

+

slogdet_npu

+

310

+

softmax.int

+

softmax_npu

+

311

+

softmax.Dimname

+

softmax_npu

+

312

+

_softmax

+

_softmax_npu

+

313

+

_softmax_backward_data

+

_softmax_backward_npu

+

314

+

stack

+

stack_npu

+

315

+

stack.out

+

stack_out_npu

+

316

+

sum

+

sum_npu

+

317

+

sum.dim_IntList

+

sum_npu

+

318

+

sum.dim_DimnameList

+

sum_npu

+

319

+

sum.IntList_out

+

sum_out_npu

+

320

+

sum.DimnameList_out

+

sum_out_npu

+

321

+

sqrt

+

sqrt_npu

+

322

+

sqrt_

+

sqrt_npu_

+

323

+

sqrt.out

+

sqrt_out_npu

+

324

+

std

+

std_npu

+

325

+

std.dim

+

std_dim_npu

+

326

+

std_mean

+

std_mean_npu

+

327

+

std_mean.dim

+

std_mean_dim_npu

+

328

+

std_mean.names_dim

+

std_mean_names_npu

+

329

+

std.out

+

std_out_npu

+

330

+

std.names_dim

+

std_names_npu

+

331

+

std.names_out

+

std_out_npu

+

332

+

prod

+

prod_npu

+

333

+

prod.dim_int

+

prod_npu

+

334

+

prod.int_out

+

prod_out_npu

+

335

+

prod.dim_Dimname

+

prod_npu

+

336

+

prod.Dimname_out

+

prod_out_npu

+

337

+

tan

+

tan_npu

+

338

+

tan_

+

tan_npu_

+

339

+

tan.out

+

tan_out_npu

+

340

+

tanh

+

tanh_npu

+

341

+

tanh_

+

tanh_npu_

+

342

+

tanh.out

+

tanh_out_npu

+

343

+

threshold

+

threshold_npu

+

344

+

threshold_

+

threshold_npu_

+

345

+

threshold.out

+

threshold_out_npu

+

346

+

threshold_backward

+

threshold_backward_npu

+

347

+

one_hot

+

one_hot_npu1

+

348

+

flip

+

flip_npu

+

349

+

roll

+

roll_npu

+

350

+

true_divide.Tensor

+

true_divide_npu

+

351

+

true_divide_.Tensor

+

true_divide_npu_

+

352

+

true_divide.out

+

true_divide_out_npu

+

353

+

true_divide.Scalar

+

true_divide_npu

+

354

+

true_divide_.Scalar

+

true_divide_npu_

+

355

+

trunc

+

trunc_npu

+

356

+

trunc_

+

trunc_npu_

+

357

+

trunc.out

+

trunc_out_npu

+

358

+

_unique2

+

_unique2_npu

+

359

+

var

+

var_npu

+

360

+

var.dim

+

var_npu

+

361

+

var.out

+

var_out_npu

+

362

+

var.names_dim

+

var_npu

+

363

+

var.names_out

+

var_out_npu

+

364

+

var_mean

+

var_mean_npu

+

365

+

var_mean.dim

+

var_mean_npu

+

366

+

var_mean.names_dim

+

var_mean_npu

+

367

+

where.self

+

where_npu

+

368

+

where

+

where_npu

+

369

+

_s_where

+

_s_where_npu

+

370

+

zeros.names

+

zeros_npu

+

371

+

zeros

+

zeros_npu

+

372

+

zeros.out

+

zeros_out_npu

+

373

+

zeros_like

+

zeros_like_npu

+

374

+

norm.ScalarOpt_dtype

+

norm_npu

+

375

+

norm.Scalar

+

norm_npu

+

376

+

norm.ScalarOpt_dim_dtype

+

norm_npu

+

377

+

norm.ScalarOpt_dim

+

norm_npu

+

378

+

norm.dtype_out

+

norm_out_npu

+

379

+

norm.out

+

norm_out_npu

+

380

+

clone

+

clone_npu

+

381

+

resize_as_

+

resize_as_npu_

+

382

+

pow.Tensor_Scalar_out

+

pow_out_npu

+

383

+

pow.Tensor_Scalar

+

pow_npu

+

384

+

zero_

+

zero_npu_

+

385

+

sub.out

+

sub_out_npu

+

386

+

sub.Tensor

+

sub_npu

+

387

+

sub_.Tensor

+

sub_npu_

+

388

+

sub.Scalar

+

sub_npu

+

389

+

sub_.Scalar

+

sub_npu_

+

390

+

rsub.Tensor

+

rsub_npu

+

391

+

rsub.Scalar

+

rsub_npu

+

392

+

addmm.out

+

addmm_out_npu

+

393

+

addmm

+

addmm_npu

+

394

+

addmm_

+

addmm_npu_

+

395

+

quantize_per_tensor

+

quantize_per_tensor_npu

+

396

+

quantize_per_channel

+

quantize_per_channel_npu

+

397

+

to.dtype_layout

+

to_npu

+

398

+

to.device

+

to_device_npu

+

399

+

to.dtype

+

to_dtype_npu

+

400

+

to.other

+

to_other_npu

+

401

+

_local_scalar_dense

+

_local_scalar_dense_npu

+

402

+

lstm.input

+

lstm_npu

+

403

+

lstm.data

+

lstm_npu

+

404

+

gru.input

+

gru_npu_

+

405

+

_pack_padded_sequence

+

_pack_padded_sequence_npu

+

406

+

_pad_packed_sequence

+

_pad_packed_sequence_npu

+

407

+

set_.source_Storage

+

set_npu_

+

408

+

set_.source_Storage_storage_offset

+

set_npu_

+

409

+

set_.source_Tensor

+

set_npu_

+

410

+

set_

+

set_npu_

+

411

+

masked_fill_.Scalar

+

masked_fill_npu_

+

412

+

masked_fill_.Tensor

+

masked_fill_npu_

+

413

+

masked_scatter_

+

masked_scatter_npu_

+

414

+

view

+

view_npu

+

415

+

put_

+

put_npu_

+

416

+

index_add_

+

index_add_npu_

+

417

+

index_add

+

index_add_npu

+

418

+

index_add.dimname

+

index_add_npu

+

419

+

index_fill_.int_Scalar

+

index_fill_npu_

+

420

+

index_fill.int_Scalar

+

index_fill_npu

+

421

+

index_fill_.int_Tensor

+

index_fill_npu_

+

422

+

index_fill.int_Tensor

+

index_fill_npu

+

423

+

scatter_.src

+

scatter_npu_

+

424

+

scatter_.value

+

scatter_npu_

+

425

+

scatter_add_

+

scatter_add_npu_

+

426

+

scatter_add

+

scatter_add_npu

+

427

+

scatter_add.dimname

+

scatter_add_npu

+

428

+

lt_.Scalar

+

lt_npu_

+

429

+

lt_.Tensor

+

lt_npu_

+

430

+

gt_.Scalar

+

gt_npu_

+

431

+

gt_.Tensor

+

gt_npu_

+

432

+

le_.Scalar

+

le_npu_

+

433

+

le_.Tensor

+

le_npu_

+

434

+

ge_.Scalar

+

ge_npu_

+

435

+

ge_.Tensor

+

ge_npu_

+

436

+

eq_.Scalar

+

eq_npu_

+

437

+

eq_.Tensor

+

eq_npu_

+

438

+

ne_.Scalar

+

ne_npu_

+

439

+

ne_.Tensor

+

ne_npu_

+

440

+

bitwise_and.Tensor_out

+

bitwise_and_out_npu

+

441

+

bitwise_and.Scalar_out

+

bitwise_and_out_npu

+

442

+

bitwise_and.Scalar

+

bitwise_and_npu

+

443

+

bitwise_and.Tensor

+

bitwise_and_npu

+

444

+

bitwise_and_.Scalar

+

bitwise_and_npu_

+

445

+

bitwise_and_.Tensor

+

bitwise_and_npu_

+

446

+

__and__.Scalar

+

__and___npu

+

447

+

__and__.Tensor

+

__and___npu

+

448

+

bitwise_or.Tensor_out

+

bitwise_or_out_npu

+

449

+

bitwise_or.Scalar_out

+

bitwise_or_out_npu

+

450

+

bitwise_or.Scalar

+

bitwise_or_npu

+

451

+

bitwise_or.Tensor

+

bitwise_or_npu

+

452

+

bitwise_or_.Scalar

+

bitwise_or_npu_

+

453

+

bitwise_or_.Tensor

+

bitwise_or_npu_

+

454

+

__or__.Scalar

+

__or___npu

+

455

+

__or__.Tensor

+

__or___npu

+

456

+

__ior__.Scalar

+

__ior___npu

+

457

+

__ior__.Tensor

+

__ior___npu

+

458

+

bitwise_xor.Tensor_out

+

bitwise_xor_out_npu

+

459

+

bitwise_xor.Scalar_out

+

bitwise_xor_out_npu

+

460

+

bitwise_xor.Scalar

+

bitwise_xor_npu

+

461

+

bitwise_xor.Tensor

+

bitwise_xor_npu

+

462

+

bitwise_xor_.Scalar

+

bitwise_xor_npu_

+

463

+

bitwise_xor_.Tensor

+

bitwise_xor_npu_

+

464

+

__xor__.Scalar

+

__xor___npu

+

465

+

__xor__.Tensor

+

__xor___npu

+

466

+

__lshift__.Scalar

+

__lshift___npu

+

467

+

__lshift__.Tensor

+

__lshift___npu

+

468

+

__ilshift__.Scalar

+

__iLshift___npu

+

469

+

__ilshift__.Tensor

+

__iLshift___npu

+

470

+

__rshift__.Scalar

+

__rshift___npu

+

471

+

__rshift__.Tensor

+

__rshift___npu

+

472

+

__irshift__.Scalar

+

__iRshift___npu

+

473

+

__irshift__.Tensor

+

__iRshift___npu

+

474

+

atan2_

+

atan2_npu_

+

475

+

tril_

+

tril_npu_

+

476

+

triu_

+

triu_npu_

+

477

+

renorm_

+

renorm_npu_

+

478

+

pow_.Scalar

+

pow_npu_

+

479

+

pow_.Tensor

+

pow_npu_

+

480

+

lerp_.Scalar

+

lerp_npu_

+

481

+

lerp_.Tensor

+

lerp_npu_

+

482

+

fmod_.Scalar

+

fmod_npu_

+

483

+

fmod_.Tensor

+

fmod_npu_

+

484

+

remainder_.Scalar

+

remainder_npu_

+

485

+

remainder_.Tensor

+

remainder_npu_

+

486

+

addbmm_

+

addbmm_npu_

+

487

+

addbmm.out

+

addbmm_out_npu

+

488

+

addbmm

+

addbmm_npu

+

489

+

addcdiv_

+

addcdiv_npu_

+

490

+

random_.from

+

random_npu_

+

491

+

random_.to

+

random_npu_

+

492

+

random_

+

random_npu_

+

493

+

uniform_

+

uniform_npu_

+

494

+

diag.out

+

diag_out_npu

+

495

+

diag

+

diag_npu

+

496

+

cross.out

+

cross_out_npu

+

497

+

cross

+

cross_npu

+

498

+

triu.out

+

triu_out_npu

+

499

+

triu

+

triu_npu

+

500

+

tril.out

+

tril_out_npu

+

501

+

tril

+

tril_npu

+

502

+

tril_indices

+

tril_indices_npu

+

503

+

triu_indices

+

triu_indices_npu

+

504

+

ne.Scalar_out

+

ne_out_npu

+

505

+

ne.Scalar

+

ne_npu

+

506

+

ne.Tensor_out

+

ne_out_npu

+

507

+

ne.Tensor

+

ne_npu

+

508

+

eq.Scalar_out

+

eq_out_npu

+

509

+

eq.Scalar

+

eq_npu

+

510

+

eq.Tensor_out

+

eq_out_npu

+

511

+

eq.Tensor

+

eq_npu

+

512

+

ge.Scalar_out

+

ge_out_npu

+

513

+

ge.Scalar

+

ge_npu

+

514

+

ge.Tensor_out

+

ge_out_npu

+

515

+

ge.Tensor

+

ge_npu

+

516

+

le.Scalar_out

+

le_out_npu

+

517

+

le.Scalar

+

le_npu

+

518

+

le.Tensor_out

+

le_out_npu

+

519

+

le.Tensor

+

le_npu

+

520

+

gt.Scalar_out

+

gt_out_npu

+

521

+

gt.Scalar

+

gt_npu

+

522

+

gt.Tensor_out

+

gt_out_npu

+

523

+

gt.Tensor

+

gt_npu

+

524

+

lt.Scalar_out

+

lt_out_npu

+

525

+

lt.Scalar

+

lt_npu

+

526

+

lt.Tensor_out

+

lt_out_npu

+

527

+

lt.Tensor

+

lt_npu

+

528

+

take.out

+

take_out_npu

+

529

+

take

+

take_npu

+

530

+

index_select.out

+

index_select_out_npu

+

531

+

index_select

+

index_select_npu

+

532

+

index_select.dimname_out

+

index_select_out_npu

+

533

+

index_select.dimname

+

index_select_npu

+

534

+

masked_select.out

+

masked_select_out_npu

+

535

+

masked_select

+

masked_select_npu

+

536

+

nonzero.out

+

nonzero_out_npu

+

537

+

nonzero

+

nonzero_npu

+

538

+

gather.out

+

gather_out_npu

+

539

+

gather

+

gather_npu

+

540

+

gather.dimname_out

+

gather_out_npu

+

541

+

gather.dimname

+

gather_npu

+

542

+

addcmul.out

+

addcmul_out_npu

+

543

+

addcmul

+

addcmul_npu

+

544

+

addcmul_

+

addcmul_npu_

+

545

+

addcdiv.out

+

addcdiv_out_npu

+

546

+

addcdiv

+

addcdiv_npu

+

547

+

_triangular_solve_helper

+

_triangular_solve_helper_npu

+

548

+

_symeig_helper

+

_symeig_helper_npu

+

549

+

_svd_helper

+

_svd_helper_npu

+

550

+

qr.Q

+

qr_out_npu

+

551

+

qr

+

qr_npu

+

552

+

multinomial.out

+

multinomial_out_npu

+

553

+

multinomial

+

multinomial_npu

+

554

+

erfinv

+

erfinv_npu

+

555

+

erfinv_

+

erfinv_npu_

+

556

+

erfinv.out

+

erfinv_out_npu

+

557

+

sign

+

sign_npu

+

558

+

sign_

+

sign_npu_

+

559

+

sign.out

+

sign_out_npu

+

560

+

atan2.out

+

atan2_out_npu

+

561

+

atan2

+

atan2_npu

+

562

+

lerp.Scalar_out

+

lerp_out_npu

+

563

+

lerp.Tensor_out

+

lerp_out_npu

+

564

+

lerp.Scalar

+

lerp_npu

+

565

+

lerp.Tensor

+

lerp_npu

+

566

+

fmod.Scalar_out

+

fmod_out_npu

+

567

+

fmod.Scalar

+

fmod_npu

+

568

+

fmod.Tensor_out

+

fmod_out_npu

+

569

+

fmod.Tensor

+

fmod_npu

+

570

+

remainder.Scalar_out

+

remainder_out_npu

+

571

+

remainder.Scalar

+

remainder_npu

+

572

+

remainder.Tensor_out

+

remainder_out_npu

+

573

+

remainder.Tensor

+

remainder_npu

+

574

+

min.out

+

min_out_npu

+

575

+

min.other

+

min_npu

+

576

+

min

+

min_npu

+

577

+

max.out

+

max_out_npu

+

578

+

max.other

+

max_npu

+

579

+

max

+

max_npu

+

580

+

median

+

median_npu

+

581

+

sort.values

+

sort_out_npu

+

582

+

sort

+

sort_npu

+

583

+

sort.dimname_values

+

sort_out_npu

+

584

+

sort.dimname

+

sort_npu

+

585

+

argsort

+

argsort_npu

+

586

+

argsort.dimname

+

argsort_npu

+

587

+

topk.values

+

topk_out_npu

+

588

+

topk

+

topk_npu

+

589

+

all

+

all_npu

+

590

+

any

+

any_npu

+

591

+

renorm.out

+

renorm_out_npu

+

592

+

renorm

+

renorm_npu

+

593

+

unfold

+

unfold

+

594

+

equal

+

equal_npu

+

595

+

pow.Tensor_Tensor_out

+

pow_out_npu

+

596

+

pow.Tensor_Tensor

+

pow_npu

+

597

+

pow.Scalar_out

+

pow_out_npu

+

598

+

pow.Scalar

+

pow_npu

+

599

+

normal_

+

normal_npu_

+

600

+

normal.Tensor_float_out

+

normal_out_npu

+

601

+

normal.Tensor_float

+

normal_npu

+

602

+

normal.float_Tensor_out

+

normal_out_npu

+

603

+

normal.float_Tensor

+

normal_npu

+

604

+

normal.Tensor_Tensor_out

+

normal_out_npu

+

605

+

normal.Tensor_Tensor

+

normal_npu

+

606

+

normal.float_float

+

normal_npu

+

607

+

normal.float_float_out

+

normal_out_npu

+

608

+

_addr

+

_addr_npu

+

609

+

_addr_

+

_addr_npu_

+

610

+

_addr.out

+

_addr_out_npu

+

611

+

_index_copy_

+

index_copy_npu_

+

612

+

_cumsum

+

_cumsum_npu

+

613

+

_cumsum.out

+

_cumsum_out_npu

+

614

+

_cumprod

+

_cumprod_npu

+

615

+

_cumprod.out

+

_cumprod_out_npu

+

616

+

_var

+

_var_npu

+

617

+

_amp_non_finite_check_and_unscale_

+

_amp_non_finite_check_and_unscale_npu_

+

618

+

_cat

+

_cat_npu

+

619

+

_cat.out

+

_cat_out_npu

+

620

+

_max

+

_max_npu

+

621

+

_max.max

+

_max_out_npu

+

622

+

_min

+

_min_npu

+

623

+

_min.min

+

_min_out_npu

+

624

+

mse_loss.out

+

mse_loss_out_npu

+

625

+

mse_loss

+

mse_loss_npu

+

626

+

mse_loss_backward.grad_input

+

mse_loss_backward_out_npu

+

627

+

mse_loss_backward

+

mse_loss_backward_npu

+

628

+

l1_loss.out

+

l1_loss_out_npu

+

629

+

l1_loss

+

l1_loss_npu

+

630

+

l1_loss_backward.grad_input

+

l1_loss_backward_out_npu

+

631

+

l1_loss_backward

+

l1_loss_backward_npu

+

632

+

multilabel_margin_loss.out

+

multilabel_margin_loss_out_npu

+

633

+

multilabel_margin_loss

+

multilabel_margin_loss_npu

+

634

+

multilabel_margin_loss_forward.output

+

multilabel_margin_loss_forward_out_npu

+

635

+

multilabel_margin_loss_forward

+

multilabel_margin_loss_forward_npu

+

636

+

nll_loss.out

+

nll_loss_out_npu

+

637

+

nll_loss

+

nll_loss_npu

+

638

+

nll_loss_forward.output

+

nll_loss_forward_out_npu

+

639

+

nll_loss_forward

+

nll_loss_forward_npu

+

640

+

nll_loss_backward.grad_input

+

nll_loss_backward_out_npu

+

641

+

nll_loss_backward

+

nll_loss_backward_npu

+

642

+

nll_loss2d.out

+

nll_loss2d_out_npu

+

643

+

nll_loss2d

+

nll_loss2d_npu

+

644

+

nll_loss2d_forward.output

+

nll_loss2d_forward_out_npu

+

645

+

nll_loss2d_forward

+

nll_loss2d_forward_npu

+

646

+

nll_loss2d_backward.grad_input

+

nll_loss2d_backward_out_npu

+

647

+

nll_loss2d_backward

+

nll_loss2d_backward_npu

+

648

+

smooth_l1_loss.out

+

smooth_l1_loss_out_npu

+

649

+

smooth_l1_loss

+

smooth_l1_loss_npu

+

650

+

smooth_l1_loss_backward.grad_input

+

smooth_l1_loss_backward_out_npu

+

651

+

smooth_l1_loss_backward

+

smooth_l1_loss_backward_npu

+

652

+

soft_margin_loss.out

+

soft_margin_loss_out_npu

+

653

+

soft_margin_loss

+

soft_margin_loss_npu

+

654

+

soft_margin_loss_backward.grad_input

+

soft_margin_loss_backward_out_npu

+

655

+

soft_margin_loss_backward

+

soft_margin_loss_backward_npu

+

656

+

elu.out

+

elu_out_npu

+

657

+

elu

+

elu_npu

+

658

+

elu_backward.grad_input

+

elu_backward_out_npu

+

659

+

elu_backward

+

elu_backward_npu

+

660

+

elu_

+

elu_npu_

+

661

+

glu.out

+

glu_out_npu

+

662

+

glu

+

glu_npu

+

663

+

glu_backward.grad_input

+

glu_backward_out_npu

+

664

+

glu_backward

+

glu_backward_npu

+

665

+

hardsigmoid.out

+

hardsigmoid_out_npu

+

666

+

hardsigmoid

+

hardsigmoid_npu

+

667

+

hardsigmoid_

+

hardsigmoid_npu_

+

668

+

hardsigmoid_backward

+

hardsigmoid_backward_npu

+

669

+

hardtanh.out

+

hardtanh_out_npu

+

670

+

hardtanh

+

hardtanh_npu

+

671

+

hardtanh_backward.grad_input

+

hardtanh_backward_out_npu

+

672

+

hardtanh_backward

+

hardtanh_backward_npu

+

673

+

hardtanh_

+

hardtanh_npu_

+

674

+

leaky_relu.out

+

leaky_relu_out_npu

+

675

+

leaky_relu

+

leaky_relu_npu

+

676

+

leaky_relu_backward

+

leaky_relu_backward_npu

+

677

+

leaky_relu_

+

leaky_relu_npu_

+

678

+

log_sigmoid.out

+

log_sigmoid_out_npu

+

679

+

log_sigmoid

+

log_sigmoid_npu

+

680

+

log_sigmoid_forward.output

+

log_sigmoid_forward_out_npu

+

681

+

log_sigmoid_forward

+

log_sigmoid_forward_npu

+

682

+

log_sigmoid_backward.grad_input

+

log_sigmoid_backward_out_npu

+

683

+

log_sigmoid_backward

+

log_sigmoid_backward_npu

+

684

+

rrelu_with_noise.out

+

rrelu_with_noise_out_npu

+

685

+

rrelu_with_noise

+

rrelu_with_noise_npu

+

686

+

rrelu_with_noise_backward

+

rrelu_with_noise_backward_npu

+

687

+

rrelu_with_noise_

+

rrelu_with_noise_npu_

+

688

+

softplus.out

+

softplus_out_npu

+

689

+

softplus

+

softplus_npu

+

690

+

softplus_backward.grad_input

+

softplus_backward_out_npu

+

691

+

softplus_backward

+

softplus_backward_npu

+

692

+

softshrink.out

+

softshrink_out_npu

+

693

+

softshrink

+

softshrink_npu

+

694

+

softshrink_backward.grad_input

+

softshrink_backward_out_npu

+

695

+

softshrink_backward

+

softshrink_backward_npu

+

696

+

adaptive_avg_pool2d.out

+

adaptive_avg_pool2d_out_npu

+

697

+

adaptive_avg_pool2d

+

adaptive_avg_pool2d_npu

+

698

+

_adaptive_avg_pool2d

+

_adaptive_avg_pool2d_npu

+

699

+

_adaptive_avg_pool2d_backward

+

adaptive_avg_pool2d_backward_npu

+

700

+

adaptive_avg_pool3d.out

+

adaptive_avg_pool3d_out_npu

+

701

+

adaptive_avg_pool3d

+

adaptive_avg_pool3d_npu

+

702

+

adaptive_avg_pool3d_backward.grad_input

+

adaptive_avg_pool3d_backward_out_npu

+

703

+

adaptive_avg_pool3d_backward

+

adaptive_avg_pool3d_backward_npu

+

704

+

adaptive_max_pool2d.out

+

adaptive_max_pool2d_out_npu

+

705

+

adaptive_max_pool2d

+

adaptive_max_pool2d_npu

+

706

+

adaptive_max_pool2d_backward.grad_input

+

adaptive_max_pool2d_backward_out_npu

+

707

+

adaptive_max_pool2d_backward

+

adaptive_max_pool2d_backward_npu

+

708

+

avg_pool2d.out

+

avg_pool2d_out_npu

+

709

+

avg_pool2d

+

avg_pool2d_npu

+

710

+

avg_pool2d_backward.grad_input

+

avg_pool2d_backward_out_npu

+

711

+

avg_pool2d_backward

+

avg_pool2d_backward_npu

+

712

+

avg_pool3d.out

+

avg_pool3d_out_npu

+

713

+

avg_pool3d

+

avg_pool3d_npu

+

714

+

avg_pool3d_backward.grad_input

+

avg_pool3d_backward_out_npu

+

715

+

avg_pool3d_backward

+

avg_pool3d_backward_npu

+

716

+

max_pool2d_with_indices.out

+

max_pool2d_with_indices_out_npu

+

717

+

max_pool2d_with_indices

+

max_pool2d_with_indices_npu

+

718

+

max_pool2d_with_indices_backward.grad_input

+

max_pool2d_with_indices_backward_out_npu

+

719

+

max_pool2d_with_indices_backward

+

max_pool2d_with_indices_backward_npu

+

720

+

max_pool3d_with_indices.out

+

max_pool3d_with_indices_out_npu

+

721

+

max_pool3d_with_indices

+

max_pool3d_with_indices_npu

+

722

+

max_pool3d_with_indices_backward.grad_input

+

max_pool3d_with_indices_backward_out_npu

+

723

+

max_pool3d_with_indices_backward

+

max_pool3d_with_indices_backward_npu

+

724

+

reflection_pad2d.out

+

reflection_pad2d_out_npu

+

725

+

reflection_pad2d

+

reflection_pad2d_npu

+

726

+

replication_pad2d.out

+

replication_pad2d_out_npu

+

727

+

replication_pad2d

+

replication_pad2d_npu

+

728

+

upsample_linear1d.out

+

upsample_linear1d_out_npu

+

729

+

upsample_linear1d

+

upsample_linear1d_npu

+

730

+

upsample_linear1d_backward

+

upsample_linear1d_backward_npu

+

731

+

upsample_bilinear2d.out

+

upsample_bilinear2d_out_npu

+

732

+

upsample_bilinear2d

+

upsample_bilinear2d_npu

+

733

+

upsample_bilinear2d_backward.grad_input

+

upsample_bilinear2d_backward_out_npu

+

734

+

upsample_bilinear2d_backward

+

upsample_bilinear2d_backward_npu

+

735

+

upsample_bicubic2d.out

+

upsample_bicubic2d_out_npu

+

736

+

upsample_bicubic2d

+

upsample_bicubic2d_npu

+

737

+

upsample_bicubic2d_backward.grad_input

+

upsample_bicubic2d_backward_out_npu

+

738

+

upsample_bicubic2d_backward

+

upsample_bicubic2d_backward_npu

+

739

+

upsample_trilinear3d.out

+

upsample_trilinear3d_out_npu

+

740

+

upsample_trilinear3d

+

upsample_trilinear3d_npu

+

741

+

upsample_trilinear3d_backward.grad_input

+

upsample_trilinear3d_backward_out_npu

+

742

+

upsample_trilinear3d_backward

+

upsample_trilinear3d_backward_npu

+

743

+

upsample_nearest1d.out

+

upsample_nearest1d_out_npu

+

744

+

upsample_nearest1d

+

upsample_nearest1d_npu

+

745

+

upsample_nearest1d_backward.grad_input

+

upsample_nearest1d_backward_out_npu

+

746

+

upsample_nearest1d_backward

+

upsample_nearest1d_backward_npu

+

747

+

upsample_nearest2d.out

+

upsample_nearest2d_out_npu

+

748

+

upsample_nearest2d

+

upsample_nearest2d_npu

+

749

+

upsample_nearest2d_backward.grad_input

+

upsample_nearest2d_backward_out_npu

+

750

+

upsample_nearest2d_backward

+

upsample_nearest2d_backward_npu

+

751

+

upsample_nearest3d.out

+

upsample_nearest3d_out_npu

+

752

+

upsample_nearest3d

+

upsample_nearest3d_npu

+

753

+

upsample_nearest3d_backward.grad_input

+

upsample_nearest3d_backward_out_npu

+

754

+

upsample_nearest3d_backward

+

upsample_nearest3d_backward_npu

+

755

+

sigmoid_backward.grad_input

+

sigmoid_backward_out_npu

+

756

+

sigmoid_backward

+

sigmoid_backward_npu

+

757

+

tanh_backward.grad_input

+

tanh_backward_out_npu

+

758

+

tanh_backward

+

tanh_backward_npu

+

759

+

slow_conv_transpose2d.out

+

slow_conv_transpose2d_out_npu

+

760

+

slow_conv_transpose2d

+

slow_conv_transpose2d_npu

+

761

+

slow_conv_transpose2d_backward.grad_output

+

slow_conv_transpose2d_backward_out_npu

+

762

+

slow_conv_transpose2d_backward.output_mask

+

slow_conv_transpose2d_backward_npu

+

763

+

thnn_conv2d.out

+

thnn_conv2d_out_npu

+

764

+

thnn_conv2d

+

thnn_conv2d_npu

+

765

+

thnn_conv2d_forward.output

+

thnn_conv2d_forward_out_npu

+

766

+

thnn_conv2d_forward

+

thnn_conv2d_forward_npu

+

767

+

thnn_conv2d_backward.output_mask

+

thnn_conv2d_backward_npu

+

768

+

thnn_conv_depthwise2d.out

+

thnn_conv_depthwise2d_out_npu

+

769

+

thnn_conv_depthwise2d

+

thnn_conv_depthwise2d_npu

+

770

+

thnn_conv_depthwise2d_forward.out

+

thnn_conv_depthwise2d_forward_out_npu

+

771

+

thnn_conv_depthwise2d_forward

+

thnn_conv_depthwise2d_forward_npu

+

772

+

thnn_conv_depthwise2d_backward.grad_input

+

thnn_conv_depthwise2d_backward_out_npu

+

773

+

thnn_conv_depthwise2d_backward.output_mask

+

thnn_conv_depthwise2d_backward_npu

+

774

+

slow_conv3d.out

+

slow_conv3d_out_npu

+

775

+

slow_conv3d

+

slow_conv3d_npu

+

776

+

slow_conv3d_forward.output

+

slow_conv3d_forward_out_npu

+

777

+

slow_conv3d_forward

+

slow_conv3d_forward_npu

+

778

+

slow_conv_dilated2d

+

slow_conv_dilated2d_npu

+

779

+

slow_conv_dilated2d_backward

+

slow_conv_dilated2d_backward_npu

+

780

+

col2im.out

+

im2col_backward_out_npu

+

781

+

col2im

+

im2col_backward_npu

+

782

+

col2im_backward.grad_input

+

im2col_out_npu

+

783

+

col2im_backward

+

im2col_npu

+

784

+

im2col.out

+

im2col_out_npu

+

785

+

im2col

+

im2col_npu

+

786

+

im2col_backward.grad_input

+

im2col_backward_out_npu

+

787

+

im2col_backward

+

im2col_backward_npu

+

788

+

isfinite

+

isfinite_npu

+

PyTorch昇腾自定义算子

-| 序号 | PyTorch 算子(由昇腾开发) | 昇腾适配算子 | -| ---- | ---------------------------------------------- | ---------------------------------------------- | -| 1 | npu_convolution_transpose | npu_convolution_transpose | -| 2 | npu_conv_transpose2d | convolution_transpose_npu | -| 3 | npu_convolution_transpose_backward | convolution_transpose_backward_npu | -| 4 | npu_convolution | npu_convolution | -| 5 | npu_convolution_backward | npu_convolution_backward | -| 6 | npu_conv2d | conv2d_npu | -| 7 | npu_conv2d.out | conv2d_out_npu | -| 8 | npu_conv2d_backward | conv2d_backward_npu | -| 9 | npu_conv3d | conv3d_npu | -| 10 | npu_conv3d.out | conv3d_out_npu | -| 11 | npu_conv3d_backward | conv3d_backward_npu | -| 12 | one_ | one_npu_ | -| 13 | npu_sort_v2.out | sort_without_indices_out_npu | -| 14 | npu_sort_v2 | sort_without_indices_npu | -| 15 | npu_format_cast | format_cast_npu | -| 16 | npu_format_cast_.acl_format | format_cast_npu_ | -| 17 | npu_format_cast_.src | format_cast_npu_ | -| 18 | npu_transpose_to_contiguous | transpose_to_contiguous_npu | -| 19 | npu_transpose | transpose_npu | -| 20 | npu_transpose.out | transpose_out_npu | -| 21 | npu_broadcast | broadcast_npu | -| 22 | npu_broadcast.out | broadcast_out_npu | -| 23 | npu_dtype_cast | dtype_cast_npu | -| 24 | npu_dtype_cast_.Tensor | dtype_cast_npu_ | -| 25 | npu_roi_alignbk | roi_align_backward_npu | -| 26 | empty_with_format | empty_with_format_npu | -| 27 | empty_with_format.names | empty_with_format_npu | -| 28 | copy_memory_ | copy_memory_npu_ | -| 29 | npu_one_hot | one_hot_npu | -| 30 | npu_stride_add | stride_add_npu | -| 31 | npu_softmax_cross_entropy_with_logits | softmax_cross_entropy_with_logits_npu | -| 32 | npu_softmax_cross_entropy_with_logits_backward | softmax_cross_entropy_with_logits_backward_npu | -| 33 | npu_ps_roi_pooling | ps_roi_pooling_npu | -| 34 | npu_ps_roi_pooling_backward | ps_roi_pooling_backward_npu | -| 35 | npu_roi_align | roi_align_npu | -| 36 | npu_nms_v4 | nms_v4_npu | -| 37 | npu_lstm | lstm_npu | -| 38 | npu_lstm_backward | lstm_backward_npu | -| 39 | npu_iou | iou_npu | -| 40 | npu_ptiou | ptiou_npu | -| 41 | npu_nms_with_mask | nms_with_mask_npu | -| 42 | npu_pad | pad_npu | -| 43 | npu_bounding_box_encode | bounding_box_encode_npu | -| 44 | npu_bounding_box_decode | bounding_box_decode_npu | -| 45 | npu_gru | gru_npu | -| 46 | npu_gru_backward | gru_backward_npu | -| 47 | npu_set_.source_Storage_storage_offset_format | set_npu_ | -| 48 | npu_random_choice_with_mask | random_choice_with_mask_npu | -| 49 | npu_batch_nms | batch_nms_npu | -| 50 | npu_slice | slice_npu | -| 51 | npu_slice.out | slice_out_npu | -| 52 | npu_dropoutV2 | dropout_v2_npu | -| 53 | npu_dropoutV2_backward | dropout_v2_backward_npu | -| 54 | _npu_dropout | _dropout_npu | -| 55 | _npu_dropout_inplace | _dropout_npu_inplace | -| 56 | npu_dropout_backward | dropout_backward_npu | -| 57 | npu_indexing | indexing_npu | -| 58 | npu_indexing.out | indexing_out_npu | -| 59 | npu_ifmr | ifmr_npu | -| 60 | npu_max.dim | max_v1_npu | -| 61 | npu_max.names_dim | max_v1_npu | -| 62 | npu_scatter | scatter_npu | -| 63 | npu_max_backward | max_backward_npu | -| 64 | npu_apply_adam | apply_adam_npu | -| 65 | npu_layer_norm_eval | layer_norm_eval_npu | -| 66 | npu_alloc_float_status | alloc_float_status_npu | -| 67 | npu_get_float_status | get_float_status_npu | -| 68 | npu_clear_float_status | clear_float_status_npu | -| 69 | npu_confusion_transpose | confusion_transpose_npu | -| 70 | npu_confusion_transpose_backward | confusion_transpose_backward_npu | -| 71 | npu_bmmV2 | bmm_v2_npu | -| 72 | fast_gelu | fast_gelu_npu | -| 73 | fast_gelu_backward | fast_gelu_backward_npu | -| 74 | npu_sub_sample | sub_sample_npu | -| 75 | npu_deformable_conv2d | deformable_conv2d_npu | -| 76 | npu_deformable_conv2dbk | deformable_conv2d_backward_npu | -| 77 | npu_mish | mish_npu | -| 78 | npu_anchor_response_flags | anchor_response_flags_npu | -| 79 | npu_yolo_boxes_encode | yolo_boxes_encode_npu | -| 80 | npu_grid_assign_positive | grid_assign_positive_npu | -| 81 | npu_mish_backward | mish_backward_npu | -| 82 | npu_normalize_batch | normalize_batch_npu | -| 83 | npu_masked_fill_range | masked_fill_range_npu | - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

序号

+

PyTorch 算子(由昇腾开发)

+

昇腾适配算子

+

1

+

npu_convolution_transpose

+

npu_convolution_transpose

+

2

+

npu_conv_transpose2d

+

conv_transpose2d_npu

+

3

+

npu_convolution_transpose_backward

+

npu_convolution_transpose_backward

+

4

+

npu_conv_transpose2d_backward

+

conv_transpose2d_backward_npu

+

5

+

npu_conv_transpose3d_backward

+

conv_transpose3d_backward_npu

+

6

+

npu_convolution

+

npu_convolution

+

7

+

npu_convolution_backward

+

npu_convolution_backward

+

8

+

npu_convolution_double_backward

+

npu_convolution_double_backward

+

9

+

npu_conv2d

+

conv2d_npu

+

10

+

npu_conv2d.out

+

conv2d_out_npu

+

11

+

npu_conv2d_backward

+

conv2d_backward_npu

+

12

+

npu_conv3d

+

conv3d_npu

+

13

+

npu_conv3d.out

+

conv3d_out_npu

+

14

+

npu_conv3d_backward

+

conv3d_backward_npu

+

15

+

one_

+

one_npu_

+

16

+

npu_sort_v2.out

+

sort_without_indices_out_npu

+

17

+

npu_sort_v2

+

sort_without_indices_npu

+

18

+

npu_format_cast

+

format_cast_npu

+

19

+

npu_format_cast_.acl_format

+

format_cast_npu_

+

20

+

npu_format_cast_.src

+

format_cast_npu_

+

21

+

npu_transpose_to_contiguous

+

transpose_to_contiguous_npu

+

22

+

npu_transpose

+

transpose_npu

+

23

+

npu_transpose.out

+

transpose_out_npu

+

24

+

npu_broadcast

+

broadcast_npu

+

25

+

npu_broadcast.out

+

broadcast_out_npu

+

26

+

npu_dtype_cast

+

dtype_cast_npu

+

27

+

npu_dtype_cast_.Tensor

+

dtype_cast_npu_

+

28

+

npu_roi_alignbk

+

roi_align_backward_npu

+

29

+

empty_with_format

+

empty_with_format_npu

+

30

+

empty_with_format.names

+

empty_with_format_npu

+

31

+

copy_memory_

+

copy_memory_npu_

+

32

+

npu_one_hot

+

one_hot_npu

+

33

+

npu_stride_add

+

stride_add_npu

+

34

+

npu_softmax_cross_entropy_with_logits

+

softmax_cross_entropy_with_logits_npu

+

35

+

npu_softmax_cross_entropy_with_logits_backward

+

softmax_cross_entropy_with_logits_backward_npu

+

36

+

npu_ps_roi_pooling

+

ps_roi_pooling_npu

+

37

+

npu_ps_roi_pooling_backward

+

ps_roi_pooling_backward_npu

+

38

+

npu_roi_align

+

roi_align_npu

+

39

+

npu_nms_v4

+

nms_v4_npu

+

40

+

npu_lstm

+

lstm_npu

+

41

+

npu_lstm_backward

+

lstm_backward_npu

+

42

+

npu_iou

+

iou_npu

+

43

+

npu_ptiou

+

ptiou_npu

+

44

+

npu_nms_with_mask

+

nms_with_mask_npu

+

45

+

npu_pad

+

pad_npu

+

46

+

npu_bounding_box_encode

+

bounding_box_encode_npu

+

47

+

npu_bounding_box_decode

+

bounding_box_decode_npu

+

48

+

npu_gru

+

gru_npu

+

49

+

npu_gru_backward

+

gru_backward_npu

+

50

+

npu_set_.source_Storage_storage_offset_format

+

set_npu_

+

51

+

npu_random_choice_with_mask

+

random_choice_with_mask_npu

+

52

+

npu_batch_nms

+

batch_nms_npu

+

53

+

npu_slice

+

slice_npu

+

54

+

npu_slice.out

+

slice_out_npu

+

55

+

npu_dropoutV2

+

dropout_v2_npu

+

56

+

npu_dropoutV2_backward

+

dropout_v2_backward_npu

+

57

+

_npu_dropout

+

_dropout_npu

+

58

+

_npu_dropout_inplace

+

_dropout_npu_inplace

+

59

+

npu_dropout_backward

+

dropout_backward_npu

+

60

+

npu_indexing

+

indexing_npu

+

61

+

npu_indexing.out

+

indexing_out_npu

+

62

+

npu_ifmr

+

ifmr_npu

+

63

+

npu_max.dim

+

max_v1_npu

+

64

+

npu_max.names_dim

+

max_v1_npu

+

65

+

npu_scatter

+

scatter_npu

+

66

+

npu_max_backward

+

max_backward_npu

+

67

+

npu_apply_adam

+

apply_adam_npu

+

68

+

npu_layer_norm_eval

+

layer_norm_eval_npu

+

69

+

npu_alloc_float_status

+

alloc_float_status_npu

+

70

+

npu_get_float_status

+

get_float_status_npu

+

71

+

npu_clear_float_status

+

clear_float_status_npu

+

72

+

npu_confusion_transpose

+

confusion_transpose_npu

+

73

+

npu_confusion_transpose_backward

+

confusion_transpose_backward_npu

+

74

+

npu_bmmV2

+

bmm_v2_npu

+

75

+

fast_gelu

+

fast_gelu_npu

+

76

+

fast_gelu_backward

+

fast_gelu_backward_npu

+

77

+

npu_sub_sample

+

sub_sample_npu

+

78

+

npu_deformable_conv2d

+

deformable_conv2d_npu

+

79

+

npu_deformable_conv2dbk

+

deformable_conv2d_backward_npu

+

80

+

npu_mish

+

mish_npu

+

81

+

npu_anchor_response_flags

+

anchor_response_flags_npu

+

82

+

npu_yolo_boxes_encode

+

yolo_boxes_encode_npu

+

83

+

npu_grid_assign_positive

+

grid_assign_positive_npu

+

84

+

npu_mish_backward

+

mish_backward_npu

+

85

+

npu_normalize_batch

+

normalize_batch_npu

+

86

+

npu_masked_fill_range

+

masked_fill_range_npu

+

87

+

npu_linear

+

linear_npu

+

88

+

npu_linear_backward

+

linear_backward_npu

+

89

+

npu_bert_apply_adam

+

bert_apply_adam_npu

+

90

+

npu_giou

+

giou_npu

+

91

+

npu_giou_backward

+

giou_backward_npu

+
diff --git a/docs/zh/RELEASENOTE/RELEASENOTE.md b/docs/zh/RELEASENOTE/RELEASENOTE.md deleted file mode 100644 index 559b2b09b3..0000000000 --- a/docs/zh/RELEASENOTE/RELEASENOTE.md +++ /dev/null @@ -1,139 +0,0 @@ -# PyTorch版本说明书 -- [用户须知](#用户须知.md) -- [新增特性](#新增特性.md) -- [特性修改](#特性修改.md) -- [已修复问题](#已修复问题.md) -- [已知问题](#已知问题.md) -- [兼容性](#兼容性.md) -

用户须知

- -本框架基于Facebook主导的开源PyTorch1.5.0进行修改,延续原生的PyTorch特性,使用NPU进行动态图训练;以算子粒度进行模型适配,代码重用性好,支持现有的网络只修改设备类型或数据类型,即可迁移到NPU上使用。 - -

新增特性

- -**表 1** PyTorch支持的版本特性列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

一级特性

-

二级特性

-

说明

-

适配训练模型

-

YOLOV4

-

-

-

YOLOV3

-

-

-

DB

-

-

-

RFCN

-

-

-

CRNN

-

-

-

Densenset161

-

-

-

Densenset191

-

-

-

适配NPU的PyTorch特性

-

框架基础功能

-

新增适配算子开发(详见算子清单)。

-

精度对比工具

-

新增精度对比工具,支持训练精度定界。

-

昇腾710芯片

-

新增支持昇腾710芯片在线推理。

-

OS兼容性

-

新增支持ubuntu 18.04.5、OpenEuler 20.03 LTS系统

-
- -

特性修改

- -不涉及 - -

已修复问题

- -不涉及 - -

已知问题

- - - - - - - - - - - - - - - - - - - - - - - -

已知问题

-

问题描述

-

数据类型支持

-

NPU不支持float16类型的inf/nan数据输入输出。

-

数据Format

-

出现4D以上的format时不能降维。

-

集合通信约束

-

-

要求一次训练任务中不同device上执行的图相同。

-

当前只支持1/2/4/8P粒度的分配。

-

只支持int8,int32,float16和float32数据类型。

-

Apex功能支持

-

Apex当前版本的实现方式主要为python实现,不支持APEX中的自定义优化CUDA Kernel。

-
- -

兼容性

- -A800-9010:CentOS 7.6/Ubuntu 18.04/BC-Linux 7.6/Debian 9.9/Debian 10/OpenEuler 20.03 LTS - -A800-9000:CentOS 7.6/Euler 2.8/Kylin v10/BC-Linux 7.6/OpenEuler 20.03 LTS - diff --git a/docs/zh/RELEASENOTE/public_sys-resources/icon-caution.gif "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-caution.gif" similarity index 100% rename from docs/zh/RELEASENOTE/public_sys-resources/icon-caution.gif rename to "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-caution.gif" diff --git a/docs/zh/RELEASENOTE/public_sys-resources/icon-danger.gif "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-danger.gif" similarity index 100% rename from docs/zh/RELEASENOTE/public_sys-resources/icon-danger.gif rename to "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-danger.gif" diff --git a/docs/zh/RELEASENOTE/public_sys-resources/icon-note.gif "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-note.gif" similarity index 100% rename from docs/zh/RELEASENOTE/public_sys-resources/icon-note.gif rename to "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-note.gif" diff --git a/docs/zh/RELEASENOTE/public_sys-resources/icon-notice.gif "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-notice.gif" similarity index 100% rename from docs/zh/RELEASENOTE/public_sys-resources/icon-notice.gif rename to "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-notice.gif" diff --git a/docs/zh/RELEASENOTE/public_sys-resources/icon-tip.gif "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-tip.gif" similarity index 100% rename from docs/zh/RELEASENOTE/public_sys-resources/icon-tip.gif rename to "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-tip.gif" diff --git a/docs/zh/RELEASENOTE/public_sys-resources/icon-warning.gif "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-warning.gif" similarity index 100% rename from docs/zh/RELEASENOTE/public_sys-resources/icon-warning.gif rename to "docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-warning.gif" diff --git "a/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" new file mode 100644 index 0000000000..2d19984535 --- /dev/null +++ "b/docs/zh/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/\346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" @@ -0,0 +1,4618 @@ +# 支持ONNX算子清单 +- [Abs](#Abs.md) +- [Acos](#Acos.md) +- [Acosh](#Acosh.md) +- [AdaptiveAvgPool2D](#AdaptiveAvgPool2D.md) +- [AdaptiveMaxPool2D](#AdaptiveMaxPool2D.md) +- [Add](#Add.md) +- [Addcmul](#Addcmul.md) +- [AffineGrid](#AffineGrid.md) +- [And](#And.md) +- [Argmax](#Argmax.md) +- [Argmin](#Argmin.md) +- [AscendRequantS16](#AscendRequantS16.md) +- [AscendRequant](#AscendRequant.md) +- [AscendQuant](#AscendQuant.md) +- [AscendDequantS16](#AscendDequantS16.md) +- [AscendDequant](#AscendDequant.md) +- [AscendAntiQuant](#AscendAntiQuant.md) +- [Asin](#Asin.md) +- [Asinh](#Asinh.md) +- [Atan](#Atan.md) +- [Atanh](#Atanh.md) +- [AveragePool](#AveragePool.md) +- [BatchNormalization](#BatchNormalization.md) +- [BatchMatMul](#BatchMatMul.md) +- [BatchMultiClassNMS](#BatchMultiClassNMS.md) +- [BitShift](#BitShift.md) +- [Cast](#Cast.md) +- [Ceil](#Ceil.md) +- [Celu](#Celu.md) +- [Concat](#Concat.md) +- [Clip](#Clip.md) +- [ConvTranspose](#ConvTranspose.md) +- [Cumsum](#Cumsum.md) +- [Conv](#Conv.md) +- [Compress](#Compress.md) +- [Constant](#Constant.md) +- [ConstantOfShape](#ConstantOfShape.md) +- [Cos](#Cos.md) +- [Cosh](#Cosh.md) +- [DeformableConv2D](#DeformableConv2D.md) +- [Det](#Det.md) +- [DepthToSpace](#DepthToSpace.md) +- [Div](#Div.md) +- [Dropout](#Dropout.md) +- [Elu](#Elu.md) +- [EmbeddingBag](#EmbeddingBag.md) +- [Equal](#Equal.md) +- [Erf](#Erf.md) +- [Exp](#Exp.md) +- [Expand](#Expand.md) +- [EyeLike](#EyeLike.md) +- [Flatten](#Flatten.md) +- [Floor](#Floor.md) +- [Gather](#Gather.md) +- [GatherND](#GatherND.md) +- [GatherElements](#GatherElements.md) +- [Gemm](#Gemm.md) +- [GlobalAveragePool](#GlobalAveragePool.md) +- [GlobalLpPool](#GlobalLpPool.md) +- [GlobalMaxPool](#GlobalMaxPool.md) +- [Greater](#Greater.md) +- [GreaterOrEqual](#GreaterOrEqual.md) +- [HardSigmoid](#HardSigmoid.md) +- [hardmax](#hardmax.md) +- [HardSwish](#HardSwish.md) +- [Identity](#Identity.md) +- [If](#If.md) +- [InstanceNormalization](#InstanceNormalization.md) +- [Less](#Less.md) +- [LeakyRelu](#LeakyRelu.md) +- [LessOrEqual](#LessOrEqual.md) +- [Log](#Log.md) +- [LogSoftMax](#LogSoftMax.md) +- [LpNormalization](#LpNormalization.md) +- [LpPool](#LpPool.md) +- [LRN](#LRN.md) +- [LSTM](#LSTM.md) +- [MatMul](#MatMul.md) +- [Max](#Max.md) +- [MaxPool](#MaxPool.md) +- [MaxRoiPool](#MaxRoiPool.md) +- [Mean](#Mean.md) +- [MeanVarianceNormalization](#MeanVarianceNormalization.md) +- [Min](#Min.md) +- [Mod](#Mod.md) +- [Mul](#Mul.md) +- [Multinomial](#Multinomial.md) +- [Neg](#Neg.md) +- [NonMaxSuppression](#NonMaxSuppression.md) +- [NonZero](#NonZero.md) +- [Not](#Not.md) +- [OneHot](#OneHot.md) +- [Or](#Or.md) +- [RandomNormalLike](#RandomNormalLike.md) +- [RandomUniformLike](#RandomUniformLike.md) +- [RandomUniform](#RandomUniform.md) +- [Range](#Range.md) +- [Reciprocal](#Reciprocal.md) +- [ReduceL1](#ReduceL1.md) +- [ReduceL2](#ReduceL2.md) +- [ReduceLogSum](#ReduceLogSum.md) +- [ReduceLogSumExp](#ReduceLogSumExp.md) +- [ReduceMin](#ReduceMin.md) +- [ReduceMean](#ReduceMean.md) +- [ReduceProd](#ReduceProd.md) +- [ReduceSumSquare](#ReduceSumSquare.md) +- [Resize](#Resize.md) +- [Relu](#Relu.md) +- [ReduceSum](#ReduceSum.md) +- [ReduceMax](#ReduceMax.md) +- [Reshape](#Reshape.md) +- [ReverseSequence](#ReverseSequence.md) +- [RoiExtractor](#RoiExtractor.md) +- [RoiAlign](#RoiAlign.md) +- [Round](#Round.md) +- [PRelu](#PRelu.md) +- [Scatter](#Scatter.md) +- [ScatterElements](#ScatterElements.md) +- [ScatterND](#ScatterND.md) +- [Shrink](#Shrink.md) +- [Selu](#Selu.md) +- [Shape](#Shape.md) +- [Sigmoid](#Sigmoid.md) +- [Slice](#Slice.md) +- [Softmax](#Softmax.md) +- [Softsign](#Softsign.md) +- [Softplus](#Softplus.md) +- [SpaceToDepth](#SpaceToDepth.md) +- [Split](#Split.md) +- [Sqrt](#Sqrt.md) +- [Squeeze](#Squeeze.md) +- [Sub](#Sub.md) +- [Sign](#Sign.md) +- [Sin](#Sin.md) +- [Sinh](#Sinh.md) +- [Size](#Size.md) +- [Sum](#Sum.md) +- [Tanh](#Tanh.md) +- [TfIdfVectorizer](#TfIdfVectorizer.md) +- [Tile](#Tile.md) +- [ThresholdedRelu](#ThresholdedRelu.md) +- [TopK](#TopK.md) +- [Transpose](#Transpose.md) +- [Pad](#Pad.md) +- [Pow](#Pow.md) +- [Unsqueeze](#Unsqueeze.md) +- [Xor](#Xor.md) +- [Where](#Where.md) +

Abs

+ +## 功能 + +对输入张量取绝对值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double、int32、int64 + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Acos

+ +## 功能 + +计算输入张量的反余弦值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Acosh

+ +## 功能 + +计算输入张量的反双曲余弦值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

AdaptiveAvgPool2D

+ +## 功能 + +对输入进行2d自适应平均池化计算 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【属性】 + +一个属性: + +output\_size:int型数组,指定输出的hw的shape大小 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:与x类型一致 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AdaptiveMaxPool2D

+ +## 功能 + +对输入进行2d自适应最大池化计算 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、float64 + +【属性】 + +一个属性: + +output\_size:int型数组,指定输出的hw的shape大小 + +【输出】 + +两个输出 + +y:一个tensor,数据类型:与x类型一致 + +argmax:一个tensor,数据类型:int32,int64 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

Add

+ +## 功能 + +按元素求和 + +## 边界 + +【输入】 + +两个输入 + +A:一个张量,数据类型:int8、int16、int32、int64、uint8、float32、float16、double + +B:一个张量,数据类型与A相同 + +【输出】 + +C:一个张量,数据类型与A相同 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Addcmul

+ +## 功能 + +元素级计算\(x1 \* x2\) \* value + input\_data + +## 边界 + +【输入】 + +四个输入 + +input\_data:一个tensor,数据类型:float16、float32、int32、int8、uint8 + +x1: 一个tensor,类型与input\_data相同 + +x2: 一个tensor,类型与input\_data相同 + +value: 一个tensor,类型与input\_data相同 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:y与输入相同 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AffineGrid

+ +## 功能 + +给定一批矩阵,生成采样网格 + +## 边界 + +【输入】 + +俩个输入 + +theta:一个tensor,数据类型:float16、float32 + +output\_size:一个tensor,数据类型:int32 + +【属性】 + +一个属性: + +align\_corners:bool型 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:int + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

And

+ +## 功能 + +逻辑与 + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:bool + +x2:一个tensor,数据类型:bool + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Argmax

+ +## 功能 + +返回指定轴上最大值所对应的索引 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,表示最大值的索引位置,维度比输入x少1,数据类型:int32 + +【属性】 + +axis:必选,表示计算最大值索引的方向,数据类型:int32,aixs的值为\[-len\(x.shape\), len\(x.shape\)-1\] + +keep\_dim:可选,keep\_dim默认为1,支持1或0。 + +【约束】 + +算子不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32类型输入 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Argmin

+ +## 功能 + +返回输入张量指定轴上最小值对应的索引 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:int64 + +【属性】 + +axis:数据类型为int,含义:指定计算轴;取值范围:\[-r, r-1\],r表示输入数据的秩 + +【约束】 + +算子不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32类型输入 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

AscendRequantS16

+ +## 功能 + +重新量化算子 + +## 边界 + +【输入】 + +两个必选输入,一个可选输入 + +x0:一个tensor,数据类型:int16 + +req\_scale:一个tensor,数据类型:uint64 + +x1:一个tensor,数据类型:int16 + +【属性】 + +两个属性: + +dual\_output:bool型 + +relu\_flag:bool型 + +【输出】 + +两个输出 + +y0:一个tensor,数据类型:int8 + +y1:一个tensor,数据类型:int16 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AscendRequant

+ +## 功能 + +重新量化算子 + +## 边界 + +【输入】 + +两个输入 + +x0:一个tensor,数据类型:int32 + +req\_scale:一个tensor,数据类型:uint64 + +【属性】 + +一个属性: + +relu\_flag,数据类型:bool + +【输出】 + +一个输出 + +y:一个tensor,数据类型:int8 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AscendQuant

+ +## 功能 + +量化算子 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16,float32 + +【属性】 + +四个属性: + +offset,数据类型:float + +scale,数据类型:float + +sqrt\_mode,数据类型:bool + +round\_mode,数据类型:string + +【输出】 + +一个输出 + +y:一个tensor,数据类型:int8 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AscendDequantS16

+ +## 功能 + +反量化算子 + +## 边界 + +【输入】 + +两个必选输入,一个可选输入 + +x0:一个tensor,数据类型:int32 + +req\_scale:一个tensor,数据类型:uint64 + +x1:一个tensor,数据类型:int16 + +【属性】 + +一个属性 + +relu\_flag,数据类型:bool + +【输出】 + +一个输出 + +y:一个tensor,数据类型:int16 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AscendDequant

+ +## 功能 + +反量化算子 + +## 边界 + +【输入】 + +两个输入 + +x0:一个tensor,数据类型:int32 + +deq\_scale:一个tensor,数据类型:uint64,float16 + +【属性】 + +sqrt\_mode,数据类型:bool + +relu\_flag,数据类型:bool + +dtype,数据类型:float + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float16,float + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

AscendAntiQuant

+ +## 功能 + +反量化算子 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:int8 + +【属性】 + +offset,float型 + +scale,float型 + +sqrt\_mode,bool + +round\_mode,string + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float16,float + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

Asin

+ +## 功能 + +计算输入张量的反正弦 + +## 边界 + +【输入】 + +一个输入 + +x1:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Asinh

+ +## 功能 + +计算输入张量双曲反正弦 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Atan

+ +## 功能 + +计算输入张量的反正切值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Atanh

+ +## 功能 + +计算输入张量的双曲反正切 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

AveragePool

+ +## 功能 + +平均池化层 + +## 边界 + +【输入】 + +X:一个张量,数据类型:float16、float32,格式为NCHW + +【输出】 + +Y:一个张量,数据类型:float16、float32,格式为NCHW + +【属性】 + +auto\_pad:可选,支持NOTSET、SAME\_UPPER、SAME\_LOWER与VALID + +count\_include\_pad:int,暂不支持 + +kernel\_shape:可选,包括: + +− kernel\_shape\[0\]:数据类型:int32,指定沿H维度的窗口大小,取值范围为\[1, 32768\],默认为1 + +− kernel\_shape\[1\]:数据类型:int32,指定沿W维度的窗口大小,取值范围为\[1, 32768\],默认为1 + +strides:可选,包括: + +− strides\[0\]:数据类型:int32,指定沿H维度的步长,默认为1 + +− strides\[1\]:数据类型:int32,指定沿W维度的步长,默认为1 + +pads:可选,包括: + +− pads\[0\]:数据类型:int32,指定顶部padding,默认为0 + +− pads\[1\]:数据类型:int32,指定底部padding,默认为0 + +− pads\[2\]:数据类型:int32,指定左部padding,默认为0 + +− pads\[3\]:数据类型:int32,指定右部padding,默认为0 + +ceil\_mode:可选,数据类型:int32,取值:0(floor模式),1(ceil模式),默认为0 + +【约束】 + +strides\[0\]或者strides\[1\]取值步长大于63时,会使用AI CPU计算,性能会下降; + +kernel\_shape\_H或kernel\_shape\_W取值超过\[1,255\],或者kernel\_shape\_H \* kernel\_shape\_W \> 256时,会使用AI CPU计算,导致性能下降; + +1 <= input\_w <= 4096; + +当输入张量的N是一个质数时,N应当小于65535; + +ceil\_mode参数仅在auto\_pad='NOTSET'时生效; + +不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32类型输入; + +auto\_pad属性值SAME\_UPPER, SAME\_LOWER统一使用的TBE的SAME属性,即TBE算子没有根据这个属性区分pad的填充位置,可能会带来精度问题 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

BatchNormalization

+ +## 功能 + +标准化张量 + +## 边界 + +【输入】 + +五个输入 + +X:数据类型为float16、float32的4D张量 + +scale:数据类型为float32的张量,指定尺度因子 + +B:数据类型为float32的张量,指定偏移量 + +mean:数据类型为float32的张量,指定均值 + +var:数据类型为float32的张量,指定方差 + +【输出】 + +五个输出 + +Y:标准化之后的张量,数据类型为float16或float32 + +mean:均值 + +var:方差 + +saved\_mean:在训练过程中使用已保存的平均值来加快梯度计算 + +saved\_var:在训练过程中使用已保存的方差来加快梯度计算 + +【属性】 + +epsilon:可选,数据类型:float32,指定一个小值与var相加,以避免除以0,默认为0.0001 + +momentum:float32,该参数暂不支持 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

BatchMatMul

+ +## 功能 + +将两个输入执行矩阵乘 + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16,float,int32 + +x2:一个tensor,数据类型:float16,float,int32 + +【属性】 + +两个属性: + +adj\_x1:bool型 + +adj\_x2:bool型 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float16,float,int32 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

BatchMultiClassNMS

+ +## 功能 + +为输入boxes和输入score计算nms + +## 边界 + +【输入】 + +两个必选输入,两个可选输入 + +boxes:一个tensor,数据类型:float16 + +scores:一个tensor,数据类型:float16 + +clip\_window:一个tensor,数据类型:float16 + +num\_valid\_boxes:一个tensor,数据类型:int32 + +【属性】 + +六个属性: + +score\_threshold:float型 + +iou\_threshold:float型 + +max\_size\_per\_class:int型 + +max\_total\_size:int型 + +change\_coordinate\_frame:bool型 + +transpose\_box:bool型 + +【输出】 + +四个输出 + +nmsed\_boxes:一个tensor,数据类型:float16 + +nmsed\_scores:一个tensor,数据类型:float16 + +nmsed\_classes:一个tensor,数据类型:float16 + +nmsed\_num:一个tensor,数据类型:float16 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

BitShift

+ +## 功能 + +元素级位移算子 + +## 边界 + +【输入】 + +两个输入 + +x:一个tensor,表示被位移的输入 + +y:一个tensor,表示位移的数量 + +【输出】 + +z:一个tensor,表示位移后的结果 + +【属性】 + +direction:数据类型:string,必选,指定位移方向,取值范围:"RIGHT"或者"LEFT" + +【约束】 + +当direction="LEFT"时不支持UINT16,UIN32,UINT64 + +## 支持的ONNX版本 + +Opset v11/v12/v13 + +

Cast

+ +## 功能 + +将输入数据的type转换为指定的type + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor + +【输出】 + +y:一个tensor,输出的数据类型为属性指定的类型,数据类型:bool、float16、float32、int8、int32、uint8等 + +【属性】 + +to:数据类型:int,必选,指定目标数据类型,取值范围:在指定的数据类型范围内 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Ceil

+ +## 功能 + +对输入张量向上取整 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Celu

+ +## 功能 + +连续可微的指数线性单位:对输入张量X按元素执行线性单位,使用公式: + +max\(0,x\) + min\(0,alpha\*\(exp\(x/alpha\)-1\)\) + +## 边界 + +【输入】 + +X:tensor\(float\) + +【输出】 + +Y:tensor\(float\) + +【属性】 + +alpha:float,默认值:1.0 + +## 支持的ONNX版本 + +Opset v12/v13 + +

Concat

+ +## 功能 + +对多个张量Concat + +## 边界 + +【输入】 + +inputs:多个输入张量,数据类型:float16、float32、int32、uint8、int16、int8、int64、qint8、quint8、qint32、uint16、uint32、uint64、qint16、quint16 + +【输出】 + +concat\_result:张量,与输入张量类型一致 + +【属性】 + +axis:指定哪一个轴进行concat操作,负数表示从后往前对维度计数,取值范围为\[-r, r - 1\],r=rank\(inputs\) + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Clip

+ +## 功能 + +将张量值剪辑到指定的最小值和最大值之间 + +## 边界 + +【输入】 + +三个输入 + +X :一个张量,数据类型:float16、float32、int32 + +min:一个scalar + +max:一个scalar + +【输出】 + +一个输出 + +Y:一个张量,剪辑后的输出,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ConvTranspose

+ +## 功能 + +转置卷积 + +## 边界 + +【输入】 + +3个输入 + +x:tensor,数据类型:float16、float32 + +w:tensor,数据类型:float16、float32 + +b:可选tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【属性】 + +auto\_pad:str,默认为NOTSET,含义:显式使用padding的方式 + +dilations:ints,默认为全1序列,含义:filter的每轴空洞值 + +group:int,默认为1,含义:输入通道分组数 + +kernel\_shape:ints,默认为w,含义:卷积核大小 + +output\_padding:ints,默认为全0数组,含义:指定padding值 + +output\_shape:ints,根据pad自动计算,含义:输出shape + +pads:ints,默认为全0矩阵,含义:每根轴指定pad值 + +strides:ints,默认为全1矩阵,含义:每根轴的stride值 + +【约束】 + +目前只支持2D的转置卷积,3D及以上暂不支持 + +dilations只支持1 + +output\_shape支持限制:实现部分功能。现在支持output shape的大小,小于原始输入大小,但是不支持大于原始输入大小 + +算子不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32,fp64的输入 + +属性auto\_pad不支持 "SAME\_UPPER","SAME\_LOWER" + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Cumsum

+ +## 功能 + +计算输入张量在给定axis上面的累加和 + +## 边界 + +【输入】 + +两个输入 + +x:一个tensor,数据类型:float16、float32、int32 + +axis:一个int32或者int64的标量,默认为0,范围为\[-rank\(x\), rank\(x\)-1\] + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type + +【属性】 + +exclusive:int,默认为0,含义:是否返回不包括顶层元素的和 + +reverse:int,默认为0,含义:是否反方向求和 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Conv

+ +## 功能 + +卷积 + +## 边界 + +【输入】 + +X:输入4D张量 + +W:权重张量 + +B:可选,偏差,一维张量 + +【输出】 + +Y:卷积输出张量 + +【属性】 + +auto\_pad:可选,支持VALID、NOTSET + +dilations:4个整数的列表,指定用于扩张卷积的扩张率,H和W维度取值范围为\[1, 255\] + +group:从输入通道到输出通道的阻塞连接数,输入通道和输出通道都必须被“group”整除;数据类型为int32,必须设置为1 + +pads:4个整数的列表,指定顶部、底部、左侧和右侧填充,取值范围为\[0, 255\] + +strides:4个整数的列表,指定沿高度H和宽度W的卷积步长。H和W维度取值范围为\[1, 63\],默认情况下,N和C尺寸设置为1 + +【约束】 + +输入张量,W维度取值范围为\[1, 4096\] + +权重张量,H维度和W维度取值范围为\[1, 255\] + +当输出张量的W == 1且H == 1时,输入张量和权重的H和W维度需相同 + +当输出张量的W = 1,H != 1时,算子不支持 + +不支持atc工具--precision\_mode=must\_keep\_origin\_dtype参数时输入类型为fp32和fp64 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Compress

+ +## 功能 + +按指定轴进行切片。 + +## 边界 + +【输入】 + +两个输入: + +input:维度大于等于1的tensor,支持类型:uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float, string, bool + +condition:1维tensor,用于指定切片和需要选择的元素,支持类型:bool + +【输出】 + +一个输出 + +output:tensor,类型:与输入一致 + +【属性】 + +axis:可选,int类型,进行切片的轴,如果没有指定轴,在切片之前将输入tensor展平。取值范围是\[-r,r-1\],r为输入tensor的维数。 + +## 支持的ONNX版本 + +Opset v9//v11/v12/v13 + +

Constant

+ +## 功能 + +构建constant节点张量 + +## 边界 + +【输入】 + +无 + +【输出】 + +一个输出 + +Y:输出张量,和提供的tensor值一致 + +【属性】 + +value:输出张量的值 + +【约束】 + +sparse\_value:不支持 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ConstantOfShape

+ +## 功能 + +用给定的值和shape生成张量 + +## 边界 + +【输入】 + +x:1D的int64的tensor,表示输出数据的shape,所有的值必须大于0 + +【输出】 + +y:一个tensor,shape由输入指定,如果属性value指定了值,那输出的值和数据类型就等于value指定的值,如果属性value不指定,输出tensor的值默认为0,数据类型默认为float32 + +【属性】 + +value:指定输出tensor的数据和类型 + +【约束】 + +x:1<=len\(shape\)<=8 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Cos

+ +## 功能 + +计算输入张量的余弦值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Cosh

+ +## 功能 + +计算输入张量的双曲余弦 + +## 边界 + +【输入】 + +一个输入 + +X1:一个tensor,数据类型:float16、float、double + +【输出】 + +一个输出 + +y:一个张量,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

DeformableConv2D

+ +## 功能 + +形变卷积 + +## 边界 + +【输入】 + +X:输入4D张量 + +filter:权重张量 + +offsets:偏移量,4维张量 + +bias:可选,偏差,一维张量 + +【输出】 + +Y:形变卷积输出张量 + +【属性】 + +auto\_pad:可选,支持VALID、NOTSET + +dilations:4个整数的列表,指定用于扩张卷积的扩张率,H和W维度取值范围为\[1, 255\] + +group:从输入通道到输出通道的阻塞连接数,输入通道和输出通道都必须被“group”整除;数据类型为int32,必须设置为1 + +pads:4个整数的列表,指定顶部、底部、左侧和右侧填充,取值范围为\[0, 255\] + +strides:4个整数的列表,指定沿高度H和宽度W的卷积步长。H和W维度取值范围为\[1, 63\],默认情况下,N和C尺寸设置为1 + +data\_format:string,表示输入数据format,默认是“NHWC” + +deformable\_groups:分组卷积通道数,缺省为1 + +modulated:bool,指定DeformableConv2D版本,true表示v2版本,false表示v1版本,当前只支持true + +【限制】 + +输入张量,W维度取值范围为\[1, 4096 / filter\_width\],H取值范围为\[1, 100000 / filter\_height\] + +权重张量,W维度取值范围为\[1, 63\],H取值范围为\[1, 63\] + +不支持atc工具--precision\_mode=must\_keep\_origin\_dtype参数时输入类型为fp32和fp64 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

Det

+ +## 功能 + +计算方形矩阵行列式 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

DepthToSpace

+ +## 功能 + +将数据由深度重排到空间数据块 + +## 边界 + +【输入】 + +1个输入 + +input:format为NCHW的tensor输入,类型:float16、float32,double,int32,int64等 + +【输出】 + +1个输出 + +output:一个张量,shape为\[N, C/\(blocksize \* blocksize\), H \* blocksize, W \* blocksize\] + +【属性】 + +blocksize:int,必选 指定被移动的块的大小 + +mode: string 指定是depth-column-row还是column-row-depth排列,默认DCR + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Div

+ +## 功能 + +按元素进行除法运算 + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16、float32、double、int32、int64 + +x2:一个tensor,数据类型:float16、float32、double、int32、int64 + +【输出】 + +一个输出 + +y:一个tensor,数据类型和输入一致 + +【约束】 + +输入、输出的type相同 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Dropout

+ +## 功能 + +拷贝或者屏蔽输入数据 + +## 边界 + +【输入】 + +1-3个输入 + +data:tensor输入,类型:float16、float32,double等 + +ratio:可选输入,类型:float16、float32,double等 + +training\_mode:可选输入,类型:bool + +【输出】 + +1-2个输出 + +output:一个张量 + +mask: 一个张量 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Elu

+ +## 功能 + +Elu激活函数 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【属性】 + +alpha:float,默认为1.0,含义:系数 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

EmbeddingBag

+ +## 功能 + +计算embedding函数的反向输出 + +## 边界 + +【输入】 + +两个必选输入,两个可选输入 + +weight:一个tensor,数据类型:float32 + +indices:一个tensor,数据类型:int32 + +offset:一个tensor,数据类型:int32 + +per\_sample\_weights:一个tensor,数据类型:float32 + +【属性】 + +四个属性: + +mode:string型 + +scale\_grad\_by\_fraq:bool型 + +sparse:bool型 + +include\_last\_offset:bool型 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float32 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

Equal

+ +## 功能 + +判断两个输入张量对应位置是否相等 + +## 边界 + +【输入】 + +两个输入 + +X1:一个tensor + +X2:一个tensor + +【输出】 + +一个输出 + +y:一个tensor ,数据类型:bool + +【约束】 + +输入X1、X2的数据类型和格式相同,支持如下数据类型:bool、uint8、int8、int16、int32、int64、float16、float32、double + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Erf

+ +## 功能 + +高斯误差函数 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型和格式与输入一致 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Exp

+ +## 功能 + +计算输入张量的指数 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Expand

+ +## 功能 + +将输入tensor广播到指定shape + +## 边界 + +【输入】 + +2个输入 + +input:tensor,数据类型:float16、float32 + +shape:tensor,数据类型:int64 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【约束】 + +需要修改模型将输入shape由placeholder改为const类型,可以使用onnxsimplifier简化模型 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

EyeLike

+ +## 功能 + +生成一个2D矩阵,主对角线是1,其他为0 + +## 边界 + +【输入】 + +1个输入 + +x:2维tensor,用于拷贝tensor的shape + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape + +【属性】 + +dtype:int,指定输出数据类型 + +k:int,默认是0,表示主对角线被广播成1的索引。如y是输出,则y\[i, i+k\] = 1 + +【约束】 + +仅支持k=0 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Flatten

+ +## 功能 + +将张量展平 + +## 边界 + +【输入】 + +input:多维张量,数据类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32 + +【输出】 + +具有输入张量的内容的2D张量 + +【属性】 + +axis:int,该参数暂不支持负值索引 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Floor

+ +## 功能 + +对输入张量向下取整 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Gather

+ +## 功能 + +根据相应的轴从“x”中收集切片 + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16、float32、int32、int64、int8、int16、uint8、uint16、uint32、uint64、bool + +indices:一个tensor,数据类型:int32、int64 + +【输出】 + +一个输出 + +y:一个张量,数据类型和输入x1类型一致 + +【属性】 + +axis:数据类型:int,指定gather的轴,取值范围为\[-r, r-1\](r表示输入数据的秩) + +【约束】 + +不支持indices为负值的索引 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

GatherND

+ +## 功能 + +将输入数据切片输出 + +## 边界 + +【输入】 + +2个输入 + +data:秩r\>=1的tensor输入,类型:float16, float32, double, int32, int64等 + +indices:int64的索引张量,秩q\>=1 + +【输出】 + +1个输出 + +output:一个张量, 秩为q + r - indices\_shape\[-1\] - 1 + +【属性】 + +batch\_dims:int,默认为0 批处理轴的数量 + +【约束】 + +不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时double的输入 + +## 支持的ONNX版本 + +Opset v11/v12/v13 + +

GatherElements

+ +## 功能 + +获取索引位置的元素产生输出 + +## 边界 + +【输入】 + +2个输入 + +input:秩大于1的tensor输入,类型:float16、float32,double,int32,int64等 + +indices:int32/int64的索引张量 + +【输出】 + +1个输出 + +output:一个张量,与indices的shape相同 + +【属性】 + +axis:int,默认为0 指定聚集的轴 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Gemm

+ +## 功能 + +通用矩阵乘 + +## 边界 + +【输入】 + +A:2D矩阵张量,数据类型:float16、float32 + +B:2D矩阵张量,数据类型:float16、float32 + +C:偏差,可选,该参数暂不支持 + +【输出】 + +Y:2D矩阵张量,数据类型:float16、float32 + +【属性】 + +transA:bool,是否A需要转置 + +transB:bool,是否B需要转置 + +alpha:float,该参数暂不支持 + +beta:float,该参数暂不支持 + +【约束】 + +v8/v9/v10版本不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32类型输入 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

GlobalAveragePool

+ +## 功能 + +全局平均池化 + +## 边界 + +【输入】 + +X:一个张量,数据类型:float16、float32,格式为NCHW + +【输出】 + +Y:池化输出张量,数据类型与X相同,格式为NCHW + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

GlobalLpPool

+ +## 功能 + +全局范数池化算子 + +## 边界 + +【输入】 + +2个输入 + +input:tensor,数据类型:float16、float32 + +p:可选属性, int32,默认2 + +【输出】 + +1个输出 + +y:更新后的张量数据,数据类型和输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

GlobalMaxPool

+ +## 功能 + +全局最大池化算子 + +## 边界 + +【输入】 + +1个输入 + +x:前一个节点的输出tensor,类型:float16, float32, double + +【输出】 + +1个输出 + +output:池化后的张量 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Greater

+ +## 功能 + +按元素比较输入x1和x2的大小,若x1\>x2,对应位置返回true + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16、float32、int32、int8、uint8 + +x2:一个tensor,数据类型:float16、float32、int32、int8、uint8 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:bool + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

GreaterOrEqual

+ +## 功能 + +按元素比较输入x1和x2的大小,若x1\>=x2,对应位置返回true + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16、float32、int32、int8、uint8等 + +x2:一个tensor,数据类型:float16、float32、int32、int8、uint8等 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:bool + +## 支持的ONNX版本 + +Opset v8/v12 + +

HardSigmoid

+ +## 功能 + +HardSigmoid接受一个输入数据\(张量\)并生成一个输出数据\(张量\),HardSigmoid函数y = max\(0, min\(1, alpha \* x + beta\)\)应用于张量元素方面。 + +## 边界 + +【输入】 + +1个输入 + +X:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【输出】 + +1个输出 + +Y:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【属性】 + +alpha:float,默认值:0.2 + +beta:float,默认值:0.2 + +## 支持的ONNX版本 + +Opset v1/v6/v8/v9/v10/v11/v12/v13 + +

hardmax

+ +## 功能 + +计算hardmax结果,如果元素是指定axis的最大元素则设为1,否则为0 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,rank=2,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【属性】 + +axis:int,默认为-1,含义:指定计算轴 + +【约束】 + +使用atc工具--precision\_mode参数必须为allow\_fp32\_to\_fp16 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

HardSwish

+ +## 功能 + +HardSwish激活函数。y=x \* max\(0, min\(1, alpha \* x + beta \)\),其中alpha=1/6,beat=0.5 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:tensor,数据类型:float16、float32 + +## 支持的ONNX版本 + +Opset v14 + +

Identity

+ +## 功能 + +恒等操作 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

If

+ +## 功能 + +逻辑控制判断算子 + +## 边界 + +【输入】 + +一个输入 + +cond:If op的条件 + +两个属性 + +else\_branch:条件为假的分支 + +then\_branch:条件为真的分支 + +【输出】 + +一到多个输出 + +y:tensor或者tensor序列 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

InstanceNormalization

+ +## 功能 + +计算y = scale \* \(x - mean\) / sqrt\(variance + epsilon\) + B,其中mean 和 variance 是每个实例每个通道的均值和方法 + +## 边界 + +【输入】 + +3个输入 + +x: tensor,数据类型是float16,float + +scale:1维tensor,维度同x的C轴长度,和输入x同样的dtype + +B:1维tensor,维度同x的C轴长度,和输入x同样的dtype + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape和dtype + +【属性】 + +epsilon:float,默认是1e-05,避免除0 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Less

+ +## 功能 + +按元素比较输入x1和x2的大小,若x1 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16、float32、int32、int8、uint8 + +x2:一个tensor,数据类型:float16、float32、int32、int8、uint8 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:bool + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

LeakyRelu

+ +## 功能 + +对输入张量用leakrelu函数激活 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y: 一个tensor,数据类型和shape与输入一致 + +【属性】 + +alpha:数据类型为float,默认0.01,表示leakage系数 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

LessOrEqual

+ +## 功能 + +小于等于计算 + +## 边界 + +【输入】 + +2个输入 + +x:tensor,数据类型:float16、float32 + +y:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape,数据类型:bool + +## 支持的ONNX版本 + +Opset v12/v13 + +

Log

+ +## 功能 + +计算输入的自然对数 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

LogSoftMax

+ +## 功能 + +对输入张量计算logsoftmax值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +【属性】 + +axis:数据类型为int;指定计算的轴,取值范围:\[-r, r-1\],r为输入的秩 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

LpNormalization

+ +## 功能 + +给定一个矩阵,沿给定的轴应用LpNormalization。 + +## 边界 + +【输入】 + +1个输入 + +input,类型:tensor\(float16\), tensor\(float\) + +【输出】 + +1个输出 + +output,类型:tensor\(float16\), tensor\(float\) + +【属性】 + +axis:int,默认值:-1 + +p:int,默认值:2 + +【约束】 + +auto\_pad属性值SAME\_UPPER, SAME\_LOWER统一使用的TBE的SAME属性,即TBE算子没有根据这个属性区分pad的填充位置,可能会带来精度问题 + +## 支持的ONNX版本 + +Opset v1/v8/v9/v10/v11/v12/v13 + +

LpPool

+ +## 功能 + +Lp范数池化。 + +## 边界 + +【输入】 + +一个输入 + +x:tensor,数据类型:float16 + +【输出】 + +一个输出 + +y:tensor,数据类型:float16 + +【属性】 + +auto\_pad:string,默认为NOTSET,支持:NOTSET, SAME\_UPPER, SAME\_LOWER 或者 VALID + +kernel\_shape:必选,int列表,kernel每个轴上的尺寸 + +p:int,范数,默认为2 + +pads:int列表 + +strides:int列表 + +【约束】 + +auto\_pad属性值SAME\_UPPER, SAME\_LOWER统一使用的TBE的SAME属性,即TBE算子没有根据这个属性区分pad的填充位置,可能会带来精度问题 + +## 支持的ONNX版本 + +Opset v11/v12/v13 + +

LRN

+ +## 功能 + +对输入张量做局部响应归一化 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和format + +【属性】 + +alpha:float,缩放因子 + +beta:float,指数项 + +bias:float + +size:int,求和的通道数,只支持奇数 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

LSTM

+ +## 功能 + +计算单层LSTM。这个操作符通常通过一些自定义实现\(如CuDNN\)来支持。 + +## 边界 + +【输入3-8】 + +X:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +W:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +R:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +B:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +sequence\_lens:,类型:tensor\(int32\) + +initial\_h:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +initial\_c:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +p:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【输出0-3】 + +Y:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +Y\_h:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +Y\_c:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【属性】 + +activation\_alpha:list of floats + +activation\_beta:list of floats + +activations:list of strings + +clip: float + +direction: string,默认值:forward + +hidden\_size: int + +input\_forget: int,默认值:0 + +layout: int,默认值:0 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

MatMul

+ +## 功能 + +矩阵乘 + +## 边界 + +【输入】 + +两个输入 + +x1:一个2D的tensor,数据类型:float16 + +x2:一个2D的tensor,数据类型:float16 + +【输出】 + +一个输出 + +y:一个2D的tensor,数据类型:float16 + +【约束】 + +仅支持1-6维输入 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Max

+ +## 功能 + +元素级比较输入tensor的大小 + +## 边界 + +【输入】 + +多个输入\(1-∞\) + +data\_0:tensor的列表,类型:float16、float32,int8,int16,int32等 + +【输出】 + +一个输出 + +max:一个张量,和输入x同样的type和shape(广播后的shape) + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

MaxPool

+ +## 功能 + +最大池化 + +## 边界 + +【输入】 + +X:一个张量,数据类型:float16、float32,格式为NCHW + +【输出】 + +Y:一个张量,数据类型:float16、float32,格式为NCHW + +【属性】 + +auto\_pad:可选,支持SAME\_UPPER、SAME\_LOWER、VALID、NOTSET + +storage\_order:暂不支持该参数 + +kernel\_shape:可选,包括: + +- kernel\_shape\[0\]:数据类型:int32,指定沿H维度的窗口大小,取值范围为\[1, 32768\],默认为1 +- kernel\_shape\[1\]:数据类型:int32,指定沿W维度的窗口大小,取值范围为\[1, 32768\],默认为1 + +strides:可选,包括: + +- strides\[0\]:数据类型:int32,指定沿H维度的步长,默认为1 +- strides\[1\]:数据类型:int32,指定沿W维度的步长,默认为1 + +pads:可选,包括: + +- pads\[0\]:数据类型:int32,指定顶部padding,默认为0 +- pads\[1\]:数据类型:int32,指定底部padding,默认为0 +- pads\[2\]:数据类型:int32,指定左部padding,默认为0 +- pads\[3\]:数据类型:int32,指定右部padding,默认为0 + +ceil\_mode:可选,数据类型:int32,取值:0\(floor模式),1(ceil模式),默认为0 + +【约束】 + +strides\[0\]或者strides\[1\]取值步长大于63时,会使用AI CPU计算,性能会下降; + +kernel\_shape\_H或kernel\_shape\_W取值超过\[1,255\],或者kernel\_shape\_H \* kernel\_shape\_W \> 256时,会使用AI CPU计算,导致性能下降; + +1 <= input\_w <= 4096 + +当输入张量的N是一个质数时,N应小于65535 + +2D tensor输入不支持dilations + +auto\_pad属性是VALID时,ceil\_mode属性值必须为0 + +不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32类型输入 + +pads属性和auto\_pad属性不可同时使用 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

MaxRoiPool

+ +## 功能 + +ROI最大池消耗一个输入张量X和感兴趣区域\(ROI\),以便在每个ROI上应用最大池,从而产生输出的4-D形状张量\(num\_roi, channels, pooled\_shape\[0\], pooled\_shape\[1\]\)。 + +## 边界 + +【输入】 + +X:,类型:tensor\(float16\), tensor\(float\) + +rois:,类型:tensor\(float16\), tensor\(float\) + +【输出】 + +Y:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【属性】 + +pooled\_shape: list of ints + +spatial\_scale: float,默认值:1.0 + +【约束】 + +不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32类型输入 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/13 + +

Mean

+ +## 功能 + +每个输入张量的元素均值\(支持numpy风格的广播\)。所有输入和输出必须具有相同的数据类型。该操作符支持多向\(即numpy风格\)广播。 + +## 边界 + +【输入1-∞】 + +data\_0:,类型:tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【输出】 + +mean:,类型:tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

MeanVarianceNormalization

+ +## 功能 + +使用公式对输入张量X进行均值方差标准化:\(X-EX\)/sqrt\(E\(X-EX\)^2\) + +## 边界 + +【输入】 + +X:,类型:tensor\(float16\), tensor\(float\), tensor\(bfloat16\) + +【输出】 + +Y:,类型:tensor\(float16\), tensor\(float\), tensor\(bfloat16\) + +【属性】 + +axes: list of ints,默认值:\['0', '2', '3'\] + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Min

+ +## 功能 + +计算输入tensors的最小值 + +## 边界 + +【输入】 + +1个输入 + +x:tensor列表,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:计算出最小值的tensor + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Mod

+ +## 功能 + +执行元素二进制模数\(支持numpy风格的广播\)。余数的符号与除数的符号相同。 + +## 边界 + +【输入】 + +A:tensor\(uint8\), tensor\(uint16\), tensor\(uint32\), tensor\(uint64\), tensor\(int8\), tensor\(int16\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +B:tensor\(uint8\), tensor\(uint16\), tensor\(uint32\), tensor\(uint64\), tensor\(int8\), tensor\(int16\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【输出】 + +C:,类型:tensor\(uint8\), tensor\(uint16\), tensor\(uint32\), tensor\(uint64\), tensor\(int8\), tensor\(int16\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【属性】 + +fmod:int,默认值:0 + +【约束】 + +当输入类型为浮点时,fmod不支持为0 + +## 支持的ONNX版本 + +Opset v10/v11/v12/v13 + +

Mul

+ +## 功能 + +矩阵点乘 + +## 边界 + +【输入】 + +A:一个张量,数据类型:float16、float32、uint8、int8、int16、int32 + +B:一个张量,数据类型:float16、float32、uint8、int8、int16、int32 + +【输出】 + +C:一个张量,数据类型与输入张量一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Multinomial

+ +## 功能 + +返回Multinomial采样结果矩阵 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,shape=\[batch\_size, class\_size\],数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,shape=\[batch\_size, sample\_size\],输出type是int32、int64 + +【属性】 + +dtype:int,默认为6,含义:输出dtype,默认为int32 + +sample\_size:int,默认为1,含义:采样次数 + +seed:float,随机数种子 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Neg

+ +## 功能 + +求输入的负数 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、int32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

NonMaxSuppression

+ +## 功能 + +过滤掉与先前选定的框有较高重叠的“交集-并集”\(IOU\)框。移除得分小于score\_threshold的边界框。边界框格式由属性center\_point\_box表示。注意,该算法不知道原点在坐标系中的位置,更普遍地说,它对坐标系的正交变换和平移是不变的;因此,平移或反射坐标系统的结果在相同的方框被算法选择。selected\_indices输出是一组整数,索引到表示所选框的边界框的输入集合中。然后,可以使用Gather或gathernd操作获得与所选索引对应的边框坐标。 + +## 边界 + +【输入2-5】 + +boxes: tensor\(float\) + +scores: tensor\(float\) + +max\_output\_boxes\_per\_class: 可选,数据类型:tensor\(int64\) + +iou\_threshold: 可选,数据类型:tensor\(float\) + +score\_threshold: 可选,数据类型:tensor\(float\) + +【输出】 + +selected\_indices: tensor\(int64\) + +【属性】 + +center\_point\_box: int 默认值:0 + +## 支持的ONNX版本 + +Opset v10/v11/v12/v13 + +

NonZero

+ +## 功能 + +返回非零元素的索引(行主序) + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、int32、int8、uint8等 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:int64 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Not

+ +## 功能 + +逻辑非 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:bool + +【输出】 + +一个输出 + +y:一个tensor,数据类型:bool + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

OneHot

+ +## 功能 + +根据输入生成独热编码张量 + +## 边界 + +【输入】 + +三个输入 + +indices:一个tensor,数据类型:uint8,uint16, uint32,uint64,int8,int16,int32,int64,float16,float,double + +depth:一个tensor,数据类型:uint8,uint16, uint32,uint64,int8,int16,int32,int64,float16,float,double + +values:一个tensor,数据类型:uint8,uint16, uint32,uint64,int8,int16,int32,int64,float16,float,double + +【属性】 + +一个属性 + +axis:(可选)添加独热表示的轴 + +【输出】 + +一个输出 + +y:一个tensor,数据类型与values输入的类型一致 + +【约束】 + +算子属性不支持axis<-1 + +## 支持的ONNX版本 + +Opset v9/v10/v11/v12/v13 + +

Or

+ +## 功能 + +逻辑或 + +## 边界 + +【输入】 + +两个输入 + +X1:一个tensor,数据类型:bool + +X2:一个tensor,数据类型:bool + +【输出】 + +一个输出 + +y:一个tensor,数据类型:bool + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

RandomNormalLike

+ +## 功能 + +根据正态分布生成随机数矩阵,输出tensor的shape与输入相同 + +## 边界 + +【输入】 + +1个输入 + +x: tensor,数据类型是float16,float + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape和dtype + +【属性】 + +dtype:int,指定输出tensor的dtype + +mean:float,默认是0.0,正态分布的均值 + +scale:float,默认是1.0,正态分布的标准差 + +seed:float,随机数种子 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

RandomUniformLike

+ +## 功能 + +根据均匀分布生成随机数矩阵,输出tensor的shape与输入相同 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型是float16,float + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape和dtype + +【属性】 + +dtype:int,指定输出tensor的dtype + +high:float,默认是1.0,均匀分布的上界 + +low:float,默认是0.0,均匀分布的下界 + +seed:float,随机数种子 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

RandomUniform

+ +## 功能 + +生成具有从均匀分布绘制的随机值的张量 + +## 边界 + +【属性】 + +五个属性 + +dtype:int类型,指明输出类型 + +high:float型,指明上边界 + +low:float型,指明下边界 + +seed:\(可选\),随机种子 + +shape:输出的形状 + +【输出】 + +一个输出 + +y:一个tensor,数据类型与dtype属性指定类型一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Range

+ +## 功能 + +产生一个连续序列的tensor + +## 边界 + +【输入】 + +3个输入 + +start:scalar,数据类型:float16、float32 + +limit:scalar,数据类型:float16、float32 + +delta:scalar,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Reciprocal

+ +## 功能 + +将输入张量取倒数 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceL1

+ +## 功能 + +沿所提供的轴计算输入张量元素的L1范数。如果keepdim等于1,得到的张量的秩与输入的相同。如果keepdim等于0,那么得到的张量就会被精简维数。上述行为与numpy类似,只是numpy默认keepdim为False而不是True。 + +## 边界 + +【输入】 + +data:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【输出】 + +reduced:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【属性】 + +axes: list of ints + +keepdims: int,默认值:1 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceL2

+ +## 功能 + +沿所提供的轴计算输入张量元素的L2范数。如果keepdim等于1,得到的张量的秩与输入的相同。如果keepdim等于0,那么得到的张量就会被精简维数。上述行为与numpy类似,只是numpy默认keepdim为False而不是True。 + +## 边界 + +【输入】 + +data:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【输出】 + +reduced:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【属性】 + +axes: list of ints + +keepdims: int,默认值:1 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceLogSum

+ +## 功能 + +计算输入张量指定方向的对数和 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16, float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float16, float32 + +【属性】 + +axes:数据类型为listInt;含义:指定计算轴;取值范围:\[-r, r-1\],r是输入数据的维数 + +keepdims:数据类型为int;含义:是否保留缩减后的维度;默认为1 + +## 支持的ONNX版本 + +Opset v11/v13 + +

ReduceLogSumExp

+ +## 功能 + +计算输入张量指定方向的对数和的指数 + +## 边界 + +【输入】 + +一个输入 + +data:一个tensor,数据类型:float16, float32 + +【输出】 + +一个输出 + +reduced:一个tensor,数据类型:float16, float32 + +【属性】 + +axes:一维tensor,数据类型int32、int64,含义:指定计算轴;取值范围:\[-r, r-1\],r是输入数据的维数 + +keepdims:数据类型为int;含义:是否缩减维度;默认为1表示缩减维度 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceMin

+ +## 功能 + +计算输入张量指定方向的最小值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float16、float32 + +【属性】 + +axes:数据类型为listInt;含义:指定计算轴;取值范围:\[-r, r-1\],r是输入数据的维数 + +keepdims:数据类型为int;含义:是否保留缩减后的维度;默认为1 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceMean

+ +## 功能 + +计算输入张量的指定维度的元素的均值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和format + +【属性】 + +axes:一个1D的整数列表,含义:指定精减的维度,取值范围为\[-r, r - 1\],r是输入矩阵的秩 + +keepdims:数据类型为int,默认为1,含义:是否保留缩减后的维度 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceProd

+ +## 功能 + +计算输入张量的元素沿所提供的轴的乘积。如果keepdim等于1,得到的张量的秩与输入的相同。如果keepdim等于0,那么得到的张量就会被精简维数。 + +## 边界 + +【输入】 + +data:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【输出】 + +reduced:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【属性】 + +axes: list of ints + +keepdims: int,默认值:1 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceSumSquare

+ +## 功能 + +沿所提供的轴计算输入张量元素的平方和。如果keepdim等于1,得到的张量的秩与输入的相同。如果keepdim等于0,那么得到的张量就会被精简维数。上述行为与numpy类似,只是numpy默认keepdim为False而不是True。 + +## 边界 + +【输入】 + +data:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【输出】 + +reduced:tensor\(uint32\), tensor\(uint64\), tensor\(int32\), tensor\(int64\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(bfloat16\) + +【属性】 + +axes: list of ints + +keepdims: int,默认值:1 + +## 支持的ONNX版本 + +Opset v1/v8/v9/v10/v11/v12/v13 + +

Resize

+ +## 功能 + +调整输入tensor大小 + +## 边界 + +【输入】 + +4个输入 + +x:一个tensor,数据类型:float16、float32 + +roi: 被输入图像归一化的1Dtensor,\[start1, ..., startN, end1, ..., endN\],数据类型:float16、float32 + +scales:与输入x的秩相等的数组 + +sizes:输出tensor的size + +【输出】 + +一个输出 + +y:缩放后的张量 + +【属性】 + +coordinate\_transformation\_mode:str,默认为half\_pixel,含义:定义缩放后图像与原图像的坐标转换 + +cubic\_coeff\_a:float,默认为-0.75,含义:三次插值系数 + +exclude\_outside:int,默认为0,含义:超出tensor外的权重 + +mode:str,默认为nearest,含义:插值算法,包括nearest, linear and cubic + +nearest\_mode:str,默认为round\_prefer\_floor,含义:最近邻算子模式 + +【约束】 + +目前仅支持nearest和linear插值方式来处理图片,并且需要修改模型将输入scales或sizes由placeholder改为const类型,可以使用onnxsimplifier简化模型 + +## 支持的ONNX版本 + +Opset v10/v11/v12 + +

Relu

+ +## 功能 + +整流线性单位函数 + +## 边界 + +【输入】 + +X:输入张量,数据类型:float32、int32、uint8、int16、int8、uint16、float16、qint8 + +【输出】 + +Y:输出张量,数据类型与X一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceSum

+ +## 功能 + +计算输入张量指定维度的元素的和 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x的type和format相同 + +【属性】 + +axes:一个1D的整数列表,含义:指定精减的维度,取值范围为\[-r, r - 1\](r是输入矩阵的秩) + +keepdims:数据类型为int,默认为1,含义:是否保留缩减后的维度 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReduceMax

+ +## 功能 + +计算输入张量指定方向的最大值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、int32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float16、float32、int32 + +【属性】 + +axes:数据类型为listInt;含义:指定计算轴;取值范围:\[-r, r-1\],r是输入数据的秩 + +keepdims:数据类型为int;含义:是否保留缩减后的维度;默认为1 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Reshape

+ +## 功能 + +改变输入维度 + +## 边界 + +【输入】 + +两个输入 + +data:一个张量 + +shape:一个张量,定义了输出张量的形状,int64 + +【输出】 + +reshaped:一个张量 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ReverseSequence

+ +## 功能 + +根据指定长度对batch序列进行排序 + +## 边界 + +【输入】 + +2个输入 + +x:tensor,rank \>= 2,数据类型:float16、float32 + +sequence\_lens:tensor,每个batch的指定长度,数据类型:int64 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【属性】 + +batch\_axis:int,默认为1,含义:指定batch轴 + +time\_axis:int,默认为1,含义:指定time轴 + +## 支持的ONNX版本 + +Opset v10/v11/v12/v13 + +

RoiExtractor

+ +## 功能 + +从特征映射列表中获取ROI特征矩阵 + +## 边界 + +【输入】 + +两个输入 + +features:一个tensor,数据类型:float32,float16 + +rois:一个tensor,数据类型:float32,float16 + +【属性】 + +八个属性: + +finest\_scale:int型 + +roi\_scale\_factor:float型 + +spatial\_scale:float型数组 + +pooled\_height:int型 + +pooled\_width:int型 + +sample\_num:int型 + +pool\_mode:string型 + +aligned:bool型 + +【输出】 + +一个输出 + +y:一个tensor,数据类型:float32,float16 + +## 支持的ONNX版本 + +自定义算子,无对应onnx版本 + +

RoiAlign

+ +## 功能 + +在每个roi区域进行池化处理 + +## 边界 + +【输入】 + +3个输入 + +x:tensor,4D输入,数据类型:float16、float32 + +rois:shape=\(num\_rois, 4\),数据类型:float16、float32 + +batch\_indices :shape=\(num\_rois,\),数据类型:int64 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type,shape=\(num\_rois, C, output\_height, output\_width\) + +【属性】 + +mode:string,默认为avg,含义:池化方式 + +output\_height:int,默认为1,含义:y的高度 + +output\_width:int,默认为1,含义:y的宽度 + +sampling\_ratio :int,默认为0,含义:插值算法采样点数 + +spatial\_scale:float,默认为1.0,含义:相对于输入图像的空间采样率 + +【约束】 + +batch\_indices数据类型只能写int32不能写int64 + +不支持atc工具参数--precision\_mode=must\_keep\_origin\_dtype时fp32,fp64的输入 + +## 支持的ONNX版本 + +Opset v10/v11/v12/v13 + +

Round

+ +## 功能 + +对输入张量做四舍五入的运算 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

PRelu

+ +## 功能 + +PRelu激活函数 + +## 边界 + +【输入】 + +两个输入 + +x:一个tensor,数据类型:float16、float32 + +slope:slope张量,数据类型和输入x一致 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【约束】 + +slope必须是1维,当输入x的shape是1维时,slope的维度值必须为1;输入x的shape是其他维度时,slope的维度值可以为1或者为输入x的shape\[1\] + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Scatter

+ +## 功能 + +根据updates和indices来更新data的值,并把结果返回。 + +## 边界 + +【输入】 + +3个输入 + +data: tensor,数据类型是float16,float,int32 + +indices:tensor,数据类型是int32、int64 + +updates:tensor,数据类型同data + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape和dtype + +【属性】 + +axis:int,默认是0,表示沿axis取数据 + +## 支持的ONNX版本 + +Opset v9/v10 + +

ScatterElements

+ +## 功能 + +根据updates和indices来更新data的值,并把结果返回。 + +## 边界 + +【输入】 + +1个输入 + +data: tensor,数据类型是float16,float,int32 + +indices:tensor,数据类型是int32、int64 + +updates:tensor,数据类型同data + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape和dtype + +【属性】 + +axis:int,默认是0,表示沿axis取数据 + +## 支持的ONNX版本 + +Opset v11/v12/v13 + +

ScatterND

+ +## 功能 + +创建data的拷贝,同时在指定indices处根据updates更新 + +## 边界 + +【输入】 + +3个输入 + +data:tensor,rank \>= 1,数据类型:float16、float32 + +indices:tensor,rank \>= 1,数据类型:int64 + +updates:tensor,rank = q + r - indices\_shape\[-1\] - 1,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +## 支持的ONNX版本 + +Opset v11 + +

Shrink

+ +## 功能 + +单输入单输出计算,If x < -lambd, y = x + bias; If x \> lambd, y = x - bias; Otherwise, y = 0. + +## 边界 + +【输入】 + +1个输入 + +data: tensor,数据类型是float16,float + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的shape和dtype + +【属性】 + +bias:float,默认是0.0 + +lambda:float,默认是0.5 + +## 支持的ONNX版本 + +Opset v9/v10/v11/ v12/v13 + +

Selu

+ +## 功能 + +在元素级别使用指数线性单位函数y = gamma \* \(alpha \* e^x - alpha\) for x <= 0, y = gamma \* x for x \> 0 生成张量 + +## 边界 + +【输入】 + +一个输入 + +x:fp16,fp32,double类型的tensor + +两个属性 + +alpha:乘数因子 + +gamma:乘数因子 + +【输出】 + +一个输出 + +y:与输入类型相同的tensor + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Shape

+ +## 功能 + +获取输入tensor的shape + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor + +【输出】 + +y:输入tensor的shape,数据类型为int64的tensor + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sigmoid

+ +## 功能 + +对输入做sigmoid + +## 边界 + +【输入】 + +一个输入 + +x:数据类型支持float16、float32 + +【输出】 + +一个输出 + +y:数据类型和输入x一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Slice

+ +## 功能 + +获取输入tensor的切片 + +## 边界 + +【输入】 + +五个输入 + +x:输入的tensor,数据类型:float16、float32、int32、uint8、bool、int8 + +starts:1Dtensor,int32或者int64,表示开始的索引位置 + +ends:1Dtensor,int32或者int64,表示结束的索引位置 + +axes:可选,1Dtensor,int32或者int64,表示切片的轴,取值范围为\[-r, r-1\](r表示输入数据的秩) + +steps:可选,1Dtensor,int32或者int64,表示切片的步长,最后一个轴的steps取值必须为1 + +【输出】 + +y:切片后的张量数据,数据类型和输入一致 + +【约束】 + +x:输入tensor维度不能为1 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Softmax

+ +## 功能 + +对输入进行softmax + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,类型和shape与输入x一致 + +【属性】 + +axis:Int,可选,表示进行softmax的方向,默认值为-1,范围为\[ -len\(x.shape\), len\(x.shape\)-1\] + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Softsign

+ +## 功能 + +计算输入张量的softsign\(x/\(1+|x|\)\) + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Softplus

+ +## 功能 + +计算softplus + +## 边界 + +【输入】 + +一个输入 + +X:1D的输入张量 + +【输出】 + +一个输出 + +Y:1D的张量 + +【约束】 + +数据类型仅支持float16、float32 + +输入、输出的数据类型一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

SpaceToDepth

+ +## 功能 + +SpaceToDepth将空间数据块重新排列成深度。更具体地说,这个op输出一个输入张量的副本,其中高度和宽度维度的值移动到深度维度。 + +## 边界 + +【输入】 + +input:tensor\(uint8\), tensor\(uint16\), tensor\(uint32\), tensor\(uint64\), tensor\(int8\), tensor\(int16\), tensor\(int32\), tensor\(int64\), tensor\(bfloat16\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(string\), tensor\(bool\), tensor\(complex64\), tensor\(complex128\) + +【输出】 + +output:tensor\(uint8\), tensor\(uint16\), tensor\(uint32\), tensor\(uint64\), tensor\(int8\), tensor\(int16\), tensor\(int32\), tensor\(int64\), tensor\(bfloat16\), tensor\(float16\), tensor\(float\), tensor\(double\), tensor\(string\), tensor\(bool\), tensor\(complex64\), tensor\(complex128\) + +【属性】 + +blocksize: int + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Split

+ +## 功能 + +将输入切分成多个输出 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、int8、int16、int32、int64、uint8、uint16、uint32、uint64 + +【输出】 + +一个输出 + +y:由多个输出tensor组成的列表,每个tensor数据类型和输入x一致 + +【属性】 + +split:list,数据类型:int8、int16、int32、int64,指定每个输出tensor沿着切分方向的大小 + +axis:数据类型:int8、int16、int32、int64,指定切分的方向 + +【约束】 + +split的每个元素必须\>=1 + +split的所有元素之和必须等于axis指定的切分方向的size + +axis在\[ -len\(x.shape\), len\(x.shape\)-1\] 之间 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sqrt

+ +## 功能 + +计算元素的平方根 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor + +【输出】 + +一个输出 + +y:一个tensor + +【约束】 + +输入、输出的数据类型相同,支持的数据类型:float16、float32 + +如果x小于0,返回Nan + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Squeeze

+ +## 功能 + +从输入中去除尺寸为1的维度 + +## 边界 + +【输入】 + +一个输入 + +x:一个张量,数据类型:float16、float32、double、uint8、uint16、uint32、uint64、int8、int16、int32、int64、bool + +【输出】 + +y:一个tensor,数据类型和输入一致 + +【属性】 + +axes:一个数据类型为int32或者int64的整形列表,维度为1;取值范围为\[-r, r-1\](r表示输入张量的秩,负数表示从后面计算维度);含义:指定要去除的维度 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sub

+ +## 功能 + +进行张量的减法运算 + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor + +x2:一个tensor + +【输出】 + +一个输出 + +y:一个张量,数据类型和输入一致 + +【约束】 + +输入、输出的shape和dtype相同,支持的数据类型:int32、float16、float32 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sign

+ +## 功能 + +逐元素计算输入tensor的符号 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sin

+ +## 功能 + +计算输入张量的正弦值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sinh

+ +## 功能 + +计算输入张量双曲正弦值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double + +【输出】 + +一个输出 + +y:一个tensor,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Size

+ +## 功能 + +计算输入tensor的元素个数 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个int64的scalar + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Sum

+ +## 功能 + +求和 + +## 边界 + +【输入】 + +1个输入 + +x:tensor序列,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Tanh

+ +## 功能 + +计算输入的双曲正切值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型与输入一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

TfIdfVectorizer

+ +## 功能 + +将输入文本序列向量化 + +## 边界 + +【输入】 + +1个输入 + +data: tensor,数据类型是int32,int64 + +【输出】 + +一个输出 + +y:一个张量,数据类型是float + +【属性】 + +max\_gram\_length:int,最大n-gram长度 + +max\_skip\_count:int,从data中构造n-gram时最多skip数 + +min\_gram\_length:int,最小n-gram长度 + +mode:string,加权模式。可选为"TF" \(term frequency\), "IDF" \(inverse document frequency\)和"TFIDF" \(the combination of TF and IDF\) + +ngram\_counts:int列表,n-gram池化的开始索引,有助于确认两个连续n-gram边界 + +ngram\_indexes:int列表,第i个元素表示输出tensor中第i个n-gram的坐标 + +pool\_int64s:int列表,不能与pool\_strings同时赋值,表示从训练集学到的n-grams + +pool\_strings:string列表,与pool\_int64s含义一样。 + +weights:float列表,存储每个n-gram的池化权重数值 + +## 支持的ONNX版本 + +Opset v9/v10/v11/ v12/v13 + +

Tile

+ +## 功能 + +将输入张量沿指定维度重复 + +## 边界 + +【输入】 + +两个输入 + +x:一个tensor + +repeats:一个1D的int64的tensor,size和输入的维度数一样 + +【输出】 + +一个输出 + +y:输出的tensor,type和维度与输入一致,output\_dim\[i\] = input\_dim\[i\] \* repeats\[i\] + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

ThresholdedRelu

+ +## 功能 + +当x \> alpha时y = x,否则y=0 + +## 边界 + +【输入】 + +1个输入 + +x:tensor,数据类型:float16、float32 + +【输出】 + +一个输出 + +y:一个张量,和输入x同样的type和shape + +【属性】 + +alpha:float,默认为1.0,含义:阈值 + +## 支持的ONNX版本 + +Opset v10/v11/v12/v13 + +

TopK

+ +## 功能 + +返回指定轴的k个最大或最小值 + +## 边界 + +【输入】 + +2个输入 + +x:tensor,数据类型:float16、float32 + +k:tensor,数据类型:int64 + +【输出】 + +2个输出 + +Values:topk的返回值 + +Indices:topk的返回值索引 + +【属性】 + +axis:int,默认为-1,含义:指定排序的轴 + +largest:int,默认为1,含义:返回k个最大/最小值 + +sorted:int,默认为1,含义:是否升序 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Transpose

+ +## 功能 + +转置 + +## 边界 + +【输入】 + +data:一个张量,数据类型:float16、float32、int8、int16、int32、int64、uint8、uint16、uint32、uint64 + +【输出】 + +transposed:转置之后的张量 + +【属性】 + +perm:必选,整数列表, 张量data的维度排列 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Pad

+ +## 功能 + +对输入tensor做填充 + +## 边界 + +【输入】 + +两个输入 + +x:数据类型支持float16、float32、int32 + +pads:数据类型支持int32 、int64 + +【输出】 + +一个输出 + +y:数据类型和输入x一致 + +【约束】 + +当mode值为constant时,目前仅支持constant\_value=0 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Pow

+ +## 功能 + +计算输入x1的x2次幂 + +## 边界 + +【输入】 + +两个输入 + +x1:一个tensor,数据类型:float16、float32、double、int32、int8、uint8 + +x2:一个tensor,数据类型和输入x1一致 + +【输出】 + +一个输出 + +y:数据类型和输入x1一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Unsqueeze

+ +## 功能 + +在输入张量(数据)的形状中插入一维项 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:uint8、uint16、uint32、int8、int16、int32、float16、float32 + +【输出】 + +一个输出 + +y:一个tensor,数据类型和输入x一致 + +【属性】 + +axes:ListInt,表示在指定的维度进行插1维项,取值范围为\[-input\_rank, input\_rank\],input\_rank为输入张量的秩,axes的内容不可以重复 + +## 支持的ONNX版本 + +Opset v8/v9/10/v11/v12 + +

Xor

+ +## 功能 + +输入张量元素的xor逻辑运算 + +## 边界 + +【输入】 + +两个输入 + +a:一个tensor,数据类型bool + +b:一个tensor,数据类型bool + +【输出】 + +c:一个tensor,数据类型bool + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

Where

+ +## 功能 + +根据条件从两个输入中选择元素 + +## 边界 + +【输入】 + +三个输入 + +condition,条件,数据类型:bool + +x:一个tensor,条件为true时从x中选取元素,数据类型支持float16、float32、int8、int32、uint8 + +y:一个tensor,条件为false时从y中选取元素,和x的数据类型一致 + +【输出】 + +一个tensor,数据类型和输入x一致 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + -- Gitee