Files
obsidian/projects/auto-tuner/ali-optimization.md

96 lines
14 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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` |