Skip to content

perf: optimize causal conv1d and mega chunk gdn for qwen3.5.#15

Open
Sinle4Cat wants to merge 1 commit into
xLLM-AI:mainfrom
Sinle4Cat:prefill_opt_conv1d_gdn
Open

perf: optimize causal conv1d and mega chunk gdn for qwen3.5.#15
Sinle4Cat wants to merge 1 commit into
xLLM-AI:mainfrom
Sinle4Cat:prefill_opt_conv1d_gdn

Conversation

@Sinle4Cat

@Sinle4Cat Sinle4Cat commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

背景

Qwen3.5 LinearAttention 的 prefill 路径原先包含以下数据处理:

CausalConv1d
-> Slice Q/K/V
-> Q/K reshape
-> Q/K L2Norm
-> Cast
-> Concat/Pack
-> MegaChunkGdn(FP16)

这些独立算子增加了 kernel launch、GM 读写和 BF16/FP16 转换开销。

本 PR 对该路径进行两项优化:

  1. 新增通用 CausalConv1dQkv,直接产生 MegaChunkGdn 所需的 packed Q/K/V。
  2. MegaChunkGdn 增加完整 BF16 specialization。

优化后数据流

CausalConv1dQkv
  - CausalConv1d
  - SiLU
  - Q/K head-wise L2Norm
  - packed Q/K/V output
  - Conv cache update

-> MegaChunkGdn(FP16/BF16)

Conv cache 的更新语义保持不变。

CausalConv1dQkv

新增完整 ACLNN 自定义算子,包括:

  • 算子定义与 shape inference
  • Host tiling
  • Ascend C kernel
  • 构建注册
  • PyTorch 测试接口
  • 精度与性能测试

算子复用现有 CausalConv1d kernel,通过新增 activationMode=2 启用 packed-QKV 路径,不维护重复的 Conv 实现。

Kernel 内完成:

BF16 CausalConv1d
-> FP32 accumulate
-> SiLU
-> Q/K L2Norm
-> FP16/BF16 output conversion
-> packed Q/K/V writeback
-> in-place Conv cache update

Q/K 以 headDim=128 分 head 计算:

normalized = x / sqrt(sum(x * x) + 1e-6)

输出物理布局为:

[all-token Q][all-token K][all-token V]

后续可以直接构造 Q/K/V tensor view,减少 Slice、reshape、Cast、Concat 和 Pack。

通用 Tiling

新增动态属性:

qDim
kDim
vDim
headDim

Host tiling 根据以下信息动态规划 token/channel 切分:

  • 总通道数
  • Q/K/V 维度
  • headDim
  • UB 容量
  • AIV 核数
  • token block 数量

对于 Qwen3.5-27B TP2 的经典 shape:

Q = 1024
K = 1024
V = 3072
D = 5120

保留 QK/V 双块映射;其他 shape 使用按 UB 容量和 headDim 对齐的通用切分。

当前支持范围:

  • Qwen3.5 系列现有 headDim=128 模型
  • TP 1/2/4/8/16
  • chunk prefill
  • ragged/varlen sequence
  • BF16 输入
  • FP16 或 BF16 packed 输出
  • width=4
  • 无 bias

MegaChunkGdn BF16

原 MegaChunkGdn 在 Python 包装和 kernel 内部强制使用 FP16。本 PR 将计算 dtype 统一改为 DTYPE_Q

完成适配的阶段包括:

scaled_dot_kkt
triangular solve
wy_fast
chunk_h
chunk_o
transpose
workspace
final state

以下 tensor 支持 FP16/BF16:

  • Q/K/V
  • beta
  • minus identity
  • initial state
  • intermediate state
  • output
  • final state

G、mask 和必要的累加仍保持 FP32,避免降低关键计算精度。

Workspace 大小和地址偏移改为根据 sizeof(DTYPE_Q) 计算,不再隐含假设 FP16。

同步 flag 改为使用 PTO 上游同步框架提供的定义,以兼容动态 H/Hg 和 FFTS 同步机制。

测试

CausalConv1dQkv

覆盖:

  • Qwen3.5-0.8B、9B、27B、35B-A3B
  • TP 1/2/4/8/16
  • FP16/BF16 输出
  • 单序列和 B4 ragged
  • fresh/mixed initial state
  • 非连续 cache index
  • normal、small、wide、zero 数值分布
  • 最大 16384 × 10240 shape

结果:

通用矩阵:480/480 Pass
大 Shape:32/32 Pass
跨版本比较:512/512 bitwise equal
Conv cache:512/512 bitwise equal
NaN/Inf:0

ATK 融合算子标准结果:

7/7 Pass
执行失败:0

唯一严格 FP16 用例存在 0.0009765625 的差异,即 1 FP16 ULP;BF16 输入、BF16 输出以及 Conv cache 均满足准入标准。

MegaChunkGdn BF16

基础 ATK:

5/5 Pass

大 shape/stress:

12/12 Pass
H:1..64
Hg:1..64
最大序列:262145
最大 GQA ratio:64:1
最大 absolute difference:0.00390625

模型验证

Qwen3.5-27B TP2 MTP C-Eval 冒烟:

57/57 completed
Accuracy: 92.98%
API/runtime errors: 0
MTP acceptance rate: 70.39%

结果与历史同配置一致。

性能

CausalConv1dQkv 算子级 ATK:

Shape 基线 E2E 优化 E2E E2E 降幅 基线 Device 优化 Device Device 降幅
2048 × 10240 283.741 us 280.890 us 1.005% 277.005 us 272.991 us 1.449%
4096 × 10240 544.008 us 538.563 us 1.001% 536.747 us 531.185 us 1.036%

整分支 Qwen3.5-27B TP2 2048-token prefill 对比:

TTFT: 545.15 ms -> 501.75 ms
TTFT reduction: 7.96%

该结果是完整优化分支相对 xLLM main 的模型级结果,不能将全部收益单独归因于某一个 kernel。

变更范围

本 PR 仅包含 xllm_ops 侧修改:

  • CausalConv1d 通用框架扩展
  • CausalConv1dQkv ACLNN 算子
  • MegaChunkGdn BF16 specialization
  • PTO 同步框架适配
  • 构建注册
  • 算子测试

@Sinle4Cat
Sinle4Cat force-pushed the prefill_opt_conv1d_gdn branch from 38497ca to 26a0b26 Compare July 16, 2026 02:37
@Sinle4Cat
Sinle4Cat marked this pull request as draft July 16, 2026 02:53
@Sinle4Cat
Sinle4Cat force-pushed the prefill_opt_conv1d_gdn branch from 26a0b26 to 7b3191d Compare July 16, 2026 04:04
@Sinle4Cat
Sinle4Cat force-pushed the prefill_opt_conv1d_gdn branch from 7b3191d to d9ce99c Compare July 16, 2026 08:43
@Sinle4Cat
Sinle4Cat marked this pull request as ready for review July 18, 2026 01:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant