API说明

PyTorch-NPU 除了提供了 PyTorch 官方算子实现之外,也提供了大量高性能的自定义算子,详细的算子信息以及描述如下所示:

备注

在运行下述示例之前,需要导入torch_npu扩展包 import torch_npu

torch_npu._npu_dropout(self, p)

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

参数:
  • self (Tensor) – 输入张量

  • p (Float) – 丢弃概率

返回类型:

(Tensor, Tensor)

示例:

 1>>> input = torch.tensor([1.,2.,3.,4.]).npu()
 2>>> input
 3tensor([1., 2., 3., 4.], device='npu:0')
 4>>> prob = 0.3
 5>>> output, mask = torch_npu._npu_dropout(input, prob)
 6>>> output
 7tensor([0.0000, 2.8571, 0.0000, 0.0000], device='npu:0')
 8>>> mask
 9tensor([ 98, 255, 188, 186, 120, 157, 175, 159,  77, 223, 127,  79, 247, 151,
10    253, 255], device='npu:0', dtype=torch.uint8)
torch_npu.copy_memory_(dst, src, non_blocking=False) Tensor

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

约束说明:

copy_memory_仅支持NPU张量,copy_memory_的输入张量应具有相同的dtype和设备index

参数:
  • dst (Tensor) – 拷贝源张量

  • sr (Tensor) – 返回张量所需数据类型

  • non_blocking (Bool,Default: False) – 如果设置为True且此拷贝位于CPU和NPU之间,则拷贝可能相对于主机异步发生,在其他情况下,此参数没有效果

返回类型:

Tensor

示例:

1>>> a=torch.IntTensor([0,  0, -1]).npu()
2>>> b=torch.IntTensor([1, 1, 1]).npu()
3>>> a.copy_memory_(b)
4tensor([1, 1, 1], device='npu:0', dtype=torch.int32)
torch_npu.empty_with_format(size, dtype, layout, device, pin_memory, acl_format)

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

参数:
  • size (ListInt) – 定义输出张量shape的整数序列,可以是参数数量(可变值),也可以是列表或元组等集合

  • dtype (torch.dtype,Default: None) – 返回张量所需数据类型;如果值为None,请使用全局默认值(请参见torch.set_default_tensor_type()).

  • layout (torch.layout, Default: torch.strided) – 返回张量所需布局

  • device (torch.device, Default: None) – 返回张量的所需设备

  • pin_memory (Bool, Default: False) – 返回张量的所需设备

  • acl_format (Int, Default: 2) – 返回张量所需内存格式

返回类型:

Tensor

示例:

1>>> torch_npu.empty_with_format((2, 3), dtype=torch.float32, device="npu")
2tensor([[1., 1., 1.],
3        [1., 1., 1.]], device='npu:0')
torch_npu.fast_gelu(self) Tensor

gelu的npu实现,支持FakeTensor模式

参数:

self (Tensor) – 输入张量(只float16、float32)

返回类型:

Tensor

示例:

 1# Normal
 2>>> x = torch.rand(2).npu()
 3>>> x
 4tensor([0.5991, 0.4094], device='npu:0')
 5>>> torch_npu.fast_gelu(x)
 6tensor([0.4403, 0.2733], device='npu:0')
 7
 8# FakeTensorMode
 9>>> from torch._subclasses.fake_tensor import FakeTensorMode
10>>> with FakeTensorMode():
11...     x = torch.rand(2).npu()
12...     torch_npu.fast_gelu(x)
13>>> FakeTensor(..., device='npu:0', size=(2,))
torch_npu.npu_alloc_float_status(self) Tensor

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

参数:

self (Tensor) – 输入张量

返回类型:

Tensor

示例:

1>>> input    = torch.randn([1,2,3]).npu()
2>>> output = torch_npu.npu_alloc_float_status(input)
3>>> input
4tensor([[[ 2.2324,  0.2478, -0.1056],
5        [ 1.1273, -0.2573,  1.0558]]], device='npu:0')
6>>> output
7tensor([0., 0., 0., 0., 0., 0., 0., 0.], device='npu:0')
torch_npu.npu_anchor_response_flags(self, featmap_size, stride, num_base_anchors) Tensor

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

