# PR #52659 完整报告

- 仓库：`vllm-project/vllm`
- 标题：[CI] Standardize test job labels by device
- 合并时间：2026-08-19 03:50
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/52659

---

# 执行摘要

- 一句话：统一 Buildkite 测试作业标签为设备优先格式
- 推荐动作：值得精读 PR body 及其关联的 vllm-dashboard#67 与 ci-infra#478 两个跨仓库 issue，完整案例展示了「命名迁移」如何通过跨仓库契约（label 格式、verbatim 覆盖、dashboard 兼容）平滑落地；对 CI 标签有深度定制需求的读者可借鉴其唯一性校验与发布顺序设计。后续在 `.buildkite/test_areas` 新增或修改作业时，应遵循 `:<vendor>: (<Device>) <Purpose> [Shard %N]` 约定并注意标签唯一性。

# 功能与动机

PR body 明确提出标准化目标：`Standardize Buildkite test-area labels on a device-first format: :<vendor>: (<Device>) <Purpose> [Shard %N]`。此前标签以用途开头、设备信息隐含或缺失，且 AMD 镜像标签恒为派生的 `AMD: <label> (<device>)`；源标签改为 `:nvidia:` 前缀后，AMD 作业会错误渲染为 `AMD: :nvidia: H200 … (mi300_1)`。因此配套 ci-infra#478 引入 `mirror.amd.label` 可选字段、vllm-dashboard#67 保证仪表盘分组不出现冷缓存缺口，本 PR 为执行主体。

# 实现拆解

1. **确定命名约定**：将全部主标签从「用途优先」改为「设备优先」格式 `:<vendor>: (<Device>) <Purpose>`。例如 `models_multimodal.yaml` 中 `"Multi-Modal Models (Standard) 1: qwen2"` 改为 `":nvidia: (H200) Multimodal Models (Standard) 1: qwen2"`；`lm_eval.yaml` 中 `"LM Eval Small Models"` 改为 `":nvidia: (H200) LM Eval Small Models"`；CPU 作业统一使用 `:computer: (CPU)` 前缀，如 `"Multi-Modal Processor (CPU) %N"` 改为 `":computer: (CPU) Multimodal Processor Shard %N"`。设备名由 step 的 `device` 字段推导：`h200_18gb` → `(H200)`、`mi300_1` → `(MI300)`、`b200-k8s` → `(B200)`，40 个无显式 device 字段的作业按 ci-infra 队列映射标注为 `(L4)`。
2. **为 AMD 镜像作业新增显式标签**：所有带 `mirror.amd` 的 step 在 `mirror.amd` 下新增 `label` 字段，格式为 `":amd: (MI3xx) <同源 purpose>"`。该字段依赖已合入的 ci-infra#478 语义——存在时 verbatim 作为镜像 job 的显示标签，缺省时行为与旧版 `AMD: <label> (<device>)` 派生逻辑逐字节一致，且 NVIDIA 侧标签永不受影响。58 个 AMD 覆盖 `models_multimodal.yaml`、`lm_eval.yaml`、`disaggregated.yaml`、`kernels.yaml`、`spec_decode.yaml`、`engine.yaml` 等文件。
3. **处理并行与唯一性**：所有带 `parallelism` 的作业将 label 中的 `%N` 改写为 `Shard %N`（如 `kernels.yaml` 的 `"Kernels Attention Test %N"` → `":nvidia: (L4) Attention Kernels Shard %N"`），使 Buildkite 展开后的 job 名与渲染结果完全对应。去掉设备后缀后出现四对重复标签，通过简明 purpose 限定词区分：`Basic`/`Extended`（distributed.yaml 的 DP 测试）、`DP + EP`/`Distributed Features`、`FP8 MoE Kernels`/`DeepEP FP8 MoE Kernels`（kernels.yaml）、`Medium`/`Large`，保证 268 个逻辑标签全局唯一。
4. **校验与发布顺序**：PR body 记录了完整验证手段——对所有变更 YAML 做结构对比（剔除 label 字段后与 origin/main 完全一致）、校验 vendor/device/shard 格式与逻辑级 / 展开级双重唯一性、block-key 字符约束（`[A-Za-z0-9_-]+`）、渲染 Buildkite build#84295 全量 pipeline 并逐一比对等。发布顺序为 vllm-dashboard#67 → ci-infra#478 → 本 PR，三者构成同一命名迁移的跨仓库契约。

关键文件：
- `.buildkite/test_areas/models_multimodal.yaml`（模块 测试编排；类别 config；类型 configuration）: 多模态模型测试区域，覆盖 H200、CPU 与多种 AMD 镜像设备，是主标签、AMD 显式标签与 CPU `:computer:` 前缀三类规则同时出现的代表性文件。
- `.buildkite/test_areas/lm_eval.yaml`（模块 测试编排；类别 config；类型 configuration）: 改动量最大的文件（+28/-26），覆盖 H200、H100、B200、A100、DGX Spark 与 8xMI300 等多种设备，完整展示了多设备型号到标签的映射。
- `.buildkite/test_areas/disaggregated.yaml`（模块 测试编排；类别 config；类型 configuration）: KV 传输 / 分离式推理测试区域，大量作业无显式 device 字段、依赖隐式队列映射，PR 中这些作业统一标注为 `:nvidia: (L4)`，是隐式设备映射风险的代表文件。
- `.buildkite/test_areas/kernels.yaml`（模块 测试编排；类别 config；类型 configuration）: kernel 测试区域，包含并行 Shard 后缀改写、FP8/DeepEP MoE 限定词区分等本 PR 最复杂的唯一性处理。
- `.buildkite/test_areas/models_language.yaml`（模块 测试编排；类别 config；类型 configuration）: 语言模型测试区域，主标签、AMD 显式标签与 Granite 仅限 L4 运行的注释说明共同体现设备维度信息的前置化。
- `.buildkite/test_areas/spec_decode.yaml`（模块 测试编排；类别 config；类型 configuration）: 投机解码测试区域，覆盖 H200、B200、H100 与 MI300/MI300_2 混合设备，showcase 多设备镜像配对场景。

