Add gfx11 (RDNA3/RDNA3.5) benchmark runner support - #91
Merged
Conversation
Magpie selects a benchmark recipe by GPU SKU name, and the catalogue covered
only data-center parts. get_runner_type() raised "No runner type found for
gfx1151" for every client/edge AMD GPU, so Magpie could not benchmark on them
at all.
Adds a shared vllm_gfx11.sh and maps the gfx11 family to a single "gfx11"
runner. The recipe is family-level rather than per-arch because the knobs that
differ from the Instinct scripts are arch properties, not SKU properties, so
one file serves Navi31/32/33, Phoenix, Strix Point, Strix Halo and Krackan.
Also fixes gfx1100, which was mapped to "mi325x" in two separate places.
gfx1100 is Navi31 (RX 7900) while MI325X is gfx942 silicon, so a consumer RDNA3
card silently ran MI-tuned settings instead of erroring.
Changes:
- vllm_gfx11.sh differs from vllm_mi300x.sh in exactly three behaviours:
AITER defaults off (it ships kernels for gfx942/gfx950 only, so enabling it
selects code paths with no kernels for this family); the MEC-firmware probe
is dropped (an Instinct RCCL workaround -- gfx11 reports no MEC line, so the
MI scripts' empty-string test fires for the wrong reason); and
--gpu-memory-utilization honours $GPU_MEMORY_UTILIZATION, which
vllm_mi300x.sh defines and then ignores in favour of a hardcoded 0.95. That
last one matters here because gfx11 spans discrete VRAM and unified GTT. The
default is 0.7 rather than the MI scripts' 0.95 to leave headroom for
profiler buffers under PROFILE=1; throughput-only runs can raise it.
- trace_arch_platform_from_runner returns None for gfx11 rather than deriving
a platform name. A family-level runner cannot identify a per-SKU TraceLens
spec, and the caller already treats None as "run without
--gpu_arch_platform", which lets TraceLens identify the part itself.
- benchmark_images.yaml gains gfx1151 only, reusing the same
vllm/vllm-openai-rocm:v0.23.0 tag the Instinct entries already point at. Its
PYTORCH_ROCM_ARCH is gfx90a;gfx942;gfx950;gfx1100;gfx1101;gfx1200;gfx1201;
gfx1150;gfx1151, so gfx1151 is compiled in and needs no separate image.
Image entries stay per-arch even though the script is shared, because that
tag omits gfx1102/gfx1103/gfx1152/gfx1153 -- those arches will need a
different image when they are added, and listing only confirmed arches keeps
the unsupported ones erroring rather than silently mis-running. No sglang or
atom entries -- no gfx11 image exists for either.
- vllm_gfx11.sh joins LOCAL_EVAL_SCRIPTS in test_eval_concurrency_scripts.py.
That list is what pins every local script to the shared eval-concurrency
contract; a new script that is not listed can silently drift off it, which
is exactly what happened while this branch was in flight.
- tests/test_benchmark_unit_coverage.py had ("gfx1100", "mi325x") in its
arch->runner table. That table enumerates the dict as it stood rather than
asserting intent, so it codified the bug; updated to expect "gfx11".
- Validated end to end on gfx1151 (Radeon 8060S), throughput and accuracy
phases both. The rest of the family is wired up and unit-tested at the
mapping level but has not been run on hardware. Splitting later is cheap:
add vllm_gfx1103.sh and repoint that one dict entry.
mgehre-amd
force-pushed
the
fix/mgehre/gfx11-runner-support
branch
from
September 8, 2026 13:58
deb6b3d to
3aba836
Compare
haofrank
reviewed
Sep 8, 2026
haofrank
left a comment
Member
There was a problem hiding this comment.
Overall LGTM, just one comment.
Member
|
Hi @mgehre-amd I saw there is another PR #90 . Could you check this scope and leave a comment on that PR? |
Collaborator
Author
Thanks, I verified that one and left comments for the missing pieces. |
haofrank
approved these changes
Sep 9, 2026
haofrank
marked this pull request as ready for review
September 9, 2026 17:38
Member
|
Hi @mgehre-amd Everything looks good overall. Do you have any other features to add? If not, we can go ahead and merge. |
Collaborator
Author
I just re-validated this PR and it works fine on my Strix Halo. We can merge. |
This was referenced Sep 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Magpie picks a benchmark recipe by GPU architecture string.
ImageSelector.arch_to_runneronly listed data-center parts, so
get_runner_type("gfx1151")raisedNo runner type found for gfx1151and Magpie could not benchmark on any AMD client/edgeGPU at all.
There was also a latent mapping bug:
gfx1100was mapped tomi325xin two separateplaces.
gfx1100is Navi31 (RX 7900) while MI325X isgfx942silicon, so a consumerRDNA3 card silently ran MI-tuned settings instead of erroring out.
What this does
Adds a shared
vllm_gfx11.shand maps the whole gfx11 family to a singlegfx11runner:The recipe is family-level rather than per-arch because the knobs that differ from the
Instinct scripts are architecture properties, not SKU properties. If one arch ever needs
different behaviour, adding
vllm_gfx<n>.shand repointing that one dict entry is cheap.Impact
gfx942 -> mi300xandgfx950 -> mi355xare asserted unchanged by tests.tests/test_benchmark_unit_coverage.pyhad("gfx1100", "mi325x")in its arch->runner table. That table enumerates the dict as itstood rather than asserting intent, so it codified the bug; it now expects
"gfx11".benchmark_images.yamlgains agfx1151entry only.Design notes
vllm_gfx11.shvsvllm_mi300x.shExactly three behavioural differences:
VLLM_ROCM_USE_AITER:-0; the MI scripts default it to1).It ships kernels for gfx942/gfx950 only, so enabling it selects code paths with no
kernels for this family. The base image's own build config confirms the split:
[[ "$version" == "" || $version -lt 177 ]], and gfx11 reports no MEC line at all, soon this family the empty-string branch fires for the wrong reason.
--gpu-memory-utilizationhonours$GPU_MEMORY_UTILIZATION.vllm_mi300x.shdefines that variable and then passes a hardcoded
0.95anyway.TraceLens
trace_arch_platform_from_runnerreturnsNoneforgfx11instead of deriving aplatform name. A family-level runner cannot identify a per-SKU TraceLens spec, and the
caller already treats
Noneas "run without--gpu_arch_platform", which lets TraceLensidentify the part itself.
Eval-concurrency contract
vllm_gfx11.shis added toLOCAL_EVAL_SCRIPTSintest_eval_concurrency_scripts.py.That list is what pins every local script to the shared eval-concurrency contract, and a
script that is not listed can silently drift off it.
Validation
Unit tests
400 passed. That includes 27 new gfx11 tests plustest_local_eval_scripts_use_environment_for_concurrency[vllm_gfx11.sh], which assertsthe new script uses the same eval-concurrency contract as the MI scripts.
End to end on hardware
Environment: Strix Halo, gfx1151 / AMD Radeon 8060S, single GPU, Docker run mode,
image
rocm/vllm:rocm10.0.0_ubuntu24.04_py3.14_pytorch_2.12.0_vllm_0.27.0(vLLM
0.27.1.dev5) — the exact image this PR adds tobenchmark_images.yaml.Detection and selection resolve on their own. Nothing is pinned by hand except
gpu_arch, andgpu_selectionruns at its default (auto: true):Benchmark config used (
benchmark_vllm_gfx11_e2e.yaml) — small model and request count,since the point is to exercise the script path rather than produce perf numbers:
Run 1 — throughput path (
RUN_EVALunset)Magpie routed itself correctly with no manual override:
Result:
and echoed back by vLLM itself in
server.log:Run 2 — accuracy path (
RUN_EVAL=true)Same command, with the eval envs above enabled, to exercise the eval tail
(
magpie_run_eval_persisted). AlsoStatus: SUCCESS, with the eval artifacts producedand persisted:
The score is meaningless at
EVAL_LIMIT=5on a 0.5B model — what is verified here isthat the path runs, persists
lm_eval/, and writes a well-formed report. Theeval-concurrency contract is confirmed by
lm_eval/meta_env.json, whereEVAL_CONCURRENT_REQUESTSresolved fromCONCand the runner name propagated:{ "conc": 4, "hw": "gfx11", "model": "Qwen/Qwen2.5-0.5B-Instruct", "isl": "128", "osl": "32" }