NPU自定义算子

仅支持通过torch_npu.xxx调用NPU自定义算子。torch.xxxtorch.Tensor.xxx的调用形式已经被废弃,使用以上方法调用可能会出报错,如图1所示。
图1 错误提示
表1 NPU自定义算子

序号

算子名称

1

torch_npu._npu_dropout

2

torch_npu.copy_memory_

3

torch_npu.empty_with_format

4

torch_npu.fast_gelu

5

torch_npu.npu_alloc_float_status

6

torch_npu.npu_anchor_response_flags

7

torch_npu.npu_apply_adam

8

torch_npu.npu_batch_nms

9

torch_npu.npu_bert_apply_adam

10

torch_npu.npu_bmmV2

11

torch_npu.npu_bounding_box_decode

12

torch_npu.npu_bounding_box_encode

13

torch_npu.npu_broadcast

14

torch_npu.npu_ciou

15

torch_npu.npu_clear_float_status

16

torch_npu.npu_confusion_transpose

17

torch_npu.npu_conv_transpose2d

18

torch_npu.npu_conv2d

19

torch_npu.npu_conv3d

20

torch_npu.npu_convolution

21

torch_npu.npu_convolution_transpose

22

torch_npu.npu_deformable_conv2d

23

torch_npu.npu_diou

24

torch_npu.npu_dtype_cast

25

torch_npu.npu_format_cast

26

torch_npu.npu_format_cast_

27

torch_npu.npu_get_float_status

28

torch_npu.npu_giou

29

torch_npu.npu_grid_assign_positive

30

torch_npu.npu_gru

31

torch_npu.npu_ifmr

32

torch_npu.npu_indexing

33

torch_npu.npu_iou

34

torch_npu.npu_layer_norm_eval

35

torch_npu.npu_linear

36

torch_npu.npu_lstm

37

torch_npu.npu_masked_fill_range

38

torch_npu.npu_max

39

torch_npu.npu_min

40

torch_npu.npu_mish

41

torch_npu.npu_nms_rotated

42

torch_npu.npu_nms_v4

43

torch_npu.npu_nms_with_mask

44

torch_npu.npu_normalize_batch

45

torch_npu.npu_one_hot

46

torch_npu.npu_pad

47

torch_npu.npu_ps_roi_pooling

48

torch_npu.npu_ptiou

49

torch_npu.npu_random_choice_with_mask

50

torch_npu.npu_reshape

51

torch_npu.npu_roi_align

52

torch_npu.npu_rotated_box_decode

53

torch_npu.npu_rotated_box_encode

54

torch_npu.npu_rotated_iou

55

torch_npu.npu_rotated_overlaps

56

torch_npu.npu_scatter

57

torch_npu.npu_sign_bits_pack

58

torch_npu.npu_sign_bits_unpack

59

torch_npu.npu_silu

60

torch_npu.npu_slice

61

torch_npu.npu_softmax_cross_entropy_with_logits

62

torch_npu.npu_sort_v2

63

torch_npu.npu_stride_add

64

torch_npu.npu_transpose

65

torch_npu.npu_yolo_boxes_encode

66

torch_npu.one_

映射关系

NPU自定义算子参数中存在部分映射关系可参考下表。

表2 映射关系表

参数

映射参数

说明

ACL_FORMAT_UNDEFINED

-1

Format参数映射值。

ACL_FORMAT_NCHW

0

ACL_FORMAT_NHWC

1

ACL_FORMAT_ND

2

ACL_FORMAT_NC1HWC0

3

ACL_FORMAT_FRACTAL_Z

4

ACL_FORMAT_NC1HWC0_C04

12

ACL_FORMAT_HWCN

16

ACL_FORMAT_NDHWC

27

ACL_FORMAT_FRACTAL_NZ

29

ACL_FORMAT_NCDHW

30

ACL_FORMAT_NDC1HWC0

32

ACL_FRACTAL_Z_3D

33

详细算子接口说明

