Prhub

#53399 [ROCm][CI] Add MTP and other spec-decode acceptance coverage

原始 PR 作者 AndreasKaratzas 合并时间 2026-09-02 16:27 文件变更 2 提交数 5 评论 8 代码增减 +30 / -1

执行摘要

为 MI355 添加投机解码接受率测试覆盖,并修复 Gemma4 CUDA 图捕获的流同步问题。

本 PR 是从 #50519 拆分而来,目的是将新增的 MI355 投机解码接受率测试覆盖及其所需的运行时修复作为一个独立的、可审查的单元。PR body 明确指出需要添加一个可选的 MI355 nightly 测试组,覆盖 v1/e2e/spec_decode/acceptance_rates/mtp_other/ 目录下的完整测试套件,并修复相关的运行时问题,如 hipBLASLt 状态初始化流作用域问题以及 CUDA 图内存剖析流回退逻辑。

此 PR 值得精读。其核心价值不在于代码变更的复杂度,而在于对 ROCm 平台特定行为(流作用域、hipBLASLt 惰性初始化)的深刻理解与修复,以及为关键功能(投机解码接受率)补充 CI 覆盖的工程实践。开发者可以关注 _setup_centroids_cuda_graphs 方法中流变量处理的细微差别,以及 CI 配置中 source_file_dependencies 如何精确地映射到相关代码路径。这是一个典型的“小改动解决具体平台问题并增强测试”的良好范例。

讨论亮点

PR 的讨论主要围绕 CI 配置的命名细节。作者 AndreasKaratzas 在提交后自评了一个 NIT (Nitpick),指出新添加的测试组标签中的 "Nightly" 一词可能不够准确(因为该组被标记为 optional: true,通常在夜间或特定需求时运行,而非每次 PR 提交都运行)。这体现了对 CI 配置语义准确性的关注。其他评论来自自动化工具,未涉及实质性的技术争议。

实现拆解

  1. CI 配置新增:在 .buildkite/test-amd.yaml 的 MI355 部分新增了一个名为 :amd: (MI355) Spec Decode AL MTP + Other Acceptance 的可选 CI 步骤。该步骤配置了 180 分钟超时、细粒度的 source_file_dependencies 以确保相关代码变更能触发测试,并执行 pytest -v -s v1/e2e/spec_decode/acceptance_rates/mtp_other/ 命令。这为关键投机解码功能在 AMD 硬件上提供了回归保障。
  2. 源码逻辑修正:在 vllm/v1/spec_decode/gemma4.py 的 _setup_centroids_cuda_graphs 方法中,将 CUDA 图捕获所使用的流从动态调用 current_stream() 改为使用在方法开头预捕获的 capture_stream 变量。此修改确保了在 ROCm 平台上,warm up 和 graph capture 操作在同一个显式设备流上执行,避免了因流不一致导致的 hipBLASLt 状态初始化或工作区在错误流上分配的问题。
  3. 配套调整:本 PR 涉及的 vllm/v1/spec_decode/gemma4.py 文件修改是微小但关键的,它修正了 Gemma4 模型在 AMD 硬件上使用 CUDA 图进行 centroids 计算时的一个潜在错误。.buildkite/test-amd.yaml 的变更则完全是配置层面的,为新测试提供了运行基础设施。
文件 模块 状态 重要度
.buildkite/test-amd.yaml CI 配置 modified 4.66
vllm/v1/spec_decode/gemma4.py 投机解码 modified 5.39

关键符号

_setup_centroids_cuda_graphs

关键源码片段

vllm/v1/spec_decode/gemma4.py core-logic

