[CI][ROCm] Mirror remaining portable suites without duplicate coverage (#57877)

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

Andreas Karatzas committed Sep 21, 2026 at 04:16 UTC 8902dbb1770b7b1780bf3d978f16cd208702472a
11 files changed +352 -109
.buildkite/test-amd.yaml
+141 -33
@@ -436,7 +436,7 @@ steps:
436 - tests/v1/e2e/general/
437 - vllm/platforms/rocm.py
438 commands:
439 - - pytest -v -s v1/e2e/general --ignore v1/e2e/general/test_async_scheduling.py
439 + - pytest -v -s v1/e2e/general --ignore v1/e2e/general/test_async_scheduling.py --ignore v1/e2e/general/test_kv_sharing_fast_prefill.py -k "not test_mamba_prefix_cache_mrv2"
440
441 - label: ":amd: (MI250) E2E Scheduling" # TBD
442 timeout_in_minutes: 55
@@ -1737,29 +1737,6 @@ steps:
1737 - pytest -v -s tests/ir
1738 - pytest -v -s tests/kernels/ir
1739
1740 -- label: ":amd: (MI300) MLA Kernels" # TBD
1741 - timeout_in_minutes: 25
1742 - mirror_hardwares: [amdexperimental, amdproduction, amdgfx942nightly, amdmi300]
1743 - dind: false
1744 - agent_pool: mi300_1
1745 - working_dir: "/vllm-workspace/"
1746 - source_file_dependencies:
1747 - - vllm/v1/attention/backends/mla/rocm_aiter_mla.py
1748 - - vllm/v1/attention/selector.py
1749 - - vllm/platforms/rocm.py
1750 - - vllm/_aiter_ops.py
1751 - - tests/kernels/attention/test_rocm_aiter_mla_decode.py
1752 - - tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
1753 - - tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
1754 - - tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
1755 - optional: true
1756 - commands:
1757 - - amd-smi
1758 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
1759 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode.py
1760 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
1761 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
1762 -
1740 - label: ":amd: (MI300) Attention Kernels Shard %N" # TBD
1741 timeout_in_minutes: 90
1742 mirror_hardwares: [amdexperimental, amdproduction, amdgfx942nightly, amdmi300]
@@ -1778,7 +1755,7 @@ steps:
1755 - vllm/platforms/rocm.py
1756 - vllm/utils/flashinfer.py
1757 commands:
1781 - - pytest -v -s kernels/attention --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
1758 + - pytest -v -s kernels/attention --ignore=kernels/attention/test_triton_unified_attention_diffkv.py --ignore=kernels/attention/test_rocm_aiter_mla_decode.py --ignore=kernels/attention/test_rocm_aiter_mla_decode_metadata.py --ignore=kernels/attention/test_rocm_aiter_mla_fp8_support.py --ignore=kernels/attention/test_rocm_aiter_mla_op_registration.py --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
1759
1760 - label: ":amd: (MI300) MiniMax Reduce RMS Kernels" # TBD
1761 timeout_in_minutes: 45
@@ -2566,7 +2543,7 @@ steps:
2543 - vllm/platforms/rocm.py
2544 - vllm/entrypoints/generate/beam_search
2545 commands:
2569 - - pytest -v -s samplers
2546 + - pytest -v -s samplers -k "not test_beam_search_passes_multimodal_data"
2547
2548 #------------------------------------------------------------ mi300 · misc ------------------------------------------------------------#
2549
@@ -3364,6 +3341,48 @@ steps:
3341 commands:
3342 - python3 benchmarks/attention_benchmarks/benchmark.py --backends ROCM_ATTN ROCM_AITER_FA ROCM_AITER_UNIFIED_ATTN --batch-specs "8q1s1k"
3343
3344 +#---------------------------------------------------------- mi355 · compile ----------------------------------------------------------#
3345 +
3346 +- label: ":amd: (MI355) PyTorch Compilation H100 Cases"
3347 + timeout_in_minutes: 45
3348 + mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
3349 + dind: false
3350 + agent_pool: mi355_1
3351 + num_gpus: 1
3352 + optional: true
3353 + working_dir: "/vllm-workspace/tests"
3354 + source_file_dependencies:
3355 + - vllm/__init__.py
3356 + - vllm/_aiter_ops.py
3357 + - vllm/_custom_ops.py
3358 + - vllm/compilation/
3359 + - vllm/config/
3360 + - vllm/distributed/
3361 + - "!vllm/distributed/kv_transfer/"
3362 + - vllm/engine/
3363 + - vllm/env_override.py
3364 + - vllm/envs.py
3365 + - vllm/forward_context.py
3366 + - vllm/inputs/
3367 + - vllm/ir/
3368 + - vllm/kernels/
3369 + - vllm/logger.py
3370 + - vllm/model_executor/
3371 + - vllm/multimodal/
3372 + - vllm/platforms/
3373 + - vllm/plugins/
3374 + - vllm/sampling_params.py
3375 + - vllm/sequence.py
3376 + - vllm/transformers_utils/
3377 + - vllm/triton_utils/
3378 + - vllm/utils/
3379 + - vllm/v1/
3380 + - tests/compile/h100/
3381 + - tests/utils.py
3382 + - csrc/
3383 + commands:
3384 + - pytest -v -s compile/h100/test_startup.py
3385 +
3386 #-------------------------------------------------------- mi355 · distributed --------------------------------------------------------#
3387
3388 - label: ":amd: (MI355) Distributed DP Basic" # TBD
@@ -3790,6 +3809,23 @@ steps:
3809
3810 #---------------------------------------------------------- mi355 · kernels ----------------------------------------------------------#
3811
3812 +- label: ":amd: (MI355) Attention DiffKV Kernels"
3813 + timeout_in_minutes: 35
3814 + mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
3815 + dind: false
3816 + agent_pool: mi355_1
3817 + num_gpus: 1
3818 + optional: true
3819 + working_dir: "/vllm-workspace/tests"
3820 + source_file_dependencies:
3821 + - vllm/v1/attention/ops/triton_unified_attention_diffkv.py
3822 + - vllm/v1/attention/backends/triton_attn_diffkv.py
3823 + - tests/kernels/attention/test_triton_unified_attention.py
3824 + - tests/kernels/attention/test_triton_unified_attention_diffkv.py
3825 + - vllm/platforms/rocm.py
3826 + commands:
3827 + - pytest -v -s kernels/attention/test_triton_unified_attention_diffkv.py
3828 +
3829 - label: ":amd: (MI355) Core Operation Kernels Shard %N" # TBD
3830 timeout_in_minutes: 40
3831 mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
@@ -3859,19 +3895,19 @@ steps:
3895 - vllm/_aiter_ops.py
3896 - examples/basic/offline_inference/chat.py
3897 - tests/kernels/attention/test_attention_selector.py
3862 - - tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
3898 optional: true
3899 commands:
3900 - amd-smi
3901 - python3 examples/basic/offline_inference/chat.py --attention-backend TRITON_ATTN
3902 - pytest -v -s tests/kernels/attention/test_attention_selector.py
3868 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
3903
3870 -- label: ":amd: (MI355) MLA Kernels" # TBD
3871 - timeout_in_minutes: 25
3904 +- label: ":amd: (MI355) MLA Kernels"
3905 + timeout_in_minutes: 40
3906 mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
3907 dind: false
3908 agent_pool: mi355_1
3909 + num_gpus: 1
3910 + optional: true
3911 working_dir: "/vllm-workspace/"
3912 source_file_dependencies:
3913 - vllm/v1/attention/backends/mla/rocm_aiter_mla.py
@@ -3882,7 +3918,6 @@ steps:
3918 - tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
3919 - tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
3920 - tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
3885 - optional: true
3921 commands:
3922 - amd-smi
3923 - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
@@ -3908,7 +3943,7 @@ steps:
3943 - vllm/utils/flashinfer.py
3944 optional: true
3945 commands:
3911 - - pytest -v -s kernels/attention --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
3946 + - pytest -v -s kernels/attention --ignore=kernels/attention/test_triton_unified_attention_diffkv.py --ignore=kernels/attention/test_rocm_aiter_mla_decode.py --ignore=kernels/attention/test_rocm_aiter_mla_decode_metadata.py --ignore=kernels/attention/test_rocm_aiter_mla_fp8_support.py --ignore=kernels/attention/test_rocm_aiter_mla_op_registration.py --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
3947
3948 - label: ":amd: (MI355) MoE Kernels Shard %N" # TBD
3949 timeout_in_minutes: 55
@@ -4050,6 +4085,21 @@ steps:
4085
4086 #------------------------------------------------------ mi355 · models / basic -------------------------------------------------------#
4087
4088 +- label: ":amd: (MI355) GLM5Next"
4089 + timeout_in_minutes: 35
4090 + mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
4091 + dind: false
4092 + agent_pool: mi355_1
4093 + num_gpus: 1
4094 + optional: true
4095 + working_dir: "/vllm-workspace/tests"
4096 + source_file_dependencies:
4097 + - vllm/models/glm5next/
4098 + - tests/models/glm5next/
4099 + - vllm/platforms/rocm.py
4100 + commands:
4101 + - pytest -v -s models/glm5next
4102 +
4103 - label: ":amd: (MI355) Basic Models (Extra Initialization) Shard %N" # TBD
4104 timeout_in_minutes: 60
4105 mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
@@ -4087,7 +4137,27 @@ steps:
4137 - export GIT_CONFIG_VALUE_0=HTTP/1.1
4138 - MAMBA_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/AndreasKaratzas/mamba@fix-rocm-7.0-warp-size-constexpr'
4139 - CAUSAL_CONV1D_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/Dao-AILab/causal-conv1d@v1.6.0'
4090 - - pytest -v -s models/language/generation -m hybrid_model --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT --shard-id=$$BUILDKITE_PARALLEL_JOB
4140 + - pytest -v -s models/language/generation -m hybrid_model -k 'not granite-4.0-tiny-preview' --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT --shard-id=$$BUILDKITE_PARALLEL_JOB
4141 +
4142 +- label: ":amd: (MI355) Granite Language Model Compatibility"
4143 + timeout_in_minutes: 80
4144 + mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
4145 + dind: false
4146 + agent_pool: mi355_1
4147 + num_gpus: 1
4148 + optional: true
4149 + working_dir: "/vllm-workspace/tests"
4150 + source_file_dependencies:
4151 + - vllm/
4152 + - "!vllm/distributed/kv_transfer/"
4153 + - tests/models/language/generation
4154 + commands:
4155 + - export GIT_CONFIG_COUNT=1
4156 + - export GIT_CONFIG_KEY_0=http.version
4157 + - export GIT_CONFIG_VALUE_0=HTTP/1.1
4158 + - MAMBA_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/AndreasKaratzas/mamba@fix-rocm-7.0-warp-size-constexpr'
4159 + - CAUSAL_CONV1D_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/Dao-AILab/causal-conv1d@v1.6.0'
4160 + - pytest -v -s models/language/generation -m hybrid_model -k 'granite-4.0-tiny-preview'
4161
4162 - label: ":amd: (MI355) Language Models (Extended Generation)" # TBD
4163 timeout_in_minutes: 95
@@ -4308,8 +4378,46 @@ steps:
4378 # commands:
4379 # - pytest -s -v tests/quantization/test_gfx950_moe.py
4380
4381 +#--------------------------------------------------------- mi355 · samplers ----------------------------------------------------------#
4382 +
4383 +- label: ":amd: (MI355) Samplers Multimodal Beam Search"
4384 + timeout_in_minutes: 45
4385 + mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
4386 + dind: false
4387 + agent_pool: mi355_1
4388 + num_gpus: 1
4389 + optional: true
4390 + working_dir: "/vllm-workspace/tests"
4391 + source_file_dependencies:
4392 + - vllm/model_executor/layers
4393 + - vllm/sampling_metadata.py
4394 + - vllm/v1/sample/
4395 + - vllm/entrypoints/generate/beam_search/
4396 + - tests/samplers
4397 + - tests/conftest.py
4398 + - vllm/_aiter_ops.py
4399 + - vllm/platforms/rocm.py
4400 + commands:
4401 + - pytest -v -s samplers/test_beam_search.py::test_beam_search_passes_multimodal_data
4402 +
4403 #------------------------------------------------------------ mi355 · v1 -------------------------------------------------------------#
4404
4405 +- label: ":amd: (MI355) E2E Core Large Memory"
4406 + timeout_in_minutes: 65
4407 + mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
4408 + dind: false
4409 + agent_pool: mi355_1
4410 + num_gpus: 1
4411 + optional: true
4412 + working_dir: "/vllm-workspace/tests"
4413 + source_file_dependencies:
4414 + - vllm/v1/
4415 + - tests/v1/e2e/general/
4416 + - vllm/platforms/rocm.py
4417 + commands:
4418 + - pytest -v -s v1/e2e/general/test_kv_sharing_fast_prefill.py
4419 + - pytest -v -s v1/e2e/general/test_mamba_prefix_cache.py::test_mamba_prefix_cache_mrv2 v1/e2e/general/test_mamba_prefix_cache.py::test_mamba_prefix_cache_mrv2_async
4420 +
4421 - label: ":amd: (MI355) V1 Attention Shard %N" # TBD
4422 timeout_in_minutes: 125
4423 mirror_hardwares: [amdexperimental, amdproduction, amdgfx950nightly, amdmi355]
.buildkite/test_areas/engine.yaml
+18 -1
@@ -94,7 +94,7 @@ steps:
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
97 + - pytest -v -s v1/e2e/general --ignore v1/e2e/general/test_async_scheduling.py --ignore v1/e2e/general/test_kv_sharing_fast_prefill.py -k "not test_mamba_prefix_cache_mrv2"
98 device: mi250_1
99 timeout_in_minutes: 50
100 depends_on:
@@ -115,6 +115,23 @@ steps:
115 commands:
116 - pytest -v -s v1/e2e/general/test_kv_sharing_fast_prefill.py
117 - pytest -v -s v1/e2e/general/test_mamba_prefix_cache.py::test_mamba_prefix_cache_mrv2 v1/e2e/general/test_mamba_prefix_cache.py::test_mamba_prefix_cache_mrv2_async
118 + mirror:
119 + amd:
120 + label: ":amd: (MI355) E2E Core Large Memory"
121 + dind: false
122 + device: mi355_1
123 + num_devices: 1
124 + timeout_in_minutes: 65
125 + working_dir: /vllm-workspace/tests
126 + depends_on:
127 + - image-build-amd
128 + source_file_dependencies:
129 + - vllm/v1/
130 + - tests/v1/e2e/general/
131 + - vllm/platforms/rocm.py
132 + commands:
133 + - pytest -v -s v1/e2e/general/test_kv_sharing_fast_prefill.py
134 + - pytest -v -s v1/e2e/general/test_mamba_prefix_cache.py::test_mamba_prefix_cache_mrv2 v1/e2e/general/test_mamba_prefix_cache.py::test_mamba_prefix_cache_mrv2_async
135
136 - label: ":nvidia: (L4) V1 E2E"
137 key: v1-e2e-2-gpus
.buildkite/test_areas/kernels.yaml
+45 -27
@@ -196,6 +196,8 @@ steps:
196 - vllm/_aiter_ops.py
197 - vllm/envs.py
198 - vllm/platforms/rocm.py
199 + commands:
200 + - pytest -v -s kernels/attention --ignore=kernels/attention/test_triton_unified_attention_diffkv.py --ignore=kernels/attention/test_rocm_aiter_mla_decode.py --ignore=kernels/attention/test_rocm_aiter_mla_decode_metadata.py --ignore=kernels/attention/test_rocm_aiter_mla_fp8_support.py --ignore=kernels/attention/test_rocm_aiter_mla_op_registration.py --shard-id=$$BUILDKITE_PARALLEL_JOB --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT
201
202 - label: ":nvidia: (H100) Attention DiffKV Kernels"
203 key: kernels-attention-diffkv-test-h100
@@ -209,6 +211,24 @@ steps:
211 - tests/kernels/attention/test_triton_unified_attention_diffkv.py
212 commands:
213 - pytest -v -s kernels/attention/test_triton_unified_attention_diffkv.py
214 + mirror:
215 + amd:
216 + label: ":amd: (MI355) Attention DiffKV Kernels"
217 + dind: false
218 + device: mi355_1
219 + num_devices: 1
220 + timeout_in_minutes: 35
221 + working_dir: /vllm-workspace/tests
222 + depends_on:
223 + - image-build-amd
224 + source_file_dependencies:
225 + - vllm/v1/attention/ops/triton_unified_attention_diffkv.py
226 + - vllm/v1/attention/backends/triton_attn_diffkv.py
227 + - tests/kernels/attention/test_triton_unified_attention.py
228 + - tests/kernels/attention/test_triton_unified_attention_diffkv.py
229 + - vllm/platforms/rocm.py
230 + commands:
231 + - pytest -v -s kernels/attention/test_triton_unified_attention_diffkv.py
232
233 - label: ":nvidia: (H100) MLA Kernel Test"
234 key: kernels-flashmla-test-h100
@@ -231,6 +251,31 @@ steps:
251 - pytest -v -s kernels/attention/test_flashmla_sparse.py
252 - pytest -v -s kernels/attention/test_flashinfer_mla_decode.py
253 - pytest -v -s kernels/attention/test_mla_cross_layer_kernel_equivalence.py
254 + mirror:
255 + amd:
256 + label: ":amd: (MI355) MLA Kernels"
257 + dind: false
258 + device: mi355_1
259 + num_devices: 1
260 + timeout_in_minutes: 40
261 + working_dir: /vllm-workspace/
262 + depends_on:
263 + - image-build-amd
264 + source_file_dependencies:
265 + - vllm/v1/attention/backends/mla/rocm_aiter_mla.py
266 + - vllm/v1/attention/selector.py
267 + - vllm/platforms/rocm.py
268 + - vllm/_aiter_ops.py
269 + - tests/kernels/attention/test_rocm_aiter_mla_decode.py
270 + - tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
271 + - tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
272 + - tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
273 + commands:
274 + - amd-smi
275 + - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
276 + - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode.py
277 + - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
278 + - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
279
280 - label: ":nvidia: (L4) Quantization Kernels Shard %N"
281 key: kernels-quantization-test
@@ -640,31 +685,6 @@ steps:
685 - pytest -v -s kernels/moe/test_moe_layer.py
686 - pytest -v -s kernels/moe/test_deepep_v2_moe.py
687
643 -- label: ":amd: (MI355) MLA Kernels"
644 - key: amd-mla-kernels-mi355
645 - dind: false
646 - device: mi355_1
647 - num_devices: 1
648 - timeout_in_minutes: 25
649 - working_dir: /vllm-workspace/
650 - depends_on:
651 - - image-build-amd
652 - source_file_dependencies:
653 - - vllm/v1/attention/backends/mla/rocm_aiter_mla.py
654 - - vllm/v1/attention/selector.py
655 - - vllm/platforms/rocm.py
656 - - vllm/_aiter_ops.py
657 - - tests/kernels/attention/test_rocm_aiter_mla_decode.py
658 - - tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
659 - - tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
660 - - tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
661 - commands:
662 - - amd-smi
663 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
664 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode.py
665 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_fp8_support.py
666 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_op_registration.py
667 -
688 - label: ":amd: (MI355) FP8 MoE Kernels"
689 key: amd-fp8-moe-kernels-mi355
690 dind: false
@@ -720,9 +740,7 @@ steps:
740 - vllm/_aiter_ops.py
741 - examples/basic/offline_inference/chat.py
742 - tests/kernels/attention/test_attention_selector.py
723 - - tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
743 commands:
744 - amd-smi
745 - python3 examples/basic/offline_inference/chat.py --attention-backend TRITON_ATTN
746 - pytest -v -s tests/kernels/attention/test_attention_selector.py
728 - - pytest -v -s tests/kernels/attention/test_rocm_aiter_mla_decode_metadata.py
.buildkite/test_areas/models_basic.yaml
+11
@@ -119,6 +119,17 @@ steps:
119 - tests/models/glm5next/
120 commands:
121 - pytest -v -s models/glm5next
122 + mirror:
123 + amd:
124 + label: ":amd: (MI355) GLM5Next"
125 + dind: false
126 + device: mi355_1
127 + timeout_in_minutes: 35
128 + working_dir: "/vllm-workspace/tests"
129 + depends_on:
130 + - image-build-amd
131 + source_file_dependencies:
132 + - vllm/platforms/rocm.py
133
134 - label: ":nvidia: (H200) Qwen4 Exp"
135 key: qwen4-exp-unit-tests
.buildkite/test_areas/models_language.yaml
+22 -1
@@ -91,7 +91,7 @@ steps:
91 commands:
92 - MAMBA_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/AndreasKaratzas/mamba@fix-rocm-7.0-warp-size-constexpr'
93 - CAUSAL_CONV1D_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/Dao-AILab/causal-conv1d@v1.6.0'
94 - - pytest -v -s models/language/generation -m hybrid_model --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT --shard-id=$$BUILDKITE_PARALLEL_JOB
94 + - pytest -v -s models/language/generation -m hybrid_model -k 'not granite-4.0-tiny-preview' --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT --shard-id=$$BUILDKITE_PARALLEL_JOB
95
96 # Granite 4 hybrid generation is sensitive to hardware-specific Triton SSD
97 # autotuning (https://github.com/vllm-project/vllm/issues/25194). Keep this one
@@ -111,6 +111,27 @@ steps:
111 - rm -rf /tmp/mamba-src && git clone --depth 1 --branch v2.3.0 https://github.com/state-spaces/mamba /tmp/mamba-src && sed -i 's/-std=c++17/-std=c++20/g' /tmp/mamba-src/setup.py && MAMBA_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation /tmp/mamba-src
112 - CAUSAL_CONV1D_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/Dao-AILab/causal-conv1d@v1.6.0'
113 - pytest -v -s models/language/generation -m hybrid_model -k 'granite-4.0-tiny-preview'
114 + mirror:
115 + amd:
116 + label: ":amd: (MI355) Granite Language Model Compatibility"
117 + dind: false
118 + device: mi355_1
119 + num_devices: 1
120 + timeout_in_minutes: 80
121 + working_dir: /vllm-workspace/tests
122 + depends_on:
123 + - image-build-amd
124 + source_file_dependencies:
125 + - vllm/
126 + - "!vllm/distributed/kv_transfer/"
127 + - tests/models/language/generation
128 + commands:
129 + - export GIT_CONFIG_COUNT=1
130 + - export GIT_CONFIG_KEY_0=http.version
131 + - export GIT_CONFIG_VALUE_0=HTTP/1.1
132 + - MAMBA_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/AndreasKaratzas/mamba@fix-rocm-7.0-warp-size-constexpr'
133 + - CAUSAL_CONV1D_FORCE_BUILD=TRUE uv pip install --system --no-build-isolation 'git+https://github.com/Dao-AILab/causal-conv1d@v1.6.0'
134 + - pytest -v -s models/language/generation -m hybrid_model -k 'granite-4.0-tiny-preview'
135
136 - label: ":nvidia: (H200 MIG 35GB) Language Models (Extended Generation)"
137 device: h200_35gb
.buildkite/test_areas/pytorch.yaml
+14
@@ -87,6 +87,20 @@ steps:
87 - tests/compile/h100/
88 commands:
89 - "find compile/h100/ -name 'test_*.py' -print0 | xargs -0 -n1 -I{} pytest -s -v '{}'"
90 + mirror:
91 + amd:
92 + label: ":amd: (MI355) PyTorch Compilation H100 Cases"
93 + dind: false
94 + device: mi355_1
95 + timeout_in_minutes: 45
96 + working_dir: "/vllm-workspace/tests"
97 + depends_on:
98 + - image-build-amd
99 + source_file_dependencies:
100 + - tests/utils.py
101 + - csrc/
102 + commands:
103 + - pytest -v -s compile/h100/test_startup.py
104
105 - label: ":nvidia: (L4) PyTorch Compilation Passes"
106 key: pytorch-compilation-passes-unit-tests
.buildkite/test_areas/samplers.yaml
+22 -1
@@ -35,7 +35,7 @@ steps:
35 - vllm/_aiter_ops.py
36 - vllm/platforms/rocm.py
37 commands:
38 - - pytest -v -s samplers
38 + - pytest -v -s samplers -k "not test_beam_search_passes_multimodal_data"
39
40 # Qwen2-Audio-7B leaves no room for KV cache on a 16 GiB slice.
41 - label: ":nvidia: (H200 MIG 35GB) Samplers Multimodal Beam Search"
@@ -51,3 +51,24 @@ steps:
51 commands:
52 - VLLM_USE_FLASHINFER_SAMPLER=0 pytest -v -s samplers/test_beam_search.py::test_beam_search_passes_multimodal_data
53 - VLLM_USE_FLASHINFER_SAMPLER=1 pytest -v -s samplers/test_beam_search.py::test_beam_search_passes_multimodal_data
54 + mirror:
55 + amd:
56 + label: ":amd: (MI355) Samplers Multimodal Beam Search"
57 + dind: false
58 + device: mi355_1
59 + num_devices: 1
60 + timeout_in_minutes: 45
61 + working_dir: /vllm-workspace/tests
62 + depends_on:
63 + - image-build-amd
64 + source_file_dependencies:
65 + - vllm/model_executor/layers
66 + - vllm/sampling_metadata.py
67 + - vllm/v1/sample/
68 + - vllm/entrypoints/generate/beam_search/
69 + - tests/samplers
70 + - tests/conftest.py
71 + - vllm/_aiter_ops.py
72 + - vllm/platforms/rocm.py
73 + commands:
74 + - pytest -v -s samplers/test_beam_search.py::test_beam_search_passes_multimodal_data
tests/compile/h100/test_startup.py
+16 -8
@@ -2,7 +2,7 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 """Cold start and warm start tests for vLLM-compile.
4
5 -Cold start runs in a forked child (must fork before CUDA init) which
5 +Cold start runs in a separate child process which
6 populates on-disk caches and asserts cold-start counters. Warm start
7 then runs in the parent with clean in-memory state but populated caches.
8 """
@@ -18,7 +18,7 @@ from vllm.compilation.counter import compilation_counter
18 from vllm.config import CompilationConfig, CompilationMode, CUDAGraphMode, PassConfig
19 from vllm.utils.torch_utils import is_torch_equal_or_newer
20
21 -from ...utils import fork_new_process_for_each_test
21 +from ...utils import create_new_process_for_each_test, requires_spawn_multiprocessing
22
23 MODEL = "microsoft/Phi-tiny-MoE-instruct"
24
@@ -54,17 +54,21 @@ def _cold_start(vllm_runner):
54 assert counters["aot_autograd"]["autograd_cache_hit"] == 0
55
56
57 -@fork_new_process_for_each_test
57 +@create_new_process_for_each_test()
58 @pytest.mark.parametrize("mega_aot_artifact", ["0", "1"])
59 def test_moe_startup(monkeypatch, vllm_runner, fresh_vllm_cache, mega_aot_artifact):
60 monkeypatch.setenv("VLLM_ENABLE_V1_MULTIPROCESSING", "0")
61 monkeypatch.setenv("VLLM_USE_MEGA_AOT_ARTIFACT", mega_aot_artifact)
62 monkeypatch.setenv("VLLM_DEEP_GEMM_WARMUP", "skip")
63
64 - # Cold start in a forked child (must fork before CUDA init).
64 + # ROCm and XPU cannot fork safely after device discovery.
65 # This model has 32 identical transformer layers which produce
66 # 33 subgraphs after splitting on attention — only 3 are unique.
67 - ctx = mp.get_context("fork")
67 + ctx = (
68 + mp.get_context("spawn")
69 + if requires_spawn_multiprocessing()
70 + else mp.get_context("fork")
71 + )
72 p = ctx.Process(target=_cold_start, args=(vllm_runner,))
73 p.start()
74 p.join()
@@ -223,13 +227,17 @@ def _cold_start_model(vllm_runner, spec: ModelStartupSpec):
227
228
229 @pytest.mark.parametrize("spec", MODEL_SPECS)
226 -@fork_new_process_for_each_test
230 +@create_new_process_for_each_test()
231 def test_model_startup(monkeypatch, vllm_runner, fresh_vllm_cache, spec):
232 monkeypatch.setenv("VLLM_ENABLE_V1_MULTIPROCESSING", "0")
233 monkeypatch.setenv("VLLM_DEEP_GEMM_WARMUP", "skip")
234
231 - # Cold start in a forked child (must fork before CUDA init).
232 - ctx = mp.get_context("fork")
235 + # ROCm and XPU cannot fork safely after device discovery.
236 + ctx = (
237 + mp.get_context("spawn")
238 + if requires_spawn_multiprocessing()
239 + else mp.get_context("fork")
240 + )
241 p = ctx.Process(target=_cold_start_model, args=(vllm_runner, spec))
242 p.start()
243 p.join()
tests/kernels/attention/test_triton_unified_attention.py
+2 -1
@@ -135,6 +135,7 @@ def ref_paged_attn(
135 num_seqs = len(query_lens)
136 block_tables = block_tables.cpu().numpy()
137 _, block_size, num_kv_heads, head_size = key_cache.shape
138 + head_size_v = value_cache.shape[-1]
139
140 outputs: list[torch.Tensor] = []
141 start_idx = 0
@@ -149,7 +150,7 @@ def ref_paged_attn(
150
151 k = key_cache[block_indices].view(-1, num_kv_heads, head_size)
152 k = k[:kv_len]
152 - v = value_cache[block_indices].view(-1, num_kv_heads, head_size)
153 + v = value_cache[block_indices].view(-1, num_kv_heads, head_size_v)
154 v = v[:kv_len]
155
156 if q.shape[1] != k.shape[1]:
tests/kernels/attention/test_triton_unified_attention_diffkv.py
+48 -33
@@ -5,6 +5,7 @@
5 import pytest
6 import torch
7
8 +from tests.kernels.attention.test_triton_unified_attention import ref_paged_attn
9 from vllm.platforms import current_platform
10 from vllm.utils.math_utils import next_power_of_2
11 from vllm.utils.torch_utils import (
@@ -81,7 +82,7 @@ def _alloc_segm_buffers(seq_threshold_3D: int, num_query_heads: int, head_size_v
82 @pytest.mark.parametrize("dtype", DTYPES)
83 @pytest.mark.parametrize("seq_threshold_3D", SEQ_THRESHOLD_3D_VALUES)
84 @torch.inference_mode()
84 -def test_triton_unified_attn_diffkv_vs_fa(
85 +def test_triton_unified_attn_diffkv_vs_reference(
86 seq_lens: list[tuple[int, int]],
87 num_heads: tuple[int, int],
88 head_sizes: tuple[int, int],
@@ -93,12 +94,13 @@ def test_triton_unified_attn_diffkv_vs_fa(
94 ) -> None:
95 head_size_qk, head_size_v = head_sizes
96
96 - # DiffKV requires FA3 (Hopper) / FA4 (Blackwell) as the reference.
97 - fa_version = get_flash_attn_version(head_size=head_size_qk, head_size_v=head_size_v)
98 - if not is_flash_attn_varlen_func_available() or fa_version not in (3, 4):
99 - pytest.skip(f"FA DiffKV needs FA3/FA4 (got version {fa_version}).")
100 -
101 - from vllm.v1.attention.backends.fa_utils import flash_attn_varlen_func
97 + # Keep the FA3/FA4 comparison on NVIDIA; ROCm uses the PyTorch oracle.
98 + if not current_platform.is_rocm():
99 + fa_version = get_flash_attn_version(
100 + head_size=head_size_qk, head_size_v=head_size_v
101 + )
102 + if not is_flash_attn_varlen_func_available() or fa_version not in (3, 4):
103 + pytest.skip(f"FA DiffKV needs FA3/FA4 (got version {fa_version}).")
104
105 torch.set_default_device(DEVICE_TYPE)
106 set_random_seed(0)
@@ -135,28 +137,44 @@ def test_triton_unified_attn_diffkv_vs_fa(
137 0, NUM_BLOCKS, (num_seqs, max_num_blocks_per_seq), dtype=torch.int32
138 )
139
138 - # ---- FlashAttention DiffKV (ground truth) ---------------------------
139 - # Mirror the backend: fix degenerate strides on size-1 dims so FA's
140 - # TMA path sees ≥16-byte-aligned strides (matters for num_kv_heads==1).
141 - fa_k = canonicalize_singleton_dim_strides(key_cache)
142 - fa_v = canonicalize_singleton_dim_strides(value_cache)
143 - fa_out = torch.empty(sum(query_lens), num_query_heads, head_size_v, dtype=dtype)
144 - flash_attn_varlen_func(
145 - q=query,
146 - k=fa_k,
147 - v=fa_v,
148 - out=fa_out,
149 - cu_seqlens_q=cu_query_lens,
150 - max_seqlen_q=max_query_len,
151 - seqused_k=kv_lens_t,
152 - max_seqlen_k=max_kv_len,
153 - softmax_scale=scale,
154 - causal=True,
155 - window_size=list(window_size),
156 - block_table=block_tables,
157 - softcap=soft_cap if soft_cap is not None else 0,
158 - fa_version=fa_version,
159 - )
140 + if current_platform.is_rocm():
141 + # FP32 also keeps the helper's in-place scaling off the kernel input.
142 + ref_out = ref_paged_attn(
143 + query.float(),
144 + key_cache.float(),
145 + value_cache.float(),
146 + query_lens,
147 + kv_lens,
148 + block_tables,
149 + scale,
150 + sliding_window=sliding_window,
151 + soft_cap=soft_cap,
152 + ).to(dtype)
153 + else:
154 + from vllm.v1.attention.backends.fa_utils import flash_attn_varlen_func
155 +
156 + # FA's TMA path needs aligned singleton strides (num_kv_heads == 1).
157 + fa_k = canonicalize_singleton_dim_strides(key_cache)
158 + fa_v = canonicalize_singleton_dim_strides(value_cache)
159 + ref_out = torch.empty(
160 + sum(query_lens), num_query_heads, head_size_v, dtype=dtype
161 + )
162 + flash_attn_varlen_func(
163 + q=query,
164 + k=fa_k,
165 + v=fa_v,
166 + out=ref_out,
167 + cu_seqlens_q=cu_query_lens,
168 + max_seqlen_q=max_query_len,
169 + seqused_k=kv_lens_t,
170 + max_seqlen_k=max_kv_len,
171 + softmax_scale=scale,
172 + causal=True,
173 + window_size=list(window_size),
174 + block_table=block_tables,
175 + softcap=soft_cap if soft_cap is not None else 0,
176 + fa_version=fa_version,
177 + )
178
179 # ---- Triton DiffKV --------------------------------------------------
180 segm_output, segm_max, segm_expsum = _alloc_segm_buffers(
@@ -183,7 +201,4 @@ def test_triton_unified_attn_diffkv_vs_fa(
201 softmax_segm_expsum=segm_expsum,
202 )
203
186 - (
187 - torch.testing.assert_close(triton_out, fa_out, atol=2e-2, rtol=2e-2),
188 - f"triton vs FA max abs diff: {torch.max(torch.abs(triton_out - fa_out))}",
189 - )
204 + torch.testing.assert_close(triton_out, ref_out, atol=2e-2, rtol=2e-2)
tests/models/glm5next/test_kda_recurrent.py
+13 -4
@@ -4,18 +4,23 @@
4
5 The decode path hands the kernel column slices of the merged ``q|k|v`` conv
6 output and of the fused ``qkvbfg_a`` projection (beta), so q/k/v/beta are
7 -token-strided rather than contiguous. The kernel must read them in place,
8 -match a pure-PyTorch recurrence, and reject layouts it cannot address.
7 +token-strided rather than contiguous. Both backends must match a pure-PyTorch
8 +recurrence. CUDA reads these slices in place and rejects unsupported layouts;
9 +the ROCm wrapper makes contiguous copies before launching its kernel.
10 """
11
12 import pytest
13 import torch
14
14 -from vllm.models.glm5next.nvidia.ops.third_party.kda import fused_recurrent_kda
15 from vllm.platforms import current_platform
16
17 +if current_platform.is_rocm():
18 + from vllm.models.glm5next.amd.ops.third_party.kda import fused_recurrent_kda
19 +else:
20 + from vllm.models.glm5next.nvidia.ops.third_party.kda import fused_recurrent_kda
21 +
22 pytestmark = pytest.mark.skipif(
18 - not current_platform.is_cuda(), reason="CUDA-only Triton kernel"
23 + not current_platform.is_cuda_alike(), reason="Requires CUDA or ROCm"
24 )
25
26 H, D = 16, 128
@@ -160,6 +165,10 @@ def test_fused_recurrent_kda_strided_inputs_bit_identical_to_contiguous(
165 torch.testing.assert_close(state, state_ref, rtol=0, atol=0)
166
167
168 +@pytest.mark.skipif(
169 + not current_platform.is_cuda(),
170 + reason="Only the CUDA implementation requires zero-copy token-strided layouts",
171 +)
172 @torch.inference_mode()
173 def test_fused_recurrent_kda_rejects_unaddressable_layouts():
174 """Layouts the token-stride addressing cannot express must fail loudly