torch_npu.npu_apply_adam(beta1_power, beta2_power, lr, beta1, beta2, epsilon, grad, use_locking, use_nesterov, out = (var, m, v))

adam结果计数。

torch_npu.npu_convolution_transpose(input, weight, bias, padding, output_padding, stride, dilation, groups) -> Tensor

在由多个输入平面组成的输入图像上应用一个2D或3D转置卷积算子,有时这个过程也被称为“反卷积”。

torch_npu.npu_conv_transpose2d(input, weight, bias, padding, output_padding, stride, dilation, groups) -> Tensor

在由多个输入平面组成的输入图像上应用一个2D转置卷积算子,有时这个过程也被称为“反卷积”。

torch_npu.npu_convolution(input, weight, bias, stride, padding, dilation, groups) -> Tensor

在由多个输入平面组成的输入图像上应用一个2D或3D卷积。

torch_npu.npu_conv2d(input, weight, bias, stride, padding, dilation, groups) -> Tensor

在由多个输入平面组成的输入图像上应用一个2D卷积。

torch_npu.npu_conv3d(input, weight, bias, stride, padding, dilation, groups) -> Tensor

在由多个输入平面组成的输入图像上应用一个3D卷积。

torch_npu.one_(self) -> Tensor

用1填充self张量。

torch_npu.npu_sort_v2(self, dim=-1, descending=False, out=None) -> Tensor

沿给定维度,按无index值对输入张量元素进行升序排序。若dim未设置,则选择输入的最后一个维度。如果descending为True,则元素将按值降序排序。

torch_npu.npu_format_cast(self, acl_format) -> Tensor

修改NPU张量的格式。

torch_npu.npu_format_cast_(self, src) -> Tensor

原地修改self张量格式,与src格式保持一致。

torch_npu.npu_transpose(self, perm, require_contiguous=True) -> Tensor

返回原始张量视图,其维度已permute,结果连续。

torch_npu.npu_broadcast(self, size) -> Tensor

返回self张量的新视图,其单维度扩展,结果连续。

张量也可以扩展更多维度,新的维度添加在最前面。

torch_npu.npu_dtype_cast(input, dtype) -> Tensor

执行张量数据类型(dtype)转换。

torch_npu.empty_with_format(size, dtype, layout, device, pin_memory, acl_format)

返回一个填充未初始化数据的张量。

torch_npu.copy_memory_(dst, src, non_blocking=False) -> Tensor

从src拷贝元素到self张量,并返回self。

torch_npu.npu_one_hot(input, num_classes=-1, depth=1, on_value=1, off_value=0) -> Tensor

返回一个one-hot张量。input中index表示的位置采用on_value值,而其他所有位置采用off_value的值。

torch_npu.npu_stride_add(x1, x2, offset1, offset2, c1_len) -> Tensor

添加两个张量的partial values,格式为NC1HWC0。

torch_npu.npu_softmax_cross_entropy_with_logits(features, labels) -> Tensor

计算softmax的交叉熵cost。

torch_npu.npu_ps_roi_pooling(x, rois, spatial_scale, group_size, output_dim) -> Tensor

执行Position Sensitive ROI Pooling。

torch_npu.npu_roi_align(features, rois, spatial_scale, pooled_height, pooled_width, sample_num, roi_end_mode) -> Tensor

从特征图中获取ROI特征矩阵。自定义FasterRcnn算子。

torch_npu.npu_nms_v4(boxes, scores, max_output_size, iou_threshold, scores_threshold, pad_to_max_output_size=False) -> (Tensor, Tensor)

按分数降序选择标注框的子集。

torch_npu.npu_nms_rotated(dets, scores, iou_threshold, scores_threshold=0, max_output_size=-1, mode=0) -> (Tensor, Tensor)

按分数降序选择旋转标注框的子集。

torch_npu.npu_lstm(x, weight, bias, seqMask, h, c, has_biases, num_layers, dropout, train, bidirectional, batch_first, flag_seq, direction)

计算DynamicRNN。

