[CI][ROCm] Deprecate DinD for MI250 test groups (#56162)

Signed-off-by: Andreas Karatzas <Andreas.Karatzas@amd.com> Signed-off-by: Andreas Karatzas <akaratza@amd.com> Co-authored-by: OpenAI Codex <codex@openai.com>

Andreas Karatzas committed Sep 18, 2026 at 16:13 UTC 2c3fb4c545005db887788747b48d040d930604df
18 files changed +102 -6
.buildkite/scripts/hardware_ci/run-amd-test.sh
+8
@@ -1612,6 +1612,13 @@ fi
1612
1613 echo "Final commands: $commands"
1614
1615 +# Match native CPU jobs even when the container can see AMD devices.
1616 +cpu_platform_env=()
1617 +if [[ "${VLLM_CI_EXPECTED_GPU_COUNT:-1}" == "0" \
1618 + && "$commands" != *python_only_compile.sh* ]]; then
1619 + cpu_platform_env=(-e "VLLM_TARGET_DEVICE=cpu")
1620 +fi
1621 +
1622 standalone_merge_base_env=()
1623 if [[ "$commands" == *python_only_compile.sh* ]]; then
1624 # The ROCm test image often ships /vllm-workspace without .git. Resolve the
@@ -1769,6 +1776,7 @@ else
1776 -e "VLLM_CACHE_ROOT=${CONTAINER_CACHE_ROOT}/vllm" \
1777 -e "XDG_CACHE_HOME=${CONTAINER_CACHE_ROOT}/xdg" \
1778 -e "PYTORCH_ROCM_ARCH=" \
1779 + "${cpu_platform_env[@]}" \
1780 "${standalone_merge_base_env[@]}" \
1781 --name "${container_name}" \
1782 "${image_name}" \
.buildkite/test-amd.yaml
+21 -1
@@ -114,6 +114,7 @@ steps:
114 - label: ":computer: (CPU) Basic Models Other" # TBD
115 timeout_in_minutes: 35
116 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
117 + dind: false
118 agent_pool: mi250_1
119 no_gpu: true
120 optional: true
@@ -124,13 +125,15 @@ steps:
125 - tests/models/test_vision.py
126 - tests/models/test_adapters.py
127 - tests/models/transformers/fusers/
128 + - tests/model_executor/layers/test_activation.py
129 - tests/models/test_qwen3_5_mtp_config.py
130 commands:
129 - - pytest -v -s models/test_utils.py models/test_vision.py models/test_adapters.py models/test_qwen3_5_mtp_config.py models/transformers/fusers/
131 + - pytest -v -s models/test_utils.py models/test_vision.py models/test_adapters.py models/test_qwen3_5_mtp_config.py models/transformers/fusers/ model_executor/layers/test_activation.py
132
133 - label: ":computer: (CPU) Multimodal Processor Shard %N" # TBD
134 timeout_in_minutes: 90
135 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
136 + dind: false
137 agent_pool: mi250_1
138 no_gpu: true
139 parallelism: 6
@@ -146,6 +149,7 @@ steps:
149 - label: ":computer: (CPU) V1 Others" # TBD
150 timeout_in_minutes: 45
151 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
152 + dind: false
153 agent_pool: mi250_1
154 no_gpu: true
155 optional: true
@@ -166,6 +170,7 @@ steps:
170 - label: ":computer: (CPU) Async Engine, Inputs, Utils, Worker, Config" # TBD
171 timeout_in_minutes: 80
172 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
173 + dind: false
174 agent_pool: mi250_1
175 no_gpu: true
176 optional: true
@@ -205,6 +210,7 @@ steps:
210 - label: ":computer: (CPU) Rust Frontend Cargo Style + Clippy" # TBD
211 timeout_in_minutes: 35
212 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
213 + dind: false
214 agent_pool: mi250_1
215 no_gpu: true
216 optional: true
@@ -220,6 +226,7 @@ steps:
226 - label: ":computer: (CPU) Rust Frontend Cargo" # TBD
227 timeout_in_minutes: 35
228 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
229 + dind: false
230 agent_pool: mi250_1
231 no_gpu: true
232 optional: true
@@ -235,6 +242,7 @@ steps:
242 - label: ":computer: (CPU) Docker Build Metadata" # TBD
243 timeout_in_minutes: 35
244 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
245 + dind: false
246 agent_pool: mi250_1
247 no_gpu: true
248 optional: true
@@ -265,6 +273,7 @@ steps:
273 - label: ":amd: (MI250) PyTorch Fullgraph Smoke" # TBD
274 timeout_in_minutes: 65
275 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
276 + dind: false
277 agent_pool: mi250_1
278 optional: true
279 working_dir: "/vllm-workspace/tests"
@@ -284,6 +293,7 @@ steps:
293 - label: ":amd: (MI250) Pipeline + Context Parallelism" # TBD
294 timeout_in_minutes: 90
295 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
296 + dind: false
297 agent_pool: mi250_4
298 num_gpus: 4
299 working_dir: "/vllm-workspace/tests"
@@ -311,6 +321,7 @@ steps:
321 timeout_in_minutes: 45
322 parallelism: 2
323 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
324 + dind: false
325 agent_pool: mi250_1
326 optional: true
327 working_dir: "/vllm-workspace/tests"
@@ -328,6 +339,7 @@ steps:
339 - label: ":amd: (MI250) Language Models (PPL)" # TBD
340 timeout_in_minutes: 65
341 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
342 + dind: false
343 agent_pool: mi250_1
344 working_dir: "/vllm-workspace/tests"
345 source_file_dependencies:
@@ -359,6 +371,7 @@ steps:
371 - label: ":amd: (MI250) Multimodal Models (Standard) 3: llava + qwen2_vl" # TBD
372 timeout_in_minutes: 55
373 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
374 + dind: false
375 agent_pool: mi250_1
376 optional: true
377 working_dir: "/vllm-workspace/tests"
@@ -374,6 +387,7 @@ steps:
387 - label: ":amd: (MI250) Batch Invariance" # TBD
388 timeout_in_minutes: 35
389 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
390 + dind: false
391 agent_pool: mi250_1
392 optional: true
393 working_dir: "/vllm-workspace/tests"
@@ -392,6 +406,7 @@ steps:
406 - label: ":amd: (MI250) CUDAGraph" # TBD
407 timeout_in_minutes: 55
408 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
409 + dind: false
410 agent_pool: mi250_1
411 optional: true
412 working_dir: "/vllm-workspace/tests"
@@ -412,6 +427,7 @@ steps:
427 - label: ":amd: (MI250) E2E Core" # TBD
428 timeout_in_minutes: 50
429 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
430 + dind: false
431 agent_pool: mi250_1
432 optional: true
433 working_dir: "/vllm-workspace/tests"
@@ -425,6 +441,7 @@ steps:
441 - label: ":amd: (MI250) E2E Scheduling" # TBD
442 timeout_in_minutes: 55
443 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
444 + dind: false
445 agent_pool: mi250_1
446 optional: true
447 working_dir: "/vllm-workspace/tests"
@@ -438,6 +455,7 @@ steps:
455 - label: ":amd: (MI250) V1 Engine" # TBD
456 timeout_in_minutes: 45
457 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
458 + dind: false
459 agent_pool: mi250_1
460 optional: true
461 working_dir: "/vllm-workspace/tests"
@@ -460,6 +478,7 @@ steps:
478 - label: ":amd: (MI250) Spec Decode Draft Model" # TBD
479 timeout_in_minutes: 60
480 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
481 + dind: false
482 agent_pool: mi250_1
483 optional: true
484 working_dir: "/vllm-workspace/tests"
@@ -477,6 +496,7 @@ steps:
496 - label: ":amd: (MI250) Spec Decode Speculators + MTP" # TBD
497 timeout_in_minutes: 75
498 mirror_hardwares: [amdexperimental, amdproduction, amdgfx90anightly, amdmi250]
499 + dind: false
500 agent_pool: mi250_1
501 optional: true
502 working_dir: "/vllm-workspace/tests"
.buildkite/test_areas/cuda.yaml
+1
@@ -49,6 +49,7 @@ steps:
49 mirror:
50 amd:
51 label: ":amd: (MI250) CUDAGraph"
52 + dind: false
53 device: mi250_1
54 timeout_in_minutes: 55
55 depends_on:
.buildkite/test_areas/distributed.yaml
+1
@@ -416,6 +416,7 @@ steps:
416 mirror:
417 amd:
418 label: ":amd: (MI250) Pipeline + Context Parallelism"
419 + dind: false
420 device: mi250_4
421 timeout_in_minutes: 90
422 depends_on:
.buildkite/test_areas/docker.yaml
+1
@@ -18,6 +18,7 @@ steps:
18 mirror:
19 amd:
20 label: ":amd: (MI250) Docker Build Metadata"
21 + dind: false
22 device: mi250_1
23 no_gpu: true
24 timeout_in_minutes: 35
.buildkite/test_areas/engine.yaml
+3
@@ -52,6 +52,7 @@ steps:
52 mirror:
53 amd:
54 label: ":amd: (MI250) V1 Engine"
55 + dind: false
56 device: mi250_1
57 timeout_in_minutes: 45
58 depends_on:
@@ -71,6 +72,7 @@ steps:
72 mirror:
73 amd:
74 label: ":amd: (MI250) E2E Scheduling"
75 + dind: false
76 device: mi250_1
77 timeout_in_minutes: 55
78 depends_on:
@@ -90,6 +92,7 @@ steps:
92 mirror:
93 amd:
94 label: ":amd: (MI250) E2E Core"
95 + dind: false
96 commands:
97 - pytest -v -s v1/e2e/general --ignore v1/e2e/general/test_async_scheduling.py
98 device: mi250_1
.buildkite/test_areas/kernels.yaml
+2
@@ -322,6 +322,7 @@ steps:
322 mirror:
323 amd:
324 label: ":amd: (MI250) Mamba Kernels"
325 + dind: false
326 device: mi250_1
327 timeout_in_minutes: 55
328 depends_on:
@@ -512,6 +513,7 @@ steps:
513 mirror:
514 amd:
515 label: ":amd: (MI250) Helion Kernels Shard %N"
516 + dind: false
517 device: mi250_1
518 timeout_in_minutes: 45
519 depends_on:
.buildkite/test_areas/misc.yaml
+1
@@ -586,6 +586,7 @@ steps:
586 mirror:
587 amd:
588 label: ":amd: (MI250) Batch Invariance"
589 + dind: false
590 device: mi250_1
591 timeout_in_minutes: 35
592 depends_on:
.buildkite/test_areas/models_basic.yaml
+3 -1
@@ -170,12 +170,14 @@ steps:
170 - tests/models/test_adapters.py
171 - tests/models/test_qwen3_5_mtp_config.py
172 - tests/models/transformers/fusers/
173 + - tests/model_executor/layers/test_activation.py
174 device: cpu-small
175 commands:
175 - - pytest -v -s models/test_utils.py models/test_vision.py models/test_adapters.py models/test_qwen3_5_mtp_config.py models/transformers/fusers/
176 + - pytest -v -s models/test_utils.py models/test_vision.py models/test_adapters.py models/test_qwen3_5_mtp_config.py models/transformers/fusers/ model_executor/layers/test_activation.py
177 mirror:
178 amd:
179 label: ":amd: (MI250) Basic Models Other"
180 + dind: false
181 device: mi250_1
182 no_gpu: true
183 working_dir: "/vllm-workspace/tests"
.buildkite/test_areas/models_language.yaml
+2
@@ -155,6 +155,7 @@ steps:
155 mirror:
156 amd:
157 label: ":amd: (MI250) Language Models (PPL)"
158 + dind: false
159 device: mi250_1
160 timeout_in_minutes: 65
161 depends_on:
@@ -214,6 +215,7 @@ steps:
215 mirror:
216 amd:
217 label: ":amd: (MI250) Language Models (MTEB)"
218 + dind: false
219 device: mi250_1
220 timeout_in_minutes: 60
221 depends_on:
.buildkite/test_areas/models_multimodal.yaml
+2
@@ -57,6 +57,7 @@ steps:
57 mirror:
58 amd:
59 label: ":amd: (MI250) Multimodal Models (Standard) 3: llava + qwen2_vl"
60 + dind: false
61 device: mi250_1
62 timeout_in_minutes: 55
63 depends_on:
@@ -101,6 +102,7 @@ steps:
102 mirror:
103 amd:
104 label: ":amd: (MI250) Multimodal Processor Shard %N"
105 + dind: false
106 device: mi250_1
107 no_gpu: true
108 working_dir: "/vllm-workspace/tests"
.buildkite/test_areas/plugins.yaml
+1
@@ -53,6 +53,7 @@ steps:
53 mirror:
54 amd:
55 label: ":amd: (MI250) Plugin Integration"
56 + dind: false
57 device: mi250_2
58 timeout_in_minutes: 50
59 depends_on:
.buildkite/test_areas/rust_frontend_cargo.yaml
+2
@@ -17,6 +17,7 @@ steps:
17 mirror:
18 amd:
19 label: ":amd: (MI250) Rust Frontend Cargo Style + Clippy"
20 + dind: false
21 device: mi250_1
22 no_gpu: true
23 working_dir: "/vllm-workspace"
@@ -40,6 +41,7 @@ steps:
41 mirror:
42 amd:
43 label: ":amd: (MI250) Rust Frontend Cargo"
44 + dind: false
45 device: mi250_1
46 no_gpu: true
47 working_dir: "/vllm-workspace"
.buildkite/test_areas/samplers.yaml
+1
@@ -20,6 +20,7 @@ steps:
20 mirror:
21 amd:
22 label: ":amd: (MI250) Samplers"
23 + dind: false
24 device: mi250_1
25 timeout_in_minutes: 40
26 depends_on:
tests/conftest.py
+1 -1
@@ -241,7 +241,7 @@ def dist_init():
241 rank=0,
242 distributed_init_method=f"file://{temp_file}",
243 local_rank=0,
244 - backend="nccl",
244 + backend="gloo" if current_platform.is_cpu() else "nccl",
245 )
246 initialize_model_parallel(1, 1)
247 yield
tests/model_executor/layers/test_activation.py new
+38
@@ -0,0 +1,38 @@
1 +# SPDX-License-Identifier: Apache-2.0
2 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 +
4 +from functools import partial
5 +
6 +import pytest
7 +import torch
8 +import torch.nn as nn
9 +
10 +from vllm.model_executor.layers.activation import GeluAndMul, SiluAndMul
11 +from vllm.platforms import CpuArchEnum, current_platform
12 +
13 +
14 +@pytest.mark.skipif(
15 + not current_platform.is_cpu()
16 + or current_platform.get_cpu_architecture() == CpuArchEnum.POWERPC,
17 + reason="Native CPU activations require a non-PowerPC CPU platform",
18 +)
19 +@pytest.mark.parametrize(
20 + "activation_factory,reference",
21 + [
22 + (SiluAndMul, nn.SiLU()),
23 + (GeluAndMul, nn.GELU()),
24 + (partial(GeluAndMul, approximate="tanh"), nn.GELU(approximate="tanh")),
25 + ],
26 + ids=["silu", "gelu", "gelu_tanh"],
27 +)
28 +def test_cpu_act_and_mul_without_compiled_ops(
29 + default_vllm_config, monkeypatch, activation_factory, reference
30 +):
31 + """CPU activations must construct and run without compiled wheel operators."""
32 + default_vllm_config.compilation_config.custom_ops = ["all"]
33 + monkeypatch.setattr(torch.ops, "_C", object())
34 + x = torch.tensor([[-2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0]], device="cpu")
35 +
36 + layer = activation_factory()
37 +
38 + torch.testing.assert_close(layer(x), reference(x[:, :4]) * x[:, 4:])
tests/tools/test_docker_build_metadata_args.py
+6 -1
@@ -155,10 +155,15 @@ def test_vllm_openai_image_embeds_metadata_contract() -> None:
155
156
157 def test_rust_build_cache_excludes_git_metadata() -> None:
158 + import torch
159 +
160 from vllm.platforms import current_platform
161
162 dockerfile_names = ["Dockerfile", "Dockerfile.cpu"]
161 - if not current_platform.is_rocm():
163 + # CPU jobs can reuse ROCm artifacts, which omit the XPU Dockerfile.
164 + if not current_platform.is_rocm() and (
165 + not current_platform.is_cpu() or torch.version.hip is None
166 + ):
167 dockerfile_names.append("Dockerfile.xpu")
168 for name in dockerfile_names:
169 dockerfile = (REPO_ROOT / "docker" / name).read_text()
vllm/model_executor/layers/activation.py
+8 -2
@@ -129,8 +129,11 @@ class SiluAndMul(CustomOp):
129 super().__init__(compile_native=compile_native)
130 if (
131 current_platform.is_cuda_alike()
132 - or current_platform.is_cpu()
132 or current_platform.is_xpu()
133 + or (
134 + current_platform.is_cpu()
135 + and current_platform.get_cpu_architecture() == CpuArchEnum.POWERPC
136 + )
137 ):
138 self.op = torch.ops._C.silu_and_mul
139
@@ -424,8 +427,11 @@ class GeluAndMul(CustomOp):
427 raise ValueError(f"Unknown approximate mode: {approximate}")
428 if (
429 current_platform.is_cuda_alike()
427 - or current_platform.is_cpu()
430 or current_platform.is_xpu()
431 + or (
432 + current_platform.is_cpu()
433 + and current_platform.get_cpu_architecture() == CpuArchEnum.POWERPC
434 + )
435 ):
436 if approximate == "none":
437 self.op = torch.ops._C.gelu_and_mul