ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PyPTO pypto.dequantize 反量化算子详解:从参数约定到 C++ 实现链路

PyPTO pypto.dequantize 反量化算子详解:从参数约定到 C++ 实现链路 PyPTO pypto.dequantize 反量化算子详解从参数约定到 C 实现链路【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto本文围绕 PyPTOCANN/pypto 仓库的pypto.dequantize接口展开完整覆盖其功能语义、参数约束、TileShape 配置与调用示例并结合仓库中的 Python 封装、C Operation 层与 TileOp 层源码讲清楚一次 INT8/INT16 → FP32 反量化调用在框架内部是如何被校验、切分和实现的。读完本文你可以在量化推理/训练场景中正确配置反量化算子并理解逐行axis-1与逐列axis-2反量化在底层的具体差异。产品支持情况pypto.dequantize目前支持以下硬件平台Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持功能说明与反量化公式pypto.dequantize将量化后的低精度数据转换为高精度格式并应用缩放scale和偏移zero_points参数。当前支持输入DT_INT8/DT_INT16的 Tensor 反量化为DT_FP32的 Tensor计算公式为$$ \text{dst} ([float]\text{input} \text{zero_points}) * \text{scale} $$由此形成两种典型使用形态对称反量化不传zero_points或传None公式退化为dst input * scale只依赖缩放因子非对称反量化传入zero_points在反量化前先叠加偏移再乘缩放因子用于恢复量化零点带来的系统性偏差。函数原型dequantize(input: Tensor, scale: Tensor, otype: DataType, axis: int, zero_points: Tensor) - Tensor参数说明参数名输入/输出说明input输入源操作数。支持的类型为Tensor。Tensor 支持的数据类型为DT_INT8/DT_INT16不支持空 TensorShape 仅支持 1-4 维Shape Size 不大于 2147483647即 INT32_MAX。shape 记为 [..., row, col]scale输入缩放因子。支持的类型为Tensor。Tensor 数据类型与 otype 一致支持DT_FP32不支持空 TensorShape 比 input 少一位维仅支持 1-3 维Shape Size 不大于 2147483647即 INT32_MAXaxis -1 或 input.shape.size() - 1 时shape [..., row]axis -2 或 input.shape.size() - 2 时shape [..., col]otype输入返回值的数值类型。目前支持 DT_FP32axis输入指定反量化压缩的轴。目前支持末尾两轴即 -1/-2 或者 input.shape.size() - 1 / input.shape.size() - 2。当 input 为 1D 时仅支持 -1zero_points输入可选的非对称量化的偏移因子。支持的类型为Tensor。Tensor 数据类型与 otype 一致支持DT_FP32支持空 TensorShape 比 input 少一位维仅支持 1-3 维Shape Size 不大于 2147483647即 INT32_MAXaxis -1 或 input.shape.size() - 1 时shape [..., row]axis -2 或 input.shape.size() - 2 时shape [..., col]几个容易出错的点值得单独强调scale/zero_points的 Shape 比input少一位维axis-1时表示逐行压缩每一行共享一个因子因此其最后一维对应 input 的 row 维axis-2时表示逐列压缩最后一维对应 input 的 col 维。zero_points支持空 Tensor这正是对称反量化不传偏移的实现方式Python 层将None转换为空 Tensor 后传入底层。当input为 1D 时仅支持axis-1逐列反量化路径不可用。返回值说明返回输出 TensorTensor 的数据类型由otype指定Shape 与input相同。约束说明Tensor 类型输入不支持TileOpFormat.TILEOP_NZ格式。该约束在 C 实现中通过格式检查函数强制执行见下文 dequantize.cpp若input/scale/zero_points任一为 NZ 格式将直接报错。TileShape 设置调用该 operation 接口前应先通过pypto.set_vec_tile_shapes设置 TileShape且 TileShape 维度应和输出一致。示例 1输入 input shape 为 [m, n]输出为 [m, n]TileShape 设置为 [m1, n1]则 m1、n1 分别用于切分 m、n 轴。pypto.set_vec_tile_shapes(4, 16)从源码结构看这一配置最终被 TiledDequantize 消费函数以tileShape.GetVecTile()为步长递归遍历 output 的每个维度把 output、src、scale、offset 分别切成若干 Tile再对每个 Tile 添加一条OP_DEQUANTIZE操作。其中 scale/offset 的 Tile 索引采用i % 该维长度的方式复用因为它们是少一位维的低秩因子保证每个 Tile 块都能取到正确的因子切片。接口调用示例x pypto.tensor([3, 4], pypto.DT_INT8) scale pypto.tensor([3, 1], pypto.DT_FP32) zero_points pypto.tensor([3, 1], pypto.DT_FP32) # fp32 - int8对称反量化 y1 pypto.dequantize(x, scale, pypto.DT_FP32, -1, None) # fp32 - uint8非对称反量化 y2 pypto.dequantize(x, scale, pypto.DT_FP32, -1, zero_points)结果示例如下Input x:[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] Input scale:[1.0, 1.0, 1.0] Input zero_points:[-2.0, -2.0, -2.0] Output y1:[[1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0]] Output y2:[[-1.0, 0.0, 1.0, 2.0], [-1.0, 0.0, 1.0, 2.0], [-1.0, 0.0, 1.0, 2.0]]可以看到对称路径y1等价于input * scale非对称路径y2先叠加zero_points本例为 -2.0再乘 scale逐行生效。源码实现链路一次pypto.dequantize调用在仓库中经过Python 封装 → PyBind 绑定 → Operation 层 → TileOp 层四级链路。Python 封装层quantization.py 中的dequantize是用户可见入口带有op_wrapper装饰器。其关键逻辑是当zero_points is None时构造一个空的pypto_impl.Tensor()作为占位再统一转发给pypto_impl.Dequantize(input, scale, otype, axis, zero_points)。也就是说Python 层的None与 C 层的空 Tensor约定是对齐的对称反量化无需特殊分支。PyBind 绑定层operation.cpp 将Dequantize暴露为pypto_impl命名空间下的函数内部直接调用npu::tile_fwk::Dequantize(input, scale, otype, axis, zeroPoints)。Operation 层参数校验与轴归一化核心实现在 dequantize.cpp 的公共入口Dequantize中可以逐条对应到文档的约束格式检查对input、scale以及非空的zero_points依次执行CheckTensorFormat(..., {TileOpFormat::TILEOP_NZ}, Dequantize)即文档中不支持 TILEOP_NZ 格式约束的落点维度与 dtype 检查校验 input 维度、input必须为DT_INT8或DT_INT16、otype必须为DT_FP32对应文档参数表中 dtype 支持范围axis 归一化将用户传入的正/负 axis 归一化后仅接受-1逐行或-2逐列1D 输入显式禁止axis-2与文档当 input 为 1D 时仅支持 -1一致1D 输入的特殊处理1D 输入会先经 PrepareDequantize1DInput 在首维补 1 变成 2D 张量同时调整 TileShape计算完成后再由RestoreDequantize1DResult恢复原始形状与 TileShape因此对上层表现为透明逐列路径的实现方式axis-2时进入 DequantizeAlongSecondLastAxis做法是对 input 做一次末两轴 Transpose把逐列反量化转化为逐行反量化再 Transpose 回来并临时交换 TileShape 的对应两维对称路径的偏移构造zero_points为空时CreateZeroOffsetTensor 会构造一个与 scale 同形状、全 0 的 FP32 Tensor 作为 offset 传入保证底层算子永远看到 4 个操作数src、scale、offset、dst。TileOp 层Tile 级计算公式最底层的 Tile 算子定义在 dequantize.h提供TDequantInt8与TDequantInt16两个模板实现由统一接口TDequant按模板参数分派。该头文件给出了两个重要的实现事实数据类型转换路径INT8 - FP32走int8 - half - float两级转换INT16 - FP32走int16 - float直转转换后再执行缩放/偏移运算Tile 布局与对齐srcINT8/INT16与 dstFP32按 RowMajor 组织scale/offset 按 ColMajor 组织为一列因子且各 Tile 的行/列尺寸都通过PTO_CEIL向上取整到 32 字节对齐边界FP32 即 8 元素、INT8 即 32 元素以满足向量单元的对齐要求。头文件注释明确写出 TileOp 层的公式形态为dst (src - offset) * scale并注明TileOp 层只支持逐行反量化axis-1逐列反量化在 Operation 层通过 Transpose 实现——这与上一节DequantizeAlongSecondLastAxis的做法互相印证。另外注释强调TDequant总是需要 4 个参数dst、src、scale、offset对称量化时 offset 传全 0 张量这正是 Operation 层构造零 Tensor 的动机。测试用例与验证方式仓库提供了可参考的端到端系统测试 test_dequantize_onboard.py展示了pypto.dequantize在真实 kernel 中的典型用法被测 kernel 使用pypto.frontend.jit编译函数体内先pypto.set_vec_tile_shapes(*config.tile_shape)再用pypto.loop双层循环按 Tile 遍历对每个 Tile 取 input/scale以及非对称场景下的 zero_points的 view调用pypto.dequantize(...)后用pypto.assemble(result, output_offset, output0)写回输出该文件同时覆盖了 2 输入对称zero_points传None与 3 输入非对称两种 kernel 形态期望值由 CPU 上的 golden 函数 dequantize_golden 计算先将输入转 FP32按 axis 广播 zero_points 后叠加/消去偏移再乘广播后的 scale最后与 NPU 输出比对。这个 golden 逻辑可以直接作为你在业务侧验证反量化数值正确性的参照公式。测试运行依赖torch.npu设备与TILE_FWK_DEVICE_ID环境变量指定卡号适用前提为已安装对应 CANN 运行环境的 Ascend 平台。小结pypto.dequantize的对外契约可以概括为INT8/INT16 输入、FP32 输出、scale 与 zero_points 均为少一位维的低秩因子、axis 仅限末尾两轴且 1D 输入只用-1、全链路禁用 NZ 格式。底层则是一条Python 封装把None归一为空 Tensor → Operation 层做格式/类型/轴校验1D 输入自动补维、逐列路径经 Transpose 归约为逐行 → TileOp 层按 32 字节对齐切 Tile 执行(src ± offset) * scale的实现链路。开发时建议以 参数说明 表为第一参照遇到边界问题1D 输入、axis-2、NZ 格式报错时回到 dequantize.cpp 的校验分支定位并参考 test_dequantize_onboard.py 组织自己的数值验证。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表