关键符号：未识别


# 评论区精华

该 PR 没有实质性的代码评审讨论：`review_comments_count` 为 0，评论区仅有 claude[bot] 的模板提示和 `/ci run` 触发记录（Buildkite #84290）。真正的设计决策记录在 PR body 与两个关联跨仓库 issue 中：
- AMD 镜像标签机制（ci-infra#478）：从派生式 `AMD: <label> (<device>)` 改为可选的 `mirror.amd.label` verbatim 覆盖，避免源标签的 `:nvidia:` 前缀泄漏到 AMD 作业。
- dashboard 分组兼容（vllm-dashboard#67）：识别新旧两种 AMD 格式、保留历史 seed 别名、等待最新映射再响应分组接口，消除冷缓存缺口。
- 重复标签唯一性：四对标签通过限定词区分，属于命名层面的手动约定，无自动化护栏。

- AMD 镜像作业的显式标签机制 (design): 采用可选的 `mirror.amd.label` 字段：存在时 verbatim 使用，缺省时行为与旧版逐字节一致，NVIDIA 侧 label 永不受影响。
- dashboard 冷缓存分组缺口 (design): dashboard 等待加载最新 test-area 映射后再响应分组接口、保留历史 seed 别名、同时识别 `AMD: ` 与 `:amd: ` 两种格式。
- 并行作业标签唯一性约束 (design): 用限定词区分：Basic/Extended、DP + EP/Distributed Features、FP8 MoE Kernels/DeepEP FP8 MoE Kernels、Medium/Large；并行模板统一为 Shard %N。
- 缺少实质 review 评论 (other): 无未解决疑虑；建议合入后观察 dashboard 分组与 AMD 标签实际渲染效果。

# 风险与影响

- 风险：
 1. **隐式设备映射强耦合**：40 个无显式 `device` 字段的作业统一标注为 `:nvidia: (L4)`，依赖 ci-infra 队列到设备的映射保持稳定；若队列映射调整，标签会与实际硬件失配。
 2. **跨仓库前置依赖**：新标签对 AMD 作业的渲染依赖 ci-infra#478 的 `mirror.amd.label` 语义。若该基础设施版本未同步部署，回退逻辑仍可工作（无 label 时沿用旧派生行为），但可能短暂出现 AMD 作业带 `:nvidia:` 前缀的渲染错误。
 3. **唯一性依赖人工约定**：268 个标签唯一性靠限定词和命名规范维持，新增测试作业时若沿用相同 purpose 可能产生冲突，当前无自动检测（仅本次一次性校验）。
 4. **外部工具匹配失效风险**：按旧 label 精确匹配的脚本、Slack 通知或 dashboard 过滤器可能受影响；PR 仅确认了 host-side fast-CI reporter 按 job UUID 去重不受影响，其余外部消费者未逐一排查。
 - 影响：影响范围集中在 CI 可视化与工具链：Buildkite 作业显示名、dashboard 分组与过滤器、历史 job 检索的 label 语义全部变化；对 vLLM 运行时行为、性能、模型推理或用户 API 零影响。收益层面，设备优先命名让跨 NVIDIA/AMD/CPU 的 CI 状态一眼可读，为后续按硬件筛选、资源归因和 dashboard 分组提供统一基础。受影响的直接人群是维护 CI 的团队与依赖 job 标签做统计的外部脚本作者，需要同步更新匹配规则。
 - 风险标记：CI 显示标签与设备映射强耦合 , 跨仓库前置依赖 , 标签唯一性靠人工约定维护 , 外部按 label 匹配的工具可能失效

# 关联脉络

- PR #478 Allow AMD mirrors to declare their own display label: 跨仓库（ci-infra）前置依赖：新增 `mirror.amd.label` 字段，使 58 个 AMD 镜像作业能显式声明 `:amd:` 标签，否则设备优先命名会让 AMD 作业显示 NVIDIA 前缀。
- PR #67 Preserve dashboard grouping across CI label renames: 跨仓库（vllm-dashboard）前置依赖：保证重命名后 dashboard 分组视图不出现冷缓存缺口，并兼容新旧两种 AMD 标签格式。
- PR #40938 [ROCm][CI] Move ROCm AITER quantization tests: 历史 vLLM PR：曾修改 `.buildkite/test_areas/kernels.yaml`（本 PR 改动的同一文件）并调整 CI job 结构；后续新增测试作业时需遵循新的标签唯一性约定。