已合并
gemm blaze模板 TT量化场景支持StreamK性能优化 #142
chen-shuai创建于 7月13日
gemm blaze模板 TT量化场景支持StreamK性能优化 #142
已合并
chen-shuai创建于 7月13日
chen-shuai成员
7月13日

描述

本 PR 在 Blaze TensorApi 中新增 QuantBatchMatmulV3 非 per-tensor 量化场景的 StreamK Device 实现,与 ops-nn Host Tiling 配合,在 M/N 较小、K 较大的场景下通过切分 K 维提高核利用率。

配套 Host PR:

https://gitcode.com/cann/ops-nn/pull/7449

整体流程

Device 侧按照以下模块组织:

Policy
  -> Kernel
  -> BlockScheduler
  -> BlockMmad
  -> BlockEpilogue
  • Policy 选择 QBMM per-tensor StreamK 调度类型。
  • Kernel 负责组装各模块,并完成 AIC/AIV 分流和同步。
  • BlockScheduler 复用已有 StreamK block 映射和 K 维切分逻辑。
  • BlockMmad 在 AIC 上完成各个 K 分片的矩阵计算。
  • BlockEpilogue 在 AIV 上归约 workspace partial,并在 UB 上完成 Vector 反量化和后处理。

Policy

新增 KernelQbmmPertensorMultiBlockStreamK 调度类型,并为 MatmulWithScaleFixpipeQuant 增加可配置的 ScheduleType

通过独立 ScheduleType 将普通 Fixpipe QBMM、MX StreamK 和 per-tensor StreamK 的模板实例区分开,防止 Kernel、MMAD 和 Epilogue 发生错误组合。

Kernel

新增 kernel_qbmm_pertensor_streamk.h,实现 QBMM per-tensor StreamK 对应的 GemmUniversal 特化。

Kernel 主要完成:

  • 组装 BlockMmad、BlockEpilogue 和 BlockScheduler。
  • AIC 根据 Scheduler 返回的 block 信息执行 DP tile 或 StreamK K 分片。
  • DP block 通过 Fixpipe 反量化并直接写入最终输出。
  • StreamK block 将未反量化的 raw accumulator partial 写入 workspace。
  • AIC 完成后通过 CrossCore 同步通知 AIV。
  • AIV 等待 AIC 完成后,执行 workspace reduce 和 Vector 后处理。

BlockScheduler

直接复用已有 BlockSchedulerMatmulStreamK,不修改原有 StreamK 切块策略。

Scheduler 负责:

  • M/N tile 划分。
  • DP block 和 StreamK block 映射。
  • K 分片编号和当前分片长度计算。
  • 尾块 StreamK 调度。

BlockMmad

扩展 block_mmad_a8w8_fixpipe_quant.h,使已有 QBMM BlockMmad 支持 per-tensor StreamK ScheduleType。

主要修改包括:

  • 根据当前 StreamK 分片长度更新 K 循环。
  • DP block 保留原有 Fixpipe 反量化输出路径。
  • StreamK block 不进行 Fixpipe 反量化,将 raw partial 写入 workspace。
  • 根据量化组合决定 bias 在 MMAD 中累加,还是交给 AIV Epilogue 处理。
  • 同一个输出 tile 的 bias 只在第一个 K 分片中累加,避免重复累加。

int32 bias,以及 FP8 整数编码 scale 对应的 fp32 bias,在 MMAD 累加域处理。

BlockEpilogue

新增 block_epilogue_qbmm_pertensor_streamk.h,实现专用 AIV 后处理:

  1. 从 workspace 读取同一输出 tile 的多个 K 分片 partial。
  2. 在 UB 中完成 split-K reduce。
  3. 应用 X2 per-tensor scale。
  4. 根据量化模式应用可选 X1 per-tensor scale。
  5. 累加需要在反量化后处理的 bias。
  6. 转换为 fp16、bf16 或 fp32,并写回最终输出。

反量化全部在 UB 上由 Vector 完成,不使用 Fixpipe 随路反量化处理 StreamK partial。

Scale 和 Bias 顺序

支持两类 bias 处理顺序:

反量化前 bias:
(raw accumulator + bias) * scale
反量化后 bias:
raw accumulator * x2Scale * optional x1Scale + bias

对于反量化后 bias,Host Tiling 仅允许全 StreamK 调度,确保所有输出 tile 都经过 AIV Epilogue。

关联的Issue

https://gitcode.com/cann/ops-tensor/issues/136

测试

已有用例的精度和性能

文档更新

docs/API/README.md
docs/API/epilogue/README.md
docs/API/epilogue/block/block_epilogue_qbmm_pertensor_streamk.md
docs/API/gemm/block/README.md
docs/API/gemm/block/block_mmad_a8w8_fixpipe_quant.md
docs/API/gemm/kernel/README.md
docs/API/gemm/kernel/kernel_qbmm_pertensor_streamk.md

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 chen-shuai 的贡献)
Cchen-shuai成员
7月13日 强制推送  11 个提交:91340c3c-10 commits from branch master2c1901fc-StreamK_TT
CANN-robotCANN-robot成员
7月13日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月13日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/ops-tensor 陈康, 杨阳 (2/2) 杨阳, 陈康 (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

chen-shuai, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
Cchen-shuai成员
7月14日 强制推送  4 个提交:15538d93-3 commits from branch master7c68146a-StreamK_TT
Cchen-shuai成员
7月15日 推送  1 个提交:4201861e-fix
此处折叠了333条消息 查看更多
yangyang016成员
8月6日 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
8月6日 添加了label:lgtm
CANN-robot
CANN-robot成员
8月6日 评论:

The MR can not be merged, because of CodeReview discussion not resolved

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
Gguiruoyu成员
8月6日 解决了最后一个问题
CANN-robotCANN-robot成员
8月6日 合入了pull request