AI Infra Daily Radar
导言
这篇文章记录 AI infra、post-training 和 multimodal serving 方向的每日 PR / issue 雷达。每轮只深入少量 P0/P1 项:优先性能、多模态、调度、attention、padding、KV cache、MTP、NPU / Ascend 相关变化。
2026-07-04¶
扫描范围¶
- 窗口:2026-07-03T02:11:27Z 至 2026-07-04T02:14Z,按上轮自动化时间回看约 24 小时。
- 仓库:
verl-project/verl、verl-project/verl-omni、vllm-project/vllm、vllm-project/vllm-omni、THUDM/slime、ByteDance-Seed/VeOmni。 - Release:verl-omni v0.1.0 在 2026-07-03 发布,是 dedicated multimodal generative RL training 仓库的首个 final release;其余种子仓库本窗口内没有新的正式 release。
- 深入上限:本轮深入 5 个 P0/P1 项;
verl#6901按首次种子任务复核状态和 NPU 风险,不重复展开完整机制。
P0 / P1¶
| 优先级 | 项目 | 状态 | NPU 分级 | 结论 |
|---|---|---|---|---|
| P0 | vllm-omni#4865 Qwen3-Omni Talker code_predictor NPU optimization | open | M | 直接优化 Qwen3-Omni Talker NPU 推理热路径,把 code_predictor attention 改为 npu_fused_infer_attention_score,并用 masked_fill 替换 Top-P sampling 的 Tensor[mask] 写法;作者自报并发 1/4/10 下 E2EL 约降 25%-29%。 |
| P0 | vllm-omni#4868 VACE reference-hint cache | open | M | 为 Wan-VACE 加入 opt-in vace_hint diffusion cache backend,在部分 denoising step 复用 reference hint,跳过 vace_blocks recompute;Wan2.1-VACE-1.3B GPU 集成自报 17.04s -> 12.83s,代价是约 9% mean pixel diff。 |
| P1 | vllm#47576 ReplaySSM for Mamba2 + GDN | open draft | L | 大型 kernel / cache 体系改动:缓存 SSM 输入而不是每步回写 recurrent state,覆盖 Mamba2 与 Qwen3.5 GDN 标准 decode / speculative decode;B300 大 batch 下自报 native spec 对比最高约 2.45x。 |
| P1 | vllm#47583 incremental prompt encoding | open | S | API server CPU / TTFT 优化:多轮对话中复用上一轮 prompt tokenization 的严格前缀,长上下文 encode p50 自报 22x-71.5x,DeepSeek-V4-Flash 生产 TTFT 0.92s -> 0.47s。 |
| P1 | verl#6929 vLLM 0.18 Ascend fully_async patch | open | S | 仅修改 verl/utils/vllm/npu_vllm_patch.py 2 行,把 RotaryEmbedding disable flash attention 的版本门槛从 >=0.19.0 下探到 >=0.18.0;适合等待上游合入后进入 Ascend fully_async 回归。 |
| P1 | verl-omni v0.1.0 final release | released | S/M | 首个 final release,集中发布 Qwen-Image、SD3.5、Wan2.2、BAGEL、Qwen3-Omni GSPO 等 multimodal generative RL recipes,并明确扩展 Ascend NPU recipe 覆盖。 |
重点机制¶
vllm-omni#4865 是本轮最直接的 NPU 多模态性能项。改动文件只有 vllm_omni/model_executor/models/common/qwen3_code_predictor.py,核心是把 Qwen3-Omni Talker code_predictor Attention forward 中的 npu_fusion_attention 替换为 vLLM NPU 路径启发的 npu_fused_infer_attention_score,并把 Top-P sampling 中低效的 Tensor[mask] 写法换成 masked_fill。作者在 vLLM 0.22.1、vLLM-Ascend 0.22.1rc1、vLLM-Omni commit 963ba1a 上做功能和性能验证,三组并发自报:
| 并发 | E2EL 变化 | Audio throughput | AUDIO_TTFP | AUDIO_RTF |
|---|---|---|---|---|
| 1 | 约 -25.68% | 约 +27.05% | 约 -11.35% | 约 -21.58% |
| 4 | 约 -29.02% | 约 +23.49% | 约 -12.66% | 约 -20.77% |
| 10 | 约 -27.44% | 约 +30.93% | 约 -25.57% | 约 -26.69% |
NPU 分级为 M:它已经是 NPU 目标路径,但依赖 torch_npu / vLLM-Ascend attention API、stage 1/2 enforce_eager 配置和 Qwen3-Omni Talker 的音频质量验证。自动适配不启动,原因是上游 PR 已在 vLLM-Omni 内实现,当前更需要复现实验:固定请求集、比较文本与音频输出、采集 E2EL / audio RTF / NPU profiler,并确认 npu_fused_infer_attention_score 的 mask、layout、dtype 与现有路径完全等价。
vllm-omni#4868 把 video diffusion 的缓存问题推进到模型结构层。它新增 vace_hint cache backend,在 Wan-VACE 这类 reference-conditioned 模型里缓存 vace_blocks 生成的 reference hints;每个 CFG branch 独立建 key,refresh step 重新计算并写 cache,reuse step 直接返回 cached hints。相关文件包括 vllm_omni/diffusion/cache/vace_hint_cache/、cache/selector.py、diffusion/data.py 和 wan2_2_vace_transformer.py。作者验证 cache_backend="vace_hint"、vace_hint_refresh_interval=8 时,Wan2.1-VACE-1.3B 真实 Omni runtime 从 17.04s 降到 12.83s,约 25% faster;同时明确这是 lossy cache,约 9% mean pixel diff,默认关闭。
NPU 分级为 M:cache state 和 selector 是 Python 逻辑,但真实价值取决于 Ascend 上 Wan-VACE vace_blocks 的耗时占比、CFG 分支调度、cache tensor 生命周期和图像质量门槛。验证时必须同时记录 wall time、denoise step latency、显存峰值、输出质量指标和跨 CFG branch 是否串 cache;TP/SP/CFG-parallel 尚未验证,所以不适合自动提交适配 PR。
vllm#47576 是机制价值很高但迁移风险很大的 ReplaySSM draft PR。它的核心判断是 SSM decode 受 HBM state load/store 限制:baseline 每步读写完整 recurrent state,而 ReplaySSM 保存周期性 checkpoint state 和最近输入 ring buffer,多数 step 只 append 输入,不回写完整 state;speculative decode 中 rollback 退化为 ring cursor 移动。PR 新增 Mamba2 和 GDN 两套 Triton kernel、metadata builder、paged cache 扩展、config flag 和测试矩阵,涉及 30+ 文件。
性能证据很强,但硬件绑定也很强:标准 decode whole-model per-step speedup 在大 batch 更明显;spec decode 在 B300、batch 256/512 下相对 native spec 自报约 1.8x-2.45x,并把 Mamba2 / GDN max decode concurrency 提高约 3x。NPU 分级为 L,原因是它依赖 Triton/CUDA graph/paged cache/SSM kernel 深度重写;Ascend 只能先跟踪机制,把它转化为未来 GDN / Mamba2 NPU kernel 设计问题,不自动适配。
vllm#47583 是长上下文多轮 serving 的 CPU 侧优化。它新增 vllm/tokenizers/incremental_encode.py,在 BaseRenderer._tokenize_prompt 之上增加 opt-in incremental encoding cache:若新 prompt 是旧 prompt 的严格字符串前缀扩展,就从安全 token boundary 处重编码尾部,并校验 overlap token ids / offsets;无法证明正确时回退 full encode。默认关闭,HF fast tokenizer 限定,mistral / deepseek_v32 / harmony renderer 不受影响。
这个 PR 对 NPU 是 S 级可复用思路:它完全发生在 API server CPU 和 tokenizer 层,不触碰 device kernel。适用场景是 agentic coding、长聊天、多轮上下文不断追加;限制是需要严格 token-exact、特殊 token seam、normalizer 和 truncation 语义都不能出错。若本地 serving 前端使用 Python renderer,可单独做小规模 tokenizer 回归;若走 Rust frontend 或其他 gateway,则只作为机制参考。
verl#6929 是很小的 Ascend 兼容修复。它只改 verl/utils/vllm/npu_vllm_patch.py,把 vLLM NPU RotaryEmbedding flash attention disable patch 的生效范围扩到 vLLM >=0.18.0 && <0.19.0。PR 描述不完整,未给实验命令;它引用已合入的 verl#6886,更像对 vLLM 0.18 版本段的补丁。NPU 分级 S,但本轮不自动开 PR,因为上游已有 open PR,且需要等 review 判断 6928 / 6929 两个同题 PR 哪个保留。
6901 状态复核¶
verl#6901 仍为 merged,merge commit 561a4b03a11b34446e44267c2e84c4bbf63585f5;本轮重新核验 changed files 仍是 verl/models/mcore/model_forward.py、verl/models/mcore/util.py、verl/trainer/config/_generated_ppo_megatron_trainer.yaml、verl/trainer/config/engine/megatron.yaml、verl/workers/config/engine.py、verl/workers/engine/megatron/transformer_impl.py。最终合入版本把 pad_bshd_to_minibatch_max 默认设为 True,但只有 use_remove_padding=False 的 BSHD path 真正生效。
PR body 的性能证据仍是 Qwen3.5-35B-A3B 15 step 均值:Total Step Time 534.13s -> 397.71s,Old Log Prob 78.38s -> 35.45s,Actor Update 247.58s -> 154.50s。机制仍是把一个 mini-batch 内所有 micro-batch padding 到 global max s_q,减少 cuDNN / TransformerEngine fused-attention Graph Build / plan build 次数。
6901 仍不自动适配
代码迁移量接近 S,但性能收益依赖 CUDA / cuDNN / TransformerEngine 的 plan cache 行为;Ascend/NPU 上是否有同类收益未证实。.max() 空 tensor 风险仍需要覆盖:mini-batch global max、preprocess_bshd_engine、build_vlm_attn_mask_bshd 都可能在空 batch / 空 rank 下触发运行时错误。
本轮结论维持 M 级适配项:代码层面是通用 BSHD shape / padding 传递,NPU BSHD 路径会经过这段逻辑;但决定收益的 attention plan build 机制不能从 CUDA/cuDNN 直接外推到 Ascend。它可以作为 BSHD fallback 的受控开关保留,但不应在 NPU 实验中无验证默认启用;优先路线仍是 THD / remove-padding 或 NPU 原生变长路径。验证清单仍是 pad_bshd_to_minibatch_max=True/False A/B、空 batch、VLM BSHD、MTP label / loss_mask、TP / CP / FP8 alignment、HBM peak、AI Core 利用率、host CPU 和长尾极长样本 OOM 风险。
简表¶
| 优先级 | 项目 | 状态 | 备注 |
|---|---|---|---|
| P0 | vllm#47588 Quark MXFP4 EPLB silent accuracy corruption | open | AITER_MXFP4_FP8 setup path 中 converted expert weights 被 plain attribute assignment 恢复后不再出现在 named_parameters(),EPLB 可能只移动 scale 而没有移动匹配 weight,导致静默输出退化。NPU 分级 L:CUDA/ROCm Quark MXFP4 路径为主,但“expert rebalance 必须移动同一物理 tensor 集合”的约束对 NPU MoE 也有借鉴价值。 |
| P1 | vllm-omni#4863 AR-Diffusion paged self-attention | open | DreamZero AR-Diffusion 不再 gather 历史 KV,而是把 resident video KV 放进 paged KV pool,用 FlashAttention block-table 直接读;默认 window=9 单 TP1 total 120.975s -> 116.770s。NPU 分级 L:依赖 block-table attention backend。 |
| P1 | vllm#47580 dense H2D fused-MoE weight loading | open | 把 transposed expert weights 的 strided side 翻到 GPU destination,避免 non-contiguous CPU fp8 gather;A100 24-layer truncation 自报 loading 18.8s -> 12.5s。NPU 分级 M:理念可参考,但实现绑定 ATen H2D / vLLM fused-MoE loader。 |
| P1 | vllm#47268 Marlin int4-fp8 HBM coalescing | open | marlin_int4_fp8_preprocess_kernel_awq 把 thread 映射从跨行 stride 访问改为列向连续访问,冷路径 kernel 自报 1291.1us -> 581.9us。NPU 分级 L:CUDA quant kernel 访问模式参考。 |
| P1 | vllm-omni#4858 FlashAttention 4 diffusion backend | open draft | Blackwell SM100/SM103 BF16 diffusion attention backend;Cosmos3-Nano 189-frame denoise step 自报 1.04x-1.08x,FP8 后续依赖 flash-attn 上游修复。NPU 分级 L:只跟踪后端机制。 |
| P1 | VeOmni#879 Qwen3.5 GDN NPU backend | open draft | Ascend 上 Qwen3.5/MoE varlen 训练关键补洞:为 causal_conv1d、chunk_gated_delta_rule 接 NPU backend;下一轮重点看 vendored Ascend Triton kernel 来源、license、复现性。 |
| P1 | vllm#47584 DSpark rowwise-fp8 draft lm_head | open | opt-in VLLM_DSPARK_FP8_DRAFT_HEAD=1,只在 draft proposal 使用 fp8 head;GB10 自报 draft-head GEMM 2.73ms -> 1.45ms,E2E +3%-5%。NPU 分级 L/M:取决于 Ascend 是否有等价 fp8 scaled matmul。 |
| P1 | vllm#47577 FLASHINFER_B12X NVFP4 MoE backend | open | SM120 / FlashInfer / NVFP4 MoE 自动选择,明确拒绝 EP deployment;CUDA 特定,NPU 只跟踪 MoE backend 选择策略。 |
| P1 | vllm#47546 Qwen Triton warmup coverage | open | 扩展 Qwen Triton kernel warmup 覆盖,与昨日 JIT warmup / shape transition 主题同线;NPU 关注 cold shape / warmup coverage 方法。 |
| P1 | vllm#47542 DCP + split-q speculative decoding | open | DCP / speculative decoding attention 路径,强 GPU attention backend 依赖。 |
| P1 | vllm#47541 SWA hybrid + FlashInfer MLA + DCP | open | hybrid attention + DCP 方向,先跟踪机制。 |
| P1 | vllm#47540 persistent penalty statistics | open | V1 sampler 避免每 step CPU rebuild penalty statistics,CPU-side serving perf。 |
| P1 | vllm#47556 sliding-window prefix-cache miss scan | open | prefix cache / sliding window 扫描优化,值得和 incremental encoding 一起看前端/缓存瓶颈。 |
| P1 | ByteDance-Seed/VeOmni#883 Ascend causal_conv1d fla kernel error | open issue | 用户在 Ascend、verl 0.8.0、veomni 0.1.11、Qwen3.5-9B sp=4 下报 Kernel 'fla' for op='causal_conv1d' requires device_type='gpu';与 GDN NPU backend 选择直接相关,下一轮跟踪。 |
| P1 | vllm-omni#4851 Qwen3 TTS no_async_chunk CI failure | open issue | high priority CI failure;Qwen3-TTS Base 输出转写与输入几乎无关,CustomVoice 为空音频,HTTP path 仍报 success。优先定位 serving_speech.py、stream=False/no_async_chunk 和 Whisper CPU fallback。 |
| P2 | vllm#47566 normalize direct PIL image inputs | merged | 多模态输入稳定性修复,已合入但非性能主线。 |
| P2 | vllm-omni#4859 Ming-TTS WER accuracy | merged | TTS accuracy 修复,进入背景跟踪。 |
| P2 | VeOmni#885 supported NPU hardware docs | merged | 文档项,记录支持矩阵但不深入。 |
验证清单¶
- Qwen3-Omni Talker NPU:复现 vLLM-Omni#4865 的并发 1/4/10 benchmark,额外采集 NPU profiler、attention op 耗时、audio RTF、文本输出一致性和音频主观/客观质量。
- VACE reference-hint cache:在 Wan-VACE 上比较
cache_backend=none/vace_hint、不同vace_hint_refresh_interval的 latency、显存、mean pixel diff、SSIM / DINOv2 或项目质量门槛;CFG branch 不得串 cache。 - ReplaySSM 跟踪:暂不迁移;先拆出 Mamba2/GDN state traffic、ring buffer、flush、spec rollback、paged cache 五个设计点,观察是否有 Ascend Triton / torch_npu 等价实现空间。
- Incremental encoding:本地 tokenizer 层可做 S 级小验证,覆盖 Qwen / DeepSeek fast tokenizer、特殊 token、CJK、长对话、并发 LRU、truncation fallback。
- verl#6929:等上游判断 6928/6929 后,在 Ascend fully_async 回归中覆盖 vLLM 0.18.x、0.19.x、RotaryEmbedding flash attention disable、FusedMoE weight loader 和 rollout 启动。
- verl#6901:继续执行 BSHD NPU A/B,重点看空 batch
.max()、额外 padding 的 HBM / mask 成本和 old_log_prob / actor_update 是否真的改善。
参考链接¶
- vllm-omni#4865
- vllm-omni#4868
- vllm#47576
- vllm#47583
- verl#6929
- verl-omni v0.1.0
- verl#6901
- vllm-omni#4863
- vllm#47580
- vllm#47268
- vllm-omni#4858
- VeOmni#879
- vllm#47584
- vllm#47588
- vllm-omni#4851
- VeOmni#883
2026-07-03¶
扫描范围¶
- 窗口:2026-07-02T02:12:20Z 至 2026-07-03T02:13Z,约等于上轮之后的 24 小时。
- 仓库:
verl-project/verl、verl-project/verl-omni、vllm-project/vllm、vllm-project/vllm-omni、THUDM/slime、ByteDance-Seed/VeOmni。 - Release:本窗口内种子仓库没有新的正式 release;最近 release 仍是
vllm v0.24.0、vllm-omni v0.24.0rc1、verl v0.8.0。 - 深入上限:本轮深入 5 个 P0/P1 项;
verl#6901只做状态复核,因为昨日文档已经记录完整机制和 NPU 边界。
P0 / P1¶
| 优先级 | 项目 | 状态 | NPU 分级 | 结论 |
|---|---|---|---|---|
| P0 | vllm-omni#4344 HunyuanImage3 MoE EP+SP NPU mapping | merged, 2026-07-02 | M | 已合入;把 diffusion TP/SP/CFG/DP 映射到 vLLM MoE TP/PCP/DP/EP,修复 HunyuanImage3 DiT NPU fused MoE 在 EP+SP 下的 token dispatch / expert placement 不一致。 |
| P0 | vllm-omni#4841 Qwen3-TTS 310P optimization | open | M | 310P 专用 patch,覆盖 Talker / CodePredictor / Code2Wav:CPU Mimi encoder、FRACTAL layout 预打包、fused RMSNorm / RoPE / attention mask、vLLM-Ascend sampling helper。 |
| P0 | VeOmni#879 Qwen3.5 GDN NPU backend | open draft | L | 为 Qwen3.5 gated delta-rule 的 causal_conv1d 和 chunk_gated_delta_rule 增加 NPU backend,vendor MindSpeed-MM / FLA Ascend Triton kernels;直接相关但属于 kernel 级引入。 |
| P1 | VeOmni#880 Qwen3 residual-add + RMSNorm fusion | open | M | 在 Qwen3 decoder layer 内把 post-attention residual add 和 RMSNorm 合成 OpSlot("rms_norm", "residual_add"),GPU 用 Liger,NPU 用 npu_rms_norm wrapper。H100 侧自报 compute kernel time 约 3.5% 改善。 |
| P1 | verl#6923 Qwen3 MoE FSDP weight sync for vLLM rollout | merged, 2026-07-03 | S | 已合入 release/v0.8.0 backport;把 Transformers 5 packed 3D MoE expert weights 展开成 vLLM reload 需要的 per-expert gate_proj/up_proj/down_proj keys,修 live FSDP-to-vLLM rollout weight sync。 |
| P1 | vllm#47451 shared JIT warmup infra | open | L | 为 Triton / CuTeDSL / TileLang 等 JIT kernel 定义 compile-key warmup contract,目标是让 kernel owner 暴露真实 specialization key,而不是用 dummy inputs 猜测 warmup 覆盖。 |
| P1 | vllm#47458 shape transition stall | open issue | L | Qwen3.6 NVFP4 + flashinfer_b12x + GDN CuteDSL prefill 在大上下文切小请求时出现约 17.5s engine-wide stall;与 JIT / shape cache / worker 顺序重编译高度相关。 |
重点机制¶
vllm-omni#4344 是本轮最明确的已合入 NPU 多模态修复。HunyuanImage3 是 diffusion MoE,vLLM-Omni 自己有 TP/SP/CFG/DP,而 vLLM FusedMoE 期望用 TP/PCP/DP 表达 expert placement。旧路径没有稳定地把 diffusion SP/CFG 映射进 vLLM MoE 语义,导致本地 expert placement 与 token dispatch 不一致,出现 shape '[8, 16]' is invalid for input of size 64 一类 runtime failure。新逻辑只在 is_moe && enable_expert_parallel 下启用映射:
diffusion TP -> vLLM TP
diffusion SP -> vLLM PCP
diffusion CFG * DP -> vLLM DP
EP = TP * SP * CFG * DP
PR 自报在 8 NPU、HunyuanImage3 DiT-only offline serving 上验证了 TP4 + SP2:EP enabled 时 denoise_step_latency_ms=239.397,EP disabled 时 188.118。这不是单纯性能 PR;它先把 NPU diffusion MoE 的并行语义接到 vLLM FusedMoE 的 EP 公式,后续才有稳定优化空间。
vllm-omni#4841 是 310P 上 Qwen3-TTS 的平台专用优化。它没有改通用模型实现,而是在 vllm_omni/platforms/npu/_310p/patch/qwen3_tts.py 下把 Talker / CodePredictor / Code2Wav 的热点换成 310P 友好路径:Linear / Conv 权重预转 FRACTAL layout,RMSNorm、RoPE、attention mask、attention path 走 fused 或 layout-aware NPU op,CodePredictor codec embedding 预投影,并把 sampling 对齐到 vLLM-Ascend helper。风险是它依赖 CANN 9.1.0 beta、vLLM 0.24.0 和 vLLM-Ascend PR 11227;适配时应优先复现作者的 20 request 平均延迟和 seed-tts-eval zh 精度,而不是直接推广到 A2/A3 或其他 TTS 模型。
VeOmni#879 和昨日的 verl#6907/#6908 属于同一类 Qwen3.5 Gated Delta Net NPU kernel 化方向。VeOmni#879 更像框架内正式 backend:通过 OpSlot / KERNEL_REGISTRY 注册 name="npu",给 causal_conv1d 和 chunk_gated_delta_rule 补齐 NPU backend;rms_norm_gated 之前已经有 NPU backend。它声明 NPU e2e Qwen3.5-MoE VL SFT loss / accuracy 对齐 reference,并加了可在无硬件机器跑的 hardware-gate unit tests。NPU 分级仍是 L,原因不是接入点复杂,而是 vendor Triton kernel 需要覆盖 dtype、varlen、反向、长序列、torch_npu / triton-ascend 版本矩阵。
VeOmni#880 是更适合拆成 M 级小验证的 fused op。它把 Qwen3 post_attention_layernorm(residual + hidden_states) 折成 fused residual-add + RMSNorm。GPU 侧用 LigerFusedAddRMSNormFunction,NPU 侧用 lazy torch_npu wrapper;选择仍复用 model.ops_implementation.rms_norm_implementation。作者报告 H100 FSDP2 侧 fused 与 eager loss / grad_norm 约 1e-5 对齐,compute kernel time 1310.7ms vs 1357.6ms,kernel launches 少约 2760。NPU 需要补真实数值 parity 和 profiler;如果 npu_rms_norm wrapper 已稳定,工作量主要是 shape / dtype / in-place 语义验证。
verl#6923 处理的是训练与 rollout serving 的权重格式边界。Transformers 5 会把 Qwen-style MoE expert weights 存成 packed 3D mlp.experts.gate_up_proj / down_proj,但 vLLM 的 Qwen3 MoE reload path 仍期待 per-expert checkpoint keys。PR 在 FSDP parameter streaming 时展开为 mlp.experts.{expert_id}.gate_proj/up_proj/down_proj。这类改动对 Ascend/NPU 本身没有 kernel 依赖,但对 fully_async / colocated rollout / Qwen3 MoE 训练稳定性很关键,适合纳入 S 级回归。
vLLM#47451 / #47458 是同一类 shape / JIT 风险的两面。47451 新增 vllm/model_executor/warmup/jit_warmup.py、jit_warmup_triton_helper.py,并重构 sparse MLA / FA4 CuTeDSL warmup,让每个 warmable kernel 声明 frozen CompileKey、dispatch(...)、get_warmup_keys(...) 和 compile(key)。47458 则给出用户侧症状:nvidia/Qwen3.6-35B-A3B-NVFP4 在若干 20K-150K token prefill 后切到 60-120 token 小请求 burst,会让 EngineCore 全局停顿约 17.5s;perf 采样显示 EngineCore idle,而 PP worker 进程顺序 CPU churn。对 NPU serving 的直接启发是:压测不能只测 steady-state tokens/s,还要测 cold shape、warmup 覆盖、cache eviction 和跨 worker shape transition。
6901 状态复核¶
verl#6901 当前仍为 merged,merge commit 561a4b03a11b34446e44267c2e84c4bbf63585f5,changed files 仍是 model_forward.py、util.py、Megatron engine/config 等 6 个文件。最终合入版本把 pad_bshd_to_minibatch_max 默认设为 True,但只在 use_remove_padding=False 的 BSHD path 生效。PR body 中的机制和性能证据未变:Qwen3.5-35B-A3B 上 Total Step Time 534.13s -> 397.71s,Old Log Prob 78.38s -> 35.45s,Actor Update 247.58s -> 154.50s。
6901 空 batch 仍需补测
本轮复核确认合入版本仍保留 input_ids.offsets().diff().max()、seqlens_in_batch.max() 这类空 tensor 风险点。动态 batching、DP rank 空输入、VLM BSHD 和 MTP label / loss_mask 路径都需要覆盖;没有 NPU 编译缓存收益证据前,不应因为上游默认 True 就在 Ascend 实验配置中无条件继承。
简表¶
| 优先级 | 项目 | 状态 | 备注 |
|---|---|---|---|
| P0 | vllm-omni#4849 HunyuanImage3 bridge request batching | open | 修 #4079 后 request-level batching 与 HunyuanImage3 AR->diffusion bridge 的契约冲突;作者已在 vLLM / vllm-ascend 0.23.0 NPU 栈和 #4344 backport 上验证 MoE EP+SP inference,通过下一轮优先深入。 |
| P0 | vllm#47181 DCP + FlashInfer MLA follow-ups | open, needs-rebase | Decode Context Parallel 核心 attention/parallel serving 路径,覆盖 Spec Decode/MTP、SWA hybrid、TRTLLM GQA decode、routed experts replay、NaN guard 和 GPU seq_lens;强 NVIDIA/FlashInfer 依赖,NPU 先跟踪机制。 |
| P0 | verl#6907 Qwen3.5 NPU Triton GDN kernels | closed, unmerged | 有完整 NPU forward/backward 验证记录,但无 merge commit;可能被 #6908 或后续 PR 替代,继续跟踪。 |
| P0 | verl#6908 Qwen3.5 Triton GDN patch | closed, unmerged draft | 同属 GDN 方向,但 PR 明确写 Needs NPU validation;不当作已合入特性。 |
| P1 | vllm-omni#4714 HunyuanImage3 MXFP8/MXFP4 online quant on Ascend | open | 为 HunyuanImage3 AR inference 增加 Ascend NPU W8A8 MXFP8 / MXFP4 在线量化;1K input、BS=32 自报 TTFT BF16 1440ms -> MXFP8 1380ms / MXFP4 1359ms。 |
| P1 | vllm-omni#4848 NPU upgrade to v0.24.0 | open | 更新 vllm-ascend CI image、NPU quickstart 和 runner interface;Qwen3-TTS、Qwen3-Omni、Wan2.2 I2V 三组 NPU 测试通过。 |
| P1 | vllm#47463 fused_topk_bias for DSv4 | open | 小改动,去掉 hash_indices_table is None 时冗余 dtype cast;属于 DeepSeek V4 perf tracker 子项。 |
| P1 | vllm#47474 cache token_to_req_indices for DSv4 |
open | 减少 Sparse MLA / SWA / Compressor 重复构建 mapping 和 CPU->GPU copy,微基准报 5x-6x kernel performance improvement。 |
| P1 | vllm#47443 HPC Attention split-K by shape | open | Decode path 按 (max_decode_seq_len, num_decode_tokens, num_heads, num_kv_heads) 选择 split-K;强 H20 / SM90 / HPC backend 绑定。 |
| P1 | vllm#47391 padded EAGLE input prep | open | Spec Decode perf;优化 padded EAGLE input prep 和 EAGLE3 layer0 RMSNorm concat,偏 serving 热路径。 |
| P1 | VeOmni#881 FSDP2 torch compile | open | 训练框架性能/编译方向,需等机制和验证证据更完整。 |
| P1 | verl-omni#231 MMK12 Qwen3-Omni GSPO on NPU | open draft | 多模态 NPU recipe,偏训练验证入口。 |
| P1 | verl-omni#225 Ascend NPU Dockerfiles | open | 环境/安装文档,对可复现验证有价值但非算法性能项。 |
| P1 | THUDM/slime#2146 shard-level weight update | open | 与昨日 slime#2147 RFC 同线,关注 non-colocate weight sync 的 shard-level P2P 与 fallback。 |
| P2 | vllm#47450 structured output crash fix | open | 稳定性修复,低于性能/多模态主线。 |
验证清单¶
- HunyuanImage3 EP+SP:用 8 NPU 复现 TP4+SP2+EP enabled / disabled,核对 vLLM TP/PCP/DP/EP group、MC2 state、token dispatch shape、生成图像正确性和 denoise latency。
- Qwen3-TTS 310P:锁定 CANN 9.1.0 beta、vLLM 0.24.0、vLLM-Ascend PR 11227,复现 20 request 平均延迟和 seed-tts-eval zh 精度;再尝试 A2/A3 前必须先拆平台差异。
- Qwen3.5 GDN NPU kernel:覆盖 varlen dyn_bsz、Dense/MoE、forward/backward parity、长序列、异常 shape、bf16/fp16、torch_npu / triton-ascend 版本矩阵。
- Qwen3 fused RMSNorm:在 NPU 上比较 eager vs fused 的 loss、grad_norm、activation dtype、in-place residual 语义、kernel launch 数和 step time。
- Qwen3 MoE weight sync:在 FSDP-to-vLLM rollout live sync 中验证 packed 3D expert weights 展开后的 key、shape、dtype 与 vLLM reload path 一致,覆盖 dense model no-op。
- vLLM JIT / shape transition:构造大 prefill -> 小 decode burst、cold shape -> hot shape、cache eviction 三类负载,采集 TTFT、ITL、worker CPU、compile latency、engine-wide stall 和 warmup key 覆盖率。
参考链接¶
2026-07-02¶
扫描范围¶
- 窗口:由于本地状态文件为空,首次运行回看 2026-06-29 至 2026-07-02 的 72 小时窗口。
- 仓库:
verl-project/verl、verl-project/verl-omni、vllm-project/vllm、vllm-project/vllm-omni、THUDM/slime、ByteDance-Seed/VeOmni。 - Release:窗口内重点 release 是
vllm-project/vllm的v0.24.0与vllm-project/vllm-omni的v0.24.0rc1;其他种子仓库无 72 小时内新正式 release。 - 深入上限:本轮只深入
verl#6901;其余 P0/P1 项做雷达级机制摘要和后续关注记录,避免一轮扩张过多。
P0 / P1¶
| 优先级 | 项目 | 状态 | NPU 分级 | 结论 |
|---|---|---|---|---|
| P0 | verl#6907 Qwen3.5 NPU Triton GDN kernels | open | L | 新增 verl.models.transformers.ops.gdn Triton kernels、Qwen3.5 / Qwen3.5-MoE NPU patch、示例默认开关和单测;直接相关但属于 kernel 级验证,不自动适配。 |
| P0 | verl#6901 BSHD micro-batch padding | merged, 2026-07-02 | M | 已合入;用 mini-batch global max 统一 BSHD micro-batch 的 s_q,减少 cuDNN / TE fused-attention plan build。代码迁移轻,但 NPU 收益必须实测。 |
| P0 | verl#6886 vLLM 0.19+ Ascend fully_async 适配 | merged, 2026-07-01 | S | 已合入;修 vLLM 0.19+ 下 NPU 场景的 process group、FusedMoE weight loader、RotaryEmbedding flash attention 关闭和 quant auto-detect 环境变量。适合进入本地 Ascend 回归清单。 |
| P1 | vllm#47355 DCP sparse MLA indexer overlap | open draft | L | 把 sparse MLA DCP indexer 切成 custom-op 边界,尝试 side stream overlap,并让 full CUDA graph 保留 stream 结构;当前 smoke 端到端未变快。强 CUDA / graph / custom op 依赖,NPU 只跟踪机制。 |
| P1 | vllm#47352 Model Runner V2 MTP top-k index sharing | open draft | M | 把 DeepSeek-style MTP 多 draft step 复用 top-k index buffer 的优化接入 Model Runner V2;报告 output throughput 1517.50 -> 1625.59 tok/s。NPU 可能复用控制流,但依赖具体 MTP attention/indexer 实现。 |
| P1 | vllm-omni#4802 KV cache efficiency metrics | open RFC | S | 为 omni 多 stage / replica / modality 增加 KV footprint、occupancy、tail waste、fragmentation、prefix hit attribution。对 NPU 主要是监控维度适配,适合后续接入服务观测。 |
| P1 | vllm-omni#4796 OmniSerializer perf refactor | open RFC | M | 拆 OmniSerializer / SHM connector copy 与 allocation 开销,计划 encode_into、registry、msgspec.Struct wire types。NPU 无硬件绑定,但涉及 wire format 与高并发正确性。 |
重点机制¶
verl#6901 的核心是稳定 shape,不是减少 padding。旧 BSHD path 每个 micro-batch 用自己的 seqlens_in_batch.max() padding,32 个 micro-batch 可能产生 20+ 种 s_q;新 path 在 forward_backward_batch 里从 mini-batch nested input_ids.offsets().diff().max() 计算 forced_max_seqlen,再传给 preprocess_bshd_engine、MTP label / loss mask 和 VLM attention mask。作者报告 Qwen3.5-35B-A3B 上 Total Step Time 534.13s -> 397.71s,Old Log Prob 78.38s -> 35.45s,Actor Update 247.58s -> 154.50s。
6901 的 NPU 边界
forced_max_seqlen 传递本身主要是 Python / Megatron shape 逻辑,但收益来源是 CUDA / cuDNN / TransformerEngine 对新 shape 的 fused-attention graph / plan build 成本。Ascend / NPU 上不能默认推导同样收益;额外 padding 还可能增加 [B,1,S,S] attention mask、HBM 和 host 侧处理成本。
verl#6886 是更直接的 Ascend 适配项:verl/utils/distributed.py 增加 vLLM 0.19+ 的 TCPStore 创建路径,verl/utils/vllm/npu_vllm_patch.py 继续处理 NPU 上的 RotaryEmbedding flash attention、FusedMoE weight loader 和 quantization auto-detect。这个 PR 已合入,适合做 S 级回归:启动、权重加载、fully_async rollout、vLLM Ascend 版本组合。
verl#6907 是本轮最直接的 NPU kernel 项:它在 verl/models/transformers/ops/gdn/ 下新增 Qwen3.5 gated delta rule Triton kernels,并通过 qwen3_5_gdn_patch.py 在 NPU 上把 HF Qwen3_5GatedDeltaNet 注入到 verl fused path。PR 自报验证包括 Ascend910 上 Triton sanity、fused forward 与 torch reference 对齐、backward 有限梯度,以及 27B / 35B GRPO FSDP NPU 示例默认开启 use_triton_gdn=True。这类改动应按 L 级处理:先读 kernel 边界、dtype / shape 约束、反向正确性和长跑稳定性,不在本轮自动开适配 PR。
vLLM#47355 和 vLLM#47352 都属于 CUDA serving 热路径探索。前者试图把 sparse MLA DCP indexer work 放到 auxiliary CUDA stream 下 overlap;后者让 Model Runner V2 MTP draft steps 共享 top-k index buffer。两者都不适合直接自动改 NPU,但可以转化为 NPU 适配问题:NPU runtime 是否有等价 stream overlap、图捕获边界、indexer buffer 生命周期和跨 draft step 正确性。
vLLM-Omni#4802/#4796 是多模态 serving 观测与数据面效率。4802 把 KV cache 指标按 stage / replica / modality / source 拆开,解决单一 engine total 无法解释 talker / code2wav 等多 stage 压力的问题;4796 把 serializer 的 copy、allocation、wire format 和 thread-safety 拆成两阶段 RFC。两者对 Ascend/NPU 的价值不是算子迁移,而是后续定位多模态 serving 的 host-bound、KV waste 和跨进程传输瓶颈。
简表¶
| 优先级 | 项目 | 状态 | 备注 |
|---|---|---|---|
| P0 | verl#6908 Qwen3.5 Triton GDN patch | open | 与 verl#6907 同主题,需下一轮判断是否为替代/拆分 PR。 |
| P1 | verl#6913 fused-kernel gradient tracking bug | open | fused kernel 正确性,等待 review。 |
| P1 | verl#6911 GLM5 on NPU docs | open | 文档/支持矩阵,跟踪即可。 |
| P1 | vllm#47363 extensible KV cache memory | open | KV cache 结构变化,后续可能影响 offload / connector。 |
| P1 | vllm#47359 Batch Invariant FLASHINFER_MLA | open feature | attention backend 形状不变性,值得跟踪。 |
| P1 | vllm#47334 CUDA kernels to CuTeDSL | open RFC | Hopper / Blackwell kernel 重写方向,NPU 为 L 级跟踪。 |
| P1 | vllm#47303 MXFP4 MoE OOB reads | open bug | 量化 MoE kernel 正确性问题。 |
| P1 | vllm-omni#4814 Wan2.2 Ulysses + cache-dit on Ascend | open bug | 直接 Ascend 多模态 serving 问题,待更多复现信息。 |
| P1 | verl#6894 FSDP2 GRPO crash on Atlas 800T A3 | open issue | Ascend A3 训练稳定性,需跟踪最小复现。 |
| P1 | verl#6881 vLLM 0.19+ Ascend NPU | open | 与已合入的 #6886 同主题但仍 open,需确认是否是后续补丁还是重复 PR。 |
| P1 | verl#6912 wake KV cache 前 empty cache | open | colocate rollout weight sync 后,PyTorch CUDA allocator 与 vLLM VMM cuMemCreate 不共享 free-list,可能导致 KV cache resume OOM。 |
| P1 | vllm#46838 FlashInfer CUTLASS MoE tuning token bound | open | 修 fused MoE tuning 误用 CUDA graph max capture size,H200x8 上 Mixtral / DeepSeek-V2 throughput 有改善。 |
| P1 | VeOmni#872 Async Activation Offload | open draft | 大模型训练显存/吞吐相关;新增 veomni/distributed/async_offload.py,下一轮应重点跟踪验证证据。 |
| P1 | VeOmni#860 DeepSeek V4 DSA backend | open | 接 cuDNN DSA indexer 与 FlashMLA/cuDNN sparse attention backend;强 CUDA 依赖,NPU 分级 L。 |
| P1 | VeOmni#871 Decoupled-Trigger FSDP2 | open draft | 面向 MoE + EP recomputation,减少冗余 pre/post forward;值得跟踪但未深入。 |
| P1 | vllm-omni#4344 HunyuanImage3 MoE EP+SP on NPU | open | 8 NPU 离线 serving 已验证 TP4+SP2 的 diffusion MoE parallel mapping,直接关联 Ascend 多模态。 |
| P1 | verl-omni#208 Qwen3-Omni Thinker LoRA FSDP | open | Qwen3-Omni Thinker transformers 5.x 下 fused MoE expert LoRA/FSDP 支持,偏多模态训练 recipe。 |
| P1 | slime#2147 shard-level P2P weight sync | open RFC | non-colocate 训练权重同步从 full broadcast 改为 shard-level P2P,报告 Qwen3-8B weight sync 0.76s -> 0.48s。 |
| P2 | vllm#47368 redact structured-output schema | open | 安全/日志,不是性能主线。 |
| P2 | vllm-omni#4826 Qwen2.5-omni video description | open | 多模态准确性 bug,低优先级。 |
验证清单¶
- 6901 NPU 对照:固定 seed、模型、长度分布、并行策略,比较
pad_bshd_to_minibatch_max=True/False的 Total Step、Old Log Prob、Actor Update、tokens/s/NPU、HBM peak、host CPU、attention mask size。 - 6901 正确性:覆盖空 nested tensor、
batch_size == 0、VLM BSHD path、MTP label / loss mask、TP / CP / FP8 alignment 后 shape 一致性。 - 6907 kernel 审核:核对 GDN Triton kernels 的 shape / dtype / block size / backward 约束,补长序列、MoE、异常 shape、不同 torch_npu / Triton 版本的回归矩阵。
- 6886 回归:vLLM 0.19+ Ascend 组合下启动、FusedMoE 权重加载、RotaryEmbedding 路径、fully_async rollout、
VLLM_ASCEND_AUTO_DETECT_QUANTIZATION=0是否按预期生效。 - vLLM serving 跟踪:DCP sparse MLA overlap 和 MTP index sharing 先不迁移;等非 draft PR 出现或有明确 NPU runtime 对应机制后再评估。
- vLLM-Omni 观测:优先把 KV stage / modality attribution 作为多模态 serving 压测指标,而不是先改算子。