torch_npu.npu_iou(bboxes, gtboxes, mode=0) -> Tensor 
torch_npu.npu_ptiou(bboxes, gtboxes, mode=0) -> Tensor

根据ground-truth和预测区域计算交并比(IoU)或前景交叉比(IoF)。

torch_npu.npu_pad(input, paddings) -> Tensor

填充张量。

torch_npu.npu_nms_with_mask(input, iou_threshold) -> (Tensor, Tensor, Tensor)

生成值0或1,用于nms算子确定有效位。

torch_npu.npu_bounding_box_encode(anchor_box, ground_truth_box, means0, means1, means2, means3, stds0, stds1, stds2, stds3) -> Tensor

计算标注框和ground truth真值框之间的坐标变化。自定义FasterRcnn算子。

torch_npu.npu_bounding_box_decode(rois, deltas, means0, means1, means2, means3, stds0, stds1, stds2, stds3, max_shape, wh_ratio_clip) -> Tensor

根据rois和deltas生成标注框。自定义FasterRcnn算子。

torch_npu.npu_gru(input, hx, weight_input, weight_hidden, bias_input, bias_hidden, seq_length, has_biases, num_layers, dropout, train, bidirectional, batch_first) -> (Tensor, Tensor, Tensor, Tensor, Tensor, Tensor)

计算DynamicGRUV2。

torch_npu.npu_random_choice_with_mask(x, count=256, seed=0, seed2=0) -> (Tensor, Tensor)

混洗非零元素的index。

torch_npu.npu_batch_nms(self, scores, score_threshold, iou_threshold, max_size_per_class, max_total_size, change_coordinate_frame=False, transpose_box=False) -> (Tensor, Tensor, Tensor, Tensor)

根据batch分类计算输入框评分,通过评分排序,删除评分高于阈值(iou_threshold)的框,支持多批多类处理。通过NonMaxSuppression(nms)操作可有效删除冗余的输入框,提高检测精度。NonMaxSuppression:抑制不是极大值的元素,搜索局部的极大值,常用于计算机视觉任务中的检测类模型。

torch_npu.npu_slice(self, offsets, size) -> Tensor

从张量中提取切片。

torch_npu._npu_dropout(self, p) -> (Tensor, Tensor)

不使用种子(seed)进行dropout结果计数。与torch.dropout相似,优化NPU设备实现。

torch_npu.npu_indexing(self, begin, end, strides, begin_mask=0, end_mask=0, ellipsis_mask=0, new_axis_mask=0, shrink_axis_mask=0) -> Tensor

使用“begin,end,strides”数组对index结果进行计数。

torch_npu.npu_ifmr(Tensor data, Tensor data_min, Tensor data_max, Tensor cumsum, float min_percentile, float max_percentile, float search_start, float search_end, float search_step, bool with_offset) -> (Tensor, Tensor)

使用“begin,end,strides”数组对ifmr结果进行计数。

torch_npu.npu_max(self, dim, keepdim=False) -> (Tensor, Tensor)

使用dim对最大结果进行计数。类似于torch.max, 优化NPU设备实现。

torch_npu.npu_min(self, dim, keepdim=False) -> (Tensor, Tensor)

使用dim对最小结果进行计数。类似于torch.min, 优化NPU设备实现。

torch_npu.npu_scatter(self, indices, updates, dim) -> Tensor

使用dim对scatter结果进行计数。类似于torch.scatter,优化NPU设备实现。

torch_npu.npu_layer_norm_eval(input, normalized_shape, weight=None, bias=None, eps=1e-05) -> Tensor

对层归一化结果进行计数。与torch.nn.functional.layer_norm相同, 优化NPU设备实现。

torch_npu.npu_alloc_float_status(self) -> Tensor

生成一个包含8个0的一维张量。

torch_npu.npu_get_float_status(self) -> Tensor

计算npu_get_float_status算子函数。

torch_npu.npu_clear_float_status(self) -> Tensor

在每个核中设置地址0x40000的值为0。

torch_npu.npu_confusion_transpose(self, perm, shape, transpose_first) -> Tensor