修复了 `Gemma4` 投机解码器中 CUDA 图捕获的流同步问题,这是一个针对 ROCm 平台的关键运行时修复,确保了模型在特定硬件上的正确行为。

    def _setup_centroids_cuda_graphs(self) -> None:
        """Capture CUDA graphs for centroids get_top_tokens at key sizes."""
        masked_emb = self.model.masked_embedding
        lm_head_weight = self.model._get_full_lm_head_weight()
        # 在方法开头预先捕获当前流,确保后续 warm up 和 graph capture 在同一显式流上
        # 在 ROCm 上,hipBLASLt 状态是惰性的且与流作用域绑定,流不一致会导致初始化问题
        capture_stream = current_stream()
​
        for size in [1, 2, 4, 8, 16, 32, 64]:
            static_input = torch.zeros(
                size,
                masked_emb.hidden_size,
                dtype=self.dtype,
                device=self.device,
            )
            # Warm up: 在 capture_stream 上执行操作,确保状态在该流上初始化
            for _ in range(3):
                masked_emb.get_top_tokens(static_input, lm_head_weight)
            torch.accelerator.synchronize()
​
            g = torch.cuda.CUDAGraph()
            # Graph capture: 显式使用预捕获的 capture_stream,而非动态调用 current_stream()
            with torch.cuda.graph(g, stream=capture_stream):
                static_output = masked_emb.get_top_tokens(
                    static_input,
                    lm_head_weight,
                )
            self._centroids_graphs[size] = g
            self._centroids_inputs[size] = static_input
            self._centroids_outputs[size] = static_output
​
        self._centroids_sizes = sorted(self._centroids_graphs)
        logger.info(
            "Gemma4 MTP: captured centroids CUDA graphs for sizes %s.",
            self._centroids_sizes,
        )

评论区精华

CI 测试组命名准确性 style

作者 AndreasKaratzas 在代码评论中自评,认为新添加的 CI 测试组标签中的 "Nightly" 一词可能不准确,因为该组被设置为 `optional: true`。

结论:作者已识别此命名问题,并表示会移除 "Nightly",以使标签更准确地反映该测试组的可选性质。 · 已解决

风险与影响

  1. CI 配置风险:新增的 CI 步骤被标记为 optional: true,这意味着它不会在每次 PR 提交时自动运行,降低了影响主要 CI 流水线的风险。然而,其配置(如超时时间、依赖路径)的正确性直接影响未来手动触发或夜间运行时的测试有效性。配置错误可能导致测试遗漏或失败。
  2. 源码变更风险:对 gemma4.py 中 _setup_centroids_cuda_graphs 的修改虽然只有两行,但影响的是 CUDA 图捕获这一核心且敏感的逻辑。在 ROCm 上,确保 warm up 和 graph capture 在同一特定流上执行至关重要。如果流选择不当,可能导致 hipBLASLt 状态初始化错误、工作区分配冲突或图形捕获失败,进而引发运行时错误或性能下降。此修复旨在解决此类问题。
  3. 兼容性与回归风险:此变更主要针对 ROCm 平台(MI355),对 NVIDIA CUDA 平台的影响较小,因为 current_stream() 在 CUDA 上通常返回正确的流。然而,修改是通用的,需要在 CUDA 环境下进行回归验证,确保没有引入意外行为。

用户影响:直接影响使用 ROCm(AMD GPU)进行投机解码推理的用户,特别是使用 Gemma4 MTP 模型的用户。修复后,CUDA 图的捕获和回放行为更加稳定可靠,减少了因底层流同步问题导致的潜在崩溃或性能抖动。
系统影响:增强了 vLLM 在 AMD GPU 上对投机解码(特别是 MTP 技术)的测试覆盖和运行时稳定性。新增的 CI 步骤为相关功能提供了持续集成和夜间回归验证的能力。
团队影响:为负责投机解码和 ROCm 平台支持的团队提供了更可靠的测试基础设施和更健壮的源码。该 PR 作为 #50519 的拆分,使得相关变更可以更独立地被审查和合入,符合模块化开发实践。

平台特定流同步修复 CI 配置变更(optional) 核心 CUDA 图捕获逻辑

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论