已关闭
[Requirement|需求建议]: Quantize算子补齐ascend910b原生AscendC 实现 #4047
zhaohujie创建于 7月12日关闭于 8月8日
zhaohujie
7月12日 评论:
7月12日 评论:
/assign @zhaohujie


7月12日 将 zhaohujie 设为负责人
7月12日 修改标题为 “[Requirement|需求建议]: Quantize算子补齐ascend910b原生AscendC 实现”,原标题为“[Requirement|需求建议]: Quantize 算子补齐 ascend910b 原生 AscendC 实现”
7月12日 修改标题为 “[Requirement|需求建议]: Quantize算子补齐ascend910b原生AscendC 实现”,原标题为“[Requirement|需求建议]: Quantize 算子补齐 ascend910b 原生 AscendC 实现”
8月8日 关闭了 issue
8月8日 添加了label:resolved
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
Quantize算子在本仓当前仅覆盖 ascend950:quant/quantize/op_kernel/quantize_apt.cpp只#include arch35/*_regbase.h,并以__NPU_ARCH__ == 3510守护;quant/quantize/op_host/arch35/;quant/quantize/op_host/config/ascend950/;AICore().AddConfig也只声明了ascend950。因此在 ascend910b(Atlas A2 / DAV_2201) 上没有可用的
Quantizekernel。与此同时,Quantize在 CANN 9.0.0部署包中对所有 SoC 均未部署 builtin(
aic-*-ops-info-*.json中查无此 OpType)。两者叠加的结果是:在 910b 上既没有开源实现、也没有内置实现可回退,
aclnnQuantize无法落到实际 kernel。需求:为
Quantize补齐 ascend910b 的原生 AscendC 实现(DAV_2201 标准编程模型,非 regbase 路径),使其在 910b 上能通过既有的
aclnnQuantize两段式接口正常调用,行为与 ascend950 侧保持一致。Origin(信息来源)
基础软件Agent算子迁移
Benefit / Necessity (价值/作用)
Quantize在该平台缺失,会导致依赖它的量化子图无法下沉为单算子调用。
Quantize) 与同一aclnnQuantize两段式接口,调用方无需按芯片做条件分支或退化实现。
例如 W8A8 推理的量化节点、量化感知训练前向的 quantize 节点。
Design(设计方案)
落点:
experimental/quant/quantize/(新增算子按仓库约定先落experimental/)。复用源算子 SoC 无关的aclnn / L0 接口层,仅补 910b 的 kernel + tiling + 配置。
计算语义:
y = saturate_cast_to(dtype)( round( x / scales + zero_points ) ),固定 RoundMode = round-to-nearest、DivMode = div、SqrtMode = none。
kernel(
op_kernel/quantize.{cpp,h},DAV_2201 标准编程模型):统一 fp32 计算路径,避免 dtype 笛卡尔积膨胀:tiling(
op_host/quantize_tiling.{cpp,h}):两条 tiling key —per-tensor(按元素做多核切分)与 per-channel(按输出行切分,行内共享同一组
scale/zero_points);UB 侧按
baseLen切分并开 double buffer。def:
op_host/quantize_def.cpp增加AICore().AddConfig("ascend910b");沿用同一 OpTypeQuantize。接口:交付可解析、可调用的
aclnnQuantizeGetWorkspaceSize/aclnnQuantize。关键实现点(易踩坑):kernel 二进制按
(x, scales, y)的 dtype 组合去重分发,而可选输入
zero_points的 dtype 不在分发键内。因此zero_points必须按其运行时真实 dtype 读取(dtype 码由 tiling 携带),不能依赖 kernel 的编译期占位类型 —— 否则 INT32 的
zero_points会被分发到以 INT8 编译的二进制、并以 1 字节步长误读;该错误在 per-channel(索引 > 0)下会取到错误字节,
而在 per-tensor(索引 0)下因低字节恰好正确而不易暴露。
支持范围(首版):
axis语义);x ∈ {FLOAT, FLOAT16, BFLOAT16}、scales ∈ {FLOAT, BFLOAT16}、zero_points ∈ {INT8, UINT8, INT32, BFLOAT16, 缺省}、y ∈ {INT8, UINT8, INT32};dtype(必选)、axis(可选,默认 1)。暂不支持(后续扩展):fp8 输出(HIFLOAT8 / FLOAT8_E5M2 / FLOAT8_E4M3FN —— ascend910b 无 fp8 能力)、
per-head、per-channel-nddma、FP32
zero_points。验收方式:
tests/ut/op_host(tiling + infershape)、tests/ut/op_api(aclnn dtype 与错误码矩阵)、tests/ut/op_kernel(ICPU_RUN_KF对 numpy golden);tests/st/aclnnQuantize/ATK 用例集,判据stand_quantize(|diff| <= 1),对 CPU goldensaturate_cast_to_y(rint(x / scales + zero_points)),覆盖 per-tensor / per-channel、三种 x dtype、三种输出 dtype、饱和边界与空 tensor。