参数:
  • self (Tensor) – 真值框,shape为[batch, 4]的2D张量

  • featmap_size (ListInt[2]) – 特征图大小

  • strides (ListInt[2]) – 当前水平的步长

  • num_base_anchors (Int) – base anchors的数量

返回类型:

Tensor

示例:

1>>> x = torch.rand(100, 4).npu()
2>>> y = torch_npu.npu_anchor_response_flags(x, [60, 60], [2, 2], 9)
3>>> y.shape
4torch.Size([32400])
torch_npu.npu_apply_adam(beta1_power, beta2_power, lr, beta1, beta2, epsilon, grad, use_locking, use_nesterov, out=(var, m, v))

adam结果计数。

参数:
  • beta1_power (Scalar) – beta1的幂

  • beta2_power (Scalar) – beta2的幂

  • lr (Scalar) – 学习率

  • beta1 (Scalar) – 一阶矩估计值的指数衰减率

  • beta2 (Scalar) – 二阶矩估计值的指数衰减率

  • epsilon (Scalar) – 添加到分母中以提高数值稳定性的项数

  • grad (Tensor) – 梯度

  • use_locking (Bool) – 设置为True时使用lock进行更新操作

  • use_nesterov (Bool) – 设置为True时采用nesterov更新

  • var (Tensor) – 待优化变量。

  • m (Tensor) – 变量平均值。

  • v (Tensor) – 变量方差。

npu_batch_nms(self, scores, score_threshold, iou_threshold, max_size_per_class, max_total_size, change_coordinate_frame=False, transpose_box=False)
Module:

torch_npu

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

参数:
  • self (Tensor) – 必填值,输入框的tensor,包含batch大小,数据类型Float16,输入示例:[batch_size, num_anchors, q, 4],其中q=1或q=num_classes

  • scores (Tensor) – 必填值,输入tensor,数据类型Float16,输入示例:[batch_size, num_anchors, num_classes]

  • score_threshold (Float32) – 必填值,指定评分过滤器的iou_threshold,用于筛选框,去除得分较低的框,数据类型Float32

  • iou_threshold (Float32) – 必填值,指定nms的iou_threshold,用于设定阈值,去除高于阈值的的框,数据类型Float32

  • max_size_per_class (Int) – 必填值,指定每个类别的最大可选的框数,数据类型Int

  • max_total_size (Int) – 必填值,指定每个batch最大可选的框数,数据类型Int

  • change_coordinate_frame (Bool) – 可选值, 是否正则化输出框坐标矩阵,数据类型Bool(默认False)

  • transpose_box (Bool) – 可选值,确定是否在此op之前插入转置,数据类型Bool。True表示boxes使用4,N排布。 False表示boxes使用过N,4排布

输出说明: :param Tensor nmsed_boxes: shape为(batch, max_total_size, 4)的3D张量,指定每批次输出的nms框,数据类型Float16 :param Tensor nmsed_scores: shape为(batch, max_total_size)的2D张量,指定每批次输出的nms分数,数据类型Float16 :param Tensor nmsed_classes: shape为(batch, max_total_size)的2D张量,指定每批次输出的nms类,数据类型Float16 :param Tensor nmsed_num: shape为(batch)的1D张量,指定nmsed_boxes的有效数量,数据类型Int32

返回类型:

Tensor

示例:

1>>> boxes = torch.randn(8, 2, 4, 4, dtype = torch.float32).to("npu")
2>>> scores = torch.randn(3, 2, 4, dtype = torch.float32).to("npu")
3>>> nmsed_boxes, nmsed_scores, nmsed_classes, nmsed_num = torch_npu.npu_batch_nms(boxes, scores, 0.3, 0.5, 3, 4)
4>>> nmsed_boxes
5>>> nmsed_scores
6>>> nmsed_classes
7>>> nmsed_num
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))
Module:

torch_npu

adam结果计数

参数:
  • var (Tensor) – float16或float32类型张量

  • m (Tensor) – 数据类型和shape与exp_avg相同

  • v (Tensor) – 数据类型和shape与exp_avg相同

  • lr (Scalar) – 数据类型与exp_avg相同

  • beta1 (Scalar) – 数据类型与exp_avg相同

  • beta2 (Scalar) – 数据类型与exp_avg相同

  • epsilon (Scalar) – 数据类型与exp_avg相同

  • grad (Tensor) – 数据类型和shape与exp_avg相同

  • max_grad_norm (Scalar) – 数据类型与exp_avg相同

  • global_grad_norm (Scalar) – 数据类型与exp_avg相同

  • weight_decay (Scalar) – 数据类型与exp_avg相同

  • step_size (Tensor) – 默认值为None - shape为(1, ),数据类型与exp_avg一致

  • adam_mode (Int) – 选择adam模式。0表示“adam”, 1表示“mbert_adam”, 默认值为0

