14 KiB
14 KiB
TL;DR
从整理的与 Qwen 模型相关的优化 commit 可以看出: 大部分优化点比较工程化(从常见的优化点方式出发:数据流优化、算子级优化、初始化、长上下文等等),哪里有钉子就哪锤头打哪,case by case 的优化某一模型在某一配置下存在的性能问题。
可以看出仍然缺乏系统层的「自动优化」与「动态调优」,所有优化均为静态配置与人工调参(如:手写 fused_moe 的 json 配置、硬编码 warp/block 尺寸),优化主要针对已知 GPU 拓扑的静态 tuning,缺少基于 runtime profiling 的动态优化层。
对比 DynamoLLM, NanoFlow, OrcaServe, AutoTP, MorphServe 已经探索了:自动并行拓扑搜索、异步调度重构与运行时自适应 FP8 策略
线上的 workflow 更接近于:测试性能有问题 -> 找到 bottleneck -> 解决问题
核心挑战:system 的经典问题,抽象的通用性与优化的定制性。 做抽象之后:系统一致,容易得到通用性优化,但是针对每一模型可能达不到最优性能 不做抽象:每个模型都能灵活的在任意组件上手动调优性能,但成本高、难以通用
对于 MoE 的优化:shared experts 计算与通信的重叠、kernel fuse
模型优化点总结
1. 并行化与数据流优化
| 优化点 | 适用模型 | Commit(s) | 优化说明 | 模型特性出发点 | 是否可以自动调优 |
|---|---|---|---|---|---|
| Vision Data-Parallel 编码器路径 | Qwen2-VL, Qwen3-VL | c98be0a23, 70b808fe1, 3127274d0 |
支持在视觉塔中关闭TP、改为DP运行 | 视觉编码器张量大、TP通信过重 | 是,本质为 parallelism config search |
| Sequence-Parallel MoE dispatch | Qwen3-Next, Qwen3-MoE | vllm/model_executor/models/qwen3_next.py:183, 3127274d0 |
令 tokens 在 TP rank 之间切分后再送 EP,防止重复专家调度 | DeepEP / TP×EP 并行导致重复计算 | 是,本质需要的是类似 DynamoLLM,根据 token 负载调整通信策略 |
| Shared Fused MoE 重叠优化 | Qwen3-Next | shared_fused_moe.py, vllm/model_executor/models/qwen3_next.py:161 |
避免重复计算共享专家,节省计算 | Shared expert 与 EP 重叠浪费算力 | 是,本质属于 DBO 搜索的一环 |
| Fused MoE 内部 all-reduce | Qwen3-MoE | 4f510bc2 |
将 all-reduce 内嵌进专家执行阶段 | TP>1 时额外一次 all-reduce 过慢 | 是,本质属于 DBO 搜索的一环 |
| 非阻塞数据流 + pinned buffer | Qwen3-VL, Qwen2.5-VL | b2155ed31, 2c1c7dfb3, 0426e3c5e, 67da5720d4, e283976f3 |
主机异步构建 seqlens 并异步拷贝到 GPU | 避免 cudaSync 阻塞,多帧视频管线更流畅 | 否,取决于 runtime benchmark 观测 H2D/D2H 延迟 |
| DeepEP 通信修正 (TP×EP) | Qwen3-Next, Qwen3-MoE | vllm/model_executor/models/qwen3_next.py:183, qwen3_moe.py:139,192 |
消除 EP 重复调度,避免多余 all-to-all | 多维并行模式中重复专家调用 | 是,本质属于 DBO 搜索的一环 |
2. 内核与算子级优化
| 优化点 | 适用模型 | Commit(s) | 优化说明 | 模型特性出发点 | 是否可以自动调优 |
|---|---|---|---|---|---|
| fast_pos_embed_interpolate 向量化 | Qwen3-VL | 30d08911f, af7dfb0d1, a6049be7 |
将 Python 循环替换为 meshgrid 张量操作 | 大图像/视频分辨率下插值耗时过高 | 否,过于 specific |
| Triton Interleaved MRoPE 核 | Qwen3-VL | cea91a32f, 3127274d0, c242c9803 |
用 Triton kernel 实现交织 3D RoPE | 视觉-时序交错嵌入需 GPU 融合旋转 | 否 |
| Fused RMSNorm 替代多次 norm | Qwen3 dense / MoE / Next | f80ae5bd, 82e64c7 |
RMSNorm 融合为单 kernel 以减少 launch | 长上下文下 norm 成为热点 | 是,类似 NanoFlow 等可以自动搜索进行算子融合 |
| O(n) inverse permutation | Qwen2.5-VL | 67da5720d4, e283976f3 |
取代 argsort 排序以降低 O(n log n) 复杂度 | 视觉窗口注意力频繁重排 | 否 |
| Bool-mask → index_select | Qwen3-Next | 785d8b6 |
改为纯 GPU 索引避免 host copy | MTP 多 token 预测频繁索引 | 否 |
| FP8 batched expert kernels | Qwen3-MoE | compressed_tensors_moe.py:937,991 |
自动选择 FP8 Cutlass / Triton 专家核 | MoE 中 expert 众多需 batched 执行 | 通用 |
| LayerNorm tile 化 与 SM cache | Qwen3-Next | 82e64c7 |
Triton LN 按行块 tile 计算 | 减少 kernel launch + 提升 占用率 | 通用 |
3. 精度与存储路径优化(FP8 / 量化 / KV Cache)
| 优化点 | 适用模型 | Commit(s) | 优化说明 | 模型特性出发点 | 是否可以自动调优 |
|---|---|---|---|---|---|
| FP8 KV-Cache 存储 | Qwen2 | da971ec7 |
允许 FP8 缓存 KV 对 | 长上下文 KV 占显存大 | 是 |
| FP8 KV-Scale 重映射 | Qwen2 MoE | bd4397352 |
修正 FP8 缓存比例 加载 | 防止量化漂移 | 是 |
| 分离 QKVZ / BA 投影 | Qwen3-Next | ef7eefe1 (2025-09-18) |
拆分 in-proj 以支持 FP8 checkpoint | FP8 blockwise 加载需结构匹配 | 否 |
| FP8 精度 guard 修正 | Qwen3-MoE | a258ad8b |
调整量化 scale 计算 | FP8 精度漂移 | 工程实践 |
| 4-bit bnb 预量化加载 | Qwen3-MoE | bitsandbytes_loader.py:467 |
支持 4bit BNB 权重 | 降低权重存储带宽 | trivial |
| FP8 / Fused MoE 配置矩阵 | Qwen3-Next, Qwen3-MoE | 238c4c17, 482e52f56, 75334956c, 9f04d9d55, 12a8414d8, f82f7a899, 7a70a7189, 569bf1c9c, c733bd5e8 |
针对 GB200 / H200 / H100 等 GPU 提供 FP8 调参 json | 不同 GPU SM 结构 差异大需 warp/block 适配 | 离线 profile 进行调优 |
| ROCm FP8 配置 (MI300X) | Qwen3 / MoE | 2007d4d5, f5a3c655 |
ROCm 专用 Triton 块 配置 | 兼容 AMD 栈 | 工程实践 |
4. 初始化与加载
| 优化点 | 适用模型 | Commit(s) | 优化说明 | 模型特性出发点 | 是否可以自动调优 |
|---|---|---|---|---|---|
| Max-token heuristics | Qwen2/2.5-VL | 2c5302fad |
通过启发式计算最大 token 代替伪输入 | 启动时避免生成假图像 | 否 |
| Cached profiling inputs + fast HF processor | Qwen2-VL | 1298c677, d49adea1 |
缓存启动探测 数据 以减少 初始化 | 模型启动耗时高 | trivial |
| Rotary dispatch abstraction (CUDA/ROCm) | Qwen series | 5e4a8223c |
动态选择后端 FlashAttn kernel | 兼容 ROCm 与 CUDA 堆栈 | 工程实践 |
5. 推理路径与长上下文优化
| 优化点 | 适用模型 | Commit(s) | 优化说明 | 模型特性出发点 | 是否可以自动调优 |
|---|---|---|---|---|---|
| Dual-chunk attention | Qwen3 dense | qwen3.py:118,199 |
支持 >128K 上下文 分块 KV | 长上下文 KV 膨胀 | 是,根据负载在线自动决定是否切分 |
| Gated DeltaNet linear attention | Qwen3-Next | vllm/model_executor/models/qwen3_next.py:206, 1266, 1292 |
融合 conv + recurrent 层 线性化 attention | Prefill 阶段 计算 O(n²) 太高 | 否,需要结合模型调优选择合适的算法 |
| Mamba-style state cache | Qwen3-Next | 1218, vllm/model_executor/layers/mamba/abstract.py:50 |
状态缓存 高效 布局 + 允许 speculative decode | GDN/Mamba 混合 需要 状态 重用 | 否 |
| Multi-Token Prediction (MTP) | Qwen3-Next | 785d8b6 (相关 MTP 路径) |
重用 decoder 层 用于草稿 token 预测 | 提升 spec decode 吞吐 | 是,根据 metrics 自动决定 MTP 深度 |
| Speculative metadata 构建 | Qwen3-Next | gdn_attn.py:22,61 gpu_model_runner.py:1374 |
预建 元数据 避免 draft 接受 重算 | 减少 prefill 延迟 | 工程实践 |
6. 多模态视觉流水线优化
| 优化点 | 适用模型 | Commit(s) | 优化说明 | 模型特性出发点 | 是否可以自动调优 |
|---|---|---|---|---|---|
| reshape 替代 concat 拼接 | Qwen3-VL, Qwen2.5-VL | 0426e3c5, 2c1c7dfb |
减少内存重新分配 | 图像批次拼接昂贵 | 是,图优化 |
| 缓存 vision dims 与 deepstack 拆分 | Qwen3-VL | 1dfea5f4 |
避免重复 .contiguous() 与 维度计算 | 多尺度视觉特征 频繁分块 | 是,runtime shape memory |
| Flash / xFormers / SDPA 适配 | Qwen2.5-VL / Qwen3-VL | 02ed8a1fb, 70b808fe1, 47c712621, c242c9803 |
统一不同 attention 后端 | 不同 GPU 和 视频 长度 需求 | 工程实践 |
| Rotary window pipeline GPU 重写 | Qwen2.5-VL | 67da5720d4, e283976f3 |
预建 窗口 索引,减少 cudaMemcpy | 重复 CPU→GPU 拷贝 | 否 |
| Memoized seqlens 缓存 | Qwen2-VL / Qwen3-VL | 70b808fe1, 3127274d0 |
重用序列长度 元数据 | 视频帧结构 重复 计算多 | 工程实践 |
总结视图(跨类对照)
| 优化类别 | 代表模型 | 核心收益 | 代表 Commits |
|---|---|---|---|
| 并行化与数据流 | Qwen3-VL / Qwen3-Next / Qwen3-MoE | 异步、少通信、高并发 | b2155ed31, 0426e3c5e, 3127274d0 |
| 内核与算子 | Qwen3-VL / Qwen3-Next / Qwen2.5-VL | GPU 融合计算 | 30d08911f, cea91a32f, 82e64c7 |
| 精度与存储 | Qwen2 / Qwen3-MoE / Next | FP8 高效推理 | da971ec7, bd4397352, ef7eefe1, 238c4c17 |
| 初始化加载 | Qwen2-VL / 全系 | 快速启动 / 多后端 | 2c5302fad, 5e4a8223c |
| 推理优化 | Qwen3-Next / dense | 线性化注意力、Spec Decode 加速 | 785d8b6, 1266, 1374 |
| 视觉流水线 | Qwen2.5-VL / 3-VL | GPU 端视频处理 吞吐 | 0426e3c5, 67da5720d4, 1dfea5f4 |
| 跨平台 | Qwen3-Next / 全系 | ROCm / Blackwell 兼容 | qwen3_next.py:306 |