diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..631fb006388d13ce7434779428c96a5d39c1ec75 --- /dev/null +++ "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225.md" @@ -0,0 +1,4061 @@ +# ONNX算子规格清单 +- [Abs](#Abs.md) +- [Acos](#Acos.md) +- [Acosh](#Acosh.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) +- [Cast](#Cast.md) +- [Ceil](#Ceil.md) +- [Celu](#Celu.md) +- [Concat](#Concat.md) +- [Clip](#Clip.md) +- [ConvTranspose](#ConvTranspose.md) +- [Cumsum](#Cumsum.md) +- [Conv](#Conv.md) +- [Constant](#Constant.md) +- [ConstantOfShape](#ConstantOfShape.md) +- [Cos](#Cos.md) +- [Cosh](#Cosh.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) +- [Flatten](#Flatten.md) +- [Floor](#Floor.md) +- [Gather](#Gather.md) +- [GatherND](#GatherND.md) +- [GatherElements](#GatherElements.md) +- [Gemm](#Gemm.md) +- [GlobalAveragePool](#GlobalAveragePool.md) +- [GlobalMaxPool](#GlobalMaxPool.md) +- [Greater](#Greater.md) +- [GreaterOrEqual](#GreaterOrEqual.md) +- [Gru](#Gru.md) +- [HardSigmoid](#HardSigmoid.md) +- [hardmax](#hardmax.md) +- [Identity](#Identity.md) +- [If](#If.md) +- [Less](#Less.md) +- [LeakyRelu](#LeakyRelu.md) +- [LessOrEqual](#LessOrEqual.md) +- [Log](#Log.md) +- [LogSoftMax](#LogSoftMax.md) +- [LpNormalization](#LpNormalization.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) +- [randomUniform](#randomUniform.md) +- [Range](#Range.md) +- [Reciprocal](#Reciprocal.md) +- [ReduceL1](#ReduceL1.md) +- [ReduceL2](#ReduceL2.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) +- [ScatterND](#ScatterND.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) +- [Tile](#Tile.md) +- [ThresholdedRelu](#ThresholdedRelu.md) +- [TopK](#TopK.md) +- [Transpose](#Transpose.md) +- [pad](#pad.md) +- [Pow](#Pow.md) +- [Unsqueeze](#Unsqueeze.md) +- [Where](#Where.md) +

Abs

+ +## 功能 + +对输入张量取绝对值 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、double、int8、int16、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 v8/v9/v10/v11/v12/v13 + +

AdaptiveMaxPool2D

+ +## 功能 + +对输入进行2d自适应最大池化计算 + +## 边界 + +【输入】 + +一个输入 + +x:一个tensor,数据类型:float16、float32、float64等 + +【属性】 + +一个属性: + +output\_size:int型数组,指定输出的hw的shape大小 + +【输出】 + +两个输出 + +y:一个tensor,数据类型:与x类型一致 + +argmax:一个tensor,数据类型:int + +## 支持的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

+ +## 功能 + +元素级计算\(x2 \* x3\) \* value + input\_data + +## 边界 + +【输入】 + +四个输入 + +input\_data:一个tensor,数据类型:float16、float32、int32、int8、uint8 + +x1: 一个tensor,类型与inpu\_data相同 + +x2: 一个tensor,类型与inpu\_data相同 + +value: 一个tensor,类型与inpu\_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:一个tenso,数据类型和shape与输入一致 + +## 支持的ONNX版本 + +Opset v8/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 v8/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时,会走aicpu芯片,性能会下降; + +kernel\_shape\_H或kernel\_shape\_W取值超过\[1,255\],或者ksizeH \* ksizeW \> 256时,也会走aicpu,导致性能下降; + +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版本 + +

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 v8/v9/v10/v11/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 + +

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 + +

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:可选输入,类型:布尔型 + +【输出】 + +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 + +

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:布尔型,是否A需要转置 + +transB:布尔型,是否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 + +

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 + +

Gru

+ +## 功能 + +计算单层GRU + +## 边界 + +【输入】 + +3-6个输入 + +X: 类型:float16, float32, double, int32, int64等 + +W: + +R: + +B: + +sequence\_lens: + +initial\_h: + +【输出】 + +0-2个输出 + +Y: + +Y\_h: + +【属性】 + +activation\_alpha: + +activation\_beta: + +activations: + +clip: + +direction: + +hidden\_size: + +layout: + +linear\_before\_reset: + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

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,含义:指定计算轴 + +## 支持的ONNX版本 + +Opset v8/v9/v10/v11/v12/v13 + +

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 + +

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 + +## 支持的ONNX版本 + +Opset v1/v8/v9/v10/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维输入 + +只支持ND和2D的矩阵乘 + +## 支持的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时,会走aicpu芯片,性能会下降; + +kernel\_shape\_H或kernel\_shape\_W取值超过\[1,255\],或者ksizeH \* ksizeW \> 256时,也会走aicpu,导致性能下降; + +1 <= input\_w <= 4096 + +当输入张量的N是一个质数时,N应小于65535 + +2D tensor输入不支持dilations + +auto\_pad属性是VALID时,ceil\_mode属性值必须为0 + +## 支持的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\), tensor\(double\) + +rois:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【输出】 + +Y:,类型:tensor\(float16\), tensor\(float\), tensor\(double\) + +【属性】 + +pooled\_shape: list of ints + +spatial\_scale: float,默认值:1.0 + +【约束】 + +不支持fp64输入 + +不支持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或gatherd操作获得与所选索引对应的边框坐标。 + +## 边界 + +【输入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,数据类型:float16、float32、int32、int8等 + +depth:一个tensor,数据类型:float16、float32、int32、int8等 + +valus:一个tensor,数据类型:float16、float32、int32、int8等 + +【属性】 + +一个属性 + +axis:(可选)添加一热表示的轴 + +【输出】 + +一个输出 + +y:一个tensor,数据类型与value输入的类型一致 + +【约束】 + +算子属性不支持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 + +

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

+ +## 功能 + +将输入张量取倒数 + +## 边界 + +【输入】 + +一个输入 + +lx:一个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 + +

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 + +

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 + +

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 + +

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 + +

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 + diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-caution.gif" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-caution.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-caution.gif" differ diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-danger.gif" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-danger.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-danger.gif" differ diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-note.gif" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-note.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-note.gif" differ diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-notice.gif" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-notice.gif" new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-notice.gif" differ diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-tip.gif" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-tip.gif" new file mode 100644 index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7 Binary files /dev/null and "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-tip.gif" differ diff --git "a/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-warning.gif" "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-warning.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/CANN 5.0.2 \346\224\257\346\214\201ONNX\347\256\227\345\255\220\346\270\205\345\215\225/public_sys-resources/icon-warning.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01.md" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01.md" new file mode 100644 index 0000000000000000000000000000000000000000..03b1254f10b0daefa84714b2e62a1dcf83a9053d --- /dev/null +++ "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01.md" @@ -0,0 +1,1316 @@ +# PyTorch算子开发指南 +- [简介](#简介.md) +- [算子开发流程](#算子开发流程.md) +- [算子开发准备](#算子开发准备.md) + - [环境准备](#环境准备.md) + - [算子速查](#算子速查.md) +- [算子适配开发](#算子适配开发.md) + - [前提条件](#前提条件.md) + - [获取PyTorch源码](#获取PyTorch源码.md) + - [注册算子开发](#注册算子开发.md) + - [算子适配开发](#算子适配开发-0.md) + - [编译安装PyTorch框架](#编译安装PyTorch框架.md) +- [算子功能验证](#算子功能验证.md) + - [概述](#概述.md) + - [实现过程](#实现过程.md) +- [FAQ](#FAQ.md) + - [Pillow==5.3.0安装失败](#Pillow-5-3-0安装失败.md) + - [pip3.7 install torchvision安装失败](#pip3-7-install-torchvision安装失败.md) + - [安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md) + - [执行算子功能验证用例,结果成功,但会报一个错误“THPModule\_npu\_shutdown failed.”](#执行算子功能验证用例-结果成功-但会报一个错误-THPModule_npu_shutdown-failed.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) + - [PyTorch编译失败,提示“error: call of overload ....”](#PyTorch编译失败-提示-error-call-of-overload.md) +- [附录](#附录.md) + - [CMake安装方法](#CMake安装方法.md) + - [自定义算子导出方法](#自定义算子导出方法.md) +

简介

+ +## 概述 + +用户通过完成TBE自定义算子适配PyTorch框架,实现PyTorch框架中算子在昇腾AI处理器上运行。 + +

算子开发流程

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

序号

+

步骤

+

描述

+

参考

+

1

+

环境准备

+

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

+

算子开发准备

+

2

+

算子速查

+

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

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

3

+

获取PyTorch源码

+

获取昇腾社区PyTorch源码。

+

算子适配开发

+

+

+

+

4

+

注册算子开发

+

将算子分发到昇腾AI处理器。

+

5

+

算子适配层开发

+

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

+

6

+

编译安装PyTorch框架

+

编译适配开发后的Pytorch源码,并安装编译的源码包。

+

7

+

算子验证

+

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

+

算子功能验证

+
+ +

算子开发准备

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

环境准备

+ +## 前提条件 + +- 已完成CANN开发或运行环境的安装,具体操作请参考《CANN 软件安装指南](https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373)》。 +- 需安装3.12.0以上版本的CMake,安装方法请参考[CMake安装方法](#CMake安装方法.md)。 +- 需确保已安装7.3.0以上版本的gcc,7.3.0版本gcc具体安装及使用方式请参见《CANN 软件安装指南](https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373)》中的“安装7.3.0版本gcc”章节。 +- 需确保环境中已安装git工具,以Ubuntu和CentOS系统为例,命令如下: + - Ubuntu系统 + + **apt-get install git** + + - CentOS系统 + + **yum install git** + + + +## 安装PyTorch依赖环境 + +如果使用非root用户安装Python及其依赖,用户需要在每句命令结尾加上**--user**,保证安装的正常进行。命令示例为:**pip3.7 install pyyaml --user** + +``` +pip3.7 install pyyaml +pip3.7 install wheel +pip3.7 install Pillow==5.3.0 +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>若以上过程出错,请参考[FAQ](#FAQ.md)尝试解决问题。 + +

算子速查

+ +进行算子开发时,您可以查询当前昇腾AI处理器中支持的算子列表和当前PyTorch适配的算子列表。根据查询结果进行算子开发或PyTorch算子适配。 + +- 当前昇腾AI处理器中支持的算子以及对应的算子约束可以通过以下两种方式查询。 + - 命令行开发方式下,您可以参见《CANN 算子清单 \(Ascend 910\)](https://support.huawei.com/enterprise/zh/doc/EDOC1100191920)》进行离线查询。 + - MindStudio开发方式下,您可以通过MindStudio进行在线查询,详细查看方法可参见《MindStudio 用户指南](https://support.huaweicloud.com/mindstudio301/index.html)》中的“算子&模型速查”章节。 + +- 当前PyTorch适配的算子列表可以参见《PyTorch适配算子清单](https://support.huawei.com/enterprise/zh/doc/EDOC1100191773)》 + +

算子适配开发

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

前提条件

+ +1. 完成开发及运行环境准备及相关依赖的安装,详情请参见[环境准备](#zh-cn_topic_0000001125736787.md)。 +2. 完成相关的TBE算子开发及部署,详情请参见《CANN TBE自定义算子开发指南](https://support.huawei.com/enterprise/zh/doc/EDOC1100191916)》。 + +

获取PyTorch源码

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

注册算子开发

+ +## 概述 + +当前制定的NPU适配派发原则是NPU算子的派发不经过框架公共函数,直接派发成NPU适配的函数,即算子执行调用栈中只包含NPU适配的函数调用,不包含框架公共函数。PyTorch框架在编译时,会根据 native\_functions.yaml 的定义,按框架中定义的类型和设备分发原则,生成相应的新算子的中间层的调用说明。对于NPU,会生成在 build/aten/src/ATen/NPUType.cpp。 + +## 注册算子开发方法 + +1. 打开native\_functions.yaml文件。 + + native\_functions.yaml 文件中,定义了所有算子函数原型,包括函数名称和参数等信息,每个算子函数支持不同硬件平台的派发信息。该文件所在路径为pytorch/aten/src/ATen/native/native\_functions.yaml。 + +2. 确定需要派发函数。 + - yaml 中已存在的算子 + + 将所有与待适配算子相关的函数进行派发。 + + - yaml中未存在的自定义算子 + + 由于yaml中没有相关算子的信息,需要手动添加相关函数,包括函数名,参数信息,返回类型信息。 + + ``` + - func:适配算子名称(输入参数信息) -> 返回类型 + ``` + + +3. 修改native\_functions.yaml文件,添加实现该算子相关函数的分发描述。 + + yaml 文件编写规范: + + - yaml 中原有的算子函数适配使用 “npu\_dispatch”关键字; + + ``` + npu_dispatch: + NPU: NPU_Adapt_Fun_Name + ``` + + - yaml 中新增昇腾AI处理器自定义算子函数适配使用“npu\_dispatch\_only”关键字; + + ``` + npu_dispatch_only: + NPU: NPU_Adapt_Fun_Name + ``` + + + >![](public_sys-resources/icon-note.gif) **说明:** + >NPU\_Adapt\_Fun\_Name的格式为 : + >- 如果原Fun\_Name无"\_"后缀,则格式:Fun\_Name + "\_" + "npu",如:add --\> add\_npu。 + >- 如果原Fun\_Name有"\_"后缀,则格式:Fun\_Name + "npu\_",如:add\_ --\> add\_npu\_。 + >该格式供参考,算子适配开发过程中的函数名需与NPU\_Adapt\_Fun\_Name保持一致。 + + +## 示例 + +以torch.add\(\)算子为例介绍注册算子开发过程。 + +1. 打开native\_functions.yaml文件。 +2. 确定相关函数 + + 在yaml中搜索add,找到与add算子相关的函数。 + +3. 添加分发描述。 + 1. add.Tensor 的函数分发描述。 + + ``` + - func: add.Tensor(Tensor self, Tensor other, *, Scalar alpha=1) -> Tensor + use_c10_dispatcher: full + variants: function, method + dispatch: + CPU: add + CUDA: add + SparseCPU: add_sparse + SparseCUDA: add_sparse + MkldnnCPU: mkldnn_add + # 增加分发描述 + npu_dispatch: + NPU: add_npu + supports_named_tensor: True + ``` + + 2. add.Scalar 的函数分发描述。 + + ``` + - func: add.Scalar(Tensor self, Scalar other, Scalar alpha=1) -> Tensor + use_c10_dispatcher: full + variants: function, method + supports_named_tensor: True + # 增加分发描述 + npu_dispatch: + NPU: add_npu + ``` + + 3. add\_.Tensor 的函数分发描述。 + + ``` + - func: add_.Tensor(Tensor(a!) self, Tensor other, *, Scalar alpha=1) -> Tensor(a!) + variants: method + dispatch: + CPU: add_ + CUDA: add_ + SparseCPU: add_sparse_ + SparseCUDA: add_sparse_ + MkldnnCPU: mkldnn_add_ + # 增加分发描述 + npu_dispatch: + NPU: add_npu_ + supports_named_tensor: True + ``` + + 4. add\_.Scalar 的函数分发描述。 + + ``` + - func: add_.Scalar(Tensor(a!) self, Scalar other, Scalar alpha=1) -> Tensor(a!) + variants: method + supports_named_tensor: True + # 增加分发描述 + npu_dispatch: + NPU: add_npu_ + ``` + + 5. add.out 的函数分发描述。 + + ``` + - func: add.out(Tensor self, Tensor other, *, Scalar alpha=1, Tensor(a!) out) -> Tensor(a!) + dispatch: + CPU: add_out + CUDA: add_out + SparseCPU: add_out_sparse_cpu + SparseCUDA: add_out_sparse_cuda + MkldnnCPU: mkldnn_add_out + # 增加分发描述 + npu_dispatch: + NPU: add_out_npu + supports_named_tensor: True + ``` + + + +

算子适配开发

+ +## 简介 + +用户通过开发算子适配插件,实现PyTorch原生算子的输入参数、输出参数和属性的格式转换,使转换后的格式与TBE算子的输入参数、输出参数和属性的格式相同。适配昇腾AI处理器的PyTorch源代码中提供了适配关联、类型转换和判别、处理动态shape等相关的方法供用户使用。 + +## 适配插件实现 + +1. 创建适配插件文件 + + NPU TBE算子适配文件保存在pytorch/aten/src/ATen/native/npu目录下,命名风格采用大驼峰,命名格式:<算子名\> + .cpp,如:AddKernelNpu.cpp。 + +2. 引入依赖头文件 + + 适配昇腾AI处理器的PyTorch源代码在ATen/native/npu/utils中提供适配常用的工具供用户使用。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >工具的功能和使用方法,可查看头文件和源码获得。 + +3. 定义算子适配主体函数。 + + 根据注册算子开发中的分发函数确定自定义算子适配主题函数。 + +4. 分别实现适配主体函数。 + + 实现算子适配主题函数,根据TBE算子原型构造得到对应的input、output、attr。 + + +## 示例 + +以torch.add\(\)算子为例介绍算子适配开发过程。 + +1. 创建适配插件文件 + + 在pytorch/aten/src/ATen/native/npu目录下创建AddKernelNpu.cpp适配文件 + +2. 引入依赖头文件 + + ``` + #include + #include "ATen/native/npu/utils/CalcuOpUtil.h" + #include "ATen/native/npu/utils/OpAdapter.h" + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >" OptionsManager.h"中主要包含类型动态shape相关的函数。 + >" CalcuOpUtil.h "中主要包含类型转换和判别的函数。 + >" OpAdapter.h"文件中主要包含适配关联的头文件。 + +3. 定义算子适配主体函数。 + + ``` + Tensor add_npu(const Tensor& self, const Tensor& other, Scalar alpha) + Tensor add_npu(const Tensor& self, Scalar other, Scalar alpha) + Tensor& add_npu_(Tensor& self, const Tensor& other, Scalar alpha) + Tensor& add_npu_(Tensor& self, Scalar other, Scalar alpha) + Tensor& add_out_npu(Tensor& result, const Tensor& self, const Tensor& other, Scalar alpha) + ``` + +4. 分别实现适配主体函数。 + 1. add\_npu实现 + + ``` + // 输入参数为Tensor和Tensor时 + Tensor add_npu(const Tensor& self, const Tensor& other, Scalar alpha) { + alpha_check_npu(self.scalar_type(), alpha); + if ((!(self.is_contiguous() && other.is_contiguous())) && + (NpuUtils::check_5d_5d_match(self) || + NpuUtils::check_5d_5d_match(other)) && + check_size(self, other)) { + int64_t c0_len = 16; + Tensor self_use = stride_add_tensor_get(self); + Scalar self_c1_offset( + self.storage_offset() / (self.size(2) * self.size(3) * c0_len)); + Tensor other_use = stride_add_tensor_get(other); + Scalar other_c1_offset( + other.storage_offset() / (other.size(2) * other.size(3) * c0_len)); + Scalar stride_len(self.size(1) / c0_len); + Tensor result = at::npu_stride_add( + self_use, other_use, self_c1_offset, other_c1_offset, stride_len); + return result; + } + // calculate the output size + Tensor outputTensor = add_dest_output(self, other); + auto outputSize = broadcast_ops_npu_output_size(self, other); + + // construct the output tensor of the NPU + Tensor result = at::empty_with_format( + outputSize, + outputTensor.options(), + CalcuOpUtil::get_tensor_npu_format(outputTensor)); + + // calculate the output result of the NPU + add_out_npu_nocheck(result, self, other, alpha); + + return result; + } + + // 输入参数为Tensor和Scalar时 + Tensor add_npu(const Tensor& self, Scalar other, Scalar alpha) { + alpha_check_npu(self.scalar_type(), alpha); + // calculate the output size + auto outputSize = input_same_output_size(self); + // construct the output tensor of the NPU + Tensor result = at::empty_with_format( + outputSize, self.options(), CalcuOpUtil::get_tensor_npu_format(self)); + + // calculate the output result of the NPU + adds_out_npu_nocheck(result, self, other, alpha); + + return result; + } + + ``` + + 2. add\_npu\_实现(就地操作场景,返回值为self) + + ``` + // 输入参数为Tensor和Tensor时 + Tensor& add_npu_(Tensor& self, const Tensor& other, Scalar alpha) { + SmallVector inputs = {self, other}; + SmallVector outputs = {self}; + CalcuOpUtil::check_memory_over_laps(inputs, outputs); + + if (!NpuUtils::check_match(&self)) { + Tensor contiguousSelf = NpuUtils::format_contiguous(self); + Tensor result = add_out_npu_nocheck(contiguousSelf, contiguousSelf, other, alpha); + NpuUtils::format_fresh_view(self, result); + } else { + add_out_npu_nocheck(self, self, other, alpha); + } + + return self; + } + + // 输入参数为Tensor和Scalar时 + Tensor& add_npu_(Tensor& self, Scalar other, Scalar alpha) { + if (!NpuUtils::check_match(&self)) { + Tensor contiguousSelf = NpuUtils::format_contiguous(self); + Tensor result = adds_out_npu_nocheck(contiguousSelf, contiguousSelf, other, alpha); + NpuUtils::format_fresh_view(self, result); + } else { + adds_out_npu_nocheck(self, self, other, alpha); + } + + return self; + } + + ``` + + 3. add\_out\_npu实现(输入参数result为返回值场景) + + ``` + Tensor& add_out_npu( + Tensor& result, + const Tensor& self, + const Tensor& other, + Scalar alpha) { + bool isSelfWrapped = CalcuOpUtil::is_scalar_wrapped_to_tensor(self); + + Tensor outputTensor; + if (not isSelfWrapped) { + outputTensor = self; + } else { + outputTensor = other; + } + auto outputSize = broadcast_ops_npu_output_size(self, other); + OpPreparation::CheckOut( + {self}, + result, + CalcuOpUtil::get_tensor_npu_format(result), + outputTensor.scalar_type(), + outputSize); + + OpPipeWithDefinedOut pipe; + return pipe.CheckMemory({self, other}, {result}) + .Func([&self, &other, &alpha](Tensor& result){add_out_npu_nocheck(result, self, other, alpha);}) + .Call(result); + } + ``` + + + +>![](public_sys-resources/icon-note.gif) **说明:** +>AddKernelNpu.cpp的详细实现代码请参见pytorch/aten/src/ATen/native/npu/AddKernelNpu.cpp文档。 + +

编译安装PyTorch框架

+ +## 编译PyTorch框架 + +1. 进入PyTorch工作目录 :“pytorch“。 +2. 给脚本文件赋权限: + + **chmod +x build.sh** + +3. 执行如下命令进行编译: + + **./build.sh** + +4. 编译成功后,会在“**pytorch/dist**” 下会生成 torch-\*.whl 包,例如:torch-1.5.0a0-cp37-cp37m-linux\_x86.whl + +>![](public_sys-resources/icon-note.gif) **说明:** +>首次编译持续的时间较长,可能超过30分钟,建议:若无必要,无需执行"make clean"。 + +## 安装PyTorch框架 + +1. 将[编译安装PyTorch框架](#编译安装PyTorch框架.md)生成的torch-\*.whl包上传到服务器任一路径。 +2. 进入torch-\*.whl 所在的目录,使用pip命令完成torch安装。 + + 当前登录用户为root用户时,执行: + + ``` + pip3.7.5 install torch-*.whl + ``` + + 当前登录用户为非root用户时,执行: + + ``` + pip3.7.5 install torch-*.whl --user + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>1. 修改代码之后,需要重新执行“编译”和“安装”PyTorch过程。 +>2. 安装过程中,可能会出现错误提示"torchvision 0.6.0" 版本不匹配,此问题无影响,忽略即可。 + +

算子功能验证

+ +- **[概述](#概述.md)** + +- **[实现过程](#实现过程.md)** + + +

概述

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

实现过程

+ +## 简介 + +本章通过具体例子,完成PyTorch算子的功能测试步骤。 + +## 操作步骤 + +1. 设置环境变量。 + + ``` + export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest + export PATH={install_path}/fwkacllib/ccec_compiler/bin:{install_path}/fwkacllib/bin:{install_path}/toolkit/bin:$PATH + export LD_LIBRARY_PATH={install_path}/fwkacllib/lib64:$LD_LIBRARY_PATH + export PYTHONPATH={install_path}/fwkacllib/python/site-packages:{install_path}/toolkit/python/site-packages:$PYTHONPATH + export ASCEND_OPP_PATH={install_path}/opp/ + export ASCEND_AICPU_PATH={install_path}/x86_64-linux/ + ``` + + install\_path请修改为Toolkit的实际安装路径。 + +2. 编写测试脚本。以add算子为例,在“pytorch/test/test\_npu/test\_network\_ops“路径下编写测试脚本文件: testcase\_add.py。 + + 以下示例仅为一个简单的用例实现供用户参考,具体测试用例的实现,需要根据算子定义进行完整的覆盖才能保证功能的基本正确。 + + ``` + # 引入依赖库 + import sys + sys.path.append('..') + import torch + import numpy as np + from common_utils import TestCase, run_tests + from common_device_type import dtypes, instantiate_device_type_tests + from util_test import create_common_tensor + + # 定义add测试用例类 + class TestAdd(TestCase): + + # 定义CPU和NPU add执行的函数 + def cpu_op_exec(self, input1, input2): + output = torch.add(input1, input2, alpha = 1) + output = output.numpy() + return output + def npu_op_exec_new(self, input1, input2): + output = torch.add(input1, input2, alpha = 1) + output = output.to("cpu") + output = output.numpy() + return output + + # 定义add对应场景通用函数,该函数中负责场景对应输入数据和对比CPU和NPU返回结果 + def add_result(self, shape_format): + for item in shape_format: + cpu_input1, npu_input1 = create_common_tensor(item, 0, 100) + cpu_input2, npu_input2 = create_common_tensor(item, 0, 100) + if cpu_input1.dtype == torch.float16: + cpu_input1 = cpu_input1.to(torch.float32) + cpu_input2 = cpu_input2.to(torch.float32) + cpu_output = self.cpu_op_exec(cpu_input1, cpu_input2) + npu_output = self.npu_op_exec_new(npu_input1, npu_input2) + cpu_output = cpu_output.astype(npu_output.dtype) + self.assertRtolEqual(cpu_output, npu_output) + + # 定义具体add场景的测试用例,用例函数需要以test_开头 + def test_add_shape_format_fp32_2d(self, device): + 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") + if __name__ == "__main__": + torch.npu.set_device("npu:0") + run_tests() + + + ``` + +3. 执行测试用例脚本 + + 进入add\_testcase.py所在的目录,执行: + + ``` + python3.7.5 testcase_add.py + ``` + + +

FAQ

+ +- **[Pillow==5.3.0安装失败](#Pillow-5-3-0安装失败.md)** + +- **[pip3.7 install torchvision安装失败](#pip3-7-install-torchvision安装失败.md)** + +- **[安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md)** + +- **[执行算子功能验证用例,结果成功,但会报一个错误“THPModule\_npu\_shutdown failed.”](#执行算子功能验证用例-结果成功-但会报一个错误-THPModule_npu_shutdown-failed.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)** + +- **[PyTorch编译失败,提示“error: call of overload ....”](#PyTorch编译失败-提示-error-call-of-overload.md)** + + +

Pillow==5.3.0安装失败

+ +## 现象描述 + +pillow==5.3.0安装失败。 + +## 可能原因 + +缺少必要的依赖,如:libjpeg、python-devel、 zlib-devel 、libjpeg-turbo-devel等等。 + +## 处理方法 + +apt-get install libjpeg python-devel zlib-devel libjpeg-turbo-devel。 + +

pip3.7 install torchvision安装失败

+ +## 现象描述 + +pip3.7 install torchvision安装失败。 + +## 可能原因 + +torch与torchvision版本不匹配。 + +## 处理方法 + +pip3.7 install torchvision --no-deps + +

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

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

执行算子功能验证用例,结果成功,但会报一个错误“THPModule\_npu\_shutdown failed.”

+ +## 现象描述 + +执行算子功能验证用例,结果成功,但会报一个错误“THPModule\_npu\_shutdown failed.”。 + +![](figures/zh-cn_image_0000001173046107.png) + +## 可能原因 + +可能是框架影响,待进一步定位 。 + +## 处理方法 + +对实际结果无影响,无需处理,忽略此问题。 + +

如何查看测试的运行日志

+ +测试运行过程提示错误,但直接可参考的信息太少,如何才能看到更详细的运行日志? + +方式一:直接查看运行日志 + +1. 进入 "/var/log/npu"目录 + + 在此目录下,对于算子功能测试运行,主要的涉及日志路径为“oplog”和“slog”,建议优先查看“oplog”中的日志,这里记录了算子运行过程中的关键信息;slog下的日志记录系统的运行过程及异常信息,具体日志信息内容,参考[日志文件](https://support.huaweicloud.com/lr-A800_9000_9010/atlaslog_24_0003.html)描述。 + +2. 进入对应的日志目录,使用vi等工具打开最新的日志文件,进行日志查看。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >以“/var/log/npu/oplog”为例,"vi oplog.log",可以查看到很多日志信息。但由于可能存在很多开发者同时操作设备进行测试,所有会包含其他开发者的运行日志信息,需要开发者通过“时间”等信息,识别出相关的日志。建议使用“方式二” + + +方式二:设置日志输出到屏幕,重定向到指定文本文件 + +1. 设置环境变量,将当前用户的日志到屏幕。 + + ``` + export SLOG_PRINT_TO_STDOUT=1 + ``` + + 设置完成后,直接运行测试用例,就可以将相关的日志输出到屏幕,为了方便查看和回溯,建议根据需要使用[2](#zh-cn_topic_0000001125315889_li168732325719)运行。 + +2. 运行测试用例时,将日志重定向到指定文件。 + + ``` + python3.7.5 add_testcase.py > test_log.txt + ``` + + +

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

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

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

+ +## 现象描述 + +完成“自定义TBE算子”开发,和“PyTorch”适配开发,但执行测试用例,发现无法调用到新开发的算子。 + +## 可能原因 + +1. 环境变量没有正确设置; +2. yaml存在错误,导致没有正确分发; +3. 自定义TBE算子实现存在问题,导致无法调用到。 + +## 处理方法 + +1. 参考“[算子功能验证](#算子功能验证.md)”章节,完成运行环境设置,特别注意: + + ``` + export ASCEND_OPP_PATH=~/.local/Ascend/opp + export CUSTOM_OP_LIB_PATH=~/.local/Ascend/opp/framework/custom/tensorflow + ``` + +2. 检查yaml文件中对应算子的分发配置,是否正确的完整分发; +3. 分析排查代码实现,建议手段: + 1. 修改"pytorch"中的算子适配实现,让"add\_testcase.py"可以调用到“自定义算子包”中的TBE算子; + + "pytorch/aten/src/ATen/native/npu/AddKernelNpu.cpp" + + ![](figures/zh-cn_image_0000001126846510.png) + + 2. 修改"cann"中的"add"算子实现\(建议此时不要包含新开发的“自定义TBE算子”,方便对比\),在算子入口增加日志打印,作为运行标识; + + "cann/ops/contrib/ops/custom/tbe/impl/add.py" + + 3. 完成上两步的编译、安装,调用"python3.7.5 add\_testcase.py"进行测试; + + ``` + cd 至"add_testcase.py" 所在路径,调用 + add_testcase.py + 进行测试 + ``` + + 至此步骤,不应该有错误,屏幕应该输出 "add" 中增加的日志打印。若出错,请完成代码清理排查,保证无新开发的代码影响测试。 + + 4. 将新开发的“自定义TBE算子”合并到"cann"中,在对应的在算子入口增加日志打印,作为运行标识; + 5. 完成上面的"cann"编译、安装,调用"python3.7.5 add\_testcase.py"进行测试; + + >![](public_sys-resources/icon-note.gif) **说明:** + >1、背景知识:根据Ascend的设计逻辑,用户开发安装的“custom”算子包优先级高于“built-in”的内置算子包,在运行加载时,会优先加载调度“custom”包中的算子。过程中,若解析“custom”中的算子信息文件失败,则会跳过“custom”算子包,不加载调度任何“custom”算子包中的任何算子。 + >2、若此步骤出错,或屏幕未输出 "add" 中增加的日志打印,则说明新开发的“自定义TBE算子”有错误,影响了“自定义算子包”的加载,建议**优先排查新开发的“自定义TBE算子”中的“算子信息定义”是否正确**。 + >3、若此步骤正确,至少说明 **新开发的“自定义TBE算子”中的“算子信息定义”不影响运行**。 + + 6. 调用"python3.7.5 xxx\_testcase.py"进行测试; + + >![](public_sys-resources/icon-note.gif) **说明:** + >1、若屏幕正常输出新开发的“自定义TBE算子”中增加的日志打印,则至少说明调度到了新开发的算子。 + >2、若屏幕未输出新开发的“自定义TBE算子”中增加的日志打印,则问题可能出现在"PyTorch适配"中,需要排查这一部分的实现代码,较多的可能会出现在“XxxxKernelNpu.cpp”中的输入、输出未能正确适配。 + + + +

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

+ +不管是“custom”算子,还是“built-in”算子,在安装后,都是以\*.py源码的方式存放在安装目录下,所以我们可以通过编辑源码,在API入口增加日志的方式,打印输出入参,确定输入的参数是否正确。 + +>![](public_sys-resources/icon-caution.gif) **注意:** +>该操作存在风险,建议在操作前备份计划修改的文件。若未备份,损坏后无法恢复,请及时联系支持人员。 + +下面以"built-in"算子中的"zn\_2\_nchw"算子为例: + +1. 打开安装在用户目录下的算子包安装目录 + + ``` + cd ~/.local/Ascend/opp/op_impl/built-in/ai_core/tbe/impl + ll + ``` + + 可以看到相应的算子\*.py源码文件均为“只读”,即此时不可编辑。 + + ![](figures/zh-cn_image_0000001127006336.png) + +2. 修改算子\*.py源码文件属性,增加“可写”权限。 + + ``` + sudo chmod +w zn_2_nchw.py + ll + ``` + + ![](figures/zh-cn_image_0000001172886191.png) + +3. 打开算子\*.py源码文件,增加日志,保存退出。 + + ``` + vi zn_2_nchw.py + ``` + + ![](figures/zh-cn_image_0000001173046109.png) + + 上面例子只加了个标识,实际调测时,可以增加打印输入参数信息。 + +4. 调用脚本执行测试用例,通过打印日志分析“输入参数信息”。 +5. 完成测试分析后,重新打开算子\*.py源码文件,删除增加的日志,保存退出。 +6. 修改算子\*.py源码文件属性,删除“可写”权限。 + + ``` + sudo chmod -w zn_2_nchw.py + ``` + + ![](figures/zh-cn_image_0000001126846512.png) + + +

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

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

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

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

附录

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

CMake安装方法

+ +CMake版本升级为3.12.1的方法 + +1. 获取Cmake软件包。 + + ``` + wget https://cmake.org/files/v3.12/cmake-3.12.1.tar.gz --no-check-certificate + ``` + +2. 解压并进入软件包目录。 + + ``` + tar -xf cmake-3.12.1.tar.gz + cd cmake-3.12.1/ + ``` + +3. 执行配置、编译和安装命令。 + + ``` + ./configure --prefix=/usr/local/cmake + make && make install + ``` + +4. 设置软连接。 + + ``` + ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake + ``` + +5. 执行如下命令验证是否安装成功。 + + ``` + cmake --version + ``` + + 如显示“cmake version 3.12.1”则表示安装成功。 + + +

自定义算子导出方法

+ +## 简介 + +PyTorch训练模型中包含自定义算子,将自定义算子导出成onnx单算子模型,方便转移到其他AI框架中使用。自定义算子导出有三种形式,适配NPU的TBE算子导出、C++算子导出、纯Python算子导出。 + +## 前提条件 + +安装PyTorch框架。 + +## TBE算子导出 + +TBE算子导出有两种方式。 + +第一种方式。 + +1. 定义和注册算子 + + ``` + # 定义算子 + @parse_args('v', 'v', 'f', 'i', 'i', 'i', 'i') + def symbolic_npu_roi_align(g, input, rois, spatial_scale, pooled_height, pooled_width, sample_num, roi_end_mode): + args = [input, rois] + kwargs = {"spatial_scale_f": spatial_scale, + "pooled_height_i": pooled_height, + "pooled_width_i": pooled_width, + "sample_num_i": sample_num, + "roi_end_mode_i": roi_end_mode} + + return g.op('torch::npu_roi_align',*args, **kwargs) + + # 注册算子 + import torch.onnx.symbolic_registry as sym_registry + def register_onnx_sym_npu_roi_align(): + sym_registry.register_op('npu_roi_align', symbolic_npu_roi_align, '', 11) + + register_onnx_sym_npu_roi_align() + ``` + +2. 自定义模型 + + ``` + # 定义模型 + class CustomModel_npu_op(torch.nn.Module): + def __init__(self,a,b): + super(CustomModel_npu_op, self).__init__() + + self.weight = Parameter(torch.Tensor(8,10,1024)) + init.kaiming_uniform_(self.weight, a=math.sqrt(5)) + + def forward(self, a, b, d): + spatial_scale=d[0].item() + pooled_height=d[1].item() + pooled_width=d[2].item() + sample_num=d[3].item() + roi_end_mode=d[4].item() + rtn = torch.npu_roi_align(a, self.weight, spatial_scale, pooled_height, pooled_width, sample_num,roi_end_mode) + + return rtn + ``` + +3. 导出onnx + + ``` + # 定义导出函数 + def do_export(model, inputs, f, *args, **kwargs): + out = torch.onnx._export(model, inputs, f, verbose=True, export_params=True, do_constant_folding=True,*args, **kwargs) + + # 初始化输入 + """ + 实现模型输入参数a,b,h1初始化,此处忽略,请参考详细代码。 + """ + + # 导出onnx + model = CustomModel_npu_op(a,b) + model = model.npu() + model.eval() + do_export(model, (a, b, h1), f, input_names=["intput"]+["","","","","","","npu_roi_align.weight"],opset_version=11) + ``` + + +第二种方式。 + +1. 定义方法类 + + ``` + # 实现算子方法类及符号导出实现的方法 + class CustomClassOp_Func_npu_roi_align(Function): + @staticmethod + def forward(ctx, input, rois, spatial_scale, pooled_height, pooled_width , sample_num, roi_end_mode): + rtn = torch.npu_roi_align(input, rois, spatial_scale, pooled_height, pooled_width, sample_num, roi_end_mode) + return rtn + + @staticmethod + def symbolic(g, input, rois, spatial_scale, pooled_height, pooled_width , sample_num, roi_end_mode): + args = [input, rois] + kwargs = {"spatial_scale_f": spatial_scale, + "pooled_height_i": pooled_height, + "pooled_width_i": pooled_width, + "sample_num_i": sample_num, + "roi_end_mode_i": roi_end_mode} + return g.op('torch::npu_roi_align',*args, **kwargs) + ``` + +2. 自定义算子模型 + + ``` + # 实现算子模型 + class NpuOp_npu_roi_align_Module(torch.nn.Module): + def __init__(self): + super(NpuOp_npu_roi_align_Module, self).__init__() + + self.spatial_scale = torch.randn(10, dtype=torch.float32, requires_grad=False,device="cpu")[0].item() + self.pooled_height = 2 + self.pooled_width = 0 + self.sample_num = 1 + self.roi_end_mode = 1 + + self.weight = Parameter(torch.Tensor(8,10,1024)) + init.kaiming_uniform_(self.weight, a=math.sqrt(5)) + + self.func = CustomClassOp_Func_npu_roi_align.apply + self.test_npu_op=1 + + def forward(self, input): + rtn = self.func(input, self.weight, self.spatial_scale, self.pooled_height, self.pooled_width, self.sample_num, self.roi_end_mode) + return rtn + ``` + +3. 自定义模型 + + ``` + # 创建自定义模型 + class CustomModel_Module_op(torch.nn.Module): + def __init__(self,a,b): + super(CustomModel_Module_op, self).__init__() + self.npu_roi_align = NpuOp_npu_roi_align_Module() + #@staticmethod + def forward(self, a): + rtn = self.npu_roi_align(a) + return rtn + ``` + +4. 导出onnx + + ``` + # 构建数据 + a = torch.randn(5, 10, 1024, dtype=torch.float32, requires_grad=True,device=rnddata_device) + b = torch.randn(10, 10, 1024, dtype=torch.float32, requires_grad=True,device=rnddata_device) + + # 模型实例化 + model = CustomModel_Module_op(a,b) + model = model.npu() + model.eval() + a = a.to('npu:6') + b = b.to('npu:6') + + # 导出onnx + do_export(model, a, f=ONNX_NPU_OP_MODULE_FILENAME, input_names=["intput"]+["npu_roi_align.weight"],opset_version=11) + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>详细实现代码请参见[test\_custom\_ops\_npu\_demo.py](https://gitee.com/ascend/pytorch/blob/master/test/test_npu/test_onnx/torch.onnx/custom_ops_demo/test_custom_ops_npu_demo.py),如无权限获取代码,请联系华为技术支持申请加入“Ascend”组织。 + +## C++算子导出 + +1. 自定义算子 + + ``` + import torch + import torch.utils.cpp_extension + # 定义C++实现的算子 + def test_custom_add(): + op_source = """ + #include + + torch::Tensor custom_add(torch::Tensor self, torch::Tensor other) { + return self + other; + } + static auto registry = + torch::RegisterOperators("custom_namespace::custom_add",&custom_add); + """ + torch.utils.cpp_extension.load_inline( + name="custom_add", + cpp_sources=op_source, + is_python_module=False, + verbose=True, + ) + + test_custom_add() + ``` + +2. 注册自定义算子 + + ``` + # 定义算子注册方法并注册算子 + from torch.onnx import register_custom_op_symbolic + + def symbolic_custom_add(g, self, other): + return g.op('custom_namespace::custom_add', self, other) + + register_custom_op_symbolic('custom_namespace::custom_add', symbolic_custom_add, 9) + ``` + +3. 建立模型 + + ``` + # 建立算子模型 + class CustomAddModel(torch.nn.Module): + def forward(self, a, b): + return torch.ops.custom_namespace.custom_add(a, b) + ``` + +4. 导出算子onnx模型 + + ``` + # 将算子导出onnx模型 + def do_export(model, inputs, *args, **kwargs): + out = torch.onnx._export(model, inputs, "custom_demo.onnx", *args, **kwargs) + + x = torch.randn(2, 3, 4, requires_grad=False) + y = torch.randn(2, 3, 4, requires_grad=False) + model = CustomAddModel() + do_export(model, (x, y), opset_version=11) + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>详细实现代码请参见[test\_custom\_ops\_demo.py](https://gitee.com/ascend/pytorch/blob/master/test/test_npu/test_onnx/torch.onnx/custom_ops_demo/test_custom_ops_demo.py),如无权限获取代码,请联系华为技术支持申请加入“Ascend”组织。 + +## 纯Python算子导出 + +1. 自定义算子 + + ``` + import torch + import torch.onnx.symbolic_registry as sym_registry + + import torch.utils.cpp_extension + import torch.nn as nn + import torch.nn.modules as Module + from torch.autograd import Function + import numpy as np + + from torch.nn.parameter import Parameter + import math + from torch.nn import init + + # 定义算子类方法 + class CustomClassOp_Add_F(Function): + @staticmethod + def forward(ctx, input1,input2): + rtn = torch.add(input1,input2) + return torch.add(input1,rtn) + + @staticmethod + def symbolic(g,input1,input2): + rtn = g.op("Custom::CustomClassOp_Add", input1, input2,test_attr1_i=1,test_attr2_f=1.0) + rtn = g.op("ATen::CustomClassOp_Add", input1, rtn) + rtn = g.op("C10::CustomClassOp_Add", rtn, input2) + #erro doman: rtn = g.op("onnx::CustomClassOp_Add", input1, input2) + + return rtn + ``` + +2. 建立模型 + + ``` + # 注册算子并建立模型 + class CustomClassOp_Add(torch.nn.Module): + def __init__(self): + super(CustomClassOp_Add, self).__init__() + self.add = CustomClassOp_Add_F.apply + + #graph(%0 : Float(1, 8, 10, 1024), + # %1 : Float(8, 10, 1024)) + self.weight = Parameter(torch.Tensor(8,10,1024)) + + #%1 : Float(8, 10, 1024) = onnx::Constant[value=]() + self.weight1 = torch.Tensor(8,10,1024) + + init.kaiming_uniform_(self.weight, a=math.sqrt(5)) + init.kaiming_uniform_(self.weight1, a=math.sqrt(5)) + def forward(self, input): + rtn = torch.add(self.weight1, self.weight) + + rtn = self.add(self.weight, rtn) + rtn1 = self.add(self.weight, self.weight1) + rtn1 = self.add(self.weight1,rtn1) + rtn = self.add(rtn,rtn1) + + return rtn + ``` + +3. 导出算子onnx模型 + + ``` + ONNX_FILE_NAME = "./custom_python_module_demo.onnx" + def do_export(model, inputs, *args, **kwargs): + out = torch.onnx._export(model, inputs, ONNX_FILE_NAME, verbose=True,keep_initializers_as_inputs=True, *args, **kwargs) + + def test_class_export(): + model = CustomModel() + model.eval() + input_x_shape = [1, 8, 10, 1024] + input = torch.randn(input_x_shape) + output = model(input) + do_export(model, input, opset_version=11) + + # 将算子导出到onnx模型 + test_class_export() + ``` + + +>![](public_sys-resources/icon-note.gif) **说明:** +>详细实现代码请参见[test\_custom\_ops\_python\_module.py](https://gitee.com/ascend/pytorch/blob/master/test/test_npu/test_onnx/torch.onnx/custom_ops_demo/test_custom_ops_python_module.py),如无权限获取代码,请联系华为技术支持申请加入“Ascend”组织。 + diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..edd26c07ece912850cc911226b4594ad2b30c322 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/PyTorch\346\241\206\346\236\266\344\270\213\347\232\204\347\256\227\345\255\220\351\200\202\351\205\215\346\265\201\347\250\213.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846510.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846510.png" new file mode 100644 index 0000000000000000000000000000000000000000..b29212c4dd9584c26367b4564157e1f9531adbdd Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846510.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846512.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846512.png" new file mode 100644 index 0000000000000000000000000000000000000000..df8a3dc25ca13833cbf1f6a199b33d44896e993e Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846512.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846514.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846514.png" new file mode 100644 index 0000000000000000000000000000000000000000..40100511c53279294c30a9d1721d8e5eac745de9 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001126846514.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006336.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006336.png" new file mode 100644 index 0000000000000000000000000000000000000000..0174ee14d442b03f164c0223e00a3d6728de278f Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006336.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006338.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006338.png" new file mode 100644 index 0000000000000000000000000000000000000000..f9526aafbca55cfb04df26df79147b0bf173d6fd Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006338.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006340.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006340.png" new file mode 100644 index 0000000000000000000000000000000000000000..525161bd16193bd17140623477be173f81de7d50 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001127006340.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886189.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886189.png" new file mode 100644 index 0000000000000000000000000000000000000000..ede83f4bc1b0ed21a9c746c358c45681d5ffb49a Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886189.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886191.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886191.png" new file mode 100644 index 0000000000000000000000000000000000000000..2b0372f5d8a7018a8c33c80e73929bf9d25c39c0 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886191.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886193.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886193.png" new file mode 100644 index 0000000000000000000000000000000000000000..f1841479dfb0355b4295931d96e18b5187d97e27 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001172886193.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046107.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046107.png" new file mode 100644 index 0000000000000000000000000000000000000000..5184f88e480847f15321aeaaabf9833a76c2af77 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046107.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046109.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046109.png" new file mode 100644 index 0000000000000000000000000000000000000000..6550ee72574f98e3486b7887f8bdb011a6882be5 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046109.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046111.png" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046111.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee7a62ab9cefcc3349958f18853a313fb504da15 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/figures/zh-cn_image_0000001173046111.png" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-caution.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-caution.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-caution.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-danger.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-danger.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-danger.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-note.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-note.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-note.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-notice.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-notice.gif" new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-notice.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-tip.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-tip.gif" new file mode 100644 index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-tip.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-warning.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-warning.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\347\256\227\345\255\220\345\274\200\345\217\221\346\214\207\345\215\227 01/public_sys-resources/icon-warning.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01.md" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01.md" new file mode 100644 index 0000000000000000000000000000000000000000..e47fa2c955e43725f86daa64f976c01897993ed7 --- /dev/null +++ "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01.md" @@ -0,0 +1,6002 @@ +# 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

+

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 算子(由昇腾开发)

+

昇腾适配算子

+

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

+
+ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-caution.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-caution.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-caution.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-danger.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-danger.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-danger.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-note.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-note.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-note.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-notice.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-notice.gif" new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-notice.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-tip.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-tip.gif" new file mode 100644 index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-tip.gif" differ diff --git "a/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-warning.gif" "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-warning.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "b/docs/zh/FrameworkPTAdapter 2.0.2 PyTorch\351\200\202\351\205\215\347\256\227\345\255\220\346\270\205\345\215\225 01/public_sys-resources/icon-warning.gif" differ diff --git "a/docs/zh/PyTorch API\346\224\257\346\214\201\346\270\205\345\215\225.md" "b/docs/zh/PyTorch API\346\224\257\346\214\201\346\270\205\345\215\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..7c4505ad1a6ffa566f43026d43c254983153d154 --- /dev/null +++ "b/docs/zh/PyTorch API\346\224\257\346\214\201\346\270\205\345\215\225.md" @@ -0,0 +1,8229 @@ +# PyTorch API支持清单 +- [Tensors](#Tensors.md) +- [Generators](#Generators.md) +- [Random sampling](#Random-sampling.md) +- [Serialization](#Serialization.md) +- [Math operations](#Math-operations.md) +- [Utilities](#Utilities.md) +- [Other](#Other.md) +- [torch.Tensor](#torch-Tensor.md) +- [Layers \(torch.nn\)](#Layers-(torch-nn).md) +- [Functions\(torch.nn.functional\)](#Functions(torch-nn-functional).md) +- [torch.distributed](#torch-distributed.md) +- [NPU和CUDA功能对齐](#NPU和CUDA功能对齐.md) +

Tensors

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

序号

+

API名称

+

是否支持

+

1

+

torch.is_tensor

+

+

2

+

torch.is_storage

+

+

3

+

torch.is_complex

+

+

4

+

torch.is_floating_point

+

+

5

+

torch.set_default_dtype

+

+

6

+

torch.get_default_dtype

+

+

7

+

torch.set_default_tensor_type

+

+

8

+

torch.numel

+

+

9

+

torch.set_printoptions

+

+

10

+

torch.set_flush_denormal

+

+

11

+

torch.tensor

+

+

12

+

torch.sparse_coo_tensor

+

+

13

+

torch.as_tensor

+

+

14

+

torch.as_strided

+

+

15

+

torch.from_numpy

+

+

16

+

torch.zeros

+

+

17

+

torch.zeros_like

+

+

18

+

torch.ones

+

+

19

+

torch.ones_like

+

+

20

+

torch.arange

+

+

21

+

torch.range

+

+

22

+

torch.linspace

+

+

23

+

torch.logspace

+

+

24

+

torch.eye

+

+

25

+

torch.empty

+

+

26

+

torch.empty_like

+

+

27

+

torch.empty_strided

+

+

28

+

torch.full

+

+

29

+

torch.full_like

+

+

30

+

torch.quantize_per_tensor

+

+

31

+

torch.quantize_per_channel

+

+

32

+

torch.cat

+

+

33

+

torch.chunk

+

+

34

+

torch.gather

+

+

35

+

torch.index_select

+

+

36

+

torch.masked_select

+

+

37

+

torch.narrow

+

+

38

+

torch.nonzero

+

+

39

+

torch.reshape

+

+

40

+

torch.split

+

+

41

+

torch.squeeze

+

+

42

+

torch.stack

+

+

43

+

torch.t

+

+

44

+

torch.take

+

+

45

+

torch.transpose

+

+

46

+

torch.unbind

+

+

47

+

torch.unsqueeze

+

+

48

+

torch.where

+

+
+ +

Generators

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

序号

+

API名称

+

是否支持

+

1

+

torch._C.Generator

+

+

2

+

torch._C.Generator.device

+

+

3

+

torch._C.Generator.get_state

+

+

4

+

torch._C.Generator.initial_seed

+

+

5

+

torch._C.Generator.manual_seed

+

+

6

+

torch._C.Generator.seed

+

+

7

+

torch._C.Generator.set_state

+

+
+ +

Random sampling

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

序号

+

API名称

+

是否支持

+

1

+

torch.seed

+

+

2

+

torch.manual_seed

+

+

3

+

torch.initial_seed

+

+

4

+

torch.get_rng_state

+

+

5

+

torch.set_rng_state

+

+

6

+

torch.torch.default_generator

+

+

7

+

torch.bernoulli

+

+

8

+

torch.multinomial

+

+

9

+

torch.normal

+

+

10

+

torch.poisson

+

+

11

+

torch.rand

+

+

12

+

torch.rand_like

+

+

13

+

torch.randint

+

+

14

+

torch.randint_like

+

+

15

+

torch.randn

+

+

16

+

torch.randn_like

+

+

17

+

torch.randperm

+

+

18

+

torch.Tensor.bernoulli_()

+

+

19

+

torch.Tensor.bernoulli_()

+

+

20

+

torch.Tensor.exponential_()

+

+

21

+

torch.Tensor.geometric_()

+

+

22

+

torch.Tensor.log_normal_()

+

+

23

+

torch.Tensor.normal_()

+

+

24

+

torch.Tensor.random_()

+

+

25

+

torch.Tensor.uniform_()

+

+

26

+

torch.quasirandom.SobolEngine

+

+

27

+

torch.quasirandom.SobolEngine.draw

+

+

28

+

torch.quasirandom.SobolEngine.fast_forward

+

+

29

+

torch.quasirandom.SobolEngine.reset

+

+
+ +

Serialization

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

序号

+

API名称

+

是否支持

+

1

+

torch.save

+

+

2

+

torch.load

+

+
+ +

Math operations

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

序号

+

API名称

+

是否支持

+

1

+

torch.abs

+

+

2

+

torch.acos

+

+

3

+

torch.add

+

+

4

+

torch.addcdiv

+

+

5

+

torch.addcmul

+

+

6

+

torch.angle

+

+

7

+

torch.asin

+

+

8

+

torch.atan

+

+

9

+

torch.atan2

+

+

10

+

torch.bitwise_not

+

+

11

+

torch.bitwise_and

+

+

12

+

torch.bitwise_or

+

+

13

+

torch.bitwise_xor

+

+

14

+

torch.ceil

+

+

15

+

torch.clamp

+

+

16

+

torch.conj

+

+

17

+

torch.cos

+

+

18

+

torch.cosh

+

+

19

+

torch.div

+

+

20

+

torch.digamma

+

+

21

+

torch.erf

+

+

22

+

torch.erfc

+

+

23

+

torch.erfinv

+

+

24

+

torch.exp

+

+

25

+

torch.expm1

+

+

26

+

torch.floor

+

+

27

+

torch.floor_divide

+

+

28

+

torch.fmod

+

+

29

+

torch.frac

+

+

30

+

torch.imag

+

+

31

+

torch.lerp

+

+

32

+

torch.lgamma

+

+

33

+

torch.log

+

+

34

+

torch.log10

+

+

35

+

torch.log1p

+

+

36

+

torch.log2

+

+

37

+

torch.logical_and

+

+

38

+

torch.logical_not

+

+

39

+

torch.logical_or

+

+

40

+

torch.logical_xor

+

+

41

+

torch.mul

+

+

42

+

torch.mvlgamma

+

+

43

+

torch.neg

+

+

44

+

torch.polygamma

+

+

45

+

torch.pow

+

+

46

+

torch.real

+

+

47

+

torch.reciprocal

+

+

48

+

torch.remainder

+

+

49

+

torch.round

+

+

50

+

torch.rsqrt

+

+

51

+

torch.sigmoid

+

+

52

+

torch.sign

+

+

53

+

torch.sin

+

+

54

+

torch.sinh

+

+

55

+

torch.sqrt

+

+

56

+

torch.square

+

+

57

+

torch.tan

+

+

58

+

torch.tanh

+

+

59

+

torch.true_divide

+

+

60

+

torch.trunc

+

+

61

+

torch.argmax

+

+

62

+

torch.argmin

+

+

63

+

torch.dist

+

+

64

+

torch.logsumexp

+

+

65

+

torch.mean

+

+

66

+

torch.median

+

+

67

+

torch.mode

+

+

68

+

torch.norm

+

+

69

+

torch.prod

+

+

70

+

torch.std

+

+

71

+

torch.std_mean

+

+

72

+

torch.sum

+

+

73

+

torch.unique

+

+

74

+

torch.unique_consecutive

+

+

75

+

torch.var

+

+

76

+

torch.var_mean

+

+

77

+

torch.allclose

+

+

78

+

torch.argsort

+

+

79

+

torch.eq

+

+

80

+

torch.equal

+

+

81

+

torch.ge

+

+

82

+

torch.gt

+

+

83

+

torch.isfinite

+

+

84

+

torch.isinf

+

+

85

+

torch.isnan

+

+

86

+

torch.kthvalue

+

+

87

+

torch.le

+

+

88

+

torch.lt

+

+

89

+

torch.max

+

+

90

+

torch.min

+

+

91

+

torch.ne

+

+

92

+

torch.sort

+

+

93

+

torch.topk

+

+

94

+

torch.fft

+

+

95

+

torch.ifft

+

+

96

+

torch.rfft

+

+

97

+

torch.irfft

+

+

98

+

torch.stft

+

+

99

+

torch.bartlett_window

+

+

100

+

torch.blackman_window

+

+

101

+

torch.hamming_window

+

+

102

+

torch.hann_window

+

+

103

+

torch.bincount

+

+

104

+

torch.broadcast_tensors

+

+

105

+

torch.cartesian_prod

+

+

106

+

torch.cdist

+

+

107

+

torch.combinations

+

+

108

+

torch.cross

+

+

109

+

torch.cummax

+

+

110

+

torch.cummin

+

+

111

+

torch.cumprod

+

+

112

+

torch.cumsum

+

+

113

+

torch.diag

+

+

114

+

torch.diag_embed

+

+

115

+

torch.diagflat

+

+

116

+

torch.diagonal

+

+

117

+

torch.einsum

+

+

118

+

torch.flatten

+

+

119

+

torch.flip

+

+

120

+

torch.rot90

+

+

121

+

torch.histc

+

+

122

+

torch.meshgrid

+

+

123

+

torch.renorm

+

+

124

+

torch.repeat_interleave

+

+

125

+

torch.roll

+

+

126

+

torch.tensordot

+

+

127

+

torch.trace

+

+

128

+

torch.tril

+

+

129

+

torch.tril_indices

+

+

130

+

torch.triu

+

+

131

+

torch.triu_indices

+

+

132

+

torch.addbmm

+

+

133

+

torch.addmm

+

+

134

+

torch.addmv

+

+

135

+

torch.addr

+

+

136

+

torch.baddbmm

+

+

137

+

torch.bmm

+

+

138

+

torch.chain_matmul

+

+

139

+

torch.cholesky

+

+

140

+

torch.cholesky_inverse

+

+

141

+

torch.cholesky_solve

+

+

142

+

torch.dot

+

+

143

+

torch.eig

+

+

144

+

torch.geqrf

+

+

145

+

torch.ger

+

+

146

+

torch.inverse

+

+

147

+

torch.det

+

+

148

+

torch.logdet

+

+

149

+

torch.slogdet

+

+

150

+

torch.lstsq

+

+

151

+

torch.lu

+

+

152

+

torch.lu_solve

+

+

153

+

torch.lu_unpack

+

+

154

+

torch.matmul

+

+

155

+

torch.matrix_power

+

+

156

+

torch.matrix_rank

+

+

157

+

torch.mm

+

+

158

+

torch.mv

+

+

159

+

torch.orgqr

+

+

160

+

torch.ormqr

+

+

161

+

torch.pinverse

+

+

162

+

torch.qr

+

+

163

+

torch.solve

+

+

164

+

torch.svd

+

+

165

+

torch.svd_lowrank

+

+

166

+

torch.pca_lowrank

+

+

167

+

torch.symeig

+

+

168

+

torch.lobpcg

+

+

169

+

torch.trapz

+

+

170

+

torch.triangular_solve

+

+
+ +

Utilities

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

序号

+

API名称

+

是否支持

+

1

+

torch.compiled_with_cxx11_abi

+

+

2

+

torch.result_type

+

+

3

+

torch.can_cast

+

+

4

+

torch.promote_types

+

+
+ +

Other

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

序号

+

API名称

+

是否支持

+

1

+

torch.no_grad

+

+

2

+

torch.enable_grad

+

+

3

+

torch.set_grad_enabled

+

+

4

+

torch.get_num_threads

+

+

5

+

torch.set_num_threads

+

+

6

+

torch.get_num_interop_threads

+

+

7

+

torch.set_num_interop_threads

+

+
+ +

torch.Tensor

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

序号

+

API名称

+

是否支持

+

1

+

torch.Tensor

+

+

2

+

torch.Tensor.new_tensor

+

+

3

+

torch.Tensor.new_full

+

+

4

+

torch.Tensor.new_empty

+

+

5

+

torch.Tensor.new_ones

+

+

6

+

torch.Tensor.new_zeros

+

+

7

+

torch.Tensor.is_cuda

+

+

8

+

torch.Tensor.is_quantized

+

+

9

+

torch.Tensor.device

+

+

10

+

torch.Tensor.ndim

+

+

11

+

torch.Tensor.T

+

+

12

+

torch.Tensor.abs

+

+

13

+

torch.Tensor.abs_

+

+

14

+

torch.Tensor.acos

+

+

15

+

torch.Tensor.acos_

+

+

16

+

torch.Tensor.add

+

+

17

+

torch.Tensor.add_

+

+

18

+

torch.Tensor.addbmm

+

+

19

+

torch.Tensor.addbmm_

+

+

20

+

torch.Tensor.addcdiv

+

+

21

+

torch.Tensor.addcdiv_

+

+

22

+

torch.Tensor.addcmul

+

+

23

+

torch.Tensor.addcmul_

+

+

24

+

torch.Tensor.addmm

+

+

25

+

torch.Tensor.addmm_

+

+

26

+

torch.Tensor.addmv

+

+

27

+

torch.Tensor.addmv_

+

+

28

+

torch.Tensor.addr

+

+

29

+

torch.Tensor.addr_

+

+

30

+

torch.Tensor.allclose

+

+

31

+

torch.Tensor.angle

+

+

32

+

torch.Tensor.apply_

+

+

33

+

torch.Tensor.argmax

+

+

34

+

torch.Tensor.argmin

+

+

35

+

torch.Tensor.argsort

+

+

36

+

torch.Tensor.asin

+

+

37

+

torch.Tensor.asin_

+

+

38

+

torch.Tensor.as_strided

+

+

39

+

torch.Tensor.atan

+

+

40

+

torch.Tensor.atan2

+

+

41

+

torch.Tensor.atan2_

+

+

42

+

torch.Tensor.atan_

+

+

43

+

torch.Tensor.baddbmm

+

+

44

+

torch.Tensor.baddbmm_

+

+

45

+

torch.Tensor.bernoulli

+

+

46

+

torch.Tensor.bernoulli_

+

+

47

+

torch.Tensor.bfloat16

+

+

48

+

torch.Tensor.bincount

+

+

49

+

torch.Tensor.bitwise_not

+

+

50

+

torch.Tensor.bitwise_not_

+

+

51

+

torch.Tensor.bitwise_and

+

+

52

+

torch.Tensor.bitwise_and_

+

+

53

+

torch.Tensor.bitwise_or

+

+

54

+

torch.Tensor.bitwise_or_

+

+

55

+

torch.Tensor.bitwise_xor

+

+

56

+

torch.Tensor.bitwise_xor_

+

+

57

+

torch.Tensor.bmm

+

+

58

+

torch.Tensor.bool

+

+

59

+

torch.Tensor.byte

+

+

60

+

torch.Tensor.cauchy_

+

+

61

+

torch.Tensor.ceil

+

+

62

+

torch.Tensor.ceil_

+

+

63

+

torch.Tensor.char

+

+

64

+

torch.Tensor.cholesky

+

+

65

+

torch.Tensor.cholesky_inverse

+

+

66

+

torch.Tensor.cholesky_solve

+

+

67

+

torch.Tensor.chunk

+

+

68

+

torch.Tensor.clamp

+

+

69

+

torch.Tensor.clamp_

+

+

70

+

torch.Tensor.clone

+

+

71

+

torch.Tensor.contiguous

+

+

72

+

torch.Tensor.copy_

+

+

73

+

torch.Tensor.conj

+

+

74

+

torch.Tensor.cos

+

+

75

+

torch.Tensor.cos_

+

+

76

+

torch.Tensor.cosh

+

+

77

+

torch.Tensor.cosh_

+

+

78

+

torch.Tensor.cpu

+

+

79

+

torch.Tensor.cross

+

+

80

+

torch.Tensor.cuda

+

+

81

+

torch.Tensor.cummax

+

+

82

+

torch.Tensor.cummin

+

+

83

+

torch.Tensor.cumprod

+

+

84

+

torch.Tensor.cumsum

+

+

85

+

torch.Tensor.data_ptr

+

+

86

+

torch.Tensor.dequantize

+

+

87

+

torch.Tensor.det

+

+

88

+

torch.Tensor.dense_dim

+

+

89

+

torch.Tensor.diag

+

+

90

+

torch.Tensor.diag_embed

+

+

91

+

torch.Tensor.diagflat

+

+

92

+

torch.Tensor.diagonal

+

+

93

+

torch.Tensor.fill_diagonal_

+

+

94

+

torch.Tensor.digamma

+

+

95

+

torch.Tensor.digamma_

+

+

96

+

torch.Tensor.dim

+

+

97

+

torch.Tensor.dist

+

+

98

+

torch.Tensor.div

+

+

99

+

torch.Tensor.div_

+

+

100

+

torch.Tensor.dot

+

+

101

+

torch.Tensor.double

+

+

102

+

torch.Tensor.eig

+

+

103

+

torch.Tensor.element_size

+

+

104

+

torch.Tensor.eq

+

+

105

+

torch.Tensor.eq_

+

+

106

+

torch.Tensor.equal

+

+

107

+

torch.Tensor.erf

+

+

108

+

torch.Tensor.erf_

+

+

109

+

torch.Tensor.erfc

+

+

110

+

torch.Tensor.erfc_

+

+

111

+

torch.Tensor.erfinv

+

+

112

+

torch.Tensor.erfinv_

+

+

113

+

torch.Tensor.exp

+

+

114

+

torch.Tensor.exp_

+

+

115

+

torch.Tensor.expm1

+

+

116

+

torch.Tensor.expm1_

+

+

117

+

torch.Tensor.expand

+

+

118

+

torch.Tensor.expand_as

+

+

119

+

torch.Tensor.exponential_

+

+

120

+

torch.Tensor.fft

+

+

121

+

torch.Tensor.fill_

+

+

122

+

torch.Tensor.flatten

+

+

123

+

torch.Tensor.flip

+

+

124

+

torch.Tensor.float

+

+

125

+

torch.Tensor.floor

+

+

126

+

torch.Tensor.floor_

+

+

127

+

torch.Tensor.floor_divide

+

+

128

+

torch.Tensor.floor_divide_

+

+

129

+

torch.Tensor.fmod

+

+

130

+

torch.Tensor.fmod_

+

+

131

+

torch.Tensor.frac

+

+

132

+

torch.Tensor.frac_

+

+

133

+

torch.Tensor.gather

+

+

134

+

torch.Tensor.ge

+

+

135

+

torch.Tensor.ge_

+

+

136

+

torch.Tensor.geometric_

+

+

137

+

torch.Tensor.geqrf

+

+

138

+

torch.Tensor.ger

+

+

139

+

torch.Tensor.get_device

+

+

140

+

torch.Tensor.gt

+

+

141

+

torch.Tensor.gt_

+

+

142

+

torch.Tensor.half

+

+

143

+

torch.Tensor.hardshrink

+

+

144

+

torch.Tensor.histc

+

+

145

+

torch.Tensor.ifft

+

+

146

+

torch.Tensor.index_add_

+

+

147

+

torch.Tensor.index_add

+

+

148

+

torch.Tensor.index_copy_

+

+

149

+

torch.Tensor.index_copy

+

+

150

+

torch.Tensor.index_fill_

+

+

151

+

torch.Tensor.index_fill

+

+

152

+

torch.Tensor.index_put_

+

+

153

+

torch.Tensor.index_put

+

+

154

+

torch.Tensor.index_select

+

+

155

+

torch.Tensor.indices

+

+

156

+

torch.Tensor.int

+

+

157

+

torch.Tensor.int_repr

+

+

158

+

torch.Tensor.inverse

+

+

159

+

torch.Tensor.irfft

+

+

160

+

torch.Tensor.is_contiguous

+

+

161

+

torch.Tensor.is_complex

+

+

162

+

torch.Tensor.is_floating_point

+

+

163

+

torch.Tensor.is_pinned

+

+

164

+

torch.Tensor.is_set_to

+

+

165

+

torch.Tensor.is_shared

+

+

166

+

torch.Tensor.is_signed

+

+

167

+

torch.Tensor.is_sparse

+

+

168

+

torch.Tensor.item

+

+

169

+

torch.Tensor.kthvalue

+

+

170

+

torch.Tensor.le

+

+

171

+

torch.Tensor.le_

+

+

172

+

torch.Tensor.lerp

+

+

173

+

torch.Tensor.lerp_

+

+

174

+

torch.Tensor.lgamma

+

+

175

+

torch.Tensor.lgamma_

+

+

176

+

torch.Tensor.log

+

+

177

+

torch.Tensor.log_

+

+

178

+

torch.Tensor.logdet

+

+

179

+

torch.Tensor.log10

+

+

180

+

torch.Tensor.log10_

+

+

181

+

torch.Tensor.log1p

+

+

182

+

torch.Tensor.log1p_

+

+

183

+

torch.Tensor.log2

+

+

184

+

torch.Tensor.log2_

+

+

185

+

torch.Tensor.log_normal_

+

+

186

+

torch.Tensor.logsumexp

+

+

187

+

torch.Tensor.logical_and

+

+

188

+

torch.Tensor.logical_and_

+

+

189

+

torch.Tensor.logical_not

+

+

190

+

torch.Tensor.logical_not_

+

+

191

+

torch.Tensor.logical_or

+

+

192

+

torch.Tensor.logical_or_

+

+

193

+

torch.Tensor.logical_xor

+

+

194

+

torch.Tensor.logical_xor_

+

+

195

+

torch.Tensor.long

+

+

196

+

torch.Tensor.lstsq

+

+

197

+

torch.Tensor.lt

+

+

198

+

torch.Tensor.lt_

+

+

199

+

torch.Tensor.lu

+

+

200

+

torch.Tensor.lu_solve

+

+

201

+

torch.Tensor.map_

+

+

202

+

torch.Tensor.masked_scatter_

+

+

203

+

torch.Tensor.masked_scatter

+

+

204

+

torch.Tensor.masked_fill_

+

+

205

+

torch.Tensor.masked_fill

+

+

206

+

torch.Tensor.masked_select

+

+

207

+

torch.Tensor.matmul

+

+

208

+

torch.Tensor.matrix_power

+

+

209

+

torch.Tensor.max

+

+

210

+

torch.Tensor.mean

+

+

211

+

torch.Tensor.median

+

+

212

+

torch.Tensor.min

+

+

213

+

torch.Tensor.mm

+

+

214

+

torch.Tensor.mode

+

+

215

+

torch.Tensor.mul

+

+

216

+

torch.Tensor.mul_

+

+

217

+

torch.Tensor.multinomial

+

+

218

+

torch.Tensor.mv

+

+

219

+

torch.Tensor.mvlgamma

+

+

220

+

torch.Tensor.mvlgamma_

+

+

221

+

torch.Tensor.narrow

+

+

222

+

torch.Tensor.narrow_copy

+

+

223

+

torch.Tensor.ndimension

+

+

224

+

torch.Tensor.ne

+

+

225

+

torch.Tensor.ne_

+

+

226

+

torch.Tensor.neg

+

+

227

+

torch.Tensor.neg_

+

+

228

+

torch.Tensor.nelement

+

+

229

+

torch.Tensor.nonzero

+

+

230

+

torch.Tensor.norm

+

+

231

+

torch.Tensor.normal_

+

+

232

+

torch.Tensor.numel

+

+

233

+

torch.Tensor.numpy

+

+

234

+

torch.Tensor.orgqr

+

+

235

+

torch.Tensor.ormqr

+

+

236

+

torch.Tensor.permute

+

+

237

+

torch.Tensor.pin_memory

+

+

238

+

torch.Tensor.pinverse

+

+

239

+

torch.Tensor.polygamma

+

+

240

+

torch.Tensor.polygamma_

+

+

241

+

torch.Tensor.pow

+

+

242

+

torch.Tensor.pow_

+

+

243

+

torch.Tensor.prod

+

+

244

+

torch.Tensor.put_

+

+

245

+

torch.Tensor.qr

+

+

246

+

torch.Tensor.qscheme

+

+

247

+

torch.Tensor.q_scale

+

+

248

+

torch.Tensor.q_zero_point

+

+

249

+

torch.Tensor.q_per_channel_scales

+

+

250

+

torch.Tensor.q_per_channel_zero_points

+

+

251

+

torch.Tensor.q_per_channel_axis

+

+

252

+

torch.Tensor.random_

+

+

253

+

torch.Tensor.reciprocal

+

+

254

+

torch.Tensor.reciprocal_

+

+

255

+

torch.Tensor.record_stream

+

+

256

+

torch.Tensor.remainder

+

+

257

+

torch.Tensor.remainder_

+

+

258

+

torch.Tensor.renorm

+

+

259

+

torch.Tensor.renorm_

+

+

260

+

torch.Tensor.repeat

+

+

261

+

torch.Tensor.repeat_interleave

+

+

262

+

torch.Tensor.requires_grad_

+

+

263

+

torch.Tensor.reshape

+

+

264

+

torch.Tensor.reshape_as

+

+

265

+

torch.Tensor.resize_

+

+

266

+

torch.Tensor.resize_as_

+

+

267

+

torch.Tensor.rfft

+

+

268

+

torch.Tensor.roll

+

+

269

+

torch.Tensor.rot90

+

+

270

+

torch.Tensor.round

+

+

271

+

torch.Tensor.round_

+

+

272

+

torch.Tensor.rsqrt

+

+

273

+

torch.Tensor.rsqrt_

+

+

274

+

torch.Tensor.scatter

+

+

275

+

torch.Tensor.scatter_

+

+

276

+

torch.Tensor.scatter_add_

+

+

277

+

torch.Tensor.scatter_add

+

+

278

+

torch.Tensor.select

+

+

279

+

torch.Tensor.set_

+

+

280

+

torch.Tensor.share_memory_

+

+

281

+

torch.Tensor.short

+

+

282

+

torch.Tensor.sigmoid

+

+

283

+

torch.Tensor.sigmoid_

+

+

284

+

torch.Tensor.sign

+

+

285

+

torch.Tensor.sign_

+

+

286

+

torch.Tensor.sin

+

+

287

+

torch.Tensor.sin_

+

+

288

+

torch.Tensor.sinh

+

+

289

+

torch.Tensor.sinh_

+

+

290

+

torch.Tensor.size

+

+

291

+

torch.Tensor.slogdet

+

+

292

+

torch.Tensor.solve

+

+

293

+

torch.Tensor.sort

+

+

294

+

torch.Tensor.split

+

+

295

+

torch.Tensor.sparse_mask

+

+

296

+

torch.Tensor.sparse_dim

+

+

297

+

torch.Tensor.sqrt

+

+

298

+

torch.Tensor.sqrt_

+

+

299

+

torch.Tensor.square

+

+

300

+

torch.Tensor.square_

+

+

301

+

torch.Tensor.squeeze

+

+

302

+

torch.Tensor.squeeze_

+

+

303

+

torch.Tensor.std

+

+

304

+

torch.Tensor.stft

+

+

305

+

torch.Tensor.storage

+

+

306

+

torch.Tensor.storage_offset

+

+

307

+

torch.Tensor.storage_type

+

+

308

+

torch.Tensor.stride

+

+

309

+

torch.Tensor.sub

+

+

310

+

torch.Tensor.sub_

+

+

311

+

torch.Tensor.sum

+

+

312

+

torch.Tensor.sum_to_size

+

+

313

+

torch.Tensor.svd

+

+

314

+

torch.Tensor.symeig

+

+

315

+

torch.Tensor.t

+

+

316

+

torch.Tensor.t_

+

+

317

+

torch.Tensor.to

+

+

318

+

torch.Tensor.to_mkldnn

+

+

319

+

torch.Tensor.take

+

+

320

+

torch.Tensor.tan

+

+

321

+

torch.Tensor.tan_

+

+

322

+

torch.Tensor.tanh

+

+

323

+

torch.Tensor.tanh_

+

+

324

+

torch.Tensor.tolist

+

+

325

+

torch.Tensor.topk

+

+

326

+

torch.Tensor.to_sparse

+

+

327

+

torch.Tensor.trace

+

+

328

+

torch.Tensor.transpose

+

+

329

+

torch.Tensor.transpose_

+

+

330

+

torch.Tensor.triangular_solve

+

+

331

+

torch.Tensor.tril

+

+

332

+

torch.Tensor.tril_

+

+

333

+

torch.Tensor.triu

+

+

334

+

torch.Tensor.triu_

+

+

335

+

torch.Tensor.true_divide

+

+

336

+

torch.Tensor.true_divide_

+

+

337

+

torch.Tensor.trunc

+

+

338

+

torch.Tensor.trunc_

+

+

339

+

torch.Tensor.type

+

+

340

+

torch.Tensor.type_as

+

+

341

+

torch.Tensor.unbind

+

+

342

+

torch.Tensor.unfold

+

+

343

+

torch.Tensor.uniform_

+

+

344

+

torch.Tensor.unique

+

+

345

+

torch.Tensor.unique_consecutive

+

+

346

+

torch.Tensor.unsqueeze

+

+

347

+

torch.Tensor.unsqueeze_

+

+

348

+

torch.Tensor.values

+

+

349

+

torch.Tensor.var

+

+

350

+

torch.Tensor.view

+

+

351

+

torch.Tensor.view_as

+

+

352

+

torch.Tensor.where

+

+

353

+

torch.Tensor.zero_

+

+

354

+

torch.BoolTensor

+

+

355

+

torch.BoolTensor.all

+

+

356

+

torch.BoolTensor.any

+

+
+ +

Layers \(torch.nn\)

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

序号

+

API名称

+

是否支持

+

1

+

torch.nn.Parameter

+

+

2

+

torch.nn.Module

+

+

3

+

torch.nn.Module.add_module

+

+

4

+

torch.nn.Module.apply

+

+

5

+

torch.nn.Module.bfloat16

+

+

6

+

torch.nn.Module.buffers

+

+

7

+

torch.nn.Module.children

+

+

8

+

torch.nn.Module.cpu

+

+

9

+

torch.nn.Module.cuda

+

+

10

+

torch.nn.Module.double

+

+

11

+

torch.nn.Module.dump_patches

+

+

12

+

torch.nn.Module.eval

+

+

13

+

torch.nn.Module.extra_repr

+

+

14

+

torch.nn.Module.float

+

+

15

+

torch.nn.Module.forward

+

+

16

+

torch.nn.Module.half

+

+

17

+

torch.nn.Module.load_state_dict

+

+

18

+

torch.nn.Module.modules

+

+

19

+

torch.nn.Module.named_buffers

+

+

20

+

torch.nn.Module.named_children

+

+

21

+

torch.nn.Module.named_modules

+

+

22

+

torch.nn.Module.named_parameters

+

+

23

+

torch.nn.Module.parameters

+

+

24

+

torch.nn.Module.register_backward_hook

+

+

25

+

torch.nn.Module.register_buffer

+

+

26

+

torch.nn.Module.register_forward_hook

+

+

27

+

torch.nn.Module.register_forward_pre_hook

+

+

28

+

torch.nn.Module.register_parameter

+

+

29

+

torch.nn.Module.requires_grad_

+

+

30

+

torch.nn.Module.state_dict

+

+

31

+

torch.nn.Module.to

+

+

32

+

torch.nn.Module.train

+

+

33

+

torch.nn.Module.type

+

+

34

+

torch.nn.Module.zero_grad

+

+

35

+

torch.nn.Sequential

+

+

36

+

torch.nn.ModuleList

+

+

37

+

torch.nn.ModuleList.append

+

+

38

+

torch.nn.ModuleList.extend

+

+

39

+

torch.nn.ModuleList.insert

+

+

40

+

torch.nn.ModuleDict

+

+

41

+

torch.nn.ModuleDict.clear

+

+

42

+

torch.nn.ModuleDict.items

+

+

43

+

torch.nn.ModuleDict.keys

+

+

44

+

torch.nn.ModuleDict.pop

+

+

45

+

torch.nn.ModuleDict.update

+

+

46

+

torch.nn.ModuleDict.values

+

+

47

+

torch.nn.ParameterList

+

+

48

+

torch.nn.ParameterList.append

+

+

49

+

torch.nn.ParameterList.extend

+

+

50

+

torch.nn.ParameterDict

+

+

51

+

torch.nn.ParameterDict.clear

+

+

52

+

torch.nn.ParameterDict.items

+

+

53

+

torch.nn.ParameterDict.keys

+

+

54

+

torch.nn.ParameterDict.pop

+

+

55

+

torch.nn.ParameterDict.update

+

+

56

+

torch.nn.ParameterDict.values

+

+

57

+

torch.nn.Conv1d

+

+

58

+

torch.nn.Conv2d

+

+

59

+

torch.nn.Conv3d

+

+

60

+

torch.nn.ConvTranspose1d

+

+

61

+

torch.nn.ConvTranspose2d

+

+

62

+

torch.nn.ConvTranspose3d

+

+

63

+

torch.nn.Unfold

+

+

64

+

torch.nn.Fold

+

+

65

+

torch.nn.MaxPool1d

+

+

66

+

torch.nn.MaxPool2d

+

+

67

+

torch.nn.MaxPool3d

+

+

68

+

torch.nn.MaxUnpool1d

+

+

69

+

torch.nn.MaxUnpool2d

+

+

70

+

torch.nn.MaxUnpool3d

+

+

71

+

torch.nn.AvgPool1d

+

+

72

+

torch.nn.AvgPool2d

+

+

73

+

torch.nn.AvgPool3d

+

+

74

+

torch.nn.FractionalMaxPool2d

+

+

75

+

torch.nn.LPPool1d

+

+

76

+

torch.nn.LPPool2d

+

+

77

+

torch.nn.AdaptiveMaxPool1d

+

+

78

+

torch.nn.AdaptiveMaxPool2d

+

+

79

+

torch.nn.AdaptiveMaxPool3d

+

+

80

+

torch.nn.AdaptiveAvgPool1d

+

+

81

+

torch.nn.AdaptiveAvgPool2d

+

+

82

+

torch.nn.AdaptiveAvgPool3d

+

+

83

+

torch.nn.ReflectionPad1d

+

+

84

+

torch.nn.ReflectionPad2d

+

+

85

+

torch.nn.ReplicationPad1d

+

+

86

+

torch.nn.ReplicationPad2d

+

+

87

+

torch.nn.ReplicationPad3d

+

+

88

+

torch.nn.ZeroPad2d

+

+

89

+

torch.nn.ConstantPad1d

+

+

90

+

torch.nn.ConstantPad2d

+

+

91

+

torch.nn.ConstantPad3d

+

+

92

+

torch.nn.ELU

+

+

93

+

torch.nn.Hardshrink

+

+

94

+

torch.nn.Hardtanh

+

+

95

+

torch.nn.LeakyReLU

+

+

96

+

torch.nn.LogSigmoid

+

+

97

+

torch.nn.MultiheadAttention

+

+

98

+

torch.nn.PReLU

+

+

99

+

torch.nn.ReLU

+

+

100

+

torch.nn.ReLU6

+

+

101

+

torch.nn.RReLU

+

+

102

+

torch.nn.SELU

+

+

103

+

torch.nn.CELU

+

+

104

+

torch.nn.GELU

+

+

105

+

torch.nn.Sigmoid

+

+

106

+

torch.nn.Softplus

+

+

107

+

torch.nn.Softshrink

+

是,SoftShrink场景暂不支持

+

108

+

torch.nn.Softsign

+

+

109

+

torch.nn.Tanh

+

+

110

+

torch.nn.Tanhshrink

+

+

111

+

torch.nn.Threshold

+

+

112

+

torch.nn.Softmin

+

+

113

+

torch.nn.Softmax

+

+

114

+

torch.nn.Softmax2d

+

+

115

+

torch.nn.LogSoftmax

+

+

116

+

torch.nn.AdaptiveLogSoftmaxWithLoss

+

+

117

+

torch.nn.AdaptiveLogSoftmaxWithLoss.log_prob

+

+

118

+

torch.nn.AdaptiveLogSoftmaxWithLoss.predict

+

+

119

+

torch.nn.BatchNorm1d

+

+

120

+

torch.nn.BatchNorm2d

+

+

121

+

torch.nn.BatchNorm3d

+

+

122

+

torch.nn.GroupNorm

+

+

123

+

torch.nn.SyncBatchNorm

+

+

124

+

torch.nn.SyncBatchNorm.convert_sync_batchnorm

+

+

125

+

torch.nn.InstanceNorm1d

+

+

126

+

torch.nn.InstanceNorm2d

+

+

127

+

torch.nn.InstanceNorm3d

+

+

128

+

torch.nn.LayerNorm

+

+

129

+

torch.nn.LocalResponseNorm

+

+

130

+

torch.nn.RNNBase

+

+

131

+

torch.nn.RNNBase.flatten_parameters

+

+

132

+

torch.nn.RNN

+

+

133

+

torch.nn.LSTM

+

是,DynamicRNN场景暂不支持

+

134

+

torch.nn.GRU

+

是,DynamicGRUV2场景暂不支持

+

135

+

torch.nn.RNNCell

+

+

136

+

torch.nn.LSTMCell

+

+

137

+

torch.nn.GRUCell

+

+

138

+

torch.nn.Transformer

+

+

139

+

torch.nn.Transformer.forward

+

+

140

+

torch.nn.Transformer.generate_square_subsequent_mask

+

+

141

+

torch.nn.TransformerEncoder

+

+

142

+

torch.nn.TransformerEncoder.forward

+

+

143

+

torch.nn.TransformerDecoder

+

+

144

+

torch.nn.TransformerDecoder.forward

+

+

145

+

torch.nn.TransformerEncoderLayer

+

+

146

+

torch.nn.TransformerEncoderLayer.forward

+

+

147

+

torch.nn.TransformerDecoderLayer

+

+

148

+

torch.nn.TransformerDecoderLayer.forward

+

+

149

+

torch.nn.Identity

+

+

150

+

torch.nn.Linear

+

+

151

+

torch.nn.Bilinear

+

+

152

+

torch.nn.Dropout

+

+

153

+

torch.nn.Dropout2d

+

+

154

+

torch.nn.Dropout3d

+

+

155

+

torch.nn.AlphaDropout

+

+

156

+

torch.nn.Embedding

+

+

157

+

torch.nn.Embedding.from_pretrained

+

+

158

+

torch.nn.EmbeddingBag

+

+

159

+

torch.nn.EmbeddingBag.from_pretrained

+

+

160

+

torch.nn.CosineSimilarity

+

+

161

+

torch.nn.PairwiseDistance

+

+

162

+

torch.nn.L1Loss

+

+

163

+

torch.nn.MSELoss

+

+

164

+

torch.nn.CrossEntropyLoss

+

+

165

+

torch.nn.CTCLoss

+

+

166

+

torch.nn.NLLLoss

+

+

167

+

torch.nn.PoissonNLLLoss

+

+

168

+

torch.nn.KLDivLoss

+

+

169

+

torch.nn.BCELoss

+

+

170

+

torch.nn.BCEWithLogitsLoss

+

+

171

+

torch.nn.MarginRankingLoss

+

+

172

+

torch.nn.HingeEmbeddingLoss

+

+

173

+

torch.nn.MultiLabelMarginLoss

+

+

174

+

torch.nn.SmoothL1Loss

+

+

175

+

torch.nn.SoftMarginLoss

+

+

176

+

torch.nn.MultiLabelSoftMarginLoss

+

+

177

+

torch.nn.CosineEmbeddingLoss

+

+

178

+

torch.nn.MultiMarginLoss

+

+

179

+

torch.nn.TripletMarginLoss

+

+

180

+

torch.nn.PixelShuffle

+

+

181

+

torch.nn.Upsample

+

+

182

+

torch.nn.UpsamplingNearest2d

+

+

183

+

torch.nn.UpsamplingBilinear2d

+

+

184

+

torch.nn.DataParallel

+

+

185

+

torch.nn.parallel.DistributedDataParallel

+

+

186

+

torch.nn.parallel.DistributedDataParallel.no_sync

+

+

187

+

torch.nn.utils.clip_grad_norm_

+

+

188

+

torch.nn.utils.clip_grad_value_

+

+

189

+

torch.nn.utils.parameters_to_vector

+

+

190

+

torch.nn.utils.vector_to_parameters

+

+

197

+

torch.nn.utils.prune.PruningContainer

+

+

198

+

torch.nn.utils.prune.PruningContainer.add_pruning_method

+

+

199

+

torch.nn.utils.prune.PruningContainer.apply

+

+

200

+

torch.nn.utils.prune.PruningContainer.apply_mask

+

+

201

+

torch.nn.utils.prune.PruningContainer.compute_mask

+

+

202

+

torch.nn.utils.prune.PruningContainer.prune

+

+

203

+

torch.nn.utils.prune.PruningContainer.remove

+

+

204

+

torch.nn.utils.prune.Identity

+

+

205

+

torch.nn.utils.prune.Identity.apply

+

+

206

+

torch.nn.utils.prune.Identity.apply_mask

+

+

207

+

torch.nn.utils.prune.Identity.prune

+

+

208

+

torch.nn.utils.prune.Identity.remove

+

+

209

+

torch.nn.utils.prune.RandomUnstructured

+

+

210

+

torch.nn.utils.prune.RandomUnstructured.apply

+

+

211

+

torch.nn.utils.prune.RandomUnstructured.apply_mask

+

+

212

+

torch.nn.utils.prune.RandomUnstructured.prune

+

+

213

+

torch.nn.utils.prune.RandomUnstructured.remove

+

+

214

+

torch.nn.utils.prune.L1Unstructured

+

+

215

+

torch.nn.utils.prune.L1Unstructured.apply

+

+

216

+

torch.nn.utils.prune.L1Unstructured.apply_mask

+

+

217

+

torch.nn.utils.prune.L1Unstructured.prune

+

+

218

+

torch.nn.utils.prune.L1Unstructured.remove

+

+

219

+

torch.nn.utils.prune.RandomStructured

+

+

220

+

torch.nn.utils.prune.RandomStructured.apply

+

+

221

+

torch.nn.utils.prune.RandomStructured.apply_mask

+

+

222

+

torch.nn.utils.prune.RandomStructured.compute_mask

+

+

223

+

torch.nn.utils.prune.RandomStructured.prune

+

+

224

+

torch.nn.utils.prune.RandomStructured.remove

+

+

225

+

torch.nn.utils.prune.LnStructured

+

+

226

+

torch.nn.utils.prune.LnStructured.apply

+

+

227

+

torch.nn.utils.prune.LnStructured.apply_mask

+

+

228

+

torch.nn.utils.prune.LnStructured.compute_mask

+

+

229

+

torch.nn.utils.prune.LnStructured.prune

+

+

230

+

torch.nn.utils.prune.LnStructured.remove

+

+

231

+

torch.nn.utils.prune.CustomFromMask

+

+

232

+

torch.nn.utils.prune.CustomFromMask.apply

+

+

233

+

torch.nn.utils.prune.CustomFromMask.apply_mask

+

+

234

+

torch.nn.utils.prune.CustomFromMask.prune

+

+

235

+

torch.nn.utils.prune.CustomFromMask.remove

+

+

236

+

torch.nn.utils.prune.identity

+

+

237

+

torch.nn.utils.prune.random_unstructured

+

+

238

+

torch.nn.utils.prune.l1_unstructured

+

+

239

+

torch.nn.utils.prune.random_structured

+

+

240

+

torch.nn.utils.prune.ln_structured

+

+

241

+

torch.nn.utils.prune.global_unstructured

+

+

242

+

torch.nn.utils.prune.custom_from_mask

+

+

243

+

torch.nn.utils.prune.remove

+

+

244

+

torch.nn.utils.prune.is_pruned

+

+

245

+

torch.nn.utils.weight_norm

+

+

246

+

torch.nn.utils.remove_weight_norm

+

+

247

+

torch.nn.utils.spectral_norm

+

+

248

+

torch.nn.utils.remove_spectral_norm

+

+

249

+

torch.nn.utils.rnn.PackedSequence

+

+

250

+

torch.nn.utils.rnn.pack_padded_sequence

+

+

251

+

torch.nn.utils.rnn.pad_packed_sequence

+

+

252

+

torch.nn.utils.rnn.pad_sequence

+

+

253

+

torch.nn.utils.rnn.pack_sequence

+

+

254

+

torch.nn.Flatten

+

+

255

+

torch.quantization.quantize

+

+

256

+

torch.quantization.quantize_dynamic

+

+

257

+

torch.quantization.quantize_qat

+

+

258

+

torch.quantization.prepare

+

+

259

+

torch.quantization.prepare_qat

+

+

260

+

torch.quantization.convert

+

+

261

+

torch.quantization.QConfig

+

+

262

+

torch.quantization.QConfigDynamic

+

+

263

+

torch.quantization.fuse_modules

+

+

264

+

torch.quantization.QuantStub

+

+

265

+

torch.quantization.DeQuantStub

+

+

266

+

torch.quantization.QuantWrapper

+

+

267

+

torch.quantization.add_quant_dequant

+

+

268

+

torch.quantization.add_observer_

+

+

269

+

torch.quantization.swap_module

+

+

270

+

torch.quantization.propagate_qconfig_

+

+

271

+

torch.quantization.default_eval_fn

+

+

272

+

torch.quantization.MinMaxObserver

+

+

273

+

torch.quantization.MovingAverageMinMaxObserver

+

+

274

+

torch.quantization.PerChannelMinMaxObserver

+

+

275

+

torch.quantization.MovingAveragePerChannelMinMaxObserver

+

+

276

+

torch.quantization.HistogramObserver

+

+

277

+

torch.quantization.FakeQuantize

+

+

278

+

torch.quantization.NoopObserver

+

+

279

+

torch.quantization.get_observer_dict

+

+

280

+

torch.quantization.RecordingObserver

+

+

281

+

torch.nn.intrinsic.ConvBn2d

+

+

282

+

torch.nn.intrinsic.ConvBnReLU2d

+

+

283

+

torch.nn.intrinsic.ConvReLU2d

+

+

284

+

torch.nn.intrinsic.ConvReLU3d

+

+

285

+

torch.nn.intrinsic.LinearReLU

+

+

286

+

torch.nn.intrinsic.qat.ConvBn2d

+

+

287

+

torch.nn.intrinsic.qat.ConvBnReLU2d

+

+

288

+

torch.nn.intrinsic.qat.ConvReLU2d

+

+

289

+

torch.nn.intrinsic.qat.LinearReLU

+

+

290

+

torch.nn.intrinsic.quantized.ConvReLU2d

+

+

291

+

torch.nn.intrinsic.quantized.ConvReLU3d

+

+

292

+

torch.nn.intrinsic.quantized.LinearReLU

+

+

293

+

torch.nn.qat.Conv2d

+

+

294

+

torch.nn.qat.Conv2d.from_float

+

+

295

+

torch.nn.qat.Linear

+

+

296

+

torch.nn.qat.Linear.from_float

+

+

297

+

torch.nn.quantized.functional.relu

+

+

298

+

torch.nn.quantized.functional.linear

+

+

299

+

torch.nn.quantized.functional.conv2d

+

+

300

+

torch.nn.quantized.functional.conv3d

+

+

301

+

torch.nn.quantized.functional.max_pool2d

+

+

302

+

torch.nn.quantized.functional.adaptive_avg_pool2d

+

+

303

+

torch.nn.quantized.functional.avg_pool2d

+

+

304

+

torch.nn.quantized.functional.interpolate

+

+

305

+

torch.nn.quantized.functional.upsample

+

+

306

+

torch.nn.quantized.functional.upsample_bilinear

+

+

307

+

torch.nn.quantized.functional.upsample_nearest

+

+

308

+

torch.nn.quantized.ReLU

+

+

309

+

torch.nn.quantized.ReLU6

+

+

310

+

torch.nn.quantized.Conv2d

+

+

311

+

torch.nn.quantized.Conv2d.from_float

+

+

312

+

torch.nn.quantized.Conv3d

+

+

313

+

torch.nn.quantized.Conv3d.from_float

+

+

314

+

torch.nn.quantized.FloatFunctional

+

+

315

+

torch.nn.quantized.QFunctional

+

+

316

+

torch.nn.quantized.Quantize

+

+

317

+

torch.nn.quantized.DeQuantize

+

+

318

+

torch.nn.quantized.Linear

+

+

319

+

torch.nn.quantized.Linear.from_float

+

+

320

+

torch.nn.quantized.dynamic.Linear

+

+

321

+

torch.nn.quantized.dynamic.Linear.from_float

+

+

322

+

torch.nn.quantized.dynamic.LSTM

+

+
+ +

Functions\(torch.nn.functional\)

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

序号

+

API名称

+

是否支持

+

1

+

torch.nn.functional.conv1d

+

+

2

+

torch.nn.functional.conv2d

+

+

3

+

torch.nn.functional.conv3d

+

+

4

+

torch.nn.functional.conv_transpose1d

+

+

5

+

torch.nn.functional.conv_transpose2d

+

+

6

+

torch.nn.functional.conv_transpose3d

+

+

7

+

torch.nn.functional.unfold

+

+

8

+

torch.nn.functional.fold

+

+

9

+

torch.nn.functional.avg_pool1d

+

+

10

+

torch.nn.functional.avg_pool2d

+

+

11

+

torch.nn.functional.avg_pool3d

+

+

12

+

torch.nn.functional.max_pool1d

+

+

13

+

torch.nn.functional.max_pool2d

+

+

14

+

torch.nn.functional.max_pool3d

+

+

15

+

torch.nn.functional.max_unpool1d

+

+

16

+

torch.nn.functional.max_unpool2d

+

+

17

+

torch.nn.functional.max_unpool3d

+

+

18

+

torch.nn.functional.lp_pool1d

+

+

19

+

torch.nn.functional.lp_pool2d

+

+

20

+

torch.nn.functional.adaptive_max_pool1d

+

+

21

+

torch.nn.functional.adaptive_max_pool2d

+

+

22

+

torch.nn.functional.adaptive_max_pool3d

+

+

23

+

torch.nn.functional.adaptive_avg_pool1d

+

+

24

+

torch.nn.functional.adaptive_avg_pool2d

+

+

25

+

torch.nn.functional.adaptive_avg_pool3d

+

+

26

+

torch.nn.functional.threshold

+

+

27

+

torch.nn.functional.threshold_

+

+

28

+

torch.nn.functional.relu

+

+

29

+

torch.nn.functional.relu_

+

+

30

+

torch.nn.functional.hardtanh

+

+

31

+

torch.nn.functional.hardtanh_

+

+

32

+

torch.nn.functional.relu6

+

+

33

+

torch.nn.functional.elu

+

+

34

+

torch.nn.functional.elu_

+

+

35

+

torch.nn.functional.selu

+

+

36

+

torch.nn.functional.celu

+

+

37

+

torch.nn.functional.leaky_relu

+

+

38

+

torch.nn.functional.leaky_relu_

+

+

39

+

torch.nn.functional.prelu

+

+

40

+

torch.nn.functional.rrelu

+

+

41

+

torch.nn.functional.rrelu_

+

+

42

+

torch.nn.functional.glu

+

+

43

+

torch.nn.functional.gelu

+

+

44

+

torch.nn.functional.logsigmoid

+

+

45

+

torch.nn.functional.hardshrink

+

+

46

+

torch.nn.functional.tanhshrink

+

+

47

+

torch.nn.functional.softsign

+

+

48

+

torch.nn.functional.softplus

+

+

49

+

torch.nn.functional.softmin

+

+

50

+

torch.nn.functional.softmax

+

+

51

+

torch.nn.functional.softshrink

+

+

52

+

torch.nn.functional.gumbel_softmax

+

+

53

+

torch.nn.functional.log_softmax

+

+

54

+

torch.nn.functional.tanh

+

+

55

+

torch.nn.functional.sigmoid

+

+

56

+

torch.nn.functional.batch_norm

+

+

57

+

torch.nn.functional.instance_norm

+

+

58

+

torch.nn.functional.layer_norm

+

+

59

+

torch.nn.functional.local_response_norm

+

+

60

+

torch.nn.functional.normalize

+

+

61

+

torch.nn.functional.linear

+

+

62

+

torch.nn.functional.bilinear

+

+

63

+

torch.nn.functional.dropout

+

+

64

+

torch.nn.functional.alpha_dropout

+

+

65

+

torch.nn.functional.dropout2d

+

+

66

+

torch.nn.functional.dropout3d

+

+

67

+

torch.nn.functional.embedding

+

+

68

+

torch.nn.functional.embedding_bag

+

+

69

+

torch.nn.functional.one_hot

+

+

70

+

torch.nn.functional.pairwise_distance

+

+

71

+

torch.nn.functional.cosine_similarity

+

+

72

+

torch.nn.functional.pdist

+

+

73

+

torch.nn.functional.binary_cross_entropy

+

+

74

+

torch.nn.functional.binary_cross_entropy_with_logits

+

+

75

+

torch.nn.functional.poisson_nll_loss

+

+

76

+

torch.nn.functional.cosine_embedding_loss

+

+

77

+

torch.nn.functional.cross_entropy

+

+

78

+

torch.nn.functional.ctc_loss

+

+

79

+

torch.nn.functional.hinge_embedding_loss

+

+

80

+

torch.nn.functional.kl_div

+

+

81

+

torch.nn.functional.l1_loss

+

+

82

+

torch.nn.functional.mse_loss

+

+

83

+

torch.nn.functional.margin_ranking_loss

+

+

84

+

torch.nn.functional.multilabel_margin_loss

+

+

85

+

torch.nn.functional.multilabel_soft_margin_loss

+

+

86

+

torch.nn.functional.multi_margin_loss

+

+

87

+

torch.nn.functional.nll_loss

+

+

88

+

torch.nn.functional.smooth_l1_loss

+

+

89

+

torch.nn.functional.soft_margin_loss

+

+

90

+

torch.nn.functional.triplet_margin_loss

+

+

91

+

torch.nn.functional.pixel_shuffle

+

+

92

+

torch.nn.functional.pad

+

+

93

+

torch.nn.functional.interpolate

+

+

94

+

torch.nn.functional.upsample

+

+

95

+

torch.nn.functional.upsample_nearest

+

+

96

+

torch.nn.functional.upsample_bilinear

+

+

97

+

torch.nn.functional.grid_sample

+

+

98

+

torch.nn.functional.affine_grid

+

+

99

+

torch.nn.parallel.data_parallel

+

+
+ +

torch.distributed

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

序号

+

API名称

+

是否支持

+

1

+

torch.distributed.init_process_group

+

+

2

+

torch.distributed.Backend

+

+

3

+

torch.distributed.get_backend

+

+

4

+

torch.distributed.get_rank

+

+

5

+

torch.distributed.get_world_size

+

+

6

+

torch.distributed.is_initialized

+

+

7

+

torch.distributed.is_mpi_available

+

+

8

+

torch.distributed.is_nccl_available

+

+

9

+

torch.distributed.new_group

+

+

10

+

torch.distributed.send

+

+

11

+

torch.distributed.recv

+

+

12

+

torch.distributed.isend

+

+

13

+

torch.distributed.irecv

+

+

14

+

is_completed

+

+

15

+

wait

+

+

16

+

torch.distributed.broadcast

+

+

17

+

torch.distributed.all_reduce

+

+

18

+

torch.distributed.reduce

+

+

19

+

torch.distributed.all_gather

+

+

20

+

torch.distributed.gather

+

+

21

+

torch.distributed.scatter

+

+

22

+

torch.distributed.barrier

+

+

23

+

torch.distributed.ReduceOp

+

+

24

+

torch.distributed.reduce_op

+

+

25

+

torch.distributed.broadcast_multigpu

+

+

26

+

torch.distributed.all_reduce_multigpu

+

+

27

+

torch.distributed.reduce_multigpu

+

+

28

+

torch.distributed.all_gather_multigpu

+

+

29

+

torch.distributed.launch

+

+

30

+

torch.multiprocessing.spawn

+

+
+ +

NPU和CUDA功能对齐

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

序号

+

API名称

+

npu对应API名称

+

是否支持

+

1

+

torch.cuda.current_blas_handle

+

torch.npu.current_blas_handle

+

+

2

+

torch.cuda.current_device

+

torch.npu.current_device

+

+

3

+

torch.cuda.current_stream

+

torch.npu.current_stream

+

+

4

+

torch.cuda.default_stream

+

torch.npu.default_stream

+

+

5

+

torch.cuda.device

+

torch.npu.device

+

+

6

+

torch.cuda.device_count

+

torch.npu.device_count

+

+

7

+

torch.cuda.device_of

+

torch.npu.device_of

+

+

8

+

torch.cuda.get_device_capability

+

torch.npu.get_device_capability

+

+

9

+

torch.cuda.get_device_name

+

torch.npu.get_device_name

+

+

10

+

torch.cuda.init

+

torch.npu.init

+

+

11

+

torch.cuda.ipc_collect

+

torch.npu.ipc_collect

+

+

12

+

torch.cuda.is_available

+

torch.npu.is_available

+

+

13

+

torch.cuda.is_initialized

+

torch.npu.is_initialized

+

+

14

+

torch.cuda.set_device

+

torch.npu.set_device

+

部分支持

+

15

+

torch.cuda.stream

+

torch.npu.stream

+

+

16

+

torch.cuda.synchronize

+

torch.npu.synchronize

+

+

17

+

torch.cuda.get_rng_state

+

torch.npu.get_rng_state

+

+

18

+

torch.cuda.get_rng_state_all

+

torch.npu.get_rng_state_all

+

+

19

+

torch.cuda.set_rng_state

+

torch.npu.set_rng_state

+

+

20

+

torch.cuda.set_rng_state_all

+

torch.npu.set_rng_state_all

+

+

21

+

torch.cuda.manual_seed

+

torch.npu.manual_seed

+

+

22

+

torch.cuda.manual_seed_all

+

torch.npu.manual_seed_all

+

+

23

+

torch.cuda.seed

+

torch.npu.seed

+

+

24

+

torch.cuda.seed_all

+

torch.npu.seed_all

+

+

25

+

torch.cuda.initial_seed

+

torch.npu.initial_seed

+

+

26

+

torch.cuda.comm.broadcast

+

torch.npu.comm.broadcast

+

+

27

+

torch.cuda.comm.broadcast_coalesced

+

torch.npu.comm.broadcast_coalesced

+

+

28

+

torch.cuda.comm.reduce_add

+

torch.npu.comm.reduce_add

+

+

29

+

torch.cuda.comm.scatter

+

torch.npu.comm.scatter

+

+

30

+

torch.cuda.comm.gather

+

torch.npu.comm.gather

+

+

31

+

torch.cuda.Stream

+

torch.npu.Stream

+

+

32

+

torch.cuda.Stream.query

+

torch.npu.Stream.query

+

+

33

+

torch.cuda.Stream.record_event

+

torch.npu.Stream.record_event

+

+

34

+

torch.cuda.Stream.synchronize

+

torch.npu.Stream.synchronize

+

+

35

+

torch.cuda.Stream.wait_event

+

torch.npu.Stream.wait_event

+

+

36

+

torch.cuda.Stream.wait_stream

+

torch.npu.Stream.wait_stream

+

+

37

+

torch.cuda.Event

+

torch.npu.Event

+

+

38

+

torch.cuda.Event.elapsed_time

+

torch.npu.Event.elapsed_time

+

+

39

+

torch.cuda.Event.from_ipc_handle

+

torch.npu.Event.from_ipc_handle

+

+

40

+

torch.cuda.Event.ipc_handle

+

torch.npu.Event.ipc_handle

+

+

41

+

torch.cuda.Event.query

+

torch.npu.Event.query

+

+

42

+

torch.cuda.Event.record

+

torch.npu.Event.record

+

+

43

+

torch.cuda.Event.synchronize

+

torch.npu.Event.synchronize

+

+

44

+

torch.cuda.Event.wait

+

torch.npu.Event.wait

+

+

45

+

torch.cuda.empty_cache

+

torch.npu.empty_cache

+

+

46

+

torch.cuda.memory_stats

+

torch.npu.memory_stats

+

+

47

+

torch.cuda.memory_summary

+

torch.npu.memory_summary

+

+

48

+

torch.cuda.memory_snapshot

+

torch.npu.memory_snapshot

+

+

49

+

torch.cuda.memory_allocated

+

torch.npu.memory_allocated

+

+

50

+

torch.cuda.max_memory_allocated

+

torch.npu.max_memory_allocated

+

+

51

+

torch.cuda.reset_max_memory_allocated

+

torch.npu.reset_max_memory_allocated

+

+

52

+

torch.cuda.memory_reserved

+

torch.npu.memory_reserved

+

+

53

+

torch.cuda.max_memory_reserved

+

torch.npu.max_memory_reserved

+

+

54

+

torch.cuda.memory_cached

+

torch.npu.memory_cached

+

+

55

+

torch.cuda.max_memory_cached

+

torch.npu.max_memory_cached

+

+

56

+

torch.cuda.reset_max_memory_cached

+

torch.npu.reset_max_memory_cached

+

+

57

+

torch.cuda.nvtx.mark

+

torch.npu.nvtx.mark

+

+

58

+

torch.cuda.nvtx.range_push

+

torch.npu.nvtx.range_push

+

+

59

+

torch.cuda.nvtx.range_pop

+

torch.npu.nvtx.range_pop

+

+

60

+

torch.cuda._sleep

+

torch.npu._sleep

+

+

61

+

torch.cuda.Stream.priority_range

+

torch.npu.Stream.priority_range

+

+

62

+

torch.cuda.get_device_properties

+

torch.npu.get_device_properties

+

+

63

+

torch.cuda.amp.GradScaler

+

torch.npu.amp.GradScaler

+

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>torch.npu.set\_device\(\)接口只支持在程序开始的位置通过set\_device进行指定,不支持多次指定和with torch.npu.device\(id\)方式的device切换 + diff --git "a/docs/zh/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.md" new file mode 100644 index 0000000000000000000000000000000000000000..7bf4e1dc551fd767e8565cfa211a1766477a6319 --- /dev/null +++ "b/docs/zh/PyTorch\345\234\250\347\272\277\346\216\250\347\220\206\346\214\207\345\215\227.md" @@ -0,0 +1,685 @@ +# PyTorch在线推理指南 +- [使用场景](#使用场景.md) +- [基本使用流程](#基本使用流程.md) + - [前提条件](#前提条件.md) + - [在线推理流程](#在线推理流程.md) + - [环境变量配置](#环境变量配置.md) + - [样例参考](#样例参考.md) +- [专题](#专题.md) + - [混合精度](#混合精度.md) + - [权重更新](#权重更新.md) +- [FAQ](#FAQ.md) + - [pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败.md) + - [安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md) +- [安装7.3.0版本gcc](#安装7-3-0版本gcc.md) +

使用场景

+ +在线推理是在AI框架内执行推理的场景,例如在PyTorch框架上,加载模型后,通过model.eval\(\)执行推理。 + +相比于离线推理场景,使用在线推理可以方便将原来基于PyTorch框架做推理的应用快速迁移到昇腾AI处理器,适用于数据中心推理场景。 + +## 支持的芯片型号 + +昇腾910 AI处理器 + +昇腾710 AI处理器 + +

基本使用流程

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

前提条件

+ +已完成PyTorch框架及混合精度模块的安装,详情请参考《PyTorch网络模型移植&训练指南》的"环境准备"章节。 + +

在线推理流程

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

环境变量配置

+ +Pytorch在线推理进程启动所依赖的环境变量: + +根据环境实际安装的软件包(toolkit或nnae),在下列场景中选择一个并运行对应的环境变量配置脚本。 + +``` +# 场景一:昇腾设备安装部署开发套件包Ascend-cann-toolkit(此时开发环境可进行推理任务),可根据不同安装用户执行相应脚本。 + # 以root用户安装toolkit包 + . /usr/local/Ascend/ascend-toolkit/set_env.sh + # 以非root用户安装toolkit包 + . ${HOME}/Ascend/ascend-toolkit/set_env.sh +# 场景二:昇腾设备安装部署软件包Ascend-cann-nnae,可根据不同安装用户执行相应脚本。 + # 以root用户安装nnae包 + . /usr/local/Ascend/nnae/set_env.sh + # 以非root用户安装nnae包 + . ${HOME}/Ascend/nnae/set_env.sh +``` + +其他环境变量配置。 + +``` +# 若参见《PyTorch网络模型移植&训练指南》的"环境准备"章节进行环境搭建时安装python3.7.5,或存在多个python3版本时,需要在环境变量中配置python3.7.5的安装路径。 +export PATH=/usr/local/python3.7.5/bin:$PATH +export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH + +# 指定芯片的逻辑ID +export ASCEND_DEVICE_ID=0 + +# 输出日志信息,可根据实际修改 +export ASCEND_SLOG_PRINT_TO_STDOUT=1 +export ASCEND_GLOBAL_LOG_LEVEL=0 +export TASK_QUEUE_ENABLE=0 +``` + +**表 1** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置项

+

说明

+

必选/可选

+

LD_LIBRARY_PATH

+

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

+
说明:

若系统环境升级了gcc版本(例如Centos、Debian和BClinux系统),需要配置gcc相关环境变量,详情请参见5

+
+

必选

+

PATH

+

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

+

必选

+

ASCEND_DEVICE_ID

+

指定芯片的逻辑ID。

+

取值范围[0,N-1],默认为0。其中N为当前物理机/虚拟机/容器内的设备总数。

+

可选

+

ASCEND_SLOG_PRINT_TO_STDOUT

+

是否开启日志打屏。取值:

+
  • 0或不配置:关闭日志打屏
  • 1:开启日志打屏
+

可选

+

ASCEND_GLOBAL_LOG_LEVEL

+

设置日志的全局日志级别。取值:

+
  • 0:对应DEBUG级别。
  • 1:对应INFO级别。
  • 2:对应WARNING级别。
  • 3:对应ERROR级别。
  • 4:对应NULL级别,不输出日志。
  • 其他值为非法值。
+

可选

+

TASK_QUEUE_ENABLE

+

s是否开启TASK多线程下发,绝大多数情况下,打开该功能会进一步提升整网训练性能。取值:

+
  • 0或不配置:关闭TASK多线程下发。
  • 1:开启TASK多线程下发。
+

可选

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>更多日志信息,请参见《CANN 日志参考》。 + +

样例参考

+ +## 样例代码 + +在进行推理应用时,应尽量保证应用在生命周期内不频繁初始化。推理模式通过模型model.eval\(\)进行设置,并且推理过程要在“with torch.no\_grad\(\):”代码分支下运行。本例中,我们将使用Resnet50网络的python代码进行说明。 + +样例代码 resnet50\_infer\_for\_pytorch.py: + +``` +import argparse +import os +import time +import torch +import torch.nn.parallel +import torch.optim +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models + +import torch.npu +from apex import amp + +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + + +def parse_args(): + """ 用户自定义数据集路径、模型路径 """ + parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') + parser.add_argument('--data', metavar='DIR', default="/data/imagenet", + help='path to dataset') + parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') + + parser.add_argument('--epochs', default=100, type=int, metavar='N', + help='number of total epochs to run') + + parser.add_argument('-b', '--batch_size', default=512, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') + + parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') + + parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') + + parser.add_argument('--npu', default=None, type=int, + help='NPU id to use.') + + parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 8)') + + parser.add_argument('--lr', '--learning_rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') + parser.add_argument('--wd', '--weight_decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') + + args, unknown_args = parser.parse_known_args() + if len(unknown_args) > 0: + for bad_arg in unknown_args: + print("ERROR: Unknown command line arg: %s" % bad_arg) + raise ValueError("Invalid command line arg(s)") + + return args + + +# ========================================================================= +# 主函数入口 +# ========================================================================= +def main(): + args = parse_args() + if args.npu is None: + args.npu = 0 + global CALCULATE_DEVICE + CALCULATE_DEVICE = "npu:{}".format(args.npu) + torch.npu.set_device(CALCULATE_DEVICE) + print("use ", CALCULATE_DEVICE) + main_worker(args.npu, args) + + +def main_worker(npu, args): + global best_acc1 + args.npu = npu + + # ========================================================================= + # 创建模型 + # ========================================================================= + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch](zero_init_residual=True) + + # 将模型数据置于昇腾AI处理器中 + model = model.to(CALCULATE_DEVICE) + + optimizer = torch.optim.SGD([ + {'params': [param for name, param in model.named_parameters() if name[-4:] == 'bias'], 'weight_decay': 0.0}, + {'params': [param for name, param in model.named_parameters() if name[-4:] != 'bias'], + 'weight_decay': args.weight_decay}], + args.lr) + + # ========================================================================= + # 初始化混合精度模型,使用后可加速运算,但推理结果的准确率可能会轻微降低。可根据实际场景选择使用 + # ========================================================================= + model, optimizer = amp.initialize(model, optimizer, opt_level="O2", loss_scale=1024, verbosity=1) + + # ========================================================================= + # 加载训练好的模型参数:通过命令行参数“--resume checkpoint文件” + # ========================================================================= + # 从模型文件中恢复模型参数 + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume) + + best_acc1 = checkpoint['best_acc1'] + best_acc1 = best_acc1.to("npu:{}".format(args.npu)) + + model.load_state_dict(checkpoint['state_dict']) + print("=> loaded checkpoint '{}' (epoch {})".format(args.resume, checkpoint['epoch'])) + + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + # ========================================================================= + # 初始化推理数据集 + # ========================================================================= + # 图像数据加载与预处理 + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=True) + + # ========================================================================= + # 进入在线推理模式 + # ========================================================================= + validate(val_loader, model, args) + + +# ========================================================================= +# 在线推理样例接口实现 +# ========================================================================= +def validate(val_loader, model, args): + batch_time = AverageMeter('Time', ':6.3f') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, top1, top5], + prefix='Test: ') + + # ========================================================================= + # 切换到推理模式 + # ========================================================================= + model.eval() + + # ========================================================================= + # 在 torch.no_grad():分支下执行模型正向计算 + # ========================================================================= + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + + # 将图像数据置于NPU中 + images = images.to(CALCULATE_DEVICE, non_blocking=True) + target = target.to(torch.int32).to(CALCULATE_DEVICE, non_blocking=True) + + # 计算输出 + output = model(images) + + # 测量结果精度 + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # 测量运行时间 + batch_time.update(time.time() - end) + end = time.time() + + # 打印推理运算过程日志 + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'.format(top1=top1, top5=top5)) + + return top1.avg + + +class AverageMeter(object): + """计算并存储平均值和当前值""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = 10 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + if self.count == 0: + self.batchsize = n + + self.val = val + self.count += n + if self.count > (self.start_count_index * self.batchsize): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * self.batchsize) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + """记录模型运算过程""" + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def accuracy(output, target, topk=(1,)): + """根据指定值k,计算k个顶部预测的精度""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + main() +``` + +## 样例执行 + +以ResNet50模型为例,执行在线推理样例。 + +1. 下载预训练模型。 + + 打开ModelZoo中[ResNet50详情页](https://ascend.huawei.com/zh/#/software/modelzoo/detail/C/cf20ab8b8bea4032a6b056ab503112e4),点击该页面的“下载模型“下载已训练好的模型文件。 + +2. 编辑推理脚本。 + + 创建“resnet50\_infer\_for\_pytorch.py“模型脚本文件,并参考[样例代码]()写入相关代码。 + +3. 执行推理。 + + 参考[环境变量配置](#环境变量配置.md)设置环境变量,并执行命令: + + ``` + python3.7 pytorch-resnet50-apex.py --data /data/imagenet --npu 7 --epochs 90 --resume checkpoint_npu7_epoch53.pth.tar + # 参数'--resume'加载训练好的权重参数文件,用户可根据实际模型名称修改 + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >上述为样例输入,用户可根据实际修改传入参数。 + + +

专题

+ +- **[混合精度](#混合精度.md)** + +- **[权重更新](#权重更新.md)** + + +

混合精度

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

功能

+

描述

+

O1配置模式

+

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

+

O2配置

+

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

+

静态Loss Scale功能

+

静态设置参数确保混合精度训练收敛。

+

动态Loss Scale功能

+

动态计算Loss Scale值并判读是否溢出。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>当前版本的实现方式主要为python实现,不支持AscendCL或者CUDA优化。 + +## 混合精度模型初始化 + +1. 使用apex混合精度模块需要首先从apex库中导入amp,代码如下: + + ``` + from apex import amp + ``` + +2. 导入amp模块后,需要初始化amp,使其能对模型、优化器以及PyTorch内部函数进行必要的改动,初始化代码如下: + + ``` + model, optimizer = amp.initialize(model, optimizer) + ``` + + - 可参考[样例代码](#样例参考.md)中的“初始化混合精度模型”: + + ``` + model, optimizer = amp.initialize(model, optimizer, opt_level="O2", loss_scale=1024, verbosity=1) + ``` + + + +## 混合精度推理 + +按混合精度模型初始化后,正常执行模型正向计算即可。 + +参考代码:可参考[样例代码](#样例参考.md)实现。 + +

权重更新

+ +## 背景 + +推理进行的同时,训练服务器不断训练得到新的权重。 + +如果希望使用最新的权重进行推理,可以采用在线推理方式,直接更新权重。 + +## 整体流程 + +**图 1** 权重更新流程示意图 +![](figures/权重更新流程示意图.png "权重更新流程示意图") + +如[图1](#fig6243201383)所示,支持循环地更新权重与执行推理。主要流程: + +1. 模型初始化; +2. 权重加载/更新:获取在线推理模型和权重信息,例如从ckpt文件中加载,实际更新用的权重则来自于外部的key-value; +3. 加载数据; +4. 执行推理图模型。 + +## 样例参考 + +请参考[样例参考](#样例参考.md)。 + +

FAQ

+ +- **[pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败.md)** + +- **[安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md)** + + +

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

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

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

+ +## 现象描述 + +安装“torch-\*.whl”时,提示"ERROR:torchvision 0.6.0 has requirement torch==1.5.0, but you'll have torch 1.5.0a0+1977093 which is incompatible"。 + +![](figures/zh-cn_image_0000001152776305.png) + +## 可能原因 + +安装torch时,会自动触发torchvision进行依赖版本检查,环境中安装的torchvision版本为0.6.0,检查时发现我们安装的torch-\*.whl的版本号与要求的1.5.0不一致,所以提示报错,但实际安装成功。 + +## 处理方法 + +对实际结果无影响,无需处理。 + +

安装7.3.0版本gcc

+ +以下步骤请在root用户下执行。 + +1. 下载gcc-7.3.0.tar.gz,下载地址为[https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz](https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz)。 +2. 安装gcc时候会占用大量临时空间,所以先执行下面的命令清空/tmp目录: + + ``` + sudo rm -rf /tmp/* + ``` + +3. 安装依赖。 + + centos/bclinux执行如下命令安装。 + + ``` + yum install bzip2 + ``` + + ubuntu/debian执行如下命令安装。 + + ``` + apt-get install bzip2 + ``` + +4. 编译安装gcc。 + 1. 进入gcc-7.3.0.tar.gz源码包所在目录,解压源码包,命令为: + + ``` + tar -zxvf gcc-7.3.0.tar.gz + ``` + + 2. 进入解压后的文件夹,执行如下命令下载gcc依赖包: + + ``` + cd gcc-7.3.0 + ./contrib/download_prerequisites + ``` + + 如果执行上述命令报错,需要执行如下命令在“gcc-7.3.0/“文件夹下下载依赖包: + + ``` + wget http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 + wget http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 + wget http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz + wget http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2 + ``` + + 下载好上述依赖包后,重新执行以下命令: + + ``` + ./contrib/download_prerequisites + ``` + + 如果上述命令校验失败,需要确保依赖包为一次性下载成功,无重复下载现象。 + + 3. 执行配置、编译和安装命令: + + ``` + ./configure --enable-languages=c,c++ --disable-multilib --with-system-zlib --prefix=/usr/local/linux_gcc7.3.0 + make -j15 # 通过grep -w processor /proc/cpuinfo|wc -l查看cpu数,示例为15,用户可自行设置相应参数。 + make install + ``` + + >![](public_sys-resources/icon-caution.gif) **注意:** + >其中“--prefix“参数用于指定linux\_gcc7.3.0安装路径,用户可自行配置,但注意不要配置为“/usr/local“及“/usr“,因为会与系统使用软件源默认安装的gcc相冲突,导致系统原始gcc编译环境被破坏。示例指定为“/usr/local/linux\_gcc7.3.0“。 + + +5. 配置环境变量。 + + 当用户执行训练时,需要用到gcc升级后的编译环境,因此要在训练脚本中配置环境变量,通过如下命令配置。 + + ``` + export LD_LIBRARY_PATH=${install_path}/lib64:${LD_LIBRARY_PATH} + ``` + + 其中$\{install\_path\}为[3.](#zh-cn_topic_0000001146754749_zh-cn_topic_0000001072593337_l75d31a2874534a2092e80a5f865b46f0)中配置的gcc7.3.0安装路径,本示例为“/usr/local/gcc7.3.0/“。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >本步骤为用户在需要用到gcc升级后的编译环境时才配置环境变量。 + + diff --git "a/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch.md" "b/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b2ed1e77be19cd2f16f8cd8f6f763039794f915 --- /dev/null +++ "b/docs/zh/PyTorch\347\275\221\347\273\234\346\250\241\345\236\213\347\247\273\346\244\215&\350\256\255\347\273\203\346\214\207\345\215\227/PyTorch.md" @@ -0,0 +1,3835 @@ +# PyTorch网络模型移植&训练指南 +- [概述](#概述.md) +- [约束与限制](#约束与限制.md) +- [迁移流程](#迁移流程.md) +- [模型移植评估](#模型移植评估.md) +- [环境准备](#环境准备.md) + - [简介](#简介.md) + - [手动编译安装](#手动编译安装.md) + - [获取软件包](#获取软件包.md) + - [安装PyTorch框架](#安装PyTorch框架.md) + - [配置环境变量](#配置环境变量.md) + - [安装混合精度模块](#安装混合精度模块.md) + - [使用Ascend Hub镜像](#使用Ascend-Hub镜像.md) + - [Ascend Hub获取PyTorch镜像](#Ascend-Hub获取PyTorch镜像.md) + - [配置环境变量](#配置环境变量-0.md) +- [模型迁移](#模型迁移.md) + - [工具迁移](#工具迁移.md) + - [功能介绍](#功能介绍.md) + - [操作指南](#操作指南.md) + - [结果解析](#结果解析.md) + - [手工迁移](#手工迁移.md) + - [单P训练模型迁移](#单P训练模型迁移.md) + - [多P训练模型迁移](#多P训练模型迁移.md) + - [PyTorch接口替换](#PyTorch接口替换.md) + - [混合精度](#混合精度.md) + - [性能优化](#性能优化.md) + - [概述](#概述-1.md) + - [修改CPU性能模式(X86服务器)](#修改CPU性能模式(X86服务器).md) + - [修改CPU性能模式(ARM服务器)](#修改CPU性能模式(ARM服务器).md) + - [安装高性能pillow库(X86服务器)](#安装高性能pillow库(X86服务器).md) + - [(可选)安装指定版本OpenCV库](#(可选)安装指定版本OpenCV库.md) +- [模型训练](#模型训练.md) +- [性能调优和分析](#性能调优和分析.md) + - [前提条件](#前提条件.md) + - [调测过程](#调测过程.md) + - [总体思路](#总体思路.md) + - [采集训练过程相关数据](#采集训练过程相关数据.md) + - [性能优化](#性能优化-2.md) + - [亲和库](#亲和库.md) + - [来源介绍](#来源介绍.md) + - [功能介绍](#功能介绍-3.md) +- [精度调测](#精度调测.md) + - [前提条件](#前提条件-4.md) + - [调测过程](#调测过程-5.md) + - [总体思路](#总体思路-6.md) + - [精度调优方法](#精度调优方法.md) +- [模型保存与转换](#模型保存与转换.md) + - [简介](#简介-7.md) + - [模型保存](#模型保存.md) + - [导出ONNX模型](#导出ONNX模型.md) +- [样例说明](#样例说明.md) + - [ResNet50模型迁移示例](#ResNet50模型迁移示例.md) + - [样例获取](#样例获取.md) + - [训练脚本迁移](#训练脚本迁移.md) + - [单P训练修改](#单P训练修改.md) + - [分布式训练修改](#分布式训练修改.md) + - [脚本执行](#脚本执行.md) + - [ShuffleNet模型调优示例](#ShuffleNet模型调优示例.md) + - [样例获取](#样例获取-8.md) + - [模型评估](#模型评估.md) + - [网络迁移](#网络迁移.md) + - [网络调测](#网络调测.md) +- [参考信息](#参考信息.md) + - [单算子样例编写说明](#单算子样例编写说明.md) + - [单算子dump方法](#单算子dump方法.md) + - [常用环境变量说明](#常用环境变量说明.md) + - [dump op方法](#dump-op方法.md) + - [CMake安装方法](#CMake安装方法.md) +- [FAQ](#FAQ.md) + - [软件安装常见问题](#软件安装常见问题.md) + - [pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败.md) + - [安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md) + - [模型和算子运行常见问题](#模型和算子运行常见问题.md) + - [在模型运行或者算子运行时遇到报错“RuntimeError: ExchangeDevice:”](#在模型运行或者算子运行时遇到报错-RuntimeError-ExchangeDevice.md) + - [在模型运行或者算子运行时遇到报错“Error in atexit.\_run\_exitfuncs:”](#在模型运行或者算子运行时遇到报错-Error-in-atexit-_run_exitfuncs.md) + - [在模型运行时遇到报错“terminate called after throwing an instance of 'c10::Error' what\(\): HelpACLExecute:”](#在模型运行时遇到报错-terminate-called-after-throwing-an-instance-of-c10-Error-what()-HelpACLExecute.md) + - [在模型运行时遇到报错“ImportError: libhccl.so.”](#在模型运行时遇到报错-ImportError-libhccl-so.md) + - [在模型运行时遇到报错“RuntimeError: Initialize.”](#在模型运行时遇到报错-RuntimeError-Initialize.md) + - [在模型运行时遇到报错“TVM/te/cce error.”](#在模型运行时遇到报错-TVM-te-cce-error.md) + - [在模型运行时遇到报错“MemCopySync:drvMemcpy failed.”](#在模型运行时遇到报错-MemCopySync-drvMemcpy-failed.md) + - [在模型运行时将多任务下发关闭\(export TASK\_QUEUE\_ENABLE=0\)后仍然遇到报错“HelpACLExecute.”](#在模型运行时将多任务下发关闭(export-TASK_QUEUE_ENABLE-0)后仍然遇到报错-HelpACLExecute.md) + - [模型调测常见问题](#模型调测常见问题.md) + - [在模型调测时遇到报错“RuntimeError: malloc:/..../pytorch/c10/npu/NPUCachingAllocator.cpp:293 NPU error, error code is 500000.”](#在模型调测时遇到报错-RuntimeError-malloc-pytorch-c10-npu-NPUCachingAllocator-cpp-293-NPU-error-error-code-is-5.md) + - [在模型调测时遇到报错“RuntimeError: Could not run 'aten::trunc.out' with arguments from the 'NPUTensorId' backend.”](#在模型调测时遇到报错-RuntimeError-Could-not-run-aten-trunc-out-with-arguments-from-the-NPUTensorId-backend.md) + - [在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错](#在模型调测时遇到如MaxPoolGradWithArgmaxV1算子和max算子报错.md) + - [在调用torch时遇到报错“ModuleNotFoundError: No module named 'torch.\_C'”](#在调用torch时遇到报错-ModuleNotFoundError-No-module-named-torch-_C.md) + - [其他操作相关问题](#其他操作相关问题.md) + - [cuda流同步操作报错](#cuda流同步操作报错.md) + - [aicpu\_kernels/libpt\_kernels.so不存在](#aicpu_kernels-libpt_kernels-so不存在.md) + - [使用npu-smi info查看显存时发现python进程残留](#使用npu-smi-info查看显存时发现python进程残留.md) + - [动态shape报错“match op inputs failed”](#动态shape报错-match-op-inputs-failed.md) + - [Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported](#Op-type-SigmoidCrossEntropyWithLogitsV2-of-ops-kernel-AIcoreEngine-is-unsupported.md) + - [Hook失败](#Hook失败.md) + - [加载权重时遇到报错“load state\_dict error.”](#加载权重时遇到报错-load-state_dict-error.md) + - [模型分布式训练常见问题](#模型分布式训练常见问题.md) + - [在进行模型分布式训练时遇到报错“host not found.”](#在进行模型分布式训练时遇到报错-host-not-found.md) +

概述

+ +当前阶段针对PyTorch框架实现的对接适配昇腾AI处理器的方案为在线对接方案。 + +## 方案特性及优点 + +昇腾AI处理器的加速实现方式是以各种算子为粒度进行调用(OP-based),即通过AscendCL调用一个或几个D亲和算子组合的形式,代替原有GPU的实现方式。其逻辑模型如[图1](#fig2267112413239)所示。 + +**图 1** 逻辑模型 + + +![](figures/pytorch适配逻辑结构图-优化.png) + +当前选择在线对接适配方案的主要原因有一下几点: + +1. 最大限度的继承PyTorch框架动态图的特性。 +2. 最大限度的继承GPU在PyTorch上的使用方式,可以使用户在将模型移植到昇腾AI处理器设备进行训练时,在开发方式和代码重用方面做到最小的改动。 +3. 最大限度的继承PyTorch原生的体系结构,保留框架本身出色的特性,比如自动微分、动态分发、Debug、Profiling、Storage共享机制以及设备侧的动态内存管理等。 +4. 扩展性好。在打通流程的通路之上,对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用。 +5. 与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,只需在Python侧和Device相关操作中,指定device为昇腾AI处理器,即可完成用昇腾AI处理器在PyTorch对网络的开发、训练以及调试,用户无需额外进一步关注昇腾AI处理器具体的底层细节。这样可以确保用户的最小化修改及完成平台迁移,迁移成本较低。 + +

约束与限制

+ +1. infershape阶段算子不支持unknowshape的推导。 +2. cube计算的算子只支持fp16。 +3. 不支持inf/nan类型的输入。 +4. 出现4D以上的format时不能降维。 +5. Apex当前版本的实现方式为python实现,不支持APEX中的自定义优化CUDA Kernel。 +6. Apex当前版本只支持适配昇腾AI处理器的混合精度计算和多种融合优化器功能,其他功能暂未支持。 +7. 集合通信约束: + - 数据并行模式中不同device上执行的图相同。 + - 只支持1/2/4/8P粒度的分配。 + - 只支持int8,int32,float16和float32数据类型。 + - 服务器网卡名称要求以eth开头。 + + +

迁移流程

+ +模型迁移主要指将开源社区中实现过的模型迁移到昇腾AI处理器上,主要流程如[图1](#fig759451810422)所示。 + +**图 1** 迁移流程 +![](figures/迁移流程.png "迁移流程") + +**表 1** 迁移流程说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

场景

+

说明

+

模型选取

+

详情请参见模型选取

+

模型移植评估

+

详情请参见模型移植评估

+

算子开发

+

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

+

环境准备

+

详情请参见环境准备

+

模型迁移

+

详情请参见模型迁移

+

模型训练

+

详情请参见模型训练

+

错误分析

+

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

+

性能调优和分析

+

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

+

精度调测

+

详情请参见精度调测

+

模型保存与转换

+

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

+

应用软件开发

+

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

+

FAQ

+

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

+
+ +

模型移植评估

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

环境准备

+ +- **[简介](#简介.md)** + +- **[手动编译安装](#手动编译安装.md)** + +- **[使用Ascend Hub镜像](#使用Ascend-Hub镜像.md)** + + +

简介

+ +用户在准备相关环境进行PyTorch模型的移植及训练时,可以选择在训练服务器中手动编译安装PyTorch框架相关模块,也可使用Ascend Hub镜像中心提供的基础镜像(镜像中已安装PyTorch模块和混合精度模块),进行模型的移植与训练。 + +**图 1** 环境准备流程图 +![](figures/环境准备流程图.png "环境准备流程图") + +

手动编译安装

+ +- **[获取软件包](#获取软件包.md)** + +- **[安装PyTorch框架](#安装PyTorch框架.md)** + +- **[配置环境变量](#配置环境变量.md)** + +- **[安装混合精度模块](#安装混合精度模块.md)** + + +

获取软件包

+ +## 前提条件 + +- 已完成CANN开发或运行环境的安装,具体操作请参考《CANN 软件安装指南》。 +- 需安装3.12.0以上版本的CMake,安装方法请参考[CMake安装方法](#CMake安装方法.md)。 +- 需确保已安装7.3.0以上版本的gcc,7.3.0版本gcc具体安装及使用方式请参见《CANN 软件安装指南》中的“安装7.3.0版本gcc”章节。 +- 需确保环境中已安装git工具,以Ubuntu和CentOS系统为例,命令如下: + - Ubuntu系统 + + **apt-get install git** + + - CentOS系统 + + **yum install git** + + + +## 获取软件包 + +当前适配昇腾AI处理器的PyTorch及混合精度模块Apex是通过patch化解耦方式发布,需要先获取对应的patch文件。另外Apex提供了包含融合优化功能的whl包,需和patch方式发布的Apex配合使用。请先获取ascend-pytorch-master.zip和ascend-apex-npu-master.zip,解压后得到源码文件。,其它证书文件请详阅下载包。 + +**表 1** 获取软件包 + + + + + + + + + + + + + +

软件包

+

获取链接

+

ascend-pytorch-master.zip

+

获取链接

+

ascend-apex-npu-master.zip

+

获取链接

+
+ +

安装PyTorch框架

+ +## 安装流程 + +1. 以root或非root用户登录服务器。 +2. 依次执行如下命令安装PyTorch依赖环境。 + + 如果使用非root用户安装Python及其依赖,用户需要在本步骤中的每句命令结尾加上**--user**,命令示例为:**pip3.7 install pyyaml --user** + + ``` + pip3.7 install pyyaml + pip3.7 install wheel + ``` + + 若以上过程报错,请参考[FAQ](#FAQ.md)尝试解决问题。 + +3. 将源码包ascend-pytorch-master.zip上传至服务器并解压,源码主要目录结构如下。 + + ``` + pytorch + │ ├─build # 编译构建目录 + │ ├─build.sh + │ ├─dist # 编译结果文件存放目录 + │ ├─patch # + │ ├─npu.patch + │ ├─src # 源码目录 + │ ├─test # 测试用例存放目录 + │ ├─README.md + ``` + +4. 编译安装PyTorch。 + 1. 进入“build“文件夹目录,执行以下命令,将DOS格式的脚本文件转换成UNIX格式。 + + ``` + dos2unix *.sh + ``` + + 2. 执行如下命令编译PyTorch,编译完成后将在“dist“文件夹下生成“.whl”格式的安装文件。 + + ``` + bash build.sh + ``` + + 3. 进入“dist“文件夹目录,执行如下命令安装。 + + ``` + pip3 install --upgrade torch-1.5.0+ascend.post2-cp37-cp37m-linux_{arch}.whl + ``` + + _**\{arch\}**_表示架构信息,为aarch64或x86\_64。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >若环境中已安装了PyTorch或需要对PyTorch进行升级时,需要先卸载环境中已安装的PyTorch软件包再执行[\#ZH-CN\_TOPIC\_0000001152776301/li1017121316306](#li1017121316306)。 + + + +

配置环境变量

+ +安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch。建议构建启动脚本,例如构建set\_env.sh脚本,使用source set\_env.sh配置当前窗口的环境变量。set\_env.sh脚本内容如下。 + +``` +cpu_type=$(echo $HOSTTYPE) + +if [ x"${cpu_type}" == x"x86_64" ];then + cpu_type=x86_64-linux +else + cpu_type=arm64-linux +fi +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + export ASCEND_AICPU_PATH=/usr/local/Ascend/nnae/latest/ +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/${cpu_type} +fi +path_lib=$(python3.7 -c """ +import sys +import re +result='' +for index in range(len(sys.path)): + match_sit = re.search('-packages', sys.path[index]) + if match_sit is not None: + match_lib = re.search('lib', sys.path[index]) + if match_lib is not None: + end=match_lib.span()[1] + result += sys.path[index][0:end] + ':' + result+=sys.path[index] + '/torch/lib:' +print(result)""" +) +export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib/:${path_lib}:$LD_LIBRARY_PATH +export TASK_QUEUE_ENABLE=1 + +# 请依据实际,在下列场景中选择合适的HCCL初始化方式,并配置相应环境变量。具体如下: +# 场景一:单机场景 +export HCCL_WHITELIST_DISABLE=1 # 关闭HCCL通信白名单 +# 场景二:多机场景。 +export HCCL_WHITELIST_DISABLE=1 # 关闭HCCL通信白名单 +export HCCL_IF_IP="10.136.181.111" # “10.136.181.111”为示例使用的host网卡IP,请根据实际修改。需要保证使用的网卡IP在集群内是互通的。 +``` + +相关参数介绍参见下表。 + +**表 1** 环境变量说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

配置项

+

说明

+

LD_LIBRARY_PATH

+

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

+

PYTHONPATH

+

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

+

PATH

+

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

+

ASCEND_OPP_PATH

+

算子根目录,参考上述举例配置。

+

OPTION_EXEC_EXTERN_PLUGIN_PATH

+

算子信息库路径。

+

ASCEND_AICPU_PATH

+

aicpu算子包路径。

+

TASK_QUEUE_ENABLE

+

使用异步任务下发,异步调用acl接口。建议开启,开启设置为1。

+

HCCL_WHITELIST_DISABLE

+

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

+

1:关闭白名单,需校验HCCL通信白名单。

+

0:开启白名单,无需校验HCCL通信白名单。

+

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

+

HCCL_IF_IP

+

配置HCCL的初始化通信网卡IP。

+

- ip格式为点分十进制。

+

- 暂只支持host网卡。

+

缺省时,按照以下优先级选定host通信网卡名:docker/local以外网卡(网卡名字字典序升序排列) >docker 网卡 > local网卡

+
+ +

安装混合精度模块

+ +## 前提条件 + +1. 请确保运行环境中适配昇腾AI处理器的PyTorch框架能正常使用。 +2. 编译安装Apex前,需参见[配置环境变量](#配置环境变量.md)配置好编译过程依赖的环境变量。 + +## 安装流程 + +1. 以root或非root用户登录服务器。 +2. 将源码包ascend-apex-npu-master.zip上传至服务器并解压,源码主要目录结构如下。 + + ``` + apex-npu + │ ├─build # 编译构建目录 + │ ├─build.sh + │ ├─dist # 编译结果文件存放目录 + │ ├─patch + │ ├─npu.patch + │ ├─src # 源码目录 + │ ├─tests # 测试用例存放目录 + │ ├─README.zh.md + ``` + +3. 编译安装apex。 + 1. 进入“build“文件夹目录,执行以下命令,将DOS格式的脚本文件转换成UNIX格式。 + + ``` + dos2unix *.sh + ``` + + 2. 执行如下命令编译apex,编译完成后将在“dist“文件夹下生成“.whl”格式的安装文件。 + + ``` + bash build.sh + ``` + + 3. 进入“dist“文件夹目录,执行如下命令安装。 + + ``` + pip3.7 install --upgrade apex-0.1+ascend-cp37-cp37m-linux_{arch}.whl + ``` + + _**\{arch\}**_表示架构信息,为aarch64或x86\_64。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >若环境中已安装了Apex或需要对Apex进行升级时,需要先卸载环境中已安装的Apex软件包再执行[3](#li9608181712216)。 + + + +

使用Ascend Hub镜像

+ +- **[Ascend Hub获取PyTorch镜像](#Ascend-Hub获取PyTorch镜像.md)** + +- **[配置环境变量](#配置环境变量-0.md)** + + +

Ascend Hub获取PyTorch镜像

+ +## 前提条件 + +- 已完成CANN开发或运行环境的安装,具体操作请参考《CANN 软件安装指南》。 +- 宿主机上已安装Docker。 + +## 获取并使用镜像 + +用户可登录[Ascend Hub](https://ascendhub.huawei.com/#/home)获取相应镜像(首次申请需要激活账号)。 + +当前支持的镜像列表如[表1](#zh-cn_topic_0000001074498056_table1519011227314)所示。用户可根据实际选择所需的镜像进行下载并使用。 + +**表 1** 镜像列表 + + + + + + + + + + + + +

镜像名称

+

镜像版本

+

配套CANN版本

+
+

21.0.2

+

5.0.2

+
+ +

配置环境变量

+ +启动并进入镜像容器后,请参见[配置环境变量](#配置环境变量.md)配置模型训练依赖的环境变量。 + +

模型迁移

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

工具迁移

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

功能介绍

+ +## 简介 + +昇腾NPU是AI算力的后起之秀,但目前训练和在线推理脚本大多是基于GPU的。由于NPU与GPU的架构差异,基于GPU的训练和在线推理脚本不能直接在NPU上使用,脚本转换工具提供了将基于GPU的脚本转换为基于NPU的脚本的自动化方法,节省了人工手动进行脚本迁移的学习成本与工作量,大幅提升了迁移效率。 + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 脚本转换工具根据适配规则,对用户脚本给出修改建议并提供转换功能,大幅度提高了脚本迁移速度,降低了开发者的工作量。但转换结果仅供参考,仍需用户根据实际情况做少量适配。 +>- 脚本转换工具当前仅支持PyTorch训练脚本转换。 + +## 系统要求 + +脚本转换工具支持Ubuntu 18.04、Centos 7.6或EulerOS 2.8。 + +## 环境准备 + +详情请参考《CANN 软件安装指南》安装开发环境。 + +

操作指南

+ +## 参数说明 + +**表 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

+

-h

+

--help

+

显示帮助信息。

+

-

+
+ +## 自定义规则文件 + +自定义转换规则样例如下: + +``` +{ + "rules": { + "ArgsModifyRule": [ + { + "func_name": "name1", + "arg_idx": 0, + "arg_new": "agrs0" + }, + { + "func_name": "name2", + "arg_idx": 0, + "arg_new": "agrs0" + } + ], + "FuncNameModifyRule": [ + { + "old_name": "func", + "new_name": "new_func" + } + ], + "ModuleNameModifyRule": [ + { + "old_name": "module", + "new_name": "new_module" + } + ] + } +} +``` + +**表 2** 参数说明 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

ArgsModifyRule

+

函数参数修改

+

func_name

+

函数名称

+

arg_idx

+

参数的位置

+

arg_new

+

新的参数

+

FuncNameModifyRule

+

函数名称修改

+

ModuleNameModifyRule

+

模块名称修改

+

old_name

+

旧名称

+

new_name

+

新名称

+
+ +## 执行转换 + +1. 进入脚本转换工具所在路径。 + + ``` + cd Ascend-cann-toolkit安装目录/ascend-toolkit/{version}/{arch}-linux/toolkit/tools/ms_fmk_transplt + ``` + +2. 执行脚本转换工具。 + + ``` + python3.7.5 ms_fmk_transplt.py -i 原始脚本路径 -o 脚本转换结果输出路径 [-r 自定义规则json文件路径] + ``` + +3. 完成脚本转换。 + +

结果解析

+ +脚本转换完成后,进入脚本转换结果输出路径查看结果文件。 + +``` +├── xxx_msft // 脚本转换结果输出目录,默认为原始脚本路径。xxx为原始脚本所在文件夹名称。 +│ ├── 生成脚本文件 // 与转换前的脚本文件目录结构一致 +│ ├── msFmkTranspltlog.txt // 脚本转换过程日志文件。 +│ ├── unsupported_op.xlsx // 不支持算子列表文件。 +``` + +

手工迁移

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

单P训练模型迁移

+ +当前在线对接方案优点在于保证在昇腾AI处理器上训练与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,**只需在Python侧和Device相关操作中,指定device为昇腾AI处理器**,即可完成用昇腾AI处理器在PyTorch对网络的开发、训练以及调试。针对单P模型训练,主要迁移改动如下: + +迁移前GPU代码: + +``` + CALCULATE_DEVICE = “gpu:0” + torch.cuda.set_device(CALCULATE_DEVICE) + # 放到device的两种方法 + model = model.cuda() # 写法1 + model = model.to(CALCULATE_DEVICE) # 写法2 + # 将输入也从host放到device + images = images.to(CALCULATE_DEVICE) + target = target.to(CALCULATE_DEVICE) +``` + +迁移到昇腾AI处理器上代码为: + +``` + CALCULATE_DEVICE = “npu:0” + torch.npu.set_device(CALCULATE_DEVICE) + # 放到device的两种方法 + model = model.npu() # 写法1 + model = model.to(CALCULATE_DEVICE) # 写法2 + # 将输入也从host放到device + images = images.to(CALCULATE_DEVICE) + target = target.to(CALCULATE_DEVICE) +``` + +更多迁移细节请参见[单P训练修改](#单P训练修改.md)。 + +

多P训练模型迁移

+ +多P训练模型迁移除了需在**Python侧和Device相关操作中,指定device为昇腾AI处理器**外,依然通过PyTorch的DistributedDataParallel方式来进行分布式训练,即在模型初始化阶段执行init\_process\_group,再将模型初始化为DistributedDataParallel模型。但须注意的是在初始化init\_process\_group时需要将**backend**配置为**hccl**并屏蔽掉初始化方式。 + +PyTorch分布式训练代码示例(部分代码省略): + +``` +import torch +import torch.distributed as dist +import torch.nn.parallel +def main(): + args = parser.parse_args() + # 需屏蔽掉初始化方式 + dist.init_process_group(backend='hccl',# init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler) + for epoch in range(args.start_epoch, args.epochs): + acc1 = train(train_loader, model, criterion, optimizer, epoch, args,ngpus_per_node, + lr_scheduler) +``` + +更多迁移细节请参见[分布式训练修改](#分布式训练修改.md)。 + +

PyTorch接口替换

+ +1. 为了使昇腾AI处理器使用PyTorch框架的能力,需要对原生的PyTorch框架进行一定Device层面的适配,对外呈现是需要将跟cpu和cuda相关的接口进行切换;在进行网络迁移时,需要将某些设备相关的接口转换成跟昇腾AI处理器相关的接口,当前适配的设备相关接口参见: + + **表 1** 设备接口替换 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PyTorch原始接口

+

适配昇腾AI处理器后的接口

+

说明

+

torch.cuda.is_available()

+

torch.npu.is_available()

+

判断当前环境上设备是否可用(不代表最后结果)。

+

torch.cuda.current_device()

+

torch.npu.current_device()

+

获取当前正在使用的device。

+

torch.cuda.device_count()

+

torch.npu.device_count()

+

获取当前环境上的设备数量。

+

torch.cuda.set_device()

+

torch.npu.set_device()

+

设置当前正在使用的device。

+

torch.tensor([1,2,3]).is_cuda

+

torch.tensor([1,2,3]).is_npu

+

判断某个tensor是否是cuda/npu设备上的格式。

+

torch.tensor([1,2,3]).cuda()

+

torch.tensor([1,2,3]).npu()

+

将某个tensor转换成cuda/npu格式。

+

torch.tensor([1,2,3]).to("cuda")

+

torch.tensor([1,2,3]).to('npu')

+

将某个tensor转换成cuda/npu格式。

+

torch.cuda.synchronize()

+

torch.npu.synchronize()

+

同步等待事件完成。

+

torch.cuda.device

+

torch.npu.device

+

生成一个device类,可以执行device相关操作。

+

torch.cuda.Stream(device)

+

torch.npu.Stream(device)

+

生成一个stream对象。

+

torch.cuda.stream(Stream)

+

torch.npu.stream(Stream)

+

多用于作用域限定。

+

torch.cuda.current_stream()

+

torch.npu.current_stream()

+

获取当前stream。

+

torch.cuda.default_stream()

+

torch.npu.default_stream()

+

获取默认stream。

+

device = torch.device("cuda:0")

+

device = torch.device("npu:0")

+

指定一个设备。

+

torch.autograd.profiler.profile

+

(use_cuda=True)

+

torch.autograd.profiler.profile

+

(use_npu=True)

+

指定执行profiler过程中使用cuda/npu。

+

torch.cuda.Event()

+

torch.npu.Event()

+

返回某个设备上的事件。

+
+ +2. 用户在构建网络或进行网络迁移时,需要创建指定数据类型的tensor,在昇腾AI处理器上创建的tensor如下。 + + **表 2** tensor创建接口替换 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GPU tensor

+

适配昇腾AI处理器后的接口

+

torch.tensor([1,2,3],dtype=torch.long,device='cuda')

+

torch.tensor([1,2,3],dtype=torch.long,device='npu')

+

torch.tensor([1,2,3],dtype=torch.int,device='cuda')

+

torch.tensor([1,2,3],dtype=torch.int,device='npu')

+

torch.tensor([1,2,3],dtype=torch.half,device='cuda')

+

torch.tensor([1,2,3],dtype=torch.half,device='npu')

+

torch.tensor([1,2,3],dtype=torch.float,device='cuda')

+

torch.tensor([1,2,3],dtype=torch.float,device='npu')

+

torch.tensor([1,2,3],dtype=torch.bool,device='cuda')

+

torch.tensor([1,2,3],dtype=torch.bool,device='npu')

+

torch.cuda.BoolTensor([1,2,3])

+

torch.npu.BoolTensor([1,2,3])

+

torch.cuda.FloatTensor([1,2,3])

+

torch.npu.FloatTensor([1,2,3])

+

torch.cuda.IntTensor([1,2,3])

+

torch.npu.IntTensor([1,2,3])

+

torch.cuda.LongTensor([1,2,3])

+

torch.npu.LongTensor([1,2,3])

+

torch.cuda.HalfTensor([1,2,3])

+

torch.npu.HalfTensor([1,2,3])

+
+ + +更多接口请参见《PyTorch API支持清单》。 + +

混合精度

+ +## 概述 + +基于NPU芯片的架构特性,会涉及到混合精度训练,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下一些好处: + +- 对于中间变量的内存占用更少,节省内存的使用。 +- 因内存使用会减少,所以数据传出的时间也会减半。 +- float16的计算单元可以提供更快的计算性能。 + +但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况,为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里采用混合精度模块Apex来达到以上效果。混合精度模块Apex是一个集优化性能、精度收敛于一身的综合优化库。 + +适配昇腾AI处理器的混合精度模块Apex除了上述优点外,还能提升运算性能。具体如下: + +- Apex在进行混合精度运算时,会对模型的grad进行运算,开启combine\_grad开关,可以加速这些运算。具体为将amp.initialize\(\)接口参数combine\_grad设置为True; +- 适配后的Apex针对adadelta/adam/sgd/lamb做了昇腾AI处理器亲和性优化,得到的NPU融合优化器与原生算法保持一致,但运算速度更快。使用时只需将原有优化器替换为apex.optimizers.\*(“\*”为优化器名称,例如NpuFusedSGD)。 + +## 特性支持 + +混合精度模块功能和优化描述如[表1](#table10717173813332)所示: + +**表 1** 混合精度模块功能 + + + + + + + + + + + + + + + + + + + +

功能

+

描述

+

O1配置模式

+

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

+

O2配置

+

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

+

静态Loss Scale功能

+

静态设置参数确保混合精度训练收敛。

+

动态Loss Scale功能

+

动态计算loss Scale值并判读是否溢出。

+
+ +>![](public_sys-resources/icon-note.gif) **说明:** +>- 当前版本的实现方式主要为python实现,不支持AscendCL或者CUDA优化。 +>- 当前昇腾AI设备暂不支持原始Apex的FusedLayerNorm接口模块,如果模型原始脚本文件使用了FusedLayerNorm接口模块,需要在模型迁移过程中将脚本头文件“from apex.normalization import FusedLayerNorm“替换为“from torch.nn import LayerNorm“。 + +## 将混合精度模块集成到PyTorch模型中 + +1. 使用apex混合精度模块需要首先从apex库中导入amp,代码如下: + + ``` + from apex import amp + ``` + +2. 导入amp模块后,需要初始化amp,使其能对模型、优化器以及PyTorch内部函数进行必要的改动,初始化代码如下: + + ``` + model, optimizer = amp.initialize(model, optimizer) + ``` + +3. 标记反向传播.backward\(\)发生的位置,这样Amp就可以进行Loss Scaling并清除每次迭代的状态,代码如下: + + 原始代码: + + ``` + loss = criterion(…) + loss.backward() + optimizer.step() + ``` + + 修改以支持loss scaling后的代码: + + ``` + loss = criterion(…) + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + optimizer.step() + ``` + + +

性能优化

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

概述

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

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

+ +## 设置电源策略为高性能模式 + +提升网络性能需要在X86服务器BIOS设置中将电源策略设为高性能模式,具体操作如下。 + +1. 登录ibmc界面,启动虚拟控制台,远程控制选择HTML5集成远程控制台,如[图1](#fig15869135420288)。 + + **图 1** 远程登录控制台 + ![](figures/远程登录控制台.png "远程登录控制台") + +2. 在虚拟界面工具栏中,单击启动项工具![](figures/zh-cn_image_0000001106016350.png),弹出启动项配置界面,如[图2](#fig744814574243)。 + + **图 2** 启动项工具 + ![](figures/启动项工具.png "启动项工具") + +3. 在启动项配置界面选择,选择“BIOS设置”,然后在虚拟界面工具栏中单击重启工具![](figures/zh-cn_image_0000001152616281.png),重启服务器。 +4. 系统重启后进入BIOS配置界面,依次选择“Advanced”\>“Socket Configuration”,如[图3](#fig4546303814)所示。 + + **图 3** Socket Configuration + ![](figures/Socket-Configuration.png "Socket-Configuration") + +5. 进入Advanced Power Mgmt. Configuration,设置Power Policy为Performance。如[图4](#fig15501111014442)。 + + **图 4** 设置电源策略 + ![](figures/设置电源策略.png "设置电源策略") + +6. 按下“F10”保存配置并重启服务器。 + +## 将CPU设置为performance模式 + +请使用root用户执行如下操作。 + +1. 使用如下命令查看当前CPU模式。 + + ``` + cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + ``` + + 执行以上命令会输出当前CPU模式,参见[表1](#table354392019384)。 + + **表 1** CPU模式 + + + + + + + + + + + + + + + + + + + + + + + + + +

调速器

+

描述

+

performance

+

运行于最大频率。

+

powersave

+

运行于最小频率。

+

userspace

+

运行于用户指定的频率。

+

ondemand

+

按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,空闲时间增加就降低频率。

+

conservative

+

按需快速动态调整CPU频率, 比 ondemand 的调整更保守。

+

schedutil

+

基于调度程序调整 CPU 频率。

+
+ +2. 安装工具,使用如下命令安装。 + + ubuntu/debian: + + ``` + apt-get install linux-tools-$(uname -r) + ``` + + centos/bclinux/euler: + + ``` + yum install kernel-tools -y + systemctl daemon-reload + systemctl enable cpupower + systemctl start cpupower + ``` + +3. 设置CPU为performance模式。 + + ``` + cpupower frequency-set -g performance + ``` + +4. 再次执行[步骤1](#li158435131344)查看是否已修改。 + +

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

+ +## 设置电源策略为高性能模式 + +在某些对Host侧CPU要求较高的模型中,例如目标检测类模型,需要进行较为复杂的图像预处理,开启电源高性能模式能一定程度上提高性能和稳定性。ARM服务器提升网络性能需要在BIOS设置中将电源策略设为高性能模式,具体操作如下。 + +1. 登录ibmc界面,启动虚拟控制台,远程控制选择HTML5集成远程控制台,如[图1](#fig15869135420288)。 + + **图 1** 远程登录控制台 + ![](figures/远程登录控制台-0.png "远程登录控制台-0") + +2. 在虚拟界面工具栏中,单击启动项工具![](figures/zh-cn_image_0000001152616289.png),弹出启动项配置界面,如[图2](#fig744814574243)。 + + **图 2** 启动项工具 + ![](figures/启动项工具-1.png "启动项工具-1") + +3. 在启动项配置界面选择,选择“BIOS设置”,然后在虚拟界面工具栏中单击重启工具![](figures/zh-cn_image_0000001152736233.png),重启服务器。 +4. 系统重启后进入BIOS配置界面,依次选择“Advanced”\>“ Performance Config”,如[图3](#fig4546303814)所示。 + + **图 3** Performance Config + ![](figures/Performance-Config.png "Performance-Config") + +5. 进入“Performance Config”,设置Power Policy为Performance。如[图4](#fig15501111014442)。 + + **图 4** 设置电源策略 + ![](figures/设置电源策略-2.png "设置电源策略-2") + +6. 按下“F10”保存配置并重启服务器。 + +

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

+ +1. 安装高性能pillow库相关依赖,命令如下。 + + ubuntu/debian: + + ``` + apt-get install libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk libharfbuzz-dev libfribidi-dev libxcb1-dev + ``` + + centos/bclinux/euler: + + ``` + yum install libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel harfbuzz-devel fribidi-devel libraqm-devel libimagequant-devel libxcb-devel + ``` + +2. 安装高性能pillow库。 + 1. 执行如下命令卸载原生pillow。 + + ``` + pip3.7 uninstall -y pillow + ``` + + 2. 安装SSE4版本pillow-simd。 + + 使用root用户安装,执行如下命令,若使用非root用户安装,需在命令结尾加上--user。 + + ``` + pip3.7 install pillow-simd + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >如果CPU支持AVX2指令集,可安装AVX2版本pillow-simd,命令如下: + >``` + >CC="cc -mavx2" pip3.7 install -U --force-reinstall pillow-simd + >``` + + +3. 修改torchvision代码解决pillow-simd缺少PILLOW\_VERSION问题。torchvision安装参见[样例获取](#样例获取.md)。 + + 将/usr/local/python3.7.5/lib/python3.7/site-packages/torchvision/transforms/functional.py第5行代码修改如下: + + ``` + try: + from PIL import Image, ImageOps, ImageEnhance,PILLOW_VERSION + except: + from PIL import Image, ImageOps, ImageEnhance + PILLOW_VERSION="7.0.0" + ``` + + +

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

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

模型训练

+ +训练脚本迁移完成后,需要参见[配置环境变量](#配置环境变量.md)设置环境变量,然后执行**python3.7** _xxx_进行模型训练。具体样例请参考[脚本执行](#脚本执行.md)。 + +

性能调优和分析

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

前提条件

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

调测过程

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

总体思路

+ +1. 通过训练执行结果,判断吞吐量指标是否达到预期要求。 +2. 当吞吐量指标不达标时,需要找出制约性能瓶颈的原因,主要为以下几个方面: + - 算子瓶颈,在某个算子上执行过慢。 + - copy瓶颈,非连续转连续时进行copy带来的瓶颈。 + - 框架瓶颈,由于算子格式转换带来了额外操作。 + - 编译瓶颈,由于shape或属性来回变化造成反复编译。 + +3. 针对以上制约性能瓶颈的原因进行分析与优化。 + +

采集训练过程相关数据

+ +## Profiling数据采集 + +当吞吐量指标不达标时,需要通过采集训练过程中的profiling数据,分析哪个环节、哪个算子导致的性能消耗。请参见以下步骤进行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文件到指定路径 + prof.export_chrome_trace(output_path) + ``` + +2. chrome\_trace文件可以通过以下方式打开查看:在Chrome浏览器中输入“chrome://tracing“地址,然后将落盘文件拖到空白处即可打开文件内容,通过键盘W、A、S、D键,可以对profiler的结果进行缩放和移动。 + +## 获取算子信息OP\_INFO + +网络模型最终是以OP执行的,通过OPInfo日志,我们可以获取实际执行时的算子及其属性。通过get\_ascend\_op\_info.py脚本获取。 + +1. 编写get\_ascend\_op\_info.py脚本获取算子信息,脚本内容如下。 + + ``` + # -*- coding: utf-8 -*- + """用于导出OPINFO + """ + import os + import sys + import argparse + + def func(host_log_folder): + """ + :param host_log_folder: where host_log_folder addr is. + :return: + """ + host_log_files = os.listdir(host_log_folder) + result = {} + + for host_log in host_log_files: + if not host_log.endswith('.log') or host_log.endswith('.out'): + continue + with open(os.path.join(host_log_folder, host_log), 'r')as f: + host_log_lines = f.readlines() + for line in host_log_lines: + if line.startswith('[INFO] ASCENDCL') and "aclopCompile::aclOp" in line: + op_info = line.split('OpType: ')[1][:-2] + op_type = op_info.split(',')[0] + op_param = op_info[len(op_type) + 2:] + if op_type not in result.keys(): + result[op_type] = [op_param] + else: + result[op_type].append(op_param) + + with open('ascend_op_info_summary.txt', 'w')as f: + for k, v in result.items(): + v_set = set(v) + for info in v_set: + f.write(k + " " + info + "\n") + + if __name__ == "__main__": + parser = argparse.ArgumentParser(description='trans the log') + parser.add_argument('--host_log_folder', default="./", + help="input the dir name, trans the current dir with default") + ags = parser.parse_args() + func(ags.host_log_folder) + ``` + +2. 设置环境变量,将host日志打屏。 + + ``` + export ASCEND_SLOG_PRINT_TO_STDOUT=1 + ``` + +3. 设置日志级别为info,参考《CANN 日志参考》设置日志级别。 +4. 执行训练脚本,进行模型训练,训练完成后获取host侧日志,默认位置为$HOME/ascend/log/plog目录下,$HOME表示Host侧用户根目录。 +5. 解析host侧日志会在当前目录下得到OPInfo信息ascend\_op\_info\_summary.txt。 + + ``` + python3.7 get_ascend_op_info.py --host_log_folder $HOME/ascend/log/plog + ``` + +6. 分析TaskInfo中额外的task,尤其关注transdata。 + +

性能优化

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

亲和库

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

来源介绍

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

功能介绍

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

函数名

+

位置

+

功能说明

+

pairwise_iou

+

torch.contrib.npu.optimized_lib

+

计算两个目标框的IOU。

+

fast_rcnn_inference_single_image

+

torch.contrib.npu.optimized_lib

+

Maskrcnn和Fasterrcnn模型的推理接口。

+

ChannelShuffle

+

torch.contrib.npu.optimized_lib

+

提供NPU亲和的channelshuffle操作,适用于shufflenetv2等模型。

+

PreLoader

+

torch.contrib.npu.optimized_lib

+

提供针对昇腾AI处理器加速的数据加载方法。

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

精度调测

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

前提条件

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

调测过程

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

总体思路

+ +精度问题排查需要找出是哪一步出现的问题,主要以下几个方面: + +1. 模型网络计算错误。 + - 定位思路:在网络中加入hook进行排查判断是哪个地方有较大嫌疑,然后构建[单算子用例](#单算子样例编写说明.md)逐渐缩小错误范围,证明该算子在当前网络场景下计算有误,可以对比CPU或GPU结果证明。 + + - 规避方案:使用同等语义其他算子替代。 + + - 解决方案:改进算子精度或功能问题。 + + +2. loss计算错误。 + - 定位思路:由于Loss的特殊性和可以自定义,在判断Loss计算错误后建议dump网络中的loss的输入来测试而非随机同shape tensor,这样才能更好地复现证明。 + + - 规避方案:使用同等语义其他算子替代。 + + - 解决方案:改进算子精度或功能问题(loss也是由算子构成)。 + + +3. 参数更新错误。 + + - 定位思路:在每个optim.step\(\)前对网络中的参数逐个打印其grad进行排查判断是哪个地方有较大嫌疑,然后构建单算子用例逐渐缩小错误范围,证明该算子在当前网络场景下梯度计算有误,可以对比CPU或GPU结果证明。该项优先级应低于[1.](#li17755175510322)与[2.](#li25281726103316),因为1与2的错误同样可以造成grad异常。 + + - 规避方案:使用同等语义其他算子替代。 + + - 解决方案:改进计算grad的算子精度或功能问题。 + + +4. 多卡计算错误。 + + - 定位思路:在保证单卡精度OK的前提下,稳定复现多卡不收敛。 + + - 解决方案:建议联系华为方支撑人员,提供稳定复现的单P和多P脚本。 + + + +

精度调优方法

+ +1. 通过对比CPU和昇腾AI处理器的结果,判断在昇腾AI处理器上计算是否正确。 + + 代码样例(本样例只体现基本方法,禁止直接复制)如下: + + ``` + # 固定入参,保证模型与输入数据在CPU和昇腾AI处理器上相同 + input_tensor_cpu = torch.Tensor() + model_cpu = build_model() + # 将输入数据迁移到昇腾AI处理器上 + input_tensor_npu = input_tensor_cpu.npu() + # 将模型迁移到昇腾AI处理器上 + model_npu = model_cpu.npu() + + # 运算结果对比 + output_cpu = model_cpu(input_tensor_cpu) + output_npu = model_npu(input_tensor_npu) + compute_result = (output_cpu - output_npu).abs().mean()) + print(compute_result) + ``` + + 因昇腾AI处理器硬件架构与cpu不同,计算结果会略有不同。若运算结果较为接近\(一般不高于1e-4\),则认为运算结果正常。 + +2. 通过Pytorch的hook机制来打印正向反向传播中module的输入和输出来分析。 + + 代码样例(本样例只体现基本方法,禁止直接复制)如下: + + ``` + # 设置hook func + def hook_func(name, module): + def hook_function(module, inputs, outputs): + print(name+' inputs', inputs) + print(name+' outputs', outputs) + return hook_function + + # 注册正反向hook + for name, module in model.named_modules(): + module.register_forward_hook(hook_func('[forward]: '+name, module)) + module.register_backward_hook(hook_func('[backward]: '+name, module)) + + # 运行 + model(input_tensor) + ``` + + 通过分析打印正向反向传播中的inputs, outputs来确定。 + +3. 通过直接获取module的grad, running\_mean, running\_var等参数来分析更新量。 + + 代码样例(本样例只体现基本方法,禁止直接复制)如下: + + ``` + # 例如获取梯度和BN的均值方法来排查 + for name, module in model.named_modules(): + if isinstance(module, nn._BatchNorm): + print("[BN_buffer]: "+name, module.running_mean, module.running_var) + print("[grad]: "+name, module.grad) + ``` + + +

模型保存与转换

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

简介

+ +模型训练完成后,通过Pytorch提供的接口保存模型文件并导出ONNX模型,然后通过ATC工具将其转换为适配昇腾AI处理器的.om文件用于离线推理。 + +本章主要介绍如何将训练好的pth文件pth.tar文件转换为ONNX模型,将ONNX模型转换为适配昇腾AI处理器的.om文件流程请参考《CANN 开发辅助工具指南 \(推理\)》手册中“ATC工具使用指南”章节。 + +如果想使用Auto Tune优化功能,请参考《CANN 开发辅助工具指南 \(推理\)》手册中“Auto Tune工具使用指导”章节。 + +离线推理应用构建请参考《CANN 应用软件开发指南\(C&C++, 推理\)》。整体流程如下: + +![](figures/zh-cn_image_0000001106176222.png) + +

模型保存

+ +Pytorch在训练过程中,通常使用torch.save\(\)来保存Checkpoint文件,根据模型文件的后续用途会保存为两种格式的模型文件: + +- .pth或.pt扩展名的文件:用于在线推理或导出ONNX格式模型,仅保存模型参数,不保存模型结构,以便压缩文件的体积,可以用Netron等可视化工具打开,一般如下图所示。 + + **图 1** Pth文件 + ![](figures/Pth文件.jpg "Pth文件") + + 通过**state\_dict**来保存和加载模型,示例如下: + + 1. 保存模型。 + + ``` + # 创建保存路径 + PATH = "state_dict_model.pt" + # 保存模型 + torch.save(net.state_dict(), PATH) + ``` + + 2. 加载模型以用于在线推理,示例如下,详情请参见《PyTorch在线推理指南》。 + + ``` + # 模型文件保存路径 + PATH = "state_dict_model.pt" + model = TheModelClass(*args, **kwargs) + # 加载模型 + model.load_state_dict(torch.load(PATH)) + model.eval() + ``` + + + >![](public_sys-resources/icon-caution.gif) **注意:** + >保存.pth或.pt文件扩展名的文件时要提供模型定义文件,否则无法部署。 + +- .pth.tar扩展名的文件:可用于在线推理或重新加载后继续训练。保存多个组件,以字典形式保存,常见的组件包括模型和优化器的state\_dict、停止时的epoch、最新记录的训练损失以及外部的torch.nn.Embedding层等。如果仅用于部署推理模型,推荐只在.pth.tar扩展名的文件中保存权重信息即模型的state\_dict。 + + 保存和加载模型示例如下: + + 1. 保存模型。 + + ``` + PATH = "checkpoint.pth.tar" + torch.save({ + 'epoch': epoch, + 'loss': loss, + 'state_dict': model.state_dict(), + 'optimizer' : optimizer.state_dict(), + ... + }, PATH) + ``` + + 2. 加载模型用于推理或恢复训练。 + + ``` + model = TheModelClass(*args, **kwargs) + optimizer = TheOptimizerClass(*args, **kwargs) + + checkpoint = torch.load(PATH) + model.load_state_dict(checkpoint['model_state_dict']) + optimizer.load_state_dict(checkpoint['optimizer_state_dict']) + epoch = checkpoint['epoch'] + loss = checkpoint['loss'] + + model.eval() + # - or - + model.train() + ``` + + + +>![](public_sys-resources/icon-caution.gif) **注意:** +>通常情况下,训练图和推理图中对同一个算子处理方式不同(例如BatchNorm和dropout等算子),在输入格式上也有差别,因此在运行推理或导出ONNX模型之前,必须调用model.eval\(\) 来将dropout和batch normalization层设置为推理模式。 + +

导出ONNX模型

+ +## 简介 + +昇腾AI处理器Pytorch模型的部署策略是基于Pytorch官方支持的ONNX模块实现的。ONNX是业内目前比较主流的模型格式,广泛用于模型交流及部署。本节主要介绍如何将Checkpoint文件通过torch.onnx.export\(\)接口导出为ONNX模型。 + +## .pth或.pt文件导出ONNX模型 + +保存的.pth或.pt文件可以通过Pytorch构建模型再加载权重的方法恢复,然后导出ONNX模型,样例如下。 + +``` +import torch +import torch.onnx +import torchvision.models as models +# 设置使用CPU导出模型 +device = torch.device("cpu") + +def convert(): + # 模型定义来自于torchvision,样例生成的模型文件是基于resnet50模型 + model = models.resnet50(pretrained = False) + resnet50_model = torch.load('resnet50.pth', map_location='cpu') + model.load_state_dict(resnet50_model) + + batch_size = 1 #批处理大小 + input_shape = (3, 224, 224) #输入数据,改成自己的输入shape + + # 模型设置为推理模式 + model.eval() + + dummy_input = torch.randn(batch_size, *input_shape) # 定义输入shape + torch.onnx.export(model, + dummy_input, + "resnet50_official.onnx", + input_names = ["input"], # 构造输入名 + output_names = ["output"], # 构造输出名 + opset_version=11, # ATC工具目前仅支持opset_version=11 + dynamic_axes={"input":{0:"batch_size"}, "output":{0:"batch_size"}}) #支持输出动态轴 + ) + +if __name__ == "__main__": + convert() +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>- 在导出ONNX模型之前,必须调用model.eval\(\) 来将dropout和batch normalization层设置为推理模式。 +>- 样例脚本中的model来自于torchvision模块中的定义,用户使用自己的模型时需自行指定。 +>- 构造输入输出需要对应训练时的输入输出,否则无法正常推理。 + +## .pth.tar文件导出ONNX模型 + +.pth.tar在导出ONNX模型时需要先确定保存时的信息,有时保存的节点名称和模型定义中的节点会有差异,例如会多出前缀和后缀。在进行转换的时候,可以对节点名称进行修改。转换代码样例如下。 + +``` +import torch +import torch.onnx +from collections import OrderedDict +import mobilenet + +# 本样例中的pth.tar文件保存时节点名加了前缀module,通过遍历删除 +def proc_nodes_module(checkpoint, AttrName): + new_state_dict = OrderedDict() + for key, value in checkpoint[AttrName].items(): + if key == "module.features.0.0.weight": + print(value) + if(key[0:7] == "module."): + name = key[7:] + else: + name = key[0:] + + new_state_dict[name] = value + return new_state_dict + +def convert(): + checkpoint = torch.load("./mobilenet_cpu.pth.tar", map_location=torch.device('cpu')) + checkpoint['state_dict'] = proc_nodes_module(checkpoint,'state_dict') + model = mobilenet.mobilenet_v2(pretrained = False) + model.load_state_dict(checkpoint['state_dict']) + model.eval() + input_names = ["actual_input_1"] + output_names = ["output1"] + dummy_input = torch.randn(1, 3, 224, 224) + torch.onnx.export(model, dummy_input, "mobilenetV2_npu.onnx", input_names = input_names, output_names = output_names, opset_version=11) + +if __name__ == "__main__": + convert() +``` + +

样例说明

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

ResNet50模型迁移示例

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

样例获取

+ +## 样例获取 + +1. 本样例基于PyTorch官网提供的Imagenet数据集训练模型进行适配昇腾910 AI处理器的迁移改造,样例获取路径为[https://github.com/pytorch/examples/tree/master/imagenet](https://github.com/pytorch/examples/tree/master/imagenet)。 +2. 本样例依赖torchvision,需要安装torchvision依赖,如果使用非root用户安装, 则需在命令末尾加上**--user**。 + + 当服务器运行环境为X86架构时,安装命令如下: + + ``` + pip3.7 install torchvision==0.6.0 --no-deps + ``` + + 当服务器运行环境为ARM架构时,安装命令如下: + + ``` + pip3.7 install torchvision==0.2.2.post3 --no-deps + ``` + +3. Resnet50模型参考PyTorch官网模型[https://pytorch.org/hub/pytorch\_vision\_resnet/](https://pytorch.org/hub/pytorch_vision_resnet/),实际使用有如下两种方式。 + 1. 直接调用对应接口,例如: + + ``` + import torchvision.models as models + model = models.resnet50() + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >Resnet50为PyTorch内置模型,了解更多内置模型请前往[Pytorch官网](https://pytorch.org/)。 + + 2. 在脚本执行中直接指定参数arch为resnet50,内容如下,本样例迁移采用该种方式,请参见[脚本执行](#脚本执行.md)。 + + ``` + --arch resnet50 + ``` + + + +## 目录结构 + +主要文件目录结构如下所示: + +``` +├──main.py +``` + +

训练脚本迁移

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

单P训练修改

+ +1. main.py增加头文件以支持基于PyTorch框架的模型在昇腾910 AI处理器上训练: + + ``` + import torch.npu + ``` + +2. 在main.py文件中头文件后添加参数以指定使用昇腾910 AI处理器进行训练: + + ``` + CALCULATE_DEVICE = "npu:1" + ``` + +3. 修改参数以及判断选项,使其只在昇腾910 AI处理器上进行训练。 + + 代码位置:main.py文件中的main\_worker\(\)函数(修改部分为字体加粗部分): + + ``` + def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + # 原代码为使用GPU进行训练,原代码如下: + # args.gpu = gpu + ############## npu modify begin ############# + args.gpu = None + ############## npu modify end ############# + if args.gpu is not None: + print("Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + # create model + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + # 原代码中需要判断是否在GPU上进行训练,原代码如下: + # if not torch.cuda.is_available(): + # print('using CPU, this will be slow') + # elif args.distributed: + ############## npu modify begin ############# + # 迁移后为直接判断是否进行分布式训练,去掉判断是否在GPU上进行训练 + if args.distributed: + ############## npu modify end ############# + # For multiprocessing distributed, DistributedDataParallel constructor + # should always set the single device scope, otherwise, + # DistributedDataParallel will use all available devices. + if args.gpu is not None: + ...... + ``` + +4. 将模型以及损失函数迁移到昇腾910 AI处理器上进行计算。 + + 代码位置:main.py文件中的main\_worker\(\)函数(修改部分为字体加粗部分): + + ``` + elif args.gpu is not None: + torch.cuda.set_device(args.gpu) + model = model.cuda(args.gpu) + else: + # DataParallel will divide and allocate batch_size to all available GPUs + if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + model.features = torch.nn.DataParallel(model.features) + model.cuda() + else: + # 原代码使用torch.nn.DataParallel()类来用多个GPU加速训练 + # model = torch.nn.DataParallel(model).cuda() + ############## npu modify begin ############# + # 将模型迁移到NPU上进行训练。 + model = model.to(CALCULATE_DEVICE) + ############## npu modify end ############# + # 原代码中损失函数是在GPU上进行计算 + # # define loss function (criterion) and optimizer + # criterion = nn.CrossEntropyLoss().cuda(args.gpu) + ############## npu modify begin ############# + # 将损失函数迁移到NPU上进行计算。 + criterion = nn.CrossEntropyLoss().to(CALCULATE_DEVICE) + ############## npu modify end ############# + ``` + +5. 将数据集目标结果target修改成int32类型解决算子报错问题;将数据集迁移到昇腾910 AI处理器上进行计算。 + - 代码位置:main.py文件中的train\(\)函数(修改部分为字体加粗部分): + + ``` + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + if args.gpu is not None: + images = images.cuda(args.gpu, non_blocking=True) + # 原代码中训练数据集在GPU上进行加载计算,原代码如下: + # if torch.cuda.is_available(): + # target = target.cuda(args.gpu, non_blocking=True) + ############## npu modify begin ############# + # 将数据集迁移到NPU上进行计算并修改target数据类型 + if 'npu' in CALCULATE_DEVICE: + target = target.to(torch.int32) + images, target = images.to(CALCULATE_DEVICE, non_blocking=True), target.to(CALCULATE_DEVICE, non_blocking=True) + ############## npu modify end ############# + ``` + + + - 代码位置:main.py文件中的validate\(\)函数(修改部分为字体加粗部分): + + ``` + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + if args.gpu is not None: + images = images.cuda(args.gpu, non_blocking=True) + # 原代码中训练数据集在GPU上进行加载计算,原代码如下: + # if torch.cuda.is_available(): + # target = target.cuda(args.gpu, non_blocking=True) + ############## npu modify begin ############# + # 将数据集迁移到NPU上进行计算并修改target数据类型 + if 'npu' in CALCULATE_DEVICE: + target = target.to(torch.int32) + images, target = images.to(CALCULATE_DEVICE, non_blocking=True), target.to(CALCULATE_DEVICE, non_blocking=True) + ############## npu modify end ############# + ``` + + +6. 设置当前正在使用的device。 + + 代码位置:main.py文件中的主函数入口(修改部分为字体加粗部分): + + ``` + if __name__ == '__main__': + ############## npu modify begin ############# + if 'npu' in CALCULATE_DEVICE: + torch.npu.set_device(CALCULATE_DEVICE) + ############## npu modify begin ############# + main() + ``` + + +

分布式训练修改

+ +1. main.py增加头文件以支持基于PyTorch框架的模型在昇腾910 AI处理器上训练及进行混合精度训练。 + + ``` + import torch.npu + from apex import amp + ``` + +2. 参数设置增加以下参数,包括指定参与训练的昇腾910 AI处理器以及进行混合精度训练需要的参数。 + + ``` + parser.add_argument('--device', default='npu', type=str, help='npu or gpu') + parser.add_argument('--addr', default='10.136.181.115', type=str, help='master addr') + parser.add_argument('--device-list', default='0,1,2,3,4,5,6,7', type=str, help='device id list') + parser.add_argument('--amp', default=False, action='store_true', help='use amp to train the model') + parser.add_argument('--loss-scale', default=1024., type=float, + help='loss scale using in amp, default -1 means dynamic') + parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + ``` + +3. 创建由device\_id到process\_id的映射函数,指定device进行训练。在main.py函数中增加以下接口。 + + ``` + def device_id_to_process_device_map(device_list): + devices = device_list.split(",") + devices = [int(x) for x in devices] + devices.sort() + + process_device_map = dict() + for process_id, device_id in enumerate(devices): + process_device_map[process_id] = device_id + + return process_device_map + ``` + +4. 指定训练服务器的ip和端口。 + + 代码位置:main.py文件中的主函数main\(\)(修改部分为字体加粗部分)。 + + ``` + def main(): + args = parser.parse_args() + ############## npu modify begin ############# + os.environ['MASTER_ADDR'] = args.addr + os.environ['MASTER_PORT'] = '29688' + ############## npu modify end ############# + ``` + +5. 创建由device\_id到process\_id的映射参数,获取单节点昇腾910 AI处理器数量。 + + 代码位置:main.py文件中的主函数main\(\)(修改部分为字体加粗部分)。 + + ``` + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + ############## npu modify begin ############# + args.process_device_map = device_id_to_process_device_map(args.device_list) + if args.device == 'npu': + ngpus_per_node = len(args.process_device_map) + else: + ngpus_per_node = torch.cuda.device_count() + ############## npu modify end ############# + # 原代码如下: + # ngpus_per_node = torch.cuda.device_count() + ``` + +6. 获取进程process\_id对应的昇腾910 AI处理器编号,指定在对应的昇腾910 AI处理器上进行训练。 + + 代码位置:main.py文件中的main\_worker\(\)(修改部分为字体加粗部分)。 + + ``` + def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + ############## npu modify begin ############# + args.gpu = args.process_device_map[gpu] + ############## npu modify end ############# + # 原代码如下: + # args.gpu = gpu + ``` + +7. 初始化进程组,屏蔽掉初始化方式。 + + 代码位置:main.py文件中的main\_worker\(\)(修改部分为字体加粗部分)。 + + ``` + ############## npu modify begin ############# + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, #init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + ############## npu modify begin ############# + # 原代码如下: + # dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + ``` + +8. 要进行分布式训练且需要引入混合精度模块,并且需要将模型迁移到昇腾AI处理器上,因此需要屏蔽掉原始代码中判断是否为分布式训练以及模型是否在GPU上进行训练的代码部分。 + + 代码位置:main.py文件中的main\_worker\(\)(修改部分为字体加粗部分)。 + + ``` + # create model + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + ############## npu modify begin ############# + # 代码中添加如下内容 + # 指定训练设备为昇腾AI处理器 + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + # 计算用于训练的batch_size和workers + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + ############## npu modify end ############# + # 原始代码如下,需屏蔽掉,已注释 + # if not torch.cuda.is_available(): + # print('using CPU, this will be slow') + # elif args.distributed: + # # For multiprocessing distributed, DistributedDataParallel constructor + # # should always set the single device scope, otherwise, + # # DistributedDataParallel will use all available devices. + # if args.gpu is not None: + # torch.cuda.set_device(args.gpu) + # model.cuda(args.gpu) + # # When using a single GPU per process and per + # # DistributedDataParallel, we need to divide the batch size + # # ourselves based on the total number of GPUs we have + # args.batch_size = int(args.batch_size / ngpus_per_node) + # args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + # model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + # else: + # model.cuda() + # # DistributedDataParallel will divide and allocate batch_size to all + # # available GPUs if device_ids are not set + # model = torch.nn.parallel.DistributedDataParallel(model) + # elif args.gpu is not None: + # torch.cuda.set_device(args.gpu) + # model = model.cuda(args.gpu) + # else: + # # DataParallel will divide and allocate batch_size to all available GPUs + # if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + # model.features = torch.nn.DataParallel(model.features) + # model.cuda() + # else: + # model = torch.nn.DataParallel(model).cuda() + ``` + +9. 屏蔽掉损失函数、优化器和断点训练部分,将这部分在后面与混合精度训练结合起来。 + + 代码位置:main.py文件中的main\_worker\(\)(修改部分为字体加粗部分)。 + + ``` + # 屏蔽掉原始代码,已注释 + # # define loss function (criterion) and optimizer + # criterion = nn.CrossEntropyLoss().cuda(args.gpu) + # + # optimizer = torch.optim.SGD(model.parameters(), args.lr, + # momentum=args.momentum, + # weight_decay=args.weight_decay) + # + # # optionally resume from a checkpoint + # if args.resume: + # if os.path.isfile(args.resume): + # print("=> loading checkpoint '{}'".format(args.resume)) + # if args.gpu is None: + # checkpoint = torch.load(args.resume) + # else: + # # Map model to be loaded to specified single gpu. + # loc = 'cuda:{}'.format(args.gpu) + # checkpoint = torch.load(args.resume, map_location=loc) + # args.start_epoch = checkpoint['epoch'] + # best_acc1 = checkpoint['best_acc1'] + # if args.gpu is not None: + # # best_acc1 may be from a checkpoint from a different GPU + # best_acc1 = best_acc1.to(args.gpu) + # model.load_state_dict(checkpoint['state_dict']) + # optimizer.load_state_dict(checkpoint['optimizer']) + # print("=> loaded checkpoint '{}' (epoch {})" + # .format(args.resume, checkpoint['epoch'])) + # else: + # print("=> no checkpoint found at '{}'".format(args.resume)) + # + # cudnn.benchmark = True + ``` + +10. 数据加载器,结合了数据集和取样器,并且可以提供多个线程处理数据集。由于是使用昇腾AI处理器进行训练,因此需要将**pin\_memory**设置为**False**;由于当前仅支持固定shape下的训练,数据流中剩余的样本数可能小于batch大小,因此需要将**drop\_last**设置为**True**;另外需要将验证部分数据集**shuffle**设置为**True**。 + + 代码位置:main.py文件中的main\_worker\(\)(修改部分为字体加粗部分)。 + + ``` + ############## npu modify begin ############# + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=False, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=False, drop_last=True) + ############## npu modify end ############# + ``` + +11. 进行损失函数及优化器构建,将模型、损失函数迁移到昇腾AI处理器上;将优化器、模型与混合精度模块进行结合以支持混合精度训练;将断点训练部分与混合精度模块结合以支持混合精度训练。 + + 代码位置:main.py文件中的main\_worker\(\)中验证数据加载**后**(修改部分为字体加粗部分)。 + + ``` + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=False, drop_last=True) + + ############## npu modify begin ############# + model = model.to(loc) + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(loc) + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + 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) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + ############## npu modify end ############# + ``` + +12. 断点checkpoint保存需要与混合精度训练结合,修改如下。 + + 代码位置:main.py文件中的main\_worker\(\)(修改部分为字体加粗部分)。 + + ``` + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + ############## npu modify begin ############# + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + }, is_best) + ############## npu modify end ############# + ``` + +13. 训练时,需要将数据集迁移到昇腾AI处理器上,修改如下: + + 代码位置:main.py文件中的train\(\)(修改部分为字体加粗部分)。 + + ``` + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + ############## npu modify begin ############# + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32) + images, target = images.to(loc, non_blocking=False), target.to(loc, non_blocking=False) + ############## npu modify end ############# + # 原模型代码如下: + # if args.gpu is not None: + # images = images.cuda(args.gpu, non_blocking=True) + # if torch.cuda.is_available(): + # target = target.cuda(args.gpu, non_blocking=True) + ``` + +14. 标记反向传播.backward\(\)发生的位置,这样混合精度模块就可以进行Loss Scaling并清除每次迭代的状态,代码如下: + + 代码位置:main.py文件中的train\(\)(修改部分为字体加粗部分)。 + + ``` + optimizer.zero_grad() + ############## npu modify begin ############# + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + # 原代码如下注释部分: + # loss.backward() + ############## npu modify end ############# + optimizer.step() + ``` + +15. 验证时,需要将验证数据集迁移到昇腾AI处理器上,修改如下: + + 代码位置:main.py文件中的validate\(\)(修改部分为字体加粗部分)。 + + ``` + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + ############## npu modify begin ############# + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32) + images, target = images.to(loc, non_blocking=False), target.to(loc, non_blocking=False) + ############## npu modify end ############# + # 原模型代码如下注释部分: + # if args.gpu is not None: + # images = images.cuda(args.gpu, non_blocking=True) + # if torch.cuda.is_available(): + # target = target.cuda(args.gpu, non_blocking=True) + ``` + + +

脚本执行

+ +## 准备数据集 + +准备数据集并上传到运行环境的目录下,例如:/home/data/resnet50/imagenet + +## 配置环境变量 + +请参考[配置环境变量](#配置环境变量.md)配置环境变量。 + +## 执行命令 + +例如: + +单卡: + +``` +python3.7 main.py /home/data/resnet50/imagenet --batch-size 128 --lr 0.1 --epochs 90 --arch resnet50 --world-size 1 --rank 0 --workers 40 --momentum 0.9 --weight-decay 1e-4 +``` + +分布式: + +``` +python3.7 main.py /home/data/resnet50/imagenet --addr='10.174.216.194' --seed 49 --workers 160 --lr 0.8 --print-freq 1 --arch resnet50 --dist-url 'tcp://127.0.0.1:50000' --dist-backend 'hccl' --multiprocessing-distributed --world-size 1 --batch-size 2048 --epochs 90 --rank 0 --device-list '0,1,2,3,4,5,6,7' --amp +``` + +>![](public_sys-resources/icon-note.gif) **说明:** +>dist-backend需配置成hccl以支持在昇腾AI设备上进行分布式训练。 + +

ShuffleNet模型调优示例

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

样例获取

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

模型评估

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

网络迁移

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

网络调测

+ +网络调测具体方法请参见[调测过程](#调测过程.md)。经排查ShuffleNet运行时相关算子耗时过大,以下给出耗时数据及解决方法。 + +## 前向排查 + +前向排查记录表如下: + +**表 1** 前向排查 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

序号

+

time(ms)

+

batch_size

+

detail

+

1

+

1100

+

512

+

channel_shuffle操作使用channel_shuffle_index_select替代。

+

2

+

600

+

512

+

使用两个channel_shuffle_index_select操作消减chunk带来的不连续。

+

3

+

300

+

512

+

通过框架层,指定concat输出格式为NCHW以消除过多的transdata。

+

4

+

285

+

512

+

修复了未初始化weight格式。

+

5

+

275

+

512

+

修复了DWCONV没有指定输出格式为5HD的问题

+
+ +详细说明如下: + +1. 由于原生实现的torch.transpose\(x, 1, 2\).contiguous\(\)是使用了View类框架算子transpose,造成了非连续场景,如[copy瓶颈优化](#性能优化-2.md)所描述Copy瓶颈,使用channel\_shuffle\_index\_select,在语义相同的情况下使用计算类算子替换框架类算子,从而减少耗时。 + +2. 由于shufflenetv2中含有大量的chunk操作,而chunk操作在Pytorch中为框架类算子,其结果会将一个tensor分割为几个等长的非连续的tensor,而非连续转连续这个操作目前耗时较长,故使用计算类算子消除非连续,如[copy瓶颈优化](#性能优化-2.md)所描述Copy瓶颈。 + +3. 适配层在适配算子时默认指定输出格式为输入格式,但是concat不支持C轴非16整数倍的5HD的格式,会转为4D进行处理,又由于concat后面接的是gatherv2算子,也是仅支持4D格式的算子,所以导致数据格式转换过程为5HD-\>4D-\>concat-\>5HD-\>4D-\>gatherv2-\>5HD,解决方法是修改concat输出格式,当非16整数倍时指定输出格式为4D,优化后数据格式转换过程为5HD-\>4D-\>concat-\>gatherv2-\>5HD,当前针对ShuffleNet的做法具体可参考pytorch/aten/src/ATen/native/npu/CatKernelNpu.cpp 第121行。 + +4. 设置weight初始化格式避免计算过程中反复的transdata,如[copy瓶颈优化](#性能优化-2.md)所描述框架瓶颈。 + +5. 修复了DWCONV weight输出格式指定,避免一些不必要5HD-\>4D。 + + +## 整网排查 + +整网排查记录表如下: + +**表 2** 整网排查 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

序号

+

time(ms)

+

batch_size

+

detail

+

1

+

5500

+

512

+

通过框架层,index tocpu成index_add操作

+

2

+

4000

+

512

+

通过自定义算子,预生成index,不再tocpu

+

3

+

1800

+

512

+

通过自定义算子,融合index_add和chunk

+

4

+

885

+

512

+

添加contiguous_with_gatherv2

+

5

+

3480

+

1024

+

修改batchsize

+

6

+

1650

+

1024

+

修改batchsize + contiguous_with_gatherv2

+

7

+

1424

+

1024

+

通过自定义算子,融合cat+shuffle+chunk,消除不连续

+

8

+

1360

+

1024

+

通过框架层,修改relugrad传入的grad格式

+

9

+

1300

+

1024

+

修改IndexSelectFullImplementation的bp传入格式

+

10

+

920

+

1024

+

修改amp O1

+

11

+

860

+

1024

+

修改amp O2

+

12

+

830

+

1024

+

消除BN参数更新时AXPY引入的过多的transdata

+

13

+

800

+

1024

+

消除所有fp bp parm_updata间的流同步

+

14

+

461

+

1024

+

针对非32对齐场景,改进GatherV2算子

+

15

+

429

+

1024

+

针对ShufflenetV2场景再次优化GatherV2算子-->GatherV3

+
+ +详细说明如下: + +1. 使用计算类算子替换框架类算子。 + +2. 使用buffer记录index信息到npu,消除index.to\('npu'\) 的操作。 + +3. 使用计算类算子消除非连续。 + +4. contiguous\_with\_gatherv2是使用aicore算子GatherV2来完成非连续转连续操作。 + +5. 修改batchsize。 + +6. 修改batchsize + contiguous\_with\_gatherv2。 + +7. 由于concat算子的反向是chunk,会引起非连续问题,故自定义concat算子反向,使用Gatherv2替代chunk,将其融合成cat+shuffle+chunk,消除不连续。 + +8. ReluGrad算子有两个输入:grad\_output(反向的输入),self(正向的输出),在shufflenet中有时会出现4D + 5HD的场景,而FE的格式对齐往往对齐第一个tensor的format,结果就会导致\(4D, 5HD\)-\>\(4D, 4D\)-\>ReluGrad-\>4D-\>5HD。由于正向的输出格式基本就是输入格式,而relu往往是配合在Conv+BN+Relu这样使用,所以可以认为,在这个场景下,输出5HD是更合适的选择。于是手动插入npu\_format\_cast,\(4D, 5HD\)-\>\(5HD, 5HD\)-\>ReluGrad-\>5HD。 + +9. IndexSelectFullImplementation中涉及到了对一个5HD的tensor做两次gatherv2操作,这个时候会导致两次的5HD-\>4D,可以手动先做一次5HD-\>4D,这样就可以在gatherv2时不做transdata,从而消减一次transdata操作。 + +10. 加入混合精度O1。 + +11. 加入混合精度O2。 +12. 由于Axpy算子的参数校验,所有网络在参数更新时,如C不整除16则会transdata为4D进行Axpy运算,引入了大量的transdata算子,通过增加一个函数,当Axpy的input的shape一致时结束校验,从而避免了格式转换,增加了运行效率。 + +13. 删除所有的流同步操作,原因是容易导致不收敛,没有采纳。 + +14. 使用针对非对齐优化后的Gatherv2算子后,整体性能提速至交付水平。 + +15. 使用针对ShufflenetV2场景再次优化后的Gatherv3算子后,整体性能还能继续提升。 + + +## python侧优化细节 + +Python侧优化主要是通过一些同等语义的修改,使网络在NPU上边的更加亲和。当前非连续转连续容易成为性能瓶颈,而ShufflenetV2中的channel\_shuffle操作就涉及了permute后转连续的操作,导致整网性能在NPU上较差。通过对channel\_shuffle操作进行同等语义的修改,加上和concat操作的融合,使得整网性能得到飞升。采用的是torchvision版本参见[开源链接](https://github.com/pytorch/vision/blob/master/torchvision/models/shufflenetv2.py)。 + +- 框架原始channel\_shuffle操作。 + + ``` + def channel_shuffle(x, groups): + # type: (torch.Tensor, int) -> torch.Tensor + batchsize, num_channels, height, width = x.data.size() + channels_per_group = num_channels // groups + # reshape + x = x.view(batchsize, groups, + channels_per_group, height, width) + x = torch.transpose(x, 1, 2).contiguous() + # flatten + x = x.view(batchsize, -1, height, width) + return x + + class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride): + super(InvertedResidual, self).__init__() + if not (1 <= stride <= 3): + raise ValueError('illegal stride value') + self.stride = stride + branch_features = oup // 2 + assert (self.stride != 1) or (inp == branch_features << 1) + if self.stride > 1: + self.branch1 = nn.Sequential( + self.depthwise_conv(inp, inp, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(inp), + nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + else: + self.branch1 = nn.Sequential() + + self.branch2 = nn.Sequential( + nn.Conv2d(inp if (self.stride > 1) else branch_features, + branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(branch_features), + nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + + @staticmethod + def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False): + return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i) + + def forward(self, x): + if self.stride == 1: + x1, x2 = x.chunk(2, dim=1) + out = torch.cat((x1, self.branch2(x2)), dim=1) + else: + out = torch.cat((self.branch1(x), self.branch2(x)), dim=1) + + out = channel_shuffle(out, 2) + + return out + ``` + +- 同等语义改写。 + +``` +def channel_shuffle_index_select(x, groups=2): + N, C, H, W = x.shape + inp = C + # channel_shuffle操作是对C维按一定规则的重排的工作,可以被表达为一次简单的重排 + group_len = inp // groups + index = torch.from_numpy(np.array(list(range(inp))).reshape(groups, group_len).transpose(1, 0).flatten()).long() + + x = x.index_select(1, index) + return x + +# 对两个操作进行结果对比,可以看到语义是相等的 +x = torch.randn(2, 232, 14, 14) +for group in [2, 4, 8]: + out1 = channel_shuffle(x, group) + out2 = channel_shuffle_index_select(x, group) + print((out1 - out2).sum()) +``` + +- 昇腾AI处理器亲和写法。 + + ``` + # 对应 out = channel_shuffle(torch.cat((self.branch1(x), self.branch2(x)), dim=1)) 的情形 + # 使用channel_shuffle_index_select替代channel_shuffle + # 自定义OP,融合channel_shuffle_index_select和cat,使用计算类算子来消减非连续 + class IndexSelectFullImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, x1, x2, fp_index, bp_index1, bp_index2): + # 强制流同步,仅稳定训练作用 + stream = torch.npu.current_stream() + stream.synchronize() + + # 对ctx注册bp_index1, bp_index2使反向时可以使用 + ctx.bp_index1 = bp_index1 + ctx.bp_index2 = bp_index2 + + x = torch.cat([x1, x2], dim=1) + + # 使用index_select替代channel_shuffle操作,这里是后面不接chunk算子的场景 + result = x.index_select(1, fp_index) + + return result + + @staticmethod + def backward(ctx, grad_output): + # 强制流同步,仅稳定训练作用 + stream = torch.npu.current_stream() + stream.synchronize() + + # 由于index_select不支持5HD格式,将格式转换为NCHW来减少额外的transdata + grad_output.data = grad_output.data.npu_format_cast(0) + + # 依据正向推导得到的反向的表达式,使用index_select同时完成对index_select和cat的反向 + out1 = grad_output.index_select(1, ctx.bp_index1) + out2 = grad_output.index_select(1, ctx.bp_index2) + return out1, out2, None, None, None, None + + + class IndexSelectHalfImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, x1, x2, fp_index1, fp_index2, bp_index1, bp_index2): + ctx.bp_index1 = bp_index1 + ctx.bp_index2 = bp_index2 + x = torch.cat([x1, x2], dim=1) + + # 使用index_select替代channel_shuffle操作,这里是后面接chunk算子的场景 + return x.index_select(1, fp_index1), x.index_select(1, fp_index2) + + @staticmethod + def backward(ctx, grad_output1, grad_output2): + grad_output = torch.cat([grad_output1, grad_output2], 1) + + out1 = grad_output.index_select(1, ctx.bp_index1) + out2 = grad_output.index_select(1, ctx.bp_index2) + return out1, out2, None, None, None, None + + + class Channel_Shuffle(nn.Module): + def __init__(self, inp, groups=2, split_shuffle=True): + super(Channel_Shuffle, self).__init__() + + self.split_shuffle = split_shuffle + self.group_len = inp // groups + + # 初始化channel_shuffle_index_select中需要使用的fp_index + self.out = np.array(list(range(inp))).reshape(groups, self.group_len).transpose(1, 0).flatten().tolist() + + # 将初始化的fp_index按需注册为module的buffer,在to.device的时候顺路带到设备,减少h2dcopy的耗时 + # 此处仅展示常用的group=2的场景下的使用方式,其他情形请自行拓展 + if self.split_shuffle: + self.register_buffer('fp_index1', torch.tensor(self.out[:self.group_len], dtype=torch.int32)) + self.register_buffer('fp_index2', torch.tensor(self.out[self.group_len:], dtype=torch.int32)) + else: + self.register_buffer('fp_index', torch.tensor(self.out, dtype=torch.int32)) + + # 将对应的bp_index按需注册为module的buffer,在to.device的时候顺路带到设备,减少h2dcopy的耗时 + self.register_buffer('bp_index1', torch.tensor(list(range(0, inp, 2)), dtype=torch.int32)) + self.register_buffer('bp_index2', torch.tensor(list(range(1, inp, 2)), dtype=torch.int32)) + + def forward(self, x1, x2): + if self.split_shuffle: + return IndexSelectHalfImplementation.apply(x1, x2, self.fp_index1, self.fp_index2, self.bp_index1, + self.bp_index2) + else: + return IndexSelectFullImplementation.apply(x1, x2, self.fp_index, self.bp_index1, self.bp_index2) + + + class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, split_shuffle=True): + super(InvertedResidual, self).__init__() + + if not (1 <= stride <= 3): + raise ValueError('illegal stride value') + self.stride = stride + + branch_features = oup // 2 + assert (self.stride != 1) or (inp == branch_features << 1) + + if self.stride > 1: + self.branch1 = nn.Sequential( + self.depthwise_conv(inp, inp, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(inp), + nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + else: + self.branch1 = nn.Sequential() + + self.branch2 = nn.Sequential( + nn.Conv2d(inp if (self.stride > 1) else branch_features, + branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(branch_features), + nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + + if self.stride > 1: + self.channel_shuffle = Channel_Shuffle(inp=branch_features + branch_features, groups=2, + split_shuffle=split_shuffle) + else: + self.channel_shuffle = Channel_Shuffle(inp=inp, groups=2, split_shuffle=split_shuffle) + + @staticmethod + def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False): + return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i) + + def forward(self, x): + + # 删除concat和chunk操作,融合进self.channel_shuffle内处理 + if self.stride == 1: + x1, x2 = x + x2 = self.branch2(x2) + else: + x1 = self.branch1(x) + x2 = self.branch2(x) + + out = self.channel_shuffle(x1, x2) + + return out + ``` + + +

参考信息

+ +- **[单算子样例编写说明](#单算子样例编写说明.md)** + +- **[单算子dump方法](#单算子dump方法.md)** + +- **[常用环境变量说明](#常用环境变量说明.md)** + +- **[dump op方法](#dump-op方法.md)** + +- **[CMake安装方法](#CMake安装方法.md)** + + +

单算子样例编写说明

+ +在模型中遇到问题时,使用整网复现问题成本较大,可以构建测试用例来复现精度或性能问题,便于定位解决。构建测试用例一般有如下两种方式。单算子dump方法请参见[单算子dump方法](#单算子dump方法.md)。 + +1. 单算子测试用例构建,直接调用该算子即可复现错误场景。 + + 例如构建max算子的单算子样例如下: + + ``` + import torch + import copy + from torch.testing._internal.common_utils import TestCase, run_tests + class TestMax(TestCase): + def cpu_op_exec(self, input1): + # 调用算子 + output = torch.max(input1) + output = output.numpy() + return output + + def npu_op_exec(self, input1): + # 调用对应npu算子 + output = torch.max(input1) + return output + + def test_max(self): + input = torch.randn(10,20)) + input = input.to(torch.int64) # 数据dtype转换 + input_cpu = copy.deepcopy(input) + input_npu = copy.deepcopy(input).npu() + + output_cpu = self.cpu_op_exec(input_cpu) + output_npu = self.npu_op_exec(input_npu) + + # 比较cpu和npu的计算结果,prec为允许误差 + self.assertEqual(output_cpu, output_npu, prec = 1e-4) + + if __name__ == '__main__': + run_tests() + ``` + + >![](public_sys-resources/icon-note.gif) **说明:** + >- 运行上述代码,如果发现报错信息与模型中的max算子报错信息相同,则说明单算子测试用例构建成功。 + >- 假设注释掉输入数据dtype转换代码,发现测试用例无报错,则可以说明在输入参数为torch.int64时,max算子在npu上报错。 + +2. 基于上下文的单算子测试用例构建。 + + 这里虽然是单算子样例,但有时候不仅仅为一个操作,而是带有上下文的场景,还有时候是一个带参数Module,Module的方式是更通用的方法。此处构建一个包含两个OP的Module,构建样例如下: + + ``` + import torch + import copy + from torch.testing._internal.common_utils import TestCase, run_tests + + class Model(nn.Module): + def __init__(self, in_channels=1, hooks=False): + super(Model, self).__init__() + self.conv = nn.Conv2d(in_channels, in_channels*2, kernel_size=64) + if hooks: + self.conv.weight.register_hook(lambda grad: print(grad)) + def forward(self, x): + out = self.conv(x) + return out + + class TestConv2d(TestCase): + def test_conv2d(self): + + model = Model(in_channels=16) + + # 若需要获取反向计算结果,则加入hooks获取反向即可 + # model = Model(in_channels=16, hooks=True) + # 创建输入tensor + input_tensor = torch.randn(4,16,64,64) + + input_tensor_cpu= copy.deepcopy(input_tensor) + out = model(input_tensor_cpu) + loss = out.sum() + loss.backward() + cpuout = out + + # 3 to NPU 运行,将model和input_tensor放到NPU运行 + torch.npu.set_device("npu:0") # 一般先set_device设定运行卡 + model_npu = Model(in_channels=16).npu() + input_tensor_npu= copy.deepcopy(input_tensor).npu() + out = model_npu(input_tensor_npu) + loss = out.sum() + loss.backward() + npuout = out + #根据结果,确定是否为报错场景 + self.assertEqual(cpuout, npuout, prec = 1e-4) + + if __name__ == '__main__': + run_tests() + ``` + + +

单算子dump方法

+ +## 采集Dump数据 + +当前适配昇腾AI处理器的PyTorch通过torch.npu中的init\_dump\(\)、set\_dump\(\)和finalize\_dump接口来进行算子dump数据的采集。首先init\_dump\(\)会进行初始化dump配置,然后通过set\_dump\(\)接口通过传入配置文件来配置dump参数,最后通过finalize\_dump来结束dump。以下以add\_算子为例,介绍算子dump数据采集方法。 + +``` +import torch +torch.npu.set_device("npu:0") +torch.npu.init_dump() +torch.npu.set_dump("/home/HwHiAiUser/dump.json") # "/home/HwHiAiUser/dump.json"为配置文件路径,用户自行配置 +a = torch.tensor([2, 2]).to("npu:0") +a.add_(1) +torch.npu.finalize_dump() +``` + +其中**dump.json**配置方法如下。 + +``` +{ + "dump": + { + "dump_list":[], + "dump_path":"/home/HwHiAiUser/dump/output", + "dump_mode":"all", + "dump_op_switch":"on" + } +``` + +**dump.json**字段解释如下。 + + + + + + + + + + + + + + + + + + + +

字段名

+

说明

+

dump_list

+

待dump数据的算子模型。为空,无需配置。

+

dump_path

+

dump数据文件存储到运行环境的目录,支持配置绝对路径或相对路径:

+
  • 绝对路径配置以“/”开头,例如:/home/HwHiAiUser/output。
  • 相对路径配置直接以目录名开始,例如:output。
+

例如:dump_path配置为/home/HwHiAiUser/output,则dump数据文件存储到运行环境的/home/HwHiAiUser/output目录下。

+

dump_mode

+

dump数据模式,配置如下。

+
  • input:dump算子的输入数据。
  • output:dump算子的输出数据,默认取值output。
  • all:dump算子的输入、输出数据
+

dump_op_switch

+

单算子模型dump数据开关,配置如下。

+
  • on:开启单算子模型dump。
  • off:关闭单算子模型dump,默认取值off
+
+ +## 查看溢出数据 + +采集的dump数据会在\{dump\_path\}/\{time\}/\{deviceid\}/\{model\_id\}/\{data\_index\}目录下生成例如:“/home/HwHiAiUser/output/20200808163566/0/0”目录。 + +存放路径及文件命名规则: + +- dump\_path:用户配置的溢出数据存放路径,例如/home/HwHiAiUser/output。 + +- time:时间戳,例如20200808163566。 +- deviceid:Device设备ID号。 +- model\_id:子图ID。 +- dump文件:命名规则如\{op\_type\}.\{op\_name\}.\{taskid\}.\{stream\_id\}.\{timestamp\},如果op\_type、op\_name出现了“.”、“/”、“\\”、空格时,会转换为下划线表示。 + +## 解析溢出算子的dump文件 + +1. 请根据实际情况,将\{op\_type\}.\{op\_name\}.\{taskid\}.\{stream\_id\}.\{timestamp\}上传到安装有Toolkit软件包的环境。 +2. 进入解析脚本所在路径,假设Toolkit软件包安装目录为:/home/HwHiAiUser/Ascend/ascend-toolkit/latest。 + + **cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/operator\_cmp/compare** + +3. 执行msaccucmp.pyc脚本,转换dump文件为numpy文件。举例: + + **python3.7.5 msaccucmp.pyc convert -d /home/HwHiAiUser/dump -out /home/HwHiAiUser/dumptonumpy -v 2** + + >![](public_sys-resources/icon-note.gif) **说明:** + >-d参数支持传入单个文件,对单个dump文件进行转换,也支持传入目录,对整个path下所有的dump文件进行转换。 + +4. 调用Python,转换numpy文件为txt文件。举例: + + **$ python3.7.5** + + **\>\>\> import numpy as np** + + **\>\>\> a = np.load\("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy"\)** + + **\>\>\> b = a.flatten\(\)** + + **\>\>\> np.savetxt\("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b\)** + + 转换为.txt格式文件后,维度信息、Dtype均不存在。详细的使用方法请参考numpy官网介绍。 + + +

常用环境变量说明

+ +1. 开启TASK多线程下发,绝大多数情况下,打开该功能会进一步提升整网训练性能。 + + **export TASK\_QUEUE\_ENABLE=1** + +2. 开启重定向日志到stdout,用于导出host日志到屏幕。 + + **export ASCEND\_SLOG\_PRINT\_TO\_STDOUT=1** + +3. 设置日志级别,日志级别设置,信息从多到少分别是 debug --\> info --\> warning --\> error --\> null,一般设置为error,调试时使用info。请参考《CANN 日志参考》设置日志级别。 +4. dump图,主要用于查看图结构。 + + **export DUMP\_GE\_GRAPH=2** + + **export DUMP\_GRAPH\_LEVEL=3** + + +

dump op方法

+ +1. 使用profile接口对原始代码训练脚本的loss计算和优化过程进行改造,打印算子信息。代码样例如下: + + ``` + with torch.autograd.profiler.profile() as prof: + out = model(input_tensor) + loss = out.sum() + loss.backward() + # 也可导出文件 + print(prof.key_averages().table(sort_by="self_cpu_time_total")) + ``` + +2. 将改造后的训练脚本在CPU上进行训练,屏幕会打印相关算子信息。 + +

CMake安装方法

+ +CMake版本升级为3.12.1的方法 + +1. 获取Cmake软件包。 + + ``` + wget https://cmake.org/files/v3.12/cmake-3.12.1.tar.gz --no-check-certificate + ``` + +2. 解压并进入软件包目录。 + + ``` + tar -xf cmake-3.12.1.tar.gz + cd cmake-3.12.1/ + ``` + +3. 执行配置、编译和安装命令。 + + ``` + ./configure --prefix=/usr/local/cmake + make && make install + ``` + +4. 设置软连接。 + + ``` + ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake + ``` + +5. 执行如下命令验证是否安装成功。 + + ``` + cmake --version + ``` + + 如显示“cmake version 3.12.1”则表示安装成功。 + + +

FAQ

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

软件安装常见问题

+ +- **[pip3.7 install Pillow==5.3.0安装失败](#pip3-7-install-Pillow-5-3-0安装失败.md)** + +- **[安装“torch-\*.whl ”提示“torch 1.5.0xxxx”与“torchvision”所依赖的版本不匹配](#安装-torch--whl-提示-torch-1-5-0xxxx-与-torchvision-所依赖的版本不匹配.md)** + + +

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

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

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

+ +## 现象描述 + +安装“torch-\*.whl”时,提示"ERROR:torchvision 0.6.0 has requirement torch==1.5.0, but you'll have torch 1.5.0a0+1977093 which is incompatible"。 + +![](figures/zh-cn_image_0000001106176216.png) + +## 可能原因 + +安装torch时,会自动触发torchvision进行依赖版本检查,环境中安装的torchvision版本为0.6.0,检查时发现我们安装的torch-\*.whl的版本号与要求的1.5.0不一致,所以提示报错,但实际安装成功 。 + +## 处理方法 + +对实际结果无影响,无需处理。 + +

模型和算子运行常见问题

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

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

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

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

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

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

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

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

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

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

+ +## 现象描述 + +![](figures/FAQ9.png) + +## 可能原因 + +根据报错信息,初步判断为npu设备初始化错误。进一步查找host日志报错信息如下: + +![](figures/FAQ9-1.png) + +根据日志信息定位报错原因为系统在拉起npu设备时报错。 + +## 处理方法 + +一般可通过重启服务器和所有npu device解决该问题;若重启后仍然存在该问题,检查安装的driver和fireware版本是否匹配,更换正确版本的driver和fireware或者向华为工程师报告求助解决。 + +

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

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

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

+ +## 现象描述 + +脚本: + +``` + import torch + + def test_sum(): + xs_shape = [22400, 8] + ys_shape = [22400, 8] + gt_bboxes_shape = [22400, 8,4] + xs = torch.rand(xs_shape).npu() + ys = torch.rand(ys_shape).npu() + gt_bboxes = torch.rand(gt_bboxes_shape).npu().half() + left = xs - gt_bboxes[..., 0] + right = gt_bboxes[..., 2] - xs + top = ys - gt_bboxes[..., 1] + bottom = gt_bboxes[..., 3] - ys + # stream = torch.npu.current_stream() + # stream.synchronize() + # left, top 结果是fp32, right, bottom 结果是fp16, + # print(left.dtype, top.dtype, right.dtype, bottom.dtype) + bbox_targets = torch.stack((left, top, right, bottom), -1) #报错位置在这里 + # stream.synchronize() + + bbox_targets = torch.sum(bbox_targets) +``` + +shell报错信息: + +``` + RuntimeError: Run:/usr1/workspace/PyTorch_Apex_Daily_c20tr5/CODE/aten/src/ATen/native/npu/utils/OpParamMaker.h:280 NPU error,NPU error code is:500002 + [ERROR] RUNTIME(160809)kernel task happen error, retCode=0x28, [aicpu timeout]. + [ERROR] RUNTIME(160809)aicpu kernel execute failed, device_id=0, stream_id=512, task_id=24, fault so_name=, fault kernel_name=, extend_info=. + Error in atexit._run_exitfuncs: + Traceback (most recent call last): + File "/usr/local/python3.7.5/lib/python3.7/site-packages/torch/__init__.py", line 429, in _npu_shutdown + torch._C._npu_shutdown() + RuntimeError: npuSynchronizeDevice:/usr1/workspace/PyTorch_Apex_Daily_c20tr5/CODE/c10/npu/NPUStream.cpp:806 NPU error, error code is 0 +``` + +日志信息: + +``` + [ERROR] RUNTIME(12731,python3.7):2021-02-02-22:23:56.475.679 [../../../../../../runtime/feature/src/npu_driver.cc:1408]12828 MemCopySync:drvMemcpy failed: dst=0x108040288000, destMax=1240, src=0x7fe7649556d0, size=1240, kind=1, drvRetCode=17! + [ERROR] RUNTIME(12731,python3.7):2021-02-02-22:23:56.475.698 [../../../../../../runtime/feature/src/logger.cc:113]12828 KernelLaunch:launch kernel failed, kernel=140631803535760/ArgMinWithValue_tvmbin, dim=32, stream=0x55b22b3def50 + [ERROR] RUNTIME(12731,python3.7):2021-02-02-22:23:56.475.717 [../../../../../../runtime/feature/src/api_c.cc:224]12828 rtKernelLaunch:ErrCode=207001, desc=[module new memory error], InnerCode=0x70a0002 +``` + +## 可能原因 + +根据shell和日志报错信息,两者报错信息不匹配。 + +shell报错是在同步操作中和ai cpu错误,而日志报错信息却是在min算子(内部调用ArgMinWithValue\_tvmbin),二者报错信息不对应。一般这类问题出现的原因是由于日志生成的报错信息滞后。 + +报错信息滞后可能是由于AI cpu算子的异步执行,导致报错信息滞后。 + +## 处理方法 + +对于该报错需要根据实际的错误来定位,可参考如下步骤进行处理: + +1. 通过关闭多任务算子下发后发现结果不变,推断在shell脚本报错位置和日志报错算子之前就已出现错误。 +2. 根据报错加上stream同步操作,缩小错误范围,定位错误算子。stream同步操作的作用在于其要求代码所运行到的位置之前的所有计算必须为完成状态,从而定位错误位置。 +3. 通过在代码中加上stream同步操作,确定报错算子为stack。 +4. 打印stack所有参数的shape、dtype、npu\_format,通过构造单算子用例复现问题。定位到问题原因为减法计算输入参数数据类型不同,导致a-b和b-a结果的数据类型不一致,最终在stack算子中报错。 +5. 将stack入参数据类型转换为一致即可临时规避问题。 + +

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

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

模型调测常见问题

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

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

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

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

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

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

+ +## 现象描述 + +![](figures/FAQ6.png) + +![](figures/FAQ6-1.png) + +## 可能原因 + +在模型搭建中,算子输入参数是多样的。某些算子(如MaxPoolGradWithArgmaxV1算子和max算子)在特定参数下,计算报错或者不支持,根据报错信息可以定位到具体算子。 + +## 处理方法 + +根据报错信息定位到具体算子,解决步骤如下: + +1. 排查模型中对该算子的调用方式和参数是否正确; +2. 根据报错算子构建单算子用例,构建报错场景; +3. 一般算子错误无法在python侧解决,构建出报错场景。在论坛中发帖附上报错场景,求助华为工程师即可。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >输入参数shape和dtype需要重点关注,一般是导致算子报错的主要原因。 + + +前述图中,根据报错信息,定位到是MaxPoolGradWithArgmaxV1算子和max算子报错。MaxPoolGradWithArgmaxV1是在反向计算过程中报错,那么构建测试用例时需要构建对应的反向场景;而对于max算子,是正向计算时报错,构建正向场景即可。 + +在模型中遇到算子报错,首选是仅构建单算子测试用例,确定报错场景和原因即可;若无法在单算子中构建单算子用例,则需要构建基于上下文的单算子场景, 可以参考[单算子样例编写说明](#单算子样例编写说明.md)编写用例。 + +

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

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

其他操作相关问题

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

cuda流同步操作报错

+ +## 现象描述 + +![](figures/FAQ12.png) + +## 可能原因 + +npu未使用npu的流同步方法。 + +## 处理方法 + +使用npu的流同步方法: + +``` +stream = torch.npu.current_stream() +stream.synchronize() +``` + +

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

+ +## 现象描述 + +![](figures/FAQ13.png) + +## 可能原因 + +未导入AICPU + +## 处理方法 + +导入AICPU: + +``` +export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest +``` + +

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

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

动态shape报错“match op inputs failed”

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

Op type SigmoidCrossEntropyWithLogitsV2 of ops kernel AIcoreEngine is unsupported

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

Hook失败

+ +## 现象描述 + +``` +Traceback (most recent call last): + File "tools/train.py", line 227, in + main() + File "tools/train.py", line 221, in main + meta=meta) + File "/root/YoloV3/mmdetection/mmdet/apis/train.py", line 192, in train_detector + runner.run(data_loaders, cfg.workflow, cfg.total_epochs) + File "/usr/local/python3.7.5/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py", line 166, in run + epoch_runner(data_loaders[i], **kwargs) + File "/usr/local/python3.7.5/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py", line 50, in train + self.run_iter(data_batch, train_mode=True) + File "/usr/local/python3.7.5/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py", line 30, in run_iter + outputs = self.model.train_step(data_batch, self.optimizer, **kwargs) + File "/usr/local/python3.7.5/lib/python3.7/site-packages/mmcv/parallel/data_parallel.py", line 100, in train_step + return self.module.train_step(*inputs[0], **kwargs[0]) + File "/root/YoloV3/mmdetection/mmdet/models/detectors/base.py", line 251, in train_step + losses = self(**data) + File "/usr/local/python3.7.5/lib/python3.7/site-packages/torch/nn/modules/module.py", line 660, in __call__ + var = next((v for v in var.values() if isinstance(v, torch.Tensor))) +StopIteration +``` + +## 可能原因 + +mmdet的loss部分结构触发了pytorch原生hook的bug,导致死循环。 + +## 处理方法 + +解决方案是在/usr/local/python3.7.5/lib/python3.7/site-packages/torch/nn/modules/module.py这个文件的658行加上try跳过: + +``` +if len(self._backward_hooks) > 0: + var = result + try: + while not isinstance(var, torch.Tensor): + if isinstance(var, dict): + var = next((v for v in var.values() if isinstance(v, torch.Tensor))) + else: + var = var[0] + grad_fn = var.grad_fn + if grad_fn is not None: + for hook in self._backward_hooks.values(): + wrapper = functools.partial(hook, self) + functools.update_wrapper(wrapper, hook) + grad_fn.register_hook(wrapper) + except Exception as e: + print('hook failed..') + print(str(e)) +return result +``` + +

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

+ +## 现象描述 + +![](figures/FAQ18.png) + +![](figures/FAQ18-1.png) + +## 可能原因 + +模型训练后保存的state\_dict的key值与加载时state\_dict的key值不一致,保存时会在每个key的最前面多一个module前缀。 + +## 处理方法 + +加载权重时先遍历state\_dict字典,修改key值,并使用新建的字典,具体用例参考demo.py。 + +脚本: + +``` + ckpt = torch.load("checkpoint.pth", map_location=loc) + # model.load_state_dict(ckpt['state_dict']) + state_dict_old = ckpt['state_dict'] + state_dict = {} + for key, value in state_dict_old.items(): + key = key[7:] + state_dict[key] = value + model.load_state_dict(state_dict) +``` + +

模型分布式训练常见问题

+ +- **[在进行模型分布式训练时遇到报错“host not found.”](#在进行模型分布式训练时遇到报错-host-not-found.md)** + + +

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

+ +## 现象描述 + +![](figures/FAQ19.png) + +## 可能原因 + +对模型进行分布式训练时,会调用集合通信模块HCCL,需要根据实际情况设置IP和端口信息。根据报错信息,确定是IP地址设置错误。 + +## 处理方法 + +在运行脚本中设置正确的IP地址,对于单机情况,设置为本机的IP即可;对于多机情况,每个服务器上脚本中的IP需要设置为master节点的IP。 + 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/FAQ1.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/FAQ1.png" new file mode 100644 index 0000000000000000000000000000000000000000..53f81e17d826f0aa0002a11873e16bb1f988f179 Binary files /dev/null and "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/FAQ1.png" differ 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/FAQ10-1.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/FAQ10-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..b95105e3af29020645ad0a4b77e2d78b84cc2fdd Binary files /dev/null and "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/FAQ10-1.png" differ 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/FAQ10.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/FAQ10.png" new file mode 100644 index 0000000000000000000000000000000000000000..a0232751b9f354e55b5a7b157ab2fdd8fb79caba Binary files /dev/null and "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/FAQ10.png" differ 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/FAQ11.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/FAQ11.png" new file mode 100644 index 0000000000000000000000000000000000000000..dfe1d90a7e99b19c64039c771b8f0f3ee095489d Binary files /dev/null and "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/FAQ11.png" differ 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" new file mode 100644 index 0000000000000000000000000000000000000000..dfe1d90a7e99b19c64039c771b8f0f3ee095489d Binary files /dev/null and "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" differ 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/FAQ13.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/FAQ13.png" new file mode 100644 index 0000000000000000000000000000000000000000..773f83071183fb63c410d94b9f658ba901049a3f Binary files /dev/null and "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/FAQ13.png" differ 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/FAQ14.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/FAQ14.png" new file mode 100644 index 0000000000000000000000000000000000000000..c1201b3f572aa01e2c91ed7959d4466d768d5723 Binary files /dev/null and "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/FAQ14.png" differ 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/FAQ15.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/FAQ15.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2ea57e76acbe91b86c910ddb44a27890fe94ff0 Binary files /dev/null and "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/FAQ15.png" differ 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/FAQ18-1.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/FAQ18-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..9634db02b1c76d601aba391180b3d84ab502c901 Binary files /dev/null and "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/FAQ18-1.png" differ 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/FAQ18.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/FAQ18.png" new file mode 100644 index 0000000000000000000000000000000000000000..253af857e9ff65a4f67ca154d323ca27769fcaef Binary files /dev/null and "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/FAQ18.png" differ 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/FAQ19.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/FAQ19.png" new file mode 100644 index 0000000000000000000000000000000000000000..ffc2a914b6ca1f99b27e52d7fd6d33de7475e566 Binary files /dev/null and "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/FAQ19.png" differ 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/FAQ2.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/FAQ2.png" new file mode 100644 index 0000000000000000000000000000000000000000..ab0a9f7e0aae085338f2324aeb9464a3c25d5090 Binary files /dev/null and "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/FAQ2.png" differ 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/FAQ3.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/FAQ3.png" new file mode 100644 index 0000000000000000000000000000000000000000..970b050c2c46f29e9d09ff401e243ea6fb06804b Binary files /dev/null and "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/FAQ3.png" differ 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/FAQ4.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/FAQ4.png" new file mode 100644 index 0000000000000000000000000000000000000000..1a813e3ddbcabd36646defdcc63b9a0fdbb7e1a9 Binary files /dev/null and "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/FAQ4.png" differ 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/FAQ5.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/FAQ5.png" new file mode 100644 index 0000000000000000000000000000000000000000..5c2019b795b4a165e7b150395739922ccacb8253 Binary files /dev/null and "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/FAQ5.png" differ 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/FAQ6-1.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/FAQ6-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..134ed666fb21e075885226fa4039d84ff4e6642c Binary files /dev/null and "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/FAQ6-1.png" differ 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/FAQ6.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/FAQ6.png" new file mode 100644 index 0000000000000000000000000000000000000000..5f0ab093a0c1c35b1c948e4ac2555a890bf73a05 Binary files /dev/null and "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/FAQ6.png" differ 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/FAQ7.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/FAQ7.png" new file mode 100644 index 0000000000000000000000000000000000000000..d7871f3d6ba9b3c2e37c79f886a7e6cb93147c5a Binary files /dev/null and "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/FAQ7.png" differ 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/FAQ8-1.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/FAQ8-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..0316905729ff0cd82806961565b947cb7655acb1 Binary files /dev/null and "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/FAQ8-1.png" differ 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/FAQ8.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/FAQ8.png" new file mode 100644 index 0000000000000000000000000000000000000000..c1950311e49af3ea74b28c02afe3e77938788396 Binary files /dev/null and "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/FAQ8.png" differ 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/FAQ9-1.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/FAQ9-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec178d5e25a2e60ef4a1a25b80bd24271e25bb02 Binary files /dev/null and "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/FAQ9-1.png" differ 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/FAQ9.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/FAQ9.png" new file mode 100644 index 0000000000000000000000000000000000000000..70e4bc5824c836a894f3e3e3c6c87c276efd15ec Binary files /dev/null and "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/FAQ9.png" differ 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/Performance-Config.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/Performance-Config.png" new file mode 100644 index 0000000000000000000000000000000000000000..d75a5dbc4e684169cfd311d0b4c94d5283c1e762 Binary files /dev/null and "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/Performance-Config.png" differ 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/Pth\346\226\207\344\273\266.jpg" "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/Pth\346\226\207\344\273\266.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7a64f87cec889e72b09d352522ae96b06c7694b6 Binary files /dev/null and "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/Pth\346\226\207\344\273\266.jpg" differ 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/Socket-Configuration.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/Socket-Configuration.png" new file mode 100644 index 0000000000000000000000000000000000000000..025284eeae4bcc43c74979d1e142a4bb77d63096 Binary files /dev/null and "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/Socket-Configuration.png" differ 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/pytorch\351\200\202\351\205\215\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276-\344\274\230\345\214\226.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/pytorch\351\200\202\351\205\215\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276-\344\274\230\345\214\226.png" new file mode 100644 index 0000000000000000000000000000000000000000..207410d4779ad9a94bbb8c92c0a60bc384af83bf Binary files /dev/null and "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/pytorch\351\200\202\351\205\215\351\200\273\350\276\221\347\273\223\346\236\204\345\233\276-\344\274\230\345\214\226.png" differ 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/zh-cn_image_0000001106016350.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/zh-cn_image_0000001106016350.png" new file mode 100644 index 0000000000000000000000000000000000000000..e95a0361e813dc685d49f524991b80acc490f988 Binary files /dev/null and "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/zh-cn_image_0000001106016350.png" differ 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/zh-cn_image_0000001106176216.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/zh-cn_image_0000001106176216.png" new file mode 100644 index 0000000000000000000000000000000000000000..ede83f4bc1b0ed21a9c746c358c45681d5ffb49a Binary files /dev/null and "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/zh-cn_image_0000001106176216.png" differ 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/zh-cn_image_0000001106176222.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/zh-cn_image_0000001106176222.png" new file mode 100644 index 0000000000000000000000000000000000000000..24ad984e3ca1b8850526626259c25de8b93c4388 Binary files /dev/null and "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/zh-cn_image_0000001106176222.png" differ 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/zh-cn_image_0000001152616281.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/zh-cn_image_0000001152616281.png" new file mode 100644 index 0000000000000000000000000000000000000000..eff3d25890d212eb91ed0cfb9f2157fa490d9983 Binary files /dev/null and "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/zh-cn_image_0000001152616281.png" differ 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/zh-cn_image_0000001152616289.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/zh-cn_image_0000001152616289.png" new file mode 100644 index 0000000000000000000000000000000000000000..e95a0361e813dc685d49f524991b80acc490f988 Binary files /dev/null and "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/zh-cn_image_0000001152616289.png" differ 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/zh-cn_image_0000001152736233.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/zh-cn_image_0000001152736233.png" new file mode 100644 index 0000000000000000000000000000000000000000..eff3d25890d212eb91ed0cfb9f2157fa490d9983 Binary files /dev/null and "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/zh-cn_image_0000001152736233.png" differ 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/\345\220\257\345\212\250\351\241\271\345\267\245\345\205\267-1.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/\345\220\257\345\212\250\351\241\271\345\267\245\345\205\267-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..c4f81fc908960959f07aeaaf6e4aa47f1c9aac83 Binary files /dev/null and "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/\345\220\257\345\212\250\351\241\271\345\267\245\345\205\267-1.png" differ 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/\345\220\257\345\212\250\351\241\271\345\267\245\345\205\267.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/\345\220\257\345\212\250\351\241\271\345\267\245\345\205\267.png" new file mode 100644 index 0000000000000000000000000000000000000000..c773cbd1c37dee1d8a5f755bd8229238dbb107cf Binary files /dev/null and "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/\345\220\257\345\212\250\351\241\271\345\267\245\345\205\267.png" differ 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/\346\214\207\345\256\232\347\256\227\345\255\220\345\210\235\345\247\213\345\214\226\346\226\271\345\274\217.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/\346\214\207\345\256\232\347\256\227\345\255\220\345\210\235\345\247\213\345\214\226\346\226\271\345\274\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..35584844f7a44aa3c0076d7e1bdf7259f3479bcc Binary files /dev/null and "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/\346\214\207\345\256\232\347\256\227\345\255\220\345\210\235\345\247\213\345\214\226\346\226\271\345\274\217.png" differ 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/\347\216\257\345\242\203\345\207\206\345\244\207\346\265\201\347\250\213\345\233\276.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/\347\216\257\345\242\203\345\207\206\345\244\207\346\265\201\347\250\213\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..cdda4fab2365a81d54807e9118cc617a25b8f4f2 Binary files /dev/null and "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/\347\216\257\345\242\203\345\207\206\345\244\207\346\265\201\347\250\213\345\233\276.png" differ 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/\350\256\276\347\275\256\347\224\265\346\272\220\347\255\226\347\225\245-2.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/\350\256\276\347\275\256\347\224\265\346\272\220\347\255\226\347\225\245-2.png" new file mode 100644 index 0000000000000000000000000000000000000000..93e4f5aa984a7f2e6c2e5298a8d59e4d3d0e9aab Binary files /dev/null and "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/\350\256\276\347\275\256\347\224\265\346\272\220\347\255\226\347\225\245-2.png" differ 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/\350\256\276\347\275\256\347\224\265\346\272\220\347\255\226\347\225\245.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/\350\256\276\347\275\256\347\224\265\346\272\220\347\255\226\347\225\245.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c31df7fe027517b9eec9ec717d06e3d75b2f3c7 Binary files /dev/null and "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/\350\256\276\347\275\256\347\224\265\346\272\220\347\255\226\347\225\245.png" differ 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/\350\277\201\347\247\273\346\265\201\347\250\213.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/\350\277\201\347\247\273\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..4f5a0edf328f897103e2d79f0281125258ac218a Binary files /dev/null and "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/\350\277\201\347\247\273\346\265\201\347\250\213.png" differ 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/\350\277\234\347\250\213\347\231\273\345\275\225\346\216\247\345\210\266\345\217\260-0.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/\350\277\234\347\250\213\347\231\273\345\275\225\346\216\247\345\210\266\345\217\260-0.png" new file mode 100644 index 0000000000000000000000000000000000000000..c323451aaa02f04b7305837db31652c23ea7bc24 Binary files /dev/null and "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/\350\277\234\347\250\213\347\231\273\345\275\225\346\216\247\345\210\266\345\217\260-0.png" differ 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/\350\277\234\347\250\213\347\231\273\345\275\225\346\216\247\345\210\266\345\217\260.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/\350\277\234\347\250\213\347\231\273\345\275\225\346\216\247\345\210\266\345\217\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..56ee9d31bcd3f4b601c8bd7edcfa0ddcb357459e Binary files /dev/null and "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/\350\277\234\347\250\213\347\231\273\345\275\225\346\216\247\345\210\266\345\217\260.png" differ 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/public_sys-resources/icon-caution.gif" "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/public_sys-resources/icon-caution.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "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/public_sys-resources/icon-caution.gif" differ 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/public_sys-resources/icon-danger.gif" "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/public_sys-resources/icon-danger.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "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/public_sys-resources/icon-danger.gif" differ 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/public_sys-resources/icon-note.gif" "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/public_sys-resources/icon-note.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda Binary files /dev/null and "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/public_sys-resources/icon-note.gif" differ 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/public_sys-resources/icon-notice.gif" "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/public_sys-resources/icon-notice.gif" new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 Binary files /dev/null and "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/public_sys-resources/icon-notice.gif" differ 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/public_sys-resources/icon-tip.gif" "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/public_sys-resources/icon-tip.gif" new file mode 100644 index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7 Binary files /dev/null and "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/public_sys-resources/icon-tip.gif" differ 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/public_sys-resources/icon-warning.gif" "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/public_sys-resources/icon-warning.gif" new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 Binary files /dev/null and "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/public_sys-resources/icon-warning.gif" differ