混淆reshape和transpose运算。

torch_npu.npu_bmmV2(self, mat2, output_sizes) -> Tensor

将矩阵“a”乘以矩阵“b”,生成“a*b”。

torch_npu.fast_gelu(self) -> Tensor

计算输入张量中fast_gelu的梯度。

torch_npu.npu_deformable_conv2d(self, weight, offset, bias, kernel_size, stride, padding, dilation=[1,1,1,1], groups=1, deformable_groups=1, modulated=True) -> (Tensor, Tensor)

使用预期输入计算变形卷积输出(deformed convolution output)。

torch_npu.npu_mish(self) -> Tensor

按元素计算self的双曲正切。

torch_npu.npu_anchor_response_flags(self, featmap_size, stride, num_base_anchors) -> Tensor

在单个特征图中生成锚点的责任标志。

torch_npu.npu_yolo_boxes_encode(self, gt_bboxes, stride, performance_mode=False) -> Tensor

根据YOLO的锚点框(anchor box)和真值框(ground-truth box)生成标注框。自定义mmdetection算子。

torch_npu.npu_grid_assign_positive(self, overlaps, box_responsible_flags, max_overlaps, argmax_overlaps, gt_max_overlaps, gt_argmax_overlaps, num_gts, pos_iou_thr, min_pos_iou, gt_max_assign_all) -> Tensor

执行position-sensitive的候选区域池化梯度计算。

torch_npu.npu_normalize_batch(self, seq_len, normalize_type=0) -> Tensor

执行批量归一化。

torch_npu.npu_masked_fill_range(self, start, end, value, axis=-1) -> Tensor

同轴上被range.boxes屏蔽(masked)的填充张量。自定义屏蔽填充范围算子。

torch_npu.npu_linear(input, weight, bias=None) -> Tensor

将矩阵“a”乘以矩阵“b”,生成“a*b”。

torch_npu.npu_bert_apply_adam(lr, beta1, beta2, epsilon, grad, max_grad_norm, global_grad_norm, weight_decay, step_size=None, adam_mode=0, *, out=(var,m,v))

adam结果计数。

torch_npu.npu_giou(self, gtboxes, trans=False, is_cross=False, mode=0) -> Tensor

首先计算两个框的最小封闭面积和IoU,然后计算封闭区域中不属于两个框的封闭面积的比例,最后从IoU中减去这个比例,得到GIoU。

torch_npu.npu_silu(self) -> Tensor

计算self的Swish。

torch_npu.npu_reshape(self, shape, bool can_refresh=False) -> Tensor

reshape张量。仅更改张量shape,其数据不变。

torch_npu.npu_rotated_overlaps(self, query_boxes, trans=False) -> Tensor

计算旋转框的重叠面积。

torch_npu.npu_rotated_iou(self, query_boxes, trans=False, mode=0, is_cross=True,v_threshold=0.0, e_threshold=0.0) -> Tensor

计算旋转框的IoU。

torch_npu.npu_rotated_box_encode(anchor_box, gt_bboxes, weight) -> Tensor

旋转标注框编码。

torch_npu.npu_rotated_box_decode(anchor_boxes, deltas, weight) -> Tensor

旋转标注框编码。

torch_npu.npu_ciou(Tensor self, Tensor gtboxes, bool trans=False, bool is_cross=True, int mode=0, bool atan_sub_flag=False) -> Tensor

应用基于NPU的CIoU操作。在DIoU的基础上增加了penalty item,并propose CIoU。

torch_npu.npu_diou(Tensor self, Tensor gtboxes, bool trans=False, bool is_cross=False, int mode=0) -> Tensor

应用基于NPU的DIoU操作。考虑到目标之间距离,以及距离和范围的重叠率,不同目标或边界需趋于稳定。

torch_npu.npu_sign_bits_pack(Tensor self, int size) -> Tensor

将float类型1位Adam打包为uint8。

torch_npu.npu_sign_bits_unpack(x, dtype, size) -> Tensor

将uint8类型1位Adam拆包为float。