96 lines
14 KiB
Markdown
96 lines
14 KiB
Markdown
## 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 搜索的一环<br> |
|
||
| 非阻塞数据流 + 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` |
|