关键字参数: out (Tensor,可选) - 输出张量。

示例:

 1>>> var_in = torch.rand(321538).uniform_(-32., 21.).npu()
 2>>> m_in = torch.zeros(321538).npu()
 3>>> v_in = torch.zeros(321538).npu()
 4>>> grad = torch.rand(321538).uniform_(-0.05, 0.03).npu()
 5>>> max_grad_norm = -1.
 6>>> beta1 = 0.9
 7>>> beta2 = 0.99
 8>>> weight_decay = 0.
 9>>> lr = 0.
10>>> epsilon = 1e-06
11>>> global_grad_norm = 0.
12>>> var_out, m_out, v_out = torch_npu.npu_bert_apply_adam(lr, beta1, beta2, epsilon, grad, max_grad_norm, global_grad_norm, weight_decay, out=(var_in, m_in, v_in))
13>>> var_out
14tensor([ 14.7733, -30.1218,  -1.3647,  ..., -16.6840,   7.1518,   8.4872], device='npu:0')
torch_npu.npu_bmmV2(self, mat2, output_sizes) Tensor

将矩阵“a”乘以矩阵“b”,生成“a*b”。支持FakeTensor模式

参数:
  • self (Tensor) – 2D或更高维度矩阵张量。数据类型:float16、float32、int32。格式:[ND, NHWC, FRACTAL_NZ]

  • mat2 (Tensor) – 2D或更高维度矩阵张量。数据类型:float16、float32、int32。格式:[ND, NHWC, FRACTAL_NZ]

  • output_sizes (ListInt[]) – 输出的shape,用于matmul的反向传播

返回类型:

Tensor

示例:

1>>> mat1 = torch.randn(10, 3, 4).npu()
2>>> mat2 = torch.randn(10, 4, 5).npu()
3>>> res = torch_npu.npu_bmmV2(mat1, mat2, [])
4>>> res.shape
5torch.Size([10, 3, 5])
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算子

参数:
  • rois (Tensor) – 区域候选网络(RPN)生成的region of interests(ROI)。shape为(N,4)数据类型为float32或float16的2D张量。“N”表示ROI的数量, “4”表示“x0”、“x1”、“y0”和“y1”

  • deltas (Tensor) – RPN生成的ROI和真值框之间的绝对变化。shape为(N,4)数据类型为float32或float16的2D张量。“N”表示错误数,“4”表示“dx”、“dy”、“dw”和“dh”

  • means0 (Float) – index

  • means1 (Float) – index

  • means2 (Float) – index

  • means33 (Float) – index, 默认值为[0,0,0,0], “deltas” = “deltas” x “stds” + “means”

  • stds0 (Float) – index

  • stds1 (Float) – index

  • stds2 (Float) – index

  • stds3 (Float) – index, 默认值:[1.0,1.0,1.0,1.0], deltas” = “deltas” x “stds” + “means”

  • max_shape (ListInt[2]) – shape[h, w], 指定传输到网络的图像大小。用于确保转换后的bbox shape不超过“max_shape”

  • wh_ratio_clip (Float) – 当前水平的步长

  • num_base_anchors (Int) – “dw”和“dh”的值在(-wh_ratio_clip, wh_ratio_clip)范围内

返回类型:

Tensor

示例:

1>>> rois = torch.tensor([[1., 2., 3., 4.], [3.,4., 5., 6.]], dtype = torch.float32).to("npu")
2>>> deltas = torch.tensor([[5., 6., 7., 8.], [7.,8., 9., 6.]], dtype = torch.float32).to("npu")
3>>> output = torch_npu.npu_bounding_box_decode(rois, deltas, 0, 0, 0, 0, 1, 1, 1, 1, (10, 10), 0.1)
4>>> output
5tensor([[2.5000, 6.5000, 9.0000, 9.0000],
6        [9.0000, 9.0000, 9.0000, 9.0000]], device='npu:0')