Skip to content

Commit a51fced

Browse files
authored
Migrate H100/A100 runners to OSDC (ARC) (#179)
* Migrate linux.aws.h100/a100 runners to OSDC (ARC) runners Switch all linux.aws.h100* and linux.aws.a100 runner labels to their OSDC/ARC equivalents. Labels follow the mapping in pytorch/pytorch .github/arc.yaml, with the mt- (Meta multi-tenant) prefix that OSDC production runners use: linux.aws.a100 -> mt-l-x86iavx512-11-125-a100 (1 GPU) linux.aws.h100 -> mt-l-x86iamx-22-225-h100 (1 GPU) linux.aws.h100.4 -> mt-l-x86iamx-88-900-h100-4 (4 GPU) linux.aws.h100.8 -> mt-l-bx86iamx-176-1800-h100-8 (8 GPU) Files: - generate_vllm_benchmark_matrix.py: TP_TO_RUNNER_MAPPING and RUNNER_TO_PLATFORM_MAPPING get the full label rename. In PLATFORM_SKIPS the skip tokens become the bare GPU-type 'h100'/'a100' so they remain a substring of the OSDC names, preserving the 'skip the whole family' behavior the substring matcher relies on (matters for h100, which has 1/4/8-GPU variants). - vllm-ci-test.yml, vllm-profiling.yml, pytorch-bisect.yaml: runs-on / runner choice updated. - test fixture: expected runner values updated to the OSDC names. The matrix output is unchanged except for the runner label strings (verified: every model<->runner pairing is identical after the rename). * Containerize vLLM CI test + profiling workflows for OSDC runners OSDC/ARC runners are ephemeral pods with no Docker daemon, so the old 'docker run --gpus all + docker exec' pattern cannot work on them. Run the vLLM CI image via the job-level container: key with options '--gpus all' instead (the GPU is injected by the runner pod), matching pytorch/pytorch _linux-test.yml (test-osdc) and pytorch/helion. - vllm-ci-test.yml / vllm-profiling.yml: add an ubuntu-latest 'resolve-image' pre-job that runs 'docker manifest inspect' (needs a daemon the pod lacks) to pick the latest available vLLM CI image and pass it down as the container image. Drop the GPU_FLAG/docker run/docker exec wrapper and the /tmp/workspace bind-mount; run the scripts directly in the container. - vllm-profiling.yml: assume the upload IAM role via OIDC before the S3 upload (ephemeral pods have no host instance role); pass the resolved vLLM commit through as S3_HEAD_SHA. - run_vllm_profiling.sh: use $GITHUB_WORKSPACE instead of the hardcoded /tmp/workspace bind-mount path. * Containerize pytorch-bisect.yaml mt- (OSDC) path in a CUDA devel container The mt- runner is an ephemeral OSDC pod with no host CUDA toolchain, so build PyTorch inside pytorch/pytorch:2.12.0-cuda13.0-cudnn9-devel (--gpus all) when the mt- runner is selected; linux.dgx.b200 keeps the existing bare-host path (conditional container via fromJSON('null')). CUDA_HOME points at the image's /usr/local/cuda on the container path (run.sh requires it non-empty). Add a git safe.directory step for the root-owned in-container checkout. * Containerize vllm-benchmark + sglang benchmarks for OSDC (all devices) Run every matrix device inside a job-level container: instead of the old 'docker run + docker exec' pattern, since OSDC/ARC pods have no Docker daemon. - generate_vllm_benchmark_matrix.py: emit a per-entry 'device-name' so the workflow can resolve the container image up front (regenerated the test fixture, which also clears pre-existing config drift). - set-parameters: resolve the upstream image on ubuntu-latest (which has a daemon) via 'docker manifest inspect', then enrich every matrix entry with container-image + device-appropriate container-options. sglang resolves per image suffix (cuda / -cu128-b200 / -rocm630-mi30x) and skips non-cuda/rocm devices instead of failing the whole matrix. - benchmarks job: add container: { image, options }, drop the device probe (device-name comes from the matrix) while keeping the runtime DEVICE_TYPE detection, run the benchmark script natively, and assume the upload IAM role via OIDC for all devices (no host instance role inside a pod). chown is made sudo-optional for the in-container root user. Flagged for CI validation: the per-model S3 'already benchmarked' dedup is dropped (needs the runtime device-type before the container exists); the rocm/hpu container options are best-effort; and --shm-size may be capped on ARC pods. * Revert benchmark/sglang containerization; keep migration minimal The H100/A100 benchmark jobs do not actually run in this repo - they run in pytorch/pytorch's .github/workflows/vllm-benchmark.yml, which consumes the runner labels emitted by generate_vllm_benchmark_matrix.py. So this repo's vllm-benchmark.yml / sglang-benchmark.yml never execute on the migrated OSDC runners and do not need the job-level container rewrite. Revert f6bc62f's four-file change: - vllm-benchmark.yml / sglang-benchmark.yml: back to the docker run/exec pattern (they run on b200 / rocm / cpu / hpu, all of which keep a Docker daemon - not OSDC). - generate_vllm_benchmark_matrix.py: drop the per-entry device-name field (it only existed to drive the dropped containerization). The H100/A100 -> OSDC label rename is kept, since pytorch/pytorch needs it. - test fixture: regenerated from the current benchmark configs (clears pre-existing config drift) with the mt- labels and no device-name. What remains is the minimal migration: the runner label rename plus the containerization of the three workflows that DO run on the migrated runners here (vllm-ci-test, vllm-profiling, pytorch-bisect).
1 parent dc4d250 commit a51fced

7 files changed

Lines changed: 214 additions & 435 deletions

.github/scripts/generate_vllm_benchmark_matrix.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# while ROCm runner are provided by AMD
1515
TP_TO_RUNNER_MAPPING = {
1616
1: [
17-
"linux.aws.h100",
17+
"mt-l-x86iamx-22-225-h100",
1818
"linux.rocm.gpu.gfx942.1",
1919
"linux.24xl.spr-metal",
2020
"linux.24xl.gnr",
@@ -25,20 +25,20 @@
2525
# NB: There is no 2xH100 runner at the momement, so let's use the next one
2626
# in the list here which is 4xH100
2727
2: [
28-
"linux.aws.h100.4",
28+
"mt-l-x86iamx-88-900-h100-4",
2929
"linux.rocm.gpu.gfx942.2",
3030
"linux.24xl.gnr",
3131
"linux.hpu.gaudi3.8",
3232
"linux.dgx.b200.8",
3333
],
3434
4: [
35-
"linux.aws.h100.4",
35+
"mt-l-x86iamx-88-900-h100-4",
3636
"linux.rocm.gpu.gfx942.4",
3737
"linux.hpu.gaudi3.8",
3838
"linux.dgx.b200.8",
3939
],
4040
8: [
41-
"linux.aws.h100.8",
41+
"mt-l-bx86iamx-176-1800-h100-8",
4242
"linux.rocm.gpu.gfx942.8",
4343
"linux.dgx.b200.8",
4444
"linux.hpu.gaudi3.8",
@@ -47,10 +47,10 @@
4747

4848
# This mapping is needed to find out the platform of the runner
4949
RUNNER_TO_PLATFORM_MAPPING = {
50-
"linux.aws.a100": "cuda",
51-
"linux.aws.h100": "cuda",
52-
"linux.aws.h100.4": "cuda",
53-
"linux.aws.h100.8": "cuda",
50+
"mt-l-x86iavx512-11-125-a100": "cuda",
51+
"mt-l-x86iamx-22-225-h100": "cuda",
52+
"mt-l-x86iamx-88-900-h100-4": "cuda",
53+
"mt-l-bx86iamx-176-1800-h100-8": "cuda",
5454
"linux.dgx.b200": "cuda",
5555
"linux.dgx.b200.8": "cuda",
5656
"linux.rocm.gpu.gfx942.1": "rocm",
@@ -102,61 +102,61 @@
102102
],
103103
# Run some bigger models on B200 to share the load
104104
"Qwen/Qwen3-30B-A3B": [
105-
"linux.aws.a100",
106-
"linux.aws.h100",
105+
"a100",
106+
"h100",
107107
"linux.rocm.gpu.gfx942", # TODO: Fail on ROCm
108108
"linux.24xl.gnr",
109109
"linux.hpu.gaudi3.8",
110110
],
111111
"google/gemma-3-27b-it": [
112-
"linux.aws.a100",
113-
"linux.aws.h100",
112+
"a100",
113+
"h100",
114114
"linux.rocm.gpu.gfx942", # TODO (huydhn): Fail on ROCm
115115
"linux.24xl.gnr",
116116
"linux.hpu.gaudi3.8",
117117
],
118118
"meta-llama/Llama-4-Scout-17B-16E-Instruct": [
119-
"linux.aws.a100",
120-
"linux.aws.h100",
119+
"a100",
120+
"h100",
121121
"linux.rocm.gpu.gfx942", # TODO: Fail on ROCm
122122
"linux.24xl.gnr",
123123
"linux.hpu.gaudi3.8",
124124
],
125125
"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": [
126-
"linux.aws.a100",
127-
"linux.aws.h100",
126+
"a100",
127+
"h100",
128128
"linux.rocm.gpu.gfx942", # TODO (huydhn): Hang on ROCm
129129
"linux.24xl.gnr",
130130
"linux.hpu.gaudi3.8",
131131
],
132132
# Run gpt-oss on both H100 and B200
133133
"openai/gpt-oss-20b": [
134-
"linux.aws.a100",
134+
"a100",
135135
"linux.24xl.gnr",
136136
"linux.hpu.gaudi3.8",
137137
],
138138
"openai/gpt-oss-120b": [
139-
"linux.aws.a100",
139+
"a100",
140140
"linux.24xl.gnr",
141141
"linux.hpu.gaudi3.8",
142142
],
143143
# Deepseek can only run on B200
144144
"deepseek-ai/DeepSeek-V3.1": [
145-
"linux.aws.a100",
146-
"linux.aws.h100",
145+
"a100",
146+
"h100",
147147
"linux.24xl.gnr",
148148
"linux.hpu.gaudi3.8",
149149
],
150150
"deepseek-ai/DeepSeek-V3.2": [
151-
"linux.aws.a100",
152-
"linux.aws.h100",
151+
"a100",
152+
"h100",
153153
"linux.24xl.gnr",
154154
"linux.hpu.gaudi3.8",
155155
],
156156
"deepseek-ai/DeepSeek-R1": [
157-
"linux.aws.a100",
157+
"a100",
158158
"linux.24xl.gnr",
159-
"linux.aws.h100",
159+
"h100",
160160
"linux.hpu.gaudi3.8",
161161
],
162162
}

.github/scripts/run_vllm_profiling.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ print_configuration() {
1212
}
1313

1414
setup_workspace() {
15-
WORKSPACE_DIR="/tmp/workspace"
15+
# On OSDC/ARC the job runs inside a container and the repo is checked out at
16+
# $GITHUB_WORKSPACE rather than the old docker-run bind mount at /tmp/workspace.
17+
WORKSPACE_DIR="${GITHUB_WORKSPACE:-/tmp/workspace}"
1618
cd "${WORKSPACE_DIR}"
1719

1820
echo "Creating profiling directory: ${VLLM_TORCH_PROFILER_DIR}"

0 commit comments

Comments
 (0)