[CI] Drive per-commit stage jobs from a runner table instead of copied job blocks (#40495)

This commit is contained in:
Liangsheng Yin
2026-09-20 15:43:46 -07:00
committed by GitHub
parent d97aed2c90
commit 2e2d8a2fda
3 changed files with 122 additions and 385 deletions
+77 -144
View File
@@ -290,7 +290,6 @@ jobs:
needs.check-changes.outputs.jit_kernel == 'true'
uses: ./.github/workflows/pr-test-jit-kernel.yml
with:
runner_config: 4-gpu-b200
runs_on_map: ${{ needs.check-changes.outputs.runs_on_map }}
jit_kernel: ${{ needs.check-changes.outputs.jit_kernel }}
# On scheduled/parallel-dispatch runs sgl-kernel-build-wheels is skipped, so the wheel
@@ -305,18 +304,27 @@ jobs:
# =============================================== primary ====================================================
# Runs on 5090 (32GB, SM120)
base-a-test-1-gpu-small:
# `name:` is load-bearing: wait-for-jobs gates a stage by job-name prefix,
# and check-pr-test-health carves h20 out by the same name.
base-a-test:
name: base-a-test-${{ matrix.runner_config }}
needs: [check-changes, call-gate, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
strategy:
fail-fast: false
matrix:
include:
# 5090 (32GB, SM120)
- { runner_config: 1-gpu-small, run_timeout: '10', timeout_per_file: '' }
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-a-test-1-gpu-small
runner_config: 1-gpu-small
self_name: base-a-test-${{ matrix.runner_config }}
runner_config: ${{ matrix.runner_config }}
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '10'
run_timeout_minutes: ${{ matrix.run_timeout }}
timeout_per_file: ${{ matrix.timeout_per_file }}
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
@@ -337,62 +345,28 @@ jobs:
# No `secrets: inherit`: this stage has no secret consumer, unlike the GPU
# stages' coredump upload. GITHUB_TOKEN and permissions inherit regardless.
# Runs on 5090 (32GB, SM120)
base-b-test-1-gpu-small:
base-b-test:
name: base-b-test-${{ matrix.runner_config }}
needs: [check-changes, call-gate, wait-for-base-a, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
strategy:
fail-fast: false
matrix:
include:
# 5090 (32GB, SM120)
- { runner_config: 1-gpu-small, run_timeout: '30', timeout_per_file: '' }
- { runner_config: 1-gpu-large, run_timeout: '60', timeout_per_file: '1800' }
- { runner_config: 2-gpu-large, run_timeout: '30', timeout_per_file: '' }
- { runner_config: 4-gpu-b200, run_timeout: '40', timeout_per_file: '' }
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-b-test-1-gpu-small
runner_config: 1-gpu-small
self_name: base-b-test-${{ matrix.runner_config }}
runner_config: ${{ matrix.runner_config }}
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
# Runs on H100 (80GB, SM90) - tests that don't pass on 5090 (FA3, FP8, high VRAM, etc.)
base-b-test-1-gpu-large:
needs: [check-changes, call-gate, wait-for-base-a, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-b-test-1-gpu-large
runner_config: 1-gpu-large
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '60'
timeout_per_file: '1800'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
base-b-test-2-gpu-large:
needs: [check-changes, call-gate, wait-for-base-a, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-b-test-2-gpu-large
runner_config: 2-gpu-large
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
base-b-test-4-gpu-b200:
needs: [check-changes, call-gate, wait-for-base-a, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-b-test-4-gpu-b200
runner_config: 4-gpu-b200
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '40'
run_timeout_minutes: ${{ matrix.run_timeout }}
timeout_per_file: ${{ matrix.timeout_per_file }}
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
@@ -416,104 +390,70 @@ jobs:
skip_pr_test_health_check: ${{ (inputs.skip_pr_test_health_check == true || inputs.test_parallel_dispatch == true || inputs.run_all_tests == true) && 'true' || 'false' }}
secrets: inherit
base-c-test-4-gpu-h100:
base-c-test:
name: base-c-test-${{ matrix.runner_config }}
needs: [check-changes, call-gate, wait-for-base-b, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
strategy:
fail-fast: false
matrix:
include:
- {
runner_config: 4-gpu-h100,
run_timeout: '30',
timeout_per_file: '',
warmup_deep_gemm_models: 'lmsys/sglang-ci-dsv3-test:4',
warmup_server_models: 'lmsys/sglang-ci-dsv3-test:4',
}
- {
runner_config: 8-gpu-h200,
run_timeout: '30',
timeout_per_file: '1800',
warmup_deep_gemm_models: 'deepseek-ai/DeepSeek-V3-0324:8 deepseek-ai/DeepSeek-V3.2:8 zai-org/GLM-5-FP8:8 XiaomiMiMo/MiMo-V2-Flash:4 XiaomiMiMo/MiMo-V2.5:8',
warmup_timeout: '60',
}
- { runner_config: 8-gpu-h20, run_timeout: '30', timeout_per_file: '' }
- { runner_config: 4-gpu-b200, run_timeout: '30', timeout_per_file: '1800' }
- { runner_config: 8-gpu-b300, run_timeout: '60', timeout_per_file: '3600' }
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-c-test-4-gpu-h100
runner_config: 4-gpu-h100
self_name: base-c-test-${{ matrix.runner_config }}
runner_config: ${{ matrix.runner_config }}
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
warmup_deep_gemm_models: 'lmsys/sglang-ci-dsv3-test:4'
warmup_server_models: 'lmsys/sglang-ci-dsv3-test:4'
run_timeout_minutes: ${{ matrix.run_timeout }}
timeout_per_file: ${{ matrix.timeout_per_file }}
warmup_deep_gemm_models: ${{ matrix.warmup_deep_gemm_models }}
warmup_server_models: ${{ matrix.warmup_server_models }}
# Rows that do not set it keep _pr-test-stage.yml's own default.
warmup_timeout_minutes: ${{ matrix.warmup_timeout || '25' }}
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
base-c-test-8-gpu-h200:
needs: [check-changes, call-gate, wait-for-base-b, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-c-test-8-gpu-h200
runner_config: 8-gpu-h200
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
timeout_per_file: '1800'
# Per-model TP must match the test's launch in test/registered/ -- see
# FALLBACK_ARGS in scripts/ci/cuda/warmup_deep_gemm.py for extra dp/ep
# flags. Only models that actually invoke DeepGEMM kernels at runtime
# are listed. Cold-cache ~13 min; warm-cache <=30 s via marker file.
# Server CUDA Graph warmup is combined into this step (warmup_server_models unset).
warmup_deep_gemm_models: 'deepseek-ai/DeepSeek-V3-0324:8 deepseek-ai/DeepSeek-V3.2:8 zai-org/GLM-5-FP8:8 XiaomiMiMo/MiMo-V2-Flash:4 XiaomiMiMo/MiMo-V2.5:8'
warmup_timeout_minutes: '60'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
base-c-test-8-gpu-h20:
needs: [check-changes, call-gate, wait-for-base-b, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-c-test-8-gpu-h20
runner_config: 8-gpu-h20
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
base-c-test-4-gpu-b200:
needs: [check-changes, call-gate, wait-for-base-b, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-c-test-4-gpu-b200
runner_config: 4-gpu-b200
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
timeout_per_file: '1800'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
base-c-test-4-gpu-gb300:
# Separate only because `needs` cannot vary per matrix row: this stage takes
# the aarch64 build, and neither table should wait on the other's.
base-c-test-aarch64:
name: base-c-test-${{ matrix.runner_config }}
needs: [check-changes, call-gate, wait-for-base-b, sgl-kernel-build-wheels, rust-ext-build-aarch64]
if: ${{ !failure() && !cancelled() }}
strategy:
fail-fast: false
matrix:
include:
- { runner_config: 4-gpu-gb300, run_timeout: '30', timeout_per_file: '1800' }
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-c-test-4-gpu-gb300
runner_config: 4-gpu-gb300
self_name: base-c-test-${{ matrix.runner_config }}
runner_config: ${{ matrix.runner_config }}
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '30'
timeout_per_file: '1800'
# The one aarch64 stage, so it takes the aarch64 build, not rust-ext-build's.
run_timeout_minutes: ${{ matrix.run_timeout }}
timeout_per_file: ${{ matrix.timeout_per_file }}
rust_ext_artifact: ${{ needs.rust-ext-build-aarch64.outputs.artifact_name }}
secrets: inherit
base-c-test-8-gpu-b300:
needs: [check-changes, call-gate, wait-for-base-b, sgl-kernel-build-wheels, rust-ext-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_pr-test-stage.yml
with:
self_name: base-c-test-8-gpu-b300
runner_config: 8-gpu-b300
check_changes: ${{ toJson(needs.check-changes.outputs) }}
caller_inputs: ${{ toJson(inputs) }}
partitions: ${{ needs.check-changes.outputs.partitions }}
run_timeout_minutes: '60'
timeout_per_file: '3600'
rust_ext_artifact: ${{ needs.rust-ext-build.outputs.artifact_name }}
secrets: inherit
# List every build and test job: `skipped` passes here, so an omission turns that
# job's failure into a green run with no tests.
pr-test-finish:
@@ -536,18 +476,11 @@ jobs:
call-multimodal-gen-tests,
base-a-test-1-gpu-small,
base-a-test,
base-a-test-cpu,
base-b-test-1-gpu-small,
base-b-test-1-gpu-large,
base-b-test-2-gpu-large,
base-b-test-4-gpu-b200,
base-c-test-4-gpu-h100,
base-c-test-8-gpu-h20,
base-c-test-8-gpu-h200,
base-c-test-4-gpu-b200,
base-c-test-4-gpu-gb300,
base-c-test-8-gpu-b300,
base-b-test,
base-c-test,
base-c-test-aarch64,
]
if: always()
runs-on: ubuntu-latest