diff --git a/knowledge/repos/vllm-omni/components/diffusion/_index.md b/knowledge/repos/vllm-omni/components/diffusion/_index.md index 99d7f0aa1..ef27ae866 100644 --- a/knowledge/repos/vllm-omni/components/diffusion/_index.md +++ b/knowledge/repos/vllm-omni/components/diffusion/_index.md @@ -52,3 +52,5 @@ sources: ["PR #5543", vllm_omni/platforms/cuda/platform.py, vllm_omni/diffusion/ | TP/PP/SP/CFG/VAE/HSDP 等并行策略 | [parallelism](parallelism.md) | | 实验性 world-model session 生命周期、LRU 与内存统计边界 | [session state](session-state.md) | | checkpoint remap、HSDP/FSDP、final-layout HWR、registered HWR mmap DLO transport、component quantization 与在线量化加载 | [checkpoint 与加载合同](rules-checkpoint-loading.md) | + +- [Diffusion 平台 kernel 与设备合同](rules-platform-kernels.md):`DIFF-1t`, `DIFF-1u`, `DIFF-1v`, `DIFF-1w`。 diff --git a/knowledge/repos/vllm-omni/components/diffusion/rules-platform-kernels.md b/knowledge/repos/vllm-omni/components/diffusion/rules-platform-kernels.md new file mode 100644 index 000000000..9a7c5b079 --- /dev/null +++ b/knowledge/repos/vllm-omni/components/diffusion/rules-platform-kernels.md @@ -0,0 +1,42 @@ +--- +title: "Diffusion 平台 kernel 与设备合同" +created: 2026-07-20 +updated: 2026-09-07 +type: rule +tags: [vllm-omni, components, diffusion] +sources: ["PR #4341", "PR #5001", "PR #5087", "PR #5088", "PR #5136", "PR #5255", "PR #5344", "PR #5543", "PR #5720", "PR #5737", "PR #5764", "PR #5801", "PR #5802", "PR #5838", "PR #5839", "PR #5848", "PR #5872", "PR #5881", "PR #5896", "PR #5981", "PR #6094", "PR #6102", "PR #6279", "PR #6385", "PR #6445", "PR #6651", "PR #6722", "PR #5831", "PR #6989", vllm_omni/diffusion/attention/backends/flashinfer_attn.py, vllm_omni/diffusion/attention/backends/ring/ring_kernels.py, vllm_omni/diffusion/attention/parallel/ulysses.py, vllm_omni/diffusion/cache/cachedit/backend.py, vllm_omni/diffusion/data.py, vllm_omni/diffusion/distributed/hsdp.py, vllm_omni/diffusion/executor/multiproc_executor.py, vllm_omni/diffusion/layers/norm.py, vllm_omni/diffusion/layers/rope.py, vllm_omni/diffusion/lora/manager.py, vllm_omni/diffusion/model_loader/diffusers_loader.py, vllm_omni/diffusion/model_metadata.py, vllm_omni/diffusion/offloader/, vllm_omni/diffusion/registry.py, vllm_omni/diffusion/worker/diffusion_model_runner.py, vllm_omni/diffusion/worker/diffusion_worker.py, vllm_omni/engine/async_omni_engine.py, vllm_omni/entrypoints/openai/api_server.py, vllm_omni/quantization/component_config.py, vllm_omni/quantization/factory.py, tests/diffusion/attention/test_attention_sp.py, tests/diffusion/attention/test_ulysses_uaa.py, tests/diffusion/cache/test_cache_backends.py, tests/diffusion/layers/test_norm.py, tests/diffusion/layers/test_rope_broadcast.py, tests/diffusion/offloader/test_distributed_layerwise_backend.py, tests/diffusion/test_diffusion_config_propagation.py, tests/diffusion/test_multiproc_engine_concurrency.py, "PR #4755", "PR #5990", "vllm_omni/diffusion/layers/fused_qk_norm_rope.py", "vllm_omni/diffusion/cache/teacache/extractors.py", "vllm_omni/diffusion/models/minimax_h3/minimax_h3_transformer.py", "tests/diffusion/layers/test_fused_qk_norm_rope.py", "PR #6165", "PR #5677", "vllm_omni/diffusion/quantization/hsdp_fp8.py", "tests/diffusion/quantization/test_hsdp_fp8.py", "PR #4845", "PR #6173", "PR #6070", "vllm_omni/diffusion/models/ltx2/ltx2_components.py", "vllm_omni/diffusion/model_loader/hub_prefetch.py", "PR #5910", "PR #5676", "PR #6125", "PR #6320", "PR #5877", "vllm_omni/diffusion/vllm_config.py", "PR #6283", "vllm_omni/diffusion/layers/activation.py", "PR #6281", "vllm_omni/diffusion/attention/ops/minimax_h3_modulation.py", "PR #6130", "PR #6364", "PR #6073", "PR #4820", vllm_omni/diffusion/attention/backends/fastvideo_vsa.py, "PR #6150", "PR #6410", tests/diffusion/layers/test_activation.py, tests/diffusion/layers/test_fused_qk_norm_rope_npu.py] +confidence: high +--- + +# Diffusion 平台 kernel 与设备合同 + +入口与其他规则见 [共享规则](rules.md)。 + +### DIFF-1t — CPU offload 下 text encoder 输入必须跟随 pipeline compute device + +- 触发:pipeline 启用 CPU offload,组件参数仍报告为 CPU,但 forward hook 会在执行前将 text encoder 权重移到 pipeline 的加速设备。 +- 强制:text encoder 组件初始化和 `encode_prompt` 输入都必须以 pipeline 的 `self.device` 为设备合同;输入 ids 不得通过 `next(text_encoder.parameters()).device` 推导设备,并保持 CUDA、XPU、CPU 等后端可用。 +- 禁止:因 offload 参数位于 CPU 就把 encoder 输入放到 CPU;硬编码 CUDA 设备;把 offload hook 已移动权重当作输入可以留在 CPU 的依据。 +- 验收:在启用 CPU offload 的 SDXL text-to-image 测试中,断言 text encoder 输入与 `self.device` 一致,并覆盖 XPU 及至少一个其他后端;确认 embedding lookup 不再出现 CPU/XPU 混用错误。^[PR #6125] + +### DIFF-1u — NPU complex64 RoPE 索引必须使用 `index_select` + +- 触发:修改 `WanS2VRotaryPosEmbed` 或 `RotaryEmbeddingS2VGrid` 的频率表采样、complex64 索引,或 NPU RoPE 兼容路径。 +- 强制:对 `freqs_split`/`freqs` 的帧、空间高度和空间宽度频率表统一使用 `torch.index_select(..., 0, index)`;当 `f_o < 0` 时先对帧频率表执行 `conj()` 再选择,并保持既有 `view`、`expand`、`reshape` 与采样顺序。 +- 禁止:在 NPU 路径对 complex64 频率表使用 `tensor[index]` advanced indexing,触发不支持 `aclnnIndex`/`DT_COMPLEX64` 的算子;不得因替换索引而改变共轭顺序、采样位置或输出布局。 +- 验收:分别覆盖两个 RoPE 类的正向与共轭频率采样,断言 `index_select` 结果的 shape/value 与参考实现一致;在 NPU TP2 上运行 Wan2.2-S2V 端到端推理,确认不再因 `aclnnIndex`/`DT_COMPLEX64` 崩溃并产生视频输出。^[PR #6320] + +### DIFF-1v — diffusion packed SwiGLU 必须保持平台分派与精度边界 + +- 触发:共享 diffusion MLP 将 `F.silu(gate) * up` 替换为 packed SwiGLU fused activation,或新增平台专用 activation dispatch。 +- 强制:输入最后一维必须保持 `[gate, up]` packed 合同,输出形状为输入去半后的最后一维,并保持输入的 device/dtype。通过本地 `CustomOp` 和 `current_omni_platform` 分派;CUDA 调用 `torch.ops._C.silu_and_mul`,NPU 调用 `torch_npu.npu_swiglu(..., dim=-1)`,XPU 保持 native fallback,其他平台必须有独立且已注册的实现。不会实际使用 fused op 的平台不得在构造时 eager resolve 该 op,尤其是 MUSA 应延迟解析。 +- 禁止:依赖 vLLM 通用 `SiluAndMul` 代替 diffusion 本地合同;把 `CustomOp` 注册本身当作目标设备实际命中证明;让 MUSA 构造因缺少 `_C.silu_and_mul` 失败;把 fused kernel 的输出宣称为必然 byte-identical,忽略不同舍入边界。 +- 验收:CUDA 与目标 NPU 分别以 native reference 对照 fused 输出的 shape、dtype、device 和数值,并确认实际命中对应 kernel;XPU 断言 native fallback,MUSA 覆盖无 op 注册时的构造与 forward。固定 checkpoint、输入、seed 和步数比较 H3 输出时使用明确数值容差;NPU 路径只是目标 kernel contract,不产生通用性能或跨平台证据。^[PR #6283] ^[PR #6410] + +### DIFF-1w — Triton 融合 kernel 必须有设备能力与连续布局门禁 + +- 触发:共享 diffusion 增加或修改 Triton fused op,尤其是 indexed modulation、in-place 输出、RMSNorm 融合,或被模型与 TeaCache extractor 复用的 kernel wrapper。 +- 强制:启动前同时检查 `HAS_TRITON`、`current_platform.is_cuda()`、输入/输出 tensor 的 CUDA device、支持的 dtype/shape 以及 kernel 所需的 row-major contiguous 布局;若列 stride 不是 1,必须回退或显式改用支持该 stride 的实现。非 CUDA、unsupported 或 strided 路径走 eager reference,并通过原生 `RMSNorm` 保留 NPU 的 `torch_npu.npu_rms_norm` 等平台分派。融合 reduction 与 elementwise 在 FP32 中完成,最终只在写回时转换到目标 dtype。 +- 禁止:只用 `x.is_cpu` 作为 Triton 门禁;让 NPU、XPU、MUSA 或其他非 CUDA tensor 进入 raw Triton launch;认为传入 row stride 就足以支持非连续列;对错误布局静默读写;或用 mock/wiring 结果宣称真实 kernel 数值 parity。 +- 验收:CPU/mock 覆盖 CUDA、NPU、XPU、MUSA、unsupported dtype/shape、空行和 contiguous/strided 输入,断言非 CUDA 路径不启动 Triton 且 NPU 保留 native RMSNorm;CUDA 目标硬件以 FP32 reference 核对值、dtype 和容差,并单独记录 kernel 数量/延迟。当前 PR 未新增该模块测试且 NPU CI 不覆盖 H3,在补齐前不得称为生产级跨平台支持。^[PR #6281] + diff --git a/knowledge/repos/vllm-omni/components/diffusion/rules.md b/knowledge/repos/vllm-omni/components/diffusion/rules.md index 5eb7e95d7..d51d7eb09 100644 --- a/knowledge/repos/vllm-omni/components/diffusion/rules.md +++ b/knowledge/repos/vllm-omni/components/diffusion/rules.md @@ -13,6 +13,8 @@ confidence: high 只有 `DIFF-数字字母` 是可审计规则 ID。模型专有常量和已验证偏差留在对应 [模型 owner](../../models/_index.md);本页只承载多个 diffusion 模型共用的不变量。 +相关专题:[Diffusion 平台 kernel 与设备合同](rules-platform-kernels.md)(`DIFF-1t`, `DIFF-1u`, `DIFF-1v`, `DIFF-1w`)。 + ## Direct 代码快速入口 | PR 描述信号 | 规则入口 | @@ -132,34 +134,6 @@ async output readiness、per-worker result channel、shutdown 与 constructor cl ## 质量阈值与资源辅助 -### DIFF-1t — CPU offload 下 text encoder 输入必须跟随 pipeline compute device - -- 触发:pipeline 启用 CPU offload,组件参数仍报告为 CPU,但 forward hook 会在执行前将 text encoder 权重移到 pipeline 的加速设备。 -- 强制:text encoder 组件初始化和 `encode_prompt` 输入都必须以 pipeline 的 `self.device` 为设备合同;输入 ids 不得通过 `next(text_encoder.parameters()).device` 推导设备,并保持 CUDA、XPU、CPU 等后端可用。 -- 禁止:因 offload 参数位于 CPU 就把 encoder 输入放到 CPU;硬编码 CUDA 设备;把 offload hook 已移动权重当作输入可以留在 CPU 的依据。 -- 验收:在启用 CPU offload 的 SDXL text-to-image 测试中,断言 text encoder 输入与 `self.device` 一致,并覆盖 XPU 及至少一个其他后端;确认 embedding lookup 不再出现 CPU/XPU 混用错误。^[PR #6125] - -### DIFF-1u — NPU complex64 RoPE 索引必须使用 `index_select` - -- 触发:修改 `WanS2VRotaryPosEmbed` 或 `RotaryEmbeddingS2VGrid` 的频率表采样、complex64 索引,或 NPU RoPE 兼容路径。 -- 强制:对 `freqs_split`/`freqs` 的帧、空间高度和空间宽度频率表统一使用 `torch.index_select(..., 0, index)`;当 `f_o < 0` 时先对帧频率表执行 `conj()` 再选择,并保持既有 `view`、`expand`、`reshape` 与采样顺序。 -- 禁止:在 NPU 路径对 complex64 频率表使用 `tensor[index]` advanced indexing,触发不支持 `aclnnIndex`/`DT_COMPLEX64` 的算子;不得因替换索引而改变共轭顺序、采样位置或输出布局。 -- 验收:分别覆盖两个 RoPE 类的正向与共轭频率采样,断言 `index_select` 结果的 shape/value 与参考实现一致;在 NPU TP2 上运行 Wan2.2-S2V 端到端推理,确认不再因 `aclnnIndex`/`DT_COMPLEX64` 崩溃并产生视频输出。^[PR #6320] - -### DIFF-1v — diffusion packed SwiGLU 必须保持平台分派与精度边界 - -- 触发:共享 diffusion MLP 将 `F.silu(gate) * up` 替换为 packed SwiGLU fused activation,或新增平台专用 activation dispatch。 -- 强制:输入最后一维必须保持 `[gate, up]` packed 合同,输出形状为输入去半后的最后一维,并保持输入的 device/dtype。通过本地 `CustomOp` 和 `current_omni_platform` 分派;CUDA 调用 `torch.ops._C.silu_and_mul`,NPU 调用 `torch_npu.npu_swiglu(..., dim=-1)`,XPU 保持 native fallback,其他平台必须有独立且已注册的实现。不会实际使用 fused op 的平台不得在构造时 eager resolve 该 op,尤其是 MUSA 应延迟解析。 -- 禁止:依赖 vLLM 通用 `SiluAndMul` 代替 diffusion 本地合同;把 `CustomOp` 注册本身当作目标设备实际命中证明;让 MUSA 构造因缺少 `_C.silu_and_mul` 失败;把 fused kernel 的输出宣称为必然 byte-identical,忽略不同舍入边界。 -- 验收:CUDA 与目标 NPU 分别以 native reference 对照 fused 输出的 shape、dtype、device 和数值,并确认实际命中对应 kernel;XPU 断言 native fallback,MUSA 覆盖无 op 注册时的构造与 forward。固定 checkpoint、输入、seed 和步数比较 H3 输出时使用明确数值容差;NPU 路径只是目标 kernel contract,不产生通用性能或跨平台证据。^[PR #6283] ^[PR #6410] - -### DIFF-1w — Triton 融合 kernel 必须有设备能力与连续布局门禁 - -- 触发:共享 diffusion 增加或修改 Triton fused op,尤其是 indexed modulation、in-place 输出、RMSNorm 融合,或被模型与 TeaCache extractor 复用的 kernel wrapper。 -- 强制:启动前同时检查 `HAS_TRITON`、`current_platform.is_cuda()`、输入/输出 tensor 的 CUDA device、支持的 dtype/shape 以及 kernel 所需的 row-major contiguous 布局;若列 stride 不是 1,必须回退或显式改用支持该 stride 的实现。非 CUDA、unsupported 或 strided 路径走 eager reference,并通过原生 `RMSNorm` 保留 NPU 的 `torch_npu.npu_rms_norm` 等平台分派。融合 reduction 与 elementwise 在 FP32 中完成,最终只在写回时转换到目标 dtype。 -- 禁止:只用 `x.is_cpu` 作为 Triton 门禁;让 NPU、XPU、MUSA 或其他非 CUDA tensor 进入 raw Triton launch;认为传入 row stride 就足以支持非连续列;对错误布局静默读写;或用 mock/wiring 结果宣称真实 kernel 数值 parity。 -- 验收:CPU/mock 覆盖 CUDA、NPU、XPU、MUSA、unsupported dtype/shape、空行和 contiguous/strided 输入,断言非 CUDA 路径不启动 Triton 且 NPU 保留 native RMSNorm;CUDA 目标硬件以 FP32 reference 核对值、dtype 和容差,并单独记录 kernel 数量/延迟。当前 PR 未新增该模块测试且 NPU CI 不覆盖 H3,在补齐前不得称为生产级跨平台支持。^[PR #6281] - ### DIFF-1x — 预拼接 image position ids 不能在 denoise 分支重复拼接 - 触发:修改 FLUX.2-Klein 图像编辑输入准备、`latent_ids`/`image_latent_ids` 拼接或 denoising loop 的 position-id 传递。 diff --git a/knowledge/repos/vllm-omni/models/minicpm-o-4-5/_index.md b/knowledge/repos/vllm-omni/models/minicpm-o-4-5/_index.md index 1d56d85f0..7ab2d062c 100644 --- a/knowledge/repos/vllm-omni/models/minicpm-o-4-5/_index.md +++ b/knowledge/repos/vllm-omni/models/minicpm-o-4-5/_index.md @@ -66,3 +66,5 @@ Realtime video 不以「每 200 ms append」定义 frame cadence:首个约 103 batch/stage handoff 或 native duplex session。 - 问题位于共享 bridge/batching 时转到 [Model Executor rules](../../components/model-executor/rules.md)。 + +- [MiniCPM-o 4.5 Code2Wav 运行时合同](rules-code2wav-runtime.md):`MCPMO-1f`, `MCPMO-1g`, `MCPMO-1h`, `MCPMO-1i`。 diff --git a/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules-code2wav-runtime.md b/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules-code2wav-runtime.md new file mode 100644 index 000000000..5cf8ec4f2 --- /dev/null +++ b/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules-code2wav-runtime.md @@ -0,0 +1,42 @@ +--- +title: "MiniCPM-o 4.5 Code2Wav 运行时合同" +created: 2026-07-20 +updated: 2026-09-07 +type: rule +tags: [vllm-omni, models, model-executor] +sources: ["PR #3642", "PR #5165", "PR #5382", "PR #5524", "PR #5638", "PR #5792", "PR #5869", "PR #6056", "PR #6154", "PR #6170", "PR #6318", "PR #6828", tests/dfx/perf/tests/test_minicpmo_4_5.json, tests/dfx/perf/tests/test_minicpmo_4_5_duplex_seed_tts.json, tests/e2e/accuracy/minicpmo_4_5/test_minicpmo_4_5.py, tests/e2e/online_serving/helpers/minicpmo_4_5_duplex.py, tests/e2e/online_serving/test_minicpmo_realtime_duplex_drivers.py, tests/e2e/online_serving/test_minicpmo_4_5.py, tests/e2e/online_serving/test_minicpmo_4_5_duplex.py, tests/e2e/online_serving/test_minicpmo_4_5_expansion.py, tests/e2e/online_serving/run_minicpmo_realtime_duplex_soft_interrupt.py, vllm_omni/benchmarks/data_modules/seed_tts_dataset.py, vllm_omni/benchmarks/data_modules/seed_tts_eval.py, vllm_omni/benchmarks/patch/patch.py, vllm_omni/deploy/minicpmo_4_5.yaml, vllm_omni/experimental/fullduplex/client.py, vllm_omni/entrypoints/duplex/chat_fallback.py, vllm_omni/entrypoints/duplex/realtime_input.py, vllm_omni/entrypoints/duplex/session_runner.py, vllm_omni/entrypoints/duplex/serving.py, vllm_omni/entrypoints/duplex/vad.py, vllm_omni/model_executor/models/minicpmo_4_5/duplex/adapter.py, vllm_omni/model_executor/models/cosyvoice3/code2wav_core/hifigan.py, vllm_omni/model_executor/models/minicpmo_4_5/batched_token2wav.py, vllm_omni/model_executor/models/minicpmo_4_5/cuda_graph_wrapper.py, vllm_omni/model_executor/models/minicpmo_4_5/minicpmo_4_5_code2wav.py, vllm_omni/model_executor/models/minicpmo_4_5/minicpmo_4_5_omni_llm.py, vllm_omni/model_executor/models/minicpmo_4_5/minicpmo_4_5_omni_tts.py, vllm_omni/model_executor/stage_input_processors/minicpmo_4_5_omni.py, tests/model_executor/models/minicpmo_4_5/test_audio_chunk_mask.py, tests/model_executor/models/minicpmo_4_5/test_cfm_graph_capture_gating.py, tests/model_executor/models/minicpmo_4_5/test_code2wav_batching.py, tests/model_executor/models/minicpmo_4_5/test_cuda_graph_wrapper.py, tests/model_executor/models/minicpmo_4_5/test_pipeline.py, tests/model_executor/models/minicpmo_4_5/test_talker_batching.py, tests/model_executor/models/minicpmo_4_5/test_vision_flash_attention.py, "PR #6082", "PR #5604", "PR #6274", "PR #6346", "PR #6397", "PR #6406", "PR #6458", "PR #6587", "PR #6619", "PR #6757", "PR #6529", "PR #6772", vllm_omni/entrypoints/duplex/protocol.py] +confidence: high +--- + +# MiniCPM-o 4.5 Code2Wav 运行时合同 + +入口与其他规则见 [共享规则](rules.md)。 + +## MCPMO-1f — Ascend Code2Wav NPUGraph 只捕获精确形状的 CFM DiT + +- 触发:MiniCPM-o 4.5 在 Ascend 上修改 Code2Wav、CFM DiT estimator、NPUGraph 开关、图缓存或 bundled deploy profile。 +- 强制:Stage 2 保持 outer `enforce_eager: true`,只将确定性的 `blocks_forward_chunk` 放入按 exact shape 捕获的 inner NPUGraph;`t_embedder`、flow encoder、HiFT/RNG、请求解析和 request-owned state commit 必须 eager。cached 与 uncached attention/CNN state 使用独立 graph bucket,`code2wav_max_npu_graphs` 默认 32,超过上限的新 shape 回 eager;`code2wav_enable_npu_graph: false` 必须能关闭该 inner graph。Token2Wav 加载前设置 `torch.npu.config.allow_internal_format = False`、`torch.npu.set_compile_mode(jit_compile=False)`,拒绝 `ASCEND_LAUNCH_BLOCKING=1`,并在 graph mode 要求 MATH SDPA。 +- 禁止:捕获整个 Code2Wav Stage 2 或依赖全局 `--enforce-eager` 代替 stage-scoped 配置;把 graph 开关放进 shared connector extra;让失败捕获继续复用可能已损坏的 allocator/RNG state;把 NPU graph 的 parity、缓存或性能结论外推到 HiFT、TRT、CUDA 或其他模型。 +- 验收:解析 `minicpmo_4_5.yaml`、`minicpmo_4_5_2gpu.yaml` 和 `minicpmo_4_5_3gpu.yaml` 的 NPU 最终 stage config,断言 Stage 0/1 的 `PIECEWISE`、Stage 2 的 outer eager 与 additional config;CPU 测试覆盖 timestep、exact dispatch、cache bucket、clone ownership、runtime precondition、MATH 选择和 fail-stop;A3 测试覆盖 uncached/cached eager parity。任何性能声明还必须记录 exact command、A3 硬件/驱动/torch-npu、warmup、测量轮数、并发、延迟/RTF 和峰值 NPU memory。^[PR #5604] + +## MCPMO-1g — Token2Wav 的 eager TorchDynamo 包装必须在流式热路径中移除 + +- 触发:MiniCPM-o 4.5 的 Token2Wav/CosyVoice 流式路径使用 `torch.compile(backend="eager")` 包装 `forward_chunk`,并在新 chunk shape 上出现首响应停顿。 +- 强制:在 `BatchedToken2Wav` 初始化时,仅当方法存在 `_torchdynamo_orig_callable` 或 `__wrapped__` 时恢复原始 bound method;保留 estimator、encoder、HiFT 的其他路径及其运行时语义。 +- 禁止:让 eager backend 的 tracing/guard 构造进入每个未见 chunk shape 的实时响应;把该解包扩大为所有后端、模型或 CUDA Graph 路径的通用优化。 +- 验收:检查存在包装时初始化后 `forward_chunk` 已指向原始实现、无包装时保持不变;用 cold 与 warm 的多 chunk duplex 回归确认首个响应不再长时间停顿、后续响应持续产出音频,且 steady-state 行为未被改变。 ^[PR #6274] + +## MCPMO-1h — Code2Wav 编码窗口必须受 RelPos 与缓存预算约束 + +- 触发:修改 MiniCPM-o Code2Wav 的长 codec prefill、`forward_chunk`、RelPos PE、upsample 或 conformer cache。 +- 强制:按 PE `max_pos`、upsample stride、cache offset 和 lookahead 计算安全 token 窗口,限制单片上限并切分超长输入;非最终片保留 lookahead,调用 `forward_chunk` 前确保 PE 足够,按 batch 行合并音频并延续 cache。 +- 禁止:把数千 codec token 一次送入固定 RelPos PE;忽略 cache offset 或把非最终短片静默截断;用空音频掩盖窗口溢出。 +- 验收:单测覆盖预算计算与切片计划,fake Code2Wav 测试断言每片大小、`last_chunk` 和非空音频;不得从该修复推断通用性能提升。 ^[PR #6346] + +## MCPMO-1i — Code2Wav dynamo 解包必须兼容无 encoder 的 Flow + +- 触发:MiniCPM-o 4.5 `BatchedToken2Wav` 初始化需要对 `flow.encoder.forward_chunk` 执行 TorchDynamo 解包,但某些 decoder/estimator-only Flow 没有 `encoder`。 +- 强制:先以 `getattr(self.flow, "encoder", None)` 检查 encoder;仅在 encoder 存在时解包 `forward_chunk`,真实 CosyVoice flow 仍必须保留原有解包行为。 +- 禁止:无条件访问 `self.flow.encoder`,或让 encoder-less 的 NPU Code2Wav 图测试与其他合法 Flow 在构造阶段因 `AttributeError` 失败。 +- 验收:decoder/estimator-only `_Flow` 能成功构造并完成 NPU graph/eager 回归;带 encoder 的 CUDA MiniCPM-o 4.5 路径仍确认 `forward_chunk` 的 Dynamo 包装被正确移除。 ^[PR #6397] + diff --git a/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules.md b/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules.md index c2fde8b26..af17bbcad 100644 --- a/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules.md +++ b/knowledge/repos/vllm-omni/models/minicpm-o-4-5/rules.md @@ -12,6 +12,8 @@ confidence: high 只有 `MCPMO-数字字母` 是可审计规则 ID。 +相关专题:[MiniCPM-o 4.5 Code2Wav 运行时合同](rules-code2wav-runtime.md)(`MCPMO-1f`, `MCPMO-1g`, `MCPMO-1h`, `MCPMO-1i`)。 + ## Direct 代码快速入口 | PR 描述信号 | 规则入口 | @@ -80,34 +82,6 @@ confidence: high CPU 并发、collision、writer/fstat/replace/cleanup failure 与 restrictive umask。MiniCPM wiring 的自动化验证仍须补证。 ^[PR #5638] ^[PR #6957] -## MCPMO-1f — Ascend Code2Wav NPUGraph 只捕获精确形状的 CFM DiT - -- 触发:MiniCPM-o 4.5 在 Ascend 上修改 Code2Wav、CFM DiT estimator、NPUGraph 开关、图缓存或 bundled deploy profile。 -- 强制:Stage 2 保持 outer `enforce_eager: true`,只将确定性的 `blocks_forward_chunk` 放入按 exact shape 捕获的 inner NPUGraph;`t_embedder`、flow encoder、HiFT/RNG、请求解析和 request-owned state commit 必须 eager。cached 与 uncached attention/CNN state 使用独立 graph bucket,`code2wav_max_npu_graphs` 默认 32,超过上限的新 shape 回 eager;`code2wav_enable_npu_graph: false` 必须能关闭该 inner graph。Token2Wav 加载前设置 `torch.npu.config.allow_internal_format = False`、`torch.npu.set_compile_mode(jit_compile=False)`,拒绝 `ASCEND_LAUNCH_BLOCKING=1`,并在 graph mode 要求 MATH SDPA。 -- 禁止:捕获整个 Code2Wav Stage 2 或依赖全局 `--enforce-eager` 代替 stage-scoped 配置;把 graph 开关放进 shared connector extra;让失败捕获继续复用可能已损坏的 allocator/RNG state;把 NPU graph 的 parity、缓存或性能结论外推到 HiFT、TRT、CUDA 或其他模型。 -- 验收:解析 `minicpmo_4_5.yaml`、`minicpmo_4_5_2gpu.yaml` 和 `minicpmo_4_5_3gpu.yaml` 的 NPU 最终 stage config,断言 Stage 0/1 的 `PIECEWISE`、Stage 2 的 outer eager 与 additional config;CPU 测试覆盖 timestep、exact dispatch、cache bucket、clone ownership、runtime precondition、MATH 选择和 fail-stop;A3 测试覆盖 uncached/cached eager parity。任何性能声明还必须记录 exact command、A3 硬件/驱动/torch-npu、warmup、测量轮数、并发、延迟/RTF 和峰值 NPU memory。^[PR #5604] - -## MCPMO-1g — Token2Wav 的 eager TorchDynamo 包装必须在流式热路径中移除 - -- 触发:MiniCPM-o 4.5 的 Token2Wav/CosyVoice 流式路径使用 `torch.compile(backend="eager")` 包装 `forward_chunk`,并在新 chunk shape 上出现首响应停顿。 -- 强制:在 `BatchedToken2Wav` 初始化时,仅当方法存在 `_torchdynamo_orig_callable` 或 `__wrapped__` 时恢复原始 bound method;保留 estimator、encoder、HiFT 的其他路径及其运行时语义。 -- 禁止:让 eager backend 的 tracing/guard 构造进入每个未见 chunk shape 的实时响应;把该解包扩大为所有后端、模型或 CUDA Graph 路径的通用优化。 -- 验收:检查存在包装时初始化后 `forward_chunk` 已指向原始实现、无包装时保持不变;用 cold 与 warm 的多 chunk duplex 回归确认首个响应不再长时间停顿、后续响应持续产出音频,且 steady-state 行为未被改变。 ^[PR #6274] - -## MCPMO-1h — Code2Wav 编码窗口必须受 RelPos 与缓存预算约束 - -- 触发:修改 MiniCPM-o Code2Wav 的长 codec prefill、`forward_chunk`、RelPos PE、upsample 或 conformer cache。 -- 强制:按 PE `max_pos`、upsample stride、cache offset 和 lookahead 计算安全 token 窗口,限制单片上限并切分超长输入;非最终片保留 lookahead,调用 `forward_chunk` 前确保 PE 足够,按 batch 行合并音频并延续 cache。 -- 禁止:把数千 codec token 一次送入固定 RelPos PE;忽略 cache offset 或把非最终短片静默截断;用空音频掩盖窗口溢出。 -- 验收:单测覆盖预算计算与切片计划,fake Code2Wav 测试断言每片大小、`last_chunk` 和非空音频;不得从该修复推断通用性能提升。 ^[PR #6346] - -## MCPMO-1i — Code2Wav dynamo 解包必须兼容无 encoder 的 Flow - -- 触发:MiniCPM-o 4.5 `BatchedToken2Wav` 初始化需要对 `flow.encoder.forward_chunk` 执行 TorchDynamo 解包,但某些 decoder/estimator-only Flow 没有 `encoder`。 -- 强制:先以 `getattr(self.flow, "encoder", None)` 检查 encoder;仅在 encoder 存在时解包 `forward_chunk`,真实 CosyVoice flow 仍必须保留原有解包行为。 -- 禁止:无条件访问 `self.flow.encoder`,或让 encoder-less 的 NPU Code2Wav 图测试与其他合法 Flow 在构造阶段因 `AttributeError` 失败。 -- 验收:decoder/estimator-only `_Flow` 能成功构造并完成 NPU graph/eager 回归;带 encoder 的 CUDA MiniCPM-o 4.5 路径仍确认 `forward_chunk` 的 Dynamo 包装被正确移除。 ^[PR #6397] - ## MCPMO-2a — registry 使用 4.5 config/version predicate - 触发:pipeline auto-detection 看到通用 `MiniCPMO` architecture。