FEATURED · 精选文章

CANN PyPTO 元素级除法算子 pypto.div 完全指南:精度模式、广播规则与 TileShape 切分实战

发布时间 / 2026/9/20 17:57:37
来源 / 创域科博编辑部
栏目 / 资讯中心
CANN PyPTO 元素级除法算子 pypto.div 完全指南:精度模式、广播规则与 TileShape 切分实战 人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载导读本文围绕 CANN PyPTOParallel Tensor/Tile Operation 编程范式中的元素级除法算子pypto.div系统讲解其功能语义、函数原型、参数与返回值规则、精度模式选择HIGH_PRECISION / INTRINSIC、数据类型与广播约束并结合仓库源码与系统测试给出可复现的调用示例与 TileShape 切分配置方法。读完本文你将掌握如何在 Ascend 训练/推理产品上正确使用pypto.div完成张量除法、标量除法与广播除法并能针对精度与性能诉求做出合理的精度模式选择。产品支持情况pypto.div在以下产品上获得支持Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持需要说明的是各产品对输入数据类型与精度模式的支持范围存在差异详见后文“约束说明”其中HIGH_PRECISION 高精度模式仅在 Ascend 950PR/Ascend 950DT 上支持A3 与 A2 系列仅能使用 INTRINSIC 指令模式。这一点在选择精度模式时务必注意避免在编译期收到“不支持”的报错。功能说明pypto.div执行元素级除法将input的每个元素除以other中对应位置的元素计算公式为$$ res_i input_i \div other_i $$该算子支持两个 Tensor 之间逐元素相除也支持 Tensor 与标量float / int相除还支持输入张量之间按维度进行广播后相除。从源码结构看pypto.div在 python/pypto/op/math.py 中通过op_wrapper装饰器定义其内部实现会根据other的类型走两条路径详见下文“底层实现解析”。函数原型div(input: Tensor, other: Union[Tensor, float, int], precision_type: PrecisionType PrecisionType.HIGH_PRECISION) - Tensorinput被除数Tensor 类型other除数可以是 Tensor、float 或 intprecision_type精度模式枚举默认PrecisionType.HIGH_PRECISION高精度模式其完整定义参见 PrecisionType 说明。参数说明参数名输入/输出说明input输入源操作数被除数。支持的类型为Tensor。不同型号支持的数据类型有所差异详细请参见约束说明。不支持空Tensor支持的维度1-4维支持多维度广播到相同形状Shape Size不大于2147483647即INT32_MAX。other输入源操作数除数。支持的类型为Tensor、float、int。不同型号支持的数据类型有所差异详细请参见约束说明。不支持空Tensor支持的维度1-4维支持多维度广播到相同形状Shape Size不大于2147483647即INT32_MAX。precision_type输入精度模式枚举类型用以控制除法计算的精度模式具体定义为PrecisionType。默认为HIGH_PRECISION高精度模式。关于precision_type的两个取值枚举原型来自 PrecisionType 文档参数值说明HIGH_PRECISION高精度模式。在底层实现中使用更高精度的计算方式可以有效减少精度损失提高计算结果的准确性。INTRINSIC指令模式。直接使用芯片指令进行计算性能更高但对精度要求不高的场景适用。返回值说明返回输出 TensorShape 为input和other广播后的大小。当输入为浮点类型时输出数据类型与输入相同当输入为 DT_INT16 或 DT_INT32 时输出数据类型为 DT_FP32。对于 Ascend 950PR/Ascend 950DT当输入为 DT_INT64 或 DT_UINT64 时输出数据类型与输入相同。约束说明使用pypto.div时必须满足以下约束否则会编译报错或产生非预期结果数据类型一致input和other都为 Tensor 时数据类型应该相同。标量scalar类型规则other为 scalar 时若input为浮点类型则 scalar 支持整型自动转为浮点若input为整型则 scalar 不支持浮点类型会报错。Tensor 数据类型说明按产品区分Ascend 950PR/Ascend 950DTDT_FP16DT_FP32DT_BF16DT_INT16DT_INT32DT_INT64DT_UINT64。Atlas A3 训练系列产品/Atlas A3 推理系列产品DT_FP16DT_FP32DT_BF16DT_INT16DT_INT32。Atlas A2 训练系列产品/Atlas A2 推理系列产品DT_FP16DT_FP32DT_BF16DT_INT16DT_INT32。精度模式说明HIGH_PRECISION高精度模式默认模式在底层实现中会使用更高精度的计算方式。在不同型号上的支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持INTRINSIC指令模式直接使用芯片指令进行计算。格式约束Tensor 类型输入不支持TileOpFormat.TILEOP_NZ格式。整型输入约束当输入为 DT_INT16 或 DT_INT32 时内部会将输入转换为 DT_FP32 进行计算float32 尾数为 24 位。在 $[-2^{24},\ 2^{24}]$ 范围内的整数可精确转换超出范围的整数在转换时可能丢失低位精度。对于 Ascend 950PR/Ascend 950DT当输入为 DT_INT64 或 DT_UINT64 时不进行类型转换直接按整数除法计算。约束规则的源码印证上述约束第 2 条scalar 类型检查与第 6 条整型转换可在 python/pypto/op/math.py 中找到对应实现。当other不是 Tensor 时div内部会调用_check_scalar_type(div, input.dtype, other)做类型校验再调用_clip_scalar_to_dtype将标量裁剪到输入 dtype 对应的取值范围后包装成pypto_impl.Element(input.dtype, other)参与计算当other是 Tensor 时则直接调用pypto_impl.Div(input, other, precision_type)。这说明标量除法的类型校验、裁剪和元素包装发生在 Python 前端层而 Tensor-Tensor 除法直接透传到底层实现。调用示例TileShape 设置示例调用该 operation 接口前应通过set_vec_tile_shapes设置 TileShape。TileShape 维度应和输出一致。非广播场景输入 input shape 为 [m, n]other 为 [m, n]输出为 [m, n]TileShape 设置为 [m1, n1]则 m1、n1 分别用于切分 m、n 轴。广播场景输入 input shape 为 [m, n]other 为 [m, 1]输出为 [m, n]TileShape 设置为 [m1, n1]则 m1、n1 分别用于切分 m、n 轴。pypto.set_vec_tile_shapes(4, 16)从源码看set_vec_tile_shapes定义于 python/pypto/_controller.py它接受可变数量的整型参数也支持SymbolicScalar内部通过concrete()求值并通过pypto_impl.SetScope({vec_tile_shapes: concrete_shapes})写入当前编译作用域供后续向量算子的 Tile 切分使用对应的读取接口为pypto.get_vec_tile_shapes()。接口调用示例基本用法默认使用高精度模式a pypto.tensor([1, 3], pypto.DT_FP32) b pypto.tensor([1, 3], pypto.DT_FP32) out pypto.div(a, b) # 默认使用HIGH_PRECISION模式结果示例如下输入数据a: [[2.0 4.0 6.0]] 输入数据b: [[2.0 2.0 2.0]] 输出数据out: [[1.0 2.0 3.0]]显式指定高精度模式a pypto.tensor([1, 3], pypto.DT_FP16) b pypto.tensor([1, 3], pypto.DT_FP16) out pypto.div(a, b, pypto.PrecisionType.HIGH_PRECISION)使用指令模式a pypto.tensor([1, 3], pypto.DT_FP32) b pypto.tensor([1, 3], pypto.DT_FP32) out pypto.div(a, b, pypto.PrecisionType.INTRINSIC)使用运算符自动使用高精度模式a pypto.tensor([1, 3], pypto.DT_FP16) b pypto.tensor([1, 3], pypto.DT_FP16) out a / b # 自动使用HIGH_PRECISION模式 out a.div(b) # 自动使用HIGH_PRECISION模式其中a / b与a.div(b)都经由 python/pypto/tensor.py 中Tensor.div方法转发到模块级pypto.div因此同样默认采用 HIGH_PRECISION 模式。精度模式选择建议结合 PrecisionType 文档 中的使用建议可按下述原则选择精度模式默认行为不指定精度模式时默认使用HIGH_PRECISION模式以确保计算精度。精度要求高的场景推荐使用HIGH_PRECISION模式可以有效减少精度损失提高计算结果的准确性。对精度要求不高但追求性能的场景可以使用INTRINSIC模式直接使用芯片指令进行计算。注意平台限制HIGH_PRECISION 仅在 Ascend 950PR/Ascend 950DT 上受支持在 Atlas A3、A2 系列上请使用 INTRINSIC 模式。除div外PrecisionType同样作用于 fmod取模、remainder余数、pow幂、exp指数、sqrt开方、rsqrt开方倒数、log/log2/log10对数、reciprocal倒数等元素级算子选择逻辑可复用。实战进阶结合循环、视图与 assemble 的完整 Kernel 写法pypto.div通常不会孤立使用而是作为向量 Kernel 的算子片段出现在 Tile 化编程中。以仓库系统测试 python/tests/st/operation/vector/test_div.py 中的div_2d_2input_kernel为例其完整流程为在pypto.frontend.jit装饰的 Kernel 函数内先调用pypto.set_vec_tile_shapes(*config.tile_shape)设置 TileShape通过pypto.loop按 execution view shape 切分循环对广播场景将 shape 为 1 的轴 offset 置 0对应代码中的0 if config.input_shapes[0][axis] 1 else offsets[axis]用pypto.view取输入视图调用pypto.div(input0_view, input1_view)得到结果视图通过pypto.assemble(result, output_offset, output)将结果写回输出 Tensor。对应的测试用例定义在 python/tests/st/operation/vector/vector_testcase/div_test_case.py其中两个典型用例分别是Div_test_14input0 shape 为 (16, 512)fp32input1 shape 为 (16, 1)fp32输出 shape 为 (16, 512)——这是一个典型的列广播除法用例view_shape为 (5, 152)tile_shape为 (33, 32)Div_test_15input0 与 input1 均为 (2048, 127, 1)fp32输出 (2048, 127, 1)——三维元素级除法view_shape为 (460, 32, 2)tile_shape为 (34, 8, 2)。测试通过torch.div(*inputs_cpu)生成期望结果并在 NPU 上执行 Kernel 后与期望值对比assert_outputs验证广播除法与逐元素除法的正确性。这套“TileShape loop view div assemble”的组合写法正是 PyPTO 向量编程的标准范式。常见问题与注意事项Shape 限制input与other均不支持空 Tensor支持 1-4 维Shape Size 不能超过 INT32_MAX2147483647。Tensor 之间广播后形状不一致会触发广播失败错误。格式限制Tensor 输入不支持TileOpFormat.TILEOP_NZ格式请使用 ND 等兼容格式。整型除法精度DT_INT16/DT_INT32 输入会先转 DT_FP32 计算再输出 DT_FP32超出 $[-2^{24}, 2^{24}]$ 的整数可能丢失低位精度若需要 64 位整型精确除法请确认目标产品为 Ascend 950PR/Ascend 950DT支持直接整数除法。标量类型整型 Tensor 与浮点标量相除会报错浮点 Tensor 与整型标量相除时标量会自动转为浮点。产品差异HIGH_PRECISION 模式与 DT_INT64/DT_UINT64 支持仅限 Ascend 950 系列跨平台开发时建议按产品分支适配或直接使用 INTRINSIC 指令模式保证兼容性。小结pypto.div是 CANN PyPTO 向量编程中最常用的元素级除法算子支持 Tensor-Tensor、Tensor-标量以及广播除法三种形态并可通过PrecisionType在精度与性能之间权衡。本文完整覆盖了它的产品支持、函数原型、参数语义、返回值、约束规则与调用示例并结合仓库源码math.py、tensor.py、_controller.py与系统测试test_div.py给出了底层实现与实战写法的印证。开发者可直接以本文的示例为模板结合set_vec_tile_shapes、loop、view、assemble组合出完整的除法 Kernel。赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐CANN PyPTO 逐元素减法算子 pypto.subAPI 详解、广播规则与 TileShape 切分实践CANN PyPTO 逐元素减法算子 pypto.subAPI 详解、广播规则与 TileShape 切分实践 pypto.sub 是 CANN PyPTO人工智能编译器模型编译高性能计算深度学习CANNCANN PyPTO 逐元素乘法 pypto.mul 详解接口语义、广播规则、TileShape 切分与源码验证CANN PyPTO 逐元素乘法 pypto.mul 详解接口语义、广播规则、TileShape 切分与源码验证 导读 pypto.mul 是 CANN Py人工智能编译器模型编译高性能计算深度学习CANNpypto.Tensor.div 详解CANN PyPTO 元素级除法算子的精度模式与工程实践pypto.Tensor.div 详解CANN PyPTO 元素级除法算子的精度模式与工程实践 导读 pypto.Tensor.div 是 CANN PyPT人工智能编译器模型编译高性能计算深度学习CANN上一篇最完整IndexTTS2模型精度对比FP32/FP16/BF16推理质量测试报告下一篇一文读懂深度学习优化策略基于deeplearning-mindmap的实用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