diff --git a/.github/workflows/nightly-test-amd-rocm720.yml b/.github/workflows/nightly-test-amd-rocm720.yml index 696c16d72..bf5273d08 100644 --- a/.github/workflows/nightly-test-amd-rocm720.yml +++ b/.github/workflows/nightly-test-amd-rocm720.yml @@ -30,12 +30,14 @@ on: # 1-GPU Unit Tests (MI30x + MI35x) - nightly-test-1-gpu-unit-rocm720 - nightly-test-1-gpu-mi35x-rocm720 - # 2-GPU and 4-GPU Tests (MI30x) + # 2-GPU and 4-GPU Tests (MI30x + MI35x) - nightly-accuracy-2-gpu-rocm720 - nightly-accuracy-2-gpu-vlm-rocm720 - nightly-perf-2-gpu-text-rocm720 - nightly-perf-2-gpu-vlm-rocm720 - nightly-4-gpu-rocm720 + # 2-GPU GLM-5.1-MXFP4 (MI35x only) + - nightly-2-gpu-mi35x-glm51-mxfp4-rocm720 # 8-GPU GPT-OSS (MI30x mixes Grok1-FP8; MI35x mixes Qwen3-Coder-Next) - nightly-accuracy-8-gpu-rocm720 - nightly-accuracy-8-gpu-mi35x-rocm720 @@ -55,10 +57,11 @@ on: - nightly-accuracy-8-gpu-mi35x-deepseek-v32-mtp-rocm720 - nightly-perf-8-gpu-mi35x-deepseek-v32-basic-rocm720 - nightly-perf-8-gpu-mi35x-deepseek-v32-mtp-rocm720 - # 8-GPU DeepSeek-R1-MXFP4 (MI35x only) + # 8-GPU DeepSeek-R1 (MI35x only) - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-rocm720 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-kv-fp8-rocm720 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-ar-fusion-rocm720 + - nightly-8-gpu-mi35x-deepseek-r1-hicache-rocm720 # 8-GPU DeepSeek-V4 (MI35x only) - nightly-8-gpu-mi35x-deepseek-v4-flash-rocm720 - nightly-8-gpu-mi35x-deepseek-v4-pro-rocm720 @@ -191,7 +194,7 @@ jobs: exit ${TEST_EXIT_CODE:-0} # ============================================================================== - # 2-GPU and 4-GPU Tests (MI30x) + # 2-GPU and 4-GPU Tests (MI30x + MI35x) # ============================================================================== nightly-accuracy-2-gpu-rocm720: @@ -224,6 +227,41 @@ jobs: echo "$(> $GITHUB_STEP_SUMMARY || true exit ${TEST_EXIT_CODE:-0} + nightly-2-gpu-mi35x-glm51-mxfp4-rocm720: + if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-2-gpu-mi35x-glm51-mxfp4-rocm720,')) + runs-on: linux-mi35x-gpu-2 + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.sha }} + + - name: Ensure VRAM is clear + run: bash scripts/ci/amd/ensure_vram_clear.sh rocm + + - name: Setup docker (ROCm 7.2) + run: | + touch github_summary.md + bash scripts/ci/amd/amd_ci_start_container.sh --rocm-version rocm720 + env: + GITHUB_WORKSPACE: ${{ github.workspace }} + + - name: Install dependencies + run: | + bash scripts/ci/amd/amd_ci_install_dependency.sh --skip-test-time-deps + bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate + bash scripts/ci/amd/amd_ci_exec.sh pip install git+https://github.com/huggingface/transformers.git@96f807a33b75 + + - name: Accuracy Test MI35x ROCm 7.2 (2-GPU GLM-5.1-MXFP4 GSM8K) + timeout-minutes: 120 + run: | + > github_summary.md + bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \ + -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \ + python3 run_suite.py --hw amd --suite nightly-amd-2-gpu-mi35x-glm51-mxfp4 --nightly --timeout-per-file 7200 ${{ (github.event_name == 'schedule' || inputs.continue_on_error) && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$? + echo "$(> $GITHUB_STEP_SUMMARY || true + exit ${TEST_EXIT_CODE:-0} + nightly-accuracy-2-gpu-vlm-rocm720: if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-accuracy-2-gpu-vlm-rocm720,')) runs-on: linux-mi325-2gpu-sglang @@ -936,7 +974,7 @@ jobs: exit ${TEST_EXIT_CODE:-0} # ============================================================================== - # 8-GPU DeepSeek-R1-MXFP4 (MI35x only) + # 8-GPU DeepSeek-R1 (MI35x only) # ============================================================================== nightly-8-gpu-mi35x-deepseek-r1-mxfp4-rocm720: @@ -1077,6 +1115,40 @@ jobs: echo "$(> $GITHUB_STEP_SUMMARY || true exit ${TEST_EXIT_CODE:-0} + nightly-8-gpu-mi35x-deepseek-r1-hicache-rocm720: + if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-8-gpu-mi35x-deepseek-r1-hicache-rocm720,')) + runs-on: linux-mi35x-gpu-8 + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.sha }} + + - name: Ensure VRAM is clear + run: bash scripts/ci/amd/ensure_vram_clear.sh rocm + + - name: Setup docker (ROCm 7.2) + run: | + touch github_summary.md + bash scripts/ci/amd/amd_ci_start_container.sh --rocm-version rocm720 + env: + GITHUB_WORKSPACE: ${{ github.workspace }} + + - name: Install dependencies + run: | + bash scripts/ci/amd/amd_ci_install_dependency.sh --skip-test-time-deps + bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate + + - name: Accuracy Test MI35x ROCm 7.2 (8-GPU DeepSeek-R1 HiCache) + timeout-minutes: 180 + run: | + > github_summary.md + bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \ + -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \ + python3 run_suite.py --hw amd --suite nightly-amd-8-gpu-mi35x-deepseek-r1-hicache --nightly --timeout-per-file 3600 ${{ (github.event_name == 'schedule' || inputs.continue_on_error) && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$? + echo "$(> $GITHUB_STEP_SUMMARY || true + exit ${TEST_EXIT_CODE:-0} + # ============================================================================== # 8-GPU DeepSeek-V4 (MI35x only) # ============================================================================== @@ -1693,12 +1765,13 @@ jobs: # 1-GPU Unit Tests (MI30x + MI35x) - nightly-test-1-gpu-unit-rocm720 - nightly-test-1-gpu-mi35x-rocm720 - # 2-GPU and 4-GPU Tests (MI30x) + # 2-GPU and 4-GPU Tests (MI30x + MI35x) - nightly-accuracy-2-gpu-rocm720 - nightly-accuracy-2-gpu-vlm-rocm720 - nightly-perf-2-gpu-text-rocm720 - nightly-perf-2-gpu-vlm-rocm720 - nightly-4-gpu-rocm720 + - nightly-2-gpu-mi35x-glm51-mxfp4-rocm720 # 8-GPU GPT-OSS (MI30x mixes Grok1-FP8; MI35x mixes Qwen3-Coder-Next) - nightly-accuracy-8-gpu-rocm720 - nightly-accuracy-8-gpu-mi35x-rocm720 @@ -1718,10 +1791,11 @@ jobs: - nightly-accuracy-8-gpu-mi35x-deepseek-v32-mtp-rocm720 - nightly-perf-8-gpu-mi35x-deepseek-v32-basic-rocm720 - nightly-perf-8-gpu-mi35x-deepseek-v32-mtp-rocm720 - # 8-GPU DeepSeek-R1-MXFP4 (MI35x only) + # 8-GPU DeepSeek-R1 (MI35x only) - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-rocm720 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-kv-fp8-rocm720 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-ar-fusion-rocm720 + - nightly-8-gpu-mi35x-deepseek-r1-hicache-rocm720 # 8-GPU DeepSeek-V4 (MI35x only) - nightly-8-gpu-mi35x-deepseek-v4-flash-rocm720 - nightly-8-gpu-mi35x-deepseek-v4-pro-rocm720 diff --git a/.github/workflows/nightly-test-amd.yml b/.github/workflows/nightly-test-amd.yml index c50e10b53..8cde330de 100644 --- a/.github/workflows/nightly-test-amd.yml +++ b/.github/workflows/nightly-test-amd.yml @@ -30,12 +30,14 @@ on: # 1-GPU Unit Tests (MI30x + MI35x) - nightly-test-1-gpu-unit - nightly-test-1-gpu-mi35x - # 2-GPU and 4-GPU Tests (MI30x) + # 2-GPU and 4-GPU Tests (MI30x + MI35x) - nightly-accuracy-2-gpu - nightly-accuracy-2-gpu-vlm - nightly-perf-2-gpu-text - nightly-perf-2-gpu-vlm - nightly-4-gpu + # 2-GPU GLM-5.1-MXFP4 (MI35x only) + - nightly-2-gpu-mi35x-glm51-mxfp4 # 8-GPU GPT-OSS (MI30x mixes Grok1-FP8; MI35x mixes Qwen3-Coder-Next) - nightly-accuracy-8-gpu - nightly-accuracy-8-gpu-mi35x @@ -55,10 +57,11 @@ on: - nightly-accuracy-8-gpu-mi35x-deepseek-v32-mtp - nightly-perf-8-gpu-mi35x-deepseek-v32-basic - nightly-perf-8-gpu-mi35x-deepseek-v32-mtp - # 8-GPU DeepSeek-R1-MXFP4 (MI35x only) + # 8-GPU DeepSeek-R1 (MI35x only) - nightly-8-gpu-mi35x-deepseek-r1-mxfp4 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-kv-fp8 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-ar-fusion + - nightly-8-gpu-mi35x-deepseek-r1-hicache # 8-GPU Kimi-K2.6 (MI30x + MI35x) - nightly-8-gpu-kimi-k26 - nightly-8-gpu-mi35x-kimi-k26 @@ -192,7 +195,7 @@ jobs: exit ${TEST_EXIT_CODE:-0} # ============================================================================== - # 2-GPU and 4-GPU Tests (MI30x) + # 2-GPU and 4-GPU Tests (MI30x + MI35x) # ============================================================================== nightly-accuracy-2-gpu: @@ -226,6 +229,41 @@ jobs: echo "$(> $GITHUB_STEP_SUMMARY || true exit ${TEST_EXIT_CODE:-0} + nightly-2-gpu-mi35x-glm51-mxfp4: + if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-2-gpu-mi35x-glm51-mxfp4,')) + runs-on: linux-mi35x-gpu-2 + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.sha }} + + - name: Ensure VRAM is clear + run: bash scripts/ci/amd/ensure_vram_clear.sh rocm + + - name: Setup docker + run: | + touch github_summary.md + bash scripts/ci/amd/amd_ci_start_container.sh + env: + GITHUB_WORKSPACE: ${{ github.workspace }} + + - name: Install dependencies + run: | + bash scripts/ci/amd/amd_ci_install_dependency.sh + bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate + bash scripts/ci/amd/amd_ci_exec.sh pip install git+https://github.com/huggingface/transformers.git@96f807a33b75 + + - name: Accuracy Test MI35x (2-GPU GLM-5.1-MXFP4 GSM8K) + timeout-minutes: 120 + run: | + > github_summary.md + bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \ + -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \ + python3 run_suite.py --hw amd --suite nightly-amd-2-gpu-mi35x-glm51-mxfp4 --nightly --timeout-per-file 7200 ${{ (github.event_name == 'schedule' || inputs.continue_on_error) && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$? + echo "$(> $GITHUB_STEP_SUMMARY || true + exit ${TEST_EXIT_CODE:-0} + nightly-accuracy-2-gpu-vlm: if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-accuracy-2-gpu-vlm,')) runs-on: linux-mi325-2gpu-sglang @@ -941,7 +979,7 @@ jobs: exit ${TEST_EXIT_CODE:-0} # ============================================================================== - # 8-GPU DeepSeek-R1-MXFP4 (MI35x only) + # 8-GPU DeepSeek-R1 (MI35x only) # ============================================================================== nightly-8-gpu-mi35x-deepseek-r1-mxfp4: @@ -1082,6 +1120,40 @@ jobs: echo "$(> $GITHUB_STEP_SUMMARY || true exit ${TEST_EXIT_CODE:-0} + nightly-8-gpu-mi35x-deepseek-r1-hicache: + if: (github.repository == 'sgl-project/sglang' || github.event_name == 'pull_request') && (!(inputs.job_filter || inputs.job_select) || (inputs.job_filter || inputs.job_select) == 'all' || contains(format(',{0},', inputs.job_filter || inputs.job_select), ',nightly-8-gpu-mi35x-deepseek-r1-hicache,')) + runs-on: linux-mi35x-gpu-8 + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.sha }} + + - name: Ensure VRAM is clear + run: bash scripts/ci/amd/ensure_vram_clear.sh rocm + + - name: Setup docker + run: | + touch github_summary.md + bash scripts/ci/amd/amd_ci_start_container.sh + env: + GITHUB_WORKSPACE: ${{ github.workspace }} + + - name: Install dependencies + run: | + bash scripts/ci/amd/amd_ci_install_dependency.sh + bash scripts/ci/amd/amd_ci_exec.sh pip install tabulate + + - name: Accuracy Test MI35x (8-GPU DeepSeek-R1 HiCache) + timeout-minutes: 180 + run: | + > github_summary.md + bash scripts/ci/amd/amd_ci_exec.sh -w /sglang-checkout/test \ + -e GITHUB_STEP_SUMMARY="/sglang-checkout/github_summary.md" \ + python3 run_suite.py --hw amd --suite nightly-amd-8-gpu-mi35x-deepseek-r1-hicache --nightly --timeout-per-file 3600 ${{ (github.event_name == 'schedule' || inputs.continue_on_error) && '--continue-on-error' || '' }} || TEST_EXIT_CODE=$? + echo "$(> $GITHUB_STEP_SUMMARY || true + exit ${TEST_EXIT_CODE:-0} + # ============================================================================== # 8-GPU Kimi-K2.6 (MI30x + MI35x) # ============================================================================== @@ -1569,12 +1641,13 @@ jobs: # 1-GPU Unit Tests (MI30x + MI35x) - nightly-test-1-gpu-unit - nightly-test-1-gpu-mi35x - # 2-GPU and 4-GPU Tests (MI30x) + # 2-GPU and 4-GPU Tests (MI30x + MI35x) - nightly-accuracy-2-gpu - nightly-accuracy-2-gpu-vlm # - nightly-perf-2-gpu-text # excluded: perf failures don't block CI # - nightly-perf-2-gpu-vlm # excluded: perf failures don't block CI - nightly-4-gpu + - nightly-2-gpu-mi35x-glm51-mxfp4 # 8-GPU GPT-OSS (MI30x mixes Grok1-FP8; MI35x mixes Qwen3-Coder-Next) - nightly-accuracy-8-gpu - nightly-accuracy-8-gpu-mi35x @@ -1594,10 +1667,11 @@ jobs: - nightly-accuracy-8-gpu-mi35x-deepseek-v32-mtp # - nightly-perf-8-gpu-mi35x-deepseek-v32-basic # excluded: perf failures don't block CI # - nightly-perf-8-gpu-mi35x-deepseek-v32-mtp # excluded: perf failures don't block CI - # 8-GPU DeepSeek-R1-MXFP4 (MI35x only) + # 8-GPU DeepSeek-R1 (MI35x only) - nightly-8-gpu-mi35x-deepseek-r1-mxfp4 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-kv-fp8 - nightly-8-gpu-mi35x-deepseek-r1-mxfp4-ar-fusion + - nightly-8-gpu-mi35x-deepseek-r1-hicache # 8-GPU Kimi-K2.6 (MI30x + MI35x) - nightly-8-gpu-kimi-k26 - nightly-8-gpu-mi35x-kimi-k26 diff --git a/test/registered/amd/accuracy/mi35x/test_glm51_mxfp4_tp2_gsm8k_mi35x.py b/test/registered/amd/accuracy/mi35x/test_glm51_mxfp4_tp2_gsm8k_mi35x.py index b2c5ae956..2fa15b6d0 100644 --- a/test/registered/amd/accuracy/mi35x/test_glm51_mxfp4_tp2_gsm8k_mi35x.py +++ b/test/registered/amd/accuracy/mi35x/test_glm51_mxfp4_tp2_gsm8k_mi35x.py @@ -1,25 +1,21 @@ """MI355X GLM-5.1-MXFP4 TP=2 GSM8K accuracy gate. -This is a PR Test (AMD) regression test for the GLM-5.1-MXFP4 TP=2 +This is a nightly AMD regression test for the GLM-5.1-MXFP4 TP=2 accuracy drop seen on MI355X/gfx950 when aiter selected a bad BF16 GEMM path. -Registry: stage-c-test-large-8-gpu-amd-mi35x suite +Registry: nightly-amd-2-gpu-mi35x-glm51-mxfp4 suite """ -import os import resource import unittest from types import SimpleNamespace -from urllib.parse import urlparse - -os.environ.setdefault("HF_HOME", "/data2/models/huggingface") -os.environ.setdefault("HF_HUB_CACHE", "/data2/models/huggingface/hub") from sglang.srt.utils import kill_process_tree from sglang.test.ci.ci_register import register_amd_ci -from sglang.test.few_shot_gsm8k import run_eval as run_gsm8k_eval +from sglang.test.run_eval import run_eval from sglang.test.test_utils import ( DEFAULT_URL_FOR_TEST, + CustomTestCase, is_in_ci, popen_launch_server, write_github_step_summary, @@ -27,19 +23,16 @@ from sglang.test.test_utils import ( register_amd_ci( est_time=3600, - suite="stage-c-test-large-8-gpu-amd-mi35x", + suite="nightly-amd-2-gpu-mi35x-glm51-mxfp4", + nightly=True, ) GLM51_MXFP4_MODEL_ID = "amd/GLM-5.1-MXFP4" -GLM51_MXFP4_LOCAL_PATHS = ( - "/data2/models/amd-GLM-5.1-MXFP4", - "/data/huggingface/hub/amd/GLM-5.1-MXFP4", -) +SERVER_LAUNCH_TIMEOUT = 5400 GSM8K_ACCURACY_THRESHOLD = 0.92 -GSM8K_INVALID_THRESHOLD = 0.02 -DEFAULT_NUM_QUESTIONS = 1200 -DEFAULT_PARALLEL = 1200 +GSM8K_NUM_EXAMPLES = None +GSM8K_NUM_THREADS = 512 def _raise_nofile_limit() -> None: @@ -50,26 +43,16 @@ def _raise_nofile_limit() -> None: resource.setrlimit(resource.RLIMIT_NOFILE, (target, hard)) -def _get_model_path() -> str: - env_path = os.environ.get("GLM51_MXFP4_MODEL_PATH") - if env_path: - return env_path - for path in GLM51_MXFP4_LOCAL_PATHS: - if os.path.exists(path): - return path - return GLM51_MXFP4_MODEL_ID - - -class TestGLM51MXFP4TP2GSM8KMI35x(unittest.TestCase): +class TestGLM51MXFP4TP2GSM8KMI35x(CustomTestCase): @classmethod def setUpClass(cls): _raise_nofile_limit() - cls.model = _get_model_path() + cls.model = GLM51_MXFP4_MODEL_ID cls.base_url = DEFAULT_URL_FOR_TEST cls.process = popen_launch_server( model=cls.model, base_url=cls.base_url, - timeout=5400, + timeout=SERVER_LAUNCH_TIMEOUT, other_args=[ "--tp", "2", @@ -100,44 +83,33 @@ class TestGLM51MXFP4TP2GSM8KMI35x(unittest.TestCase): def tearDownClass(cls): kill_process_tree(cls.process.pid) - def test_gsm8k_accuracy(self): - num_questions = int( - os.environ.get("GLM51_MXFP4_GSM8K_NUM_QUESTIONS", DEFAULT_NUM_QUESTIONS) - ) - parallel = int(os.environ.get("GLM51_MXFP4_GSM8K_PARALLEL", DEFAULT_PARALLEL)) - url = urlparse(self.base_url) + def test_gsm8k(self): args = SimpleNamespace( - num_shots=5, - data_path=None, - num_questions=num_questions, - max_new_tokens=512, - parallel=parallel, - host=url.hostname or "127.0.0.1", - port=url.port or 30000, + base_url=self.base_url, + model=self.model, + eval_name="gsm8k", + api="completion", + num_examples=GSM8K_NUM_EXAMPLES, + num_threads=GSM8K_NUM_THREADS, + max_tokens=512, temperature=0.0, ) - metrics = run_gsm8k_eval(args) - accuracy = metrics["accuracy"] - invalid = metrics["invalid"] - summary = ( - "### GLM-5.1-MXFP4 TP=2 GSM8K (MI355X)\n\n" - "| Model | TP | Questions | Accuracy | Invalid | Threshold | Status |\n" - "| ----- | -- | --------- | -------- | ------- | --------- | ------ |\n" - ) - passed = ( - accuracy >= GSM8K_ACCURACY_THRESHOLD and invalid <= GSM8K_INVALID_THRESHOLD - ) - status = "PASS" if passed else "FAIL" - summary += ( - f"| {self.model} | 2 | {num_questions} | {accuracy:.3f} | " - f"{invalid:.3f} | accuracy >= {GSM8K_ACCURACY_THRESHOLD:.2f} | {status} |\n" - ) - if is_in_ci(): - write_github_step_summary(summary) + metrics = run_eval(args) + print(f"{metrics=}", flush=True) + score = metrics["score"] - self.assertGreaterEqual(accuracy, GSM8K_ACCURACY_THRESHOLD) - self.assertLessEqual(invalid, GSM8K_INVALID_THRESHOLD) + if is_in_ci(): + write_github_step_summary( + "### GLM-5.1-MXFP4 TP=2 GSM8K (MI355X)\n\n" + "| Model | Examples | Max Parallel | Score | Threshold | Latency |\n" + "| ----- | --------- | ------------ | ----- | --------- | ------- |\n" + f"| {self.model} | full | default ({GSM8K_NUM_THREADS}) | " + f"{score:.3f} | {GSM8K_ACCURACY_THRESHOLD:.2f} | " + f"{metrics.get('latency', 0):.1f}s |\n" + ) + + self.assertGreaterEqual(score, GSM8K_ACCURACY_THRESHOLD) if __name__ == "__main__": diff --git a/test/registered/amd/test_deepseek_r1_hicache_mi35x.py b/test/registered/amd/test_deepseek_r1_hicache_mi35x.py index 2ccd50970..4010536be 100644 --- a/test/registered/amd/test_deepseek_r1_hicache_mi35x.py +++ b/test/registered/amd/test_deepseek_r1_hicache_mi35x.py @@ -1,4 +1,4 @@ -"""MI35x DeepSeek-R1-0528 FP8 HiCache PR Test (8-GPU) +"""MI35x DeepSeek-R1-0528 FP8 HiCache Nightly Test (8-GPU) Regression guard: launches DeepSeek-R1-0528 (native FP8, MLA, aiter attention backend) on MI35x with the full L1+L2+L3 HiCache hierarchy wired up @@ -6,13 +6,13 @@ backend) on MI35x with the full L1+L2+L3 HiCache hierarchy wired up GSM8K few-shot completion and asserts the accuracy still matches the established threshold. The goal is to catch regressions where HiCache breaks DSR1-0528 generation correctness, not to stress-test the cascade -overflow path (that lives in the nightly suite). +overflow path. -Acceptance: GSM8K (200 questions, 5-shot, completion API) score >= 0.93, +Acceptance: GSM8K (1319 questions, 5-shot, completion API) score >= 0.93, matching ``test_deepseek_r1_eval_mi35x.py`` / ``test_deepseek_r1_eval_amd.py``. -Registry: stage-c-test-large-8-gpu-amd-mi35x (per-commit PR suite). +Registry: nightly-amd-8-gpu-mi35x-deepseek-r1-hicache suite. """ import os @@ -21,12 +21,6 @@ import tempfile import unittest from types import SimpleNamespace -# MI35x CI runner caches HF models on a fast local volume. We only fall -# back to this if HF_HOME isn't already set by the runner (e.g. repro_ci.sh -# points HF_HOME at /sgl-data/hf-cache); never force HF_HUB_CACHE so -# huggingface_hub keeps deriving it as $HF_HOME/hub. -os.environ.setdefault("HF_HOME", "/data2/models/huggingface") - from sglang.srt.utils import kill_process_tree from sglang.test.ci.ci_register import register_amd_ci from sglang.test.run_eval import run_eval @@ -38,18 +32,21 @@ from sglang.test.test_utils import ( write_github_step_summary, ) -# ~15 min: 5-8 min weight load + ~2-3 min GSM8K + slack. -register_amd_ci(est_time=900, suite="stage-c-test-large-8-gpu-amd-mi35x") +# DSR1-0528 can spend 20+ min in weight loading on MI35x before warmup. +register_amd_ci( + est_time=5400, + suite="nightly-amd-8-gpu-mi35x-deepseek-r1-hicache", + nightly=True, +) DEEPSEEK_R1_MODEL_PATH = "deepseek-ai/DeepSeek-R1-0528" -SERVER_LAUNCH_TIMEOUT = 1500 +SERVER_LAUNCH_TIMEOUT = 3600 # Threshold matches the existing nightly AMD DSR1-0528 accuracy tests: # test/registered/amd/accuracy/mi35x/test_deepseek_r1_eval_mi35x.py # test/registered/amd/accuracy/mi30x/test_deepseek_r1_eval_amd.py GSM8K_ACCURACY_THRESHOLD = 0.93 -GSM8K_NUM_EXAMPLES = 200 -GSM8K_NUM_SHOTS = 5 +GSM8K_NUM_EXAMPLES = None GSM8K_NUM_THREADS = 64 @@ -140,31 +137,29 @@ class TestDeepSeekR1HiCacheMI35x(CustomTestCase): """GSM8K few-shot completion against the HiCache-enabled DSR1-0528.""" args = SimpleNamespace( base_url=self.base_url, + model=self.model, eval_name="gsm8k", api="completion", num_examples=GSM8K_NUM_EXAMPLES, - num_shots=GSM8K_NUM_SHOTS, num_threads=GSM8K_NUM_THREADS, max_tokens=512, temperature=0.0, ) metrics = run_eval(args) + print(f"{metrics=}", flush=True) score = metrics["score"] - print(f"GSM8K {metrics=}", flush=True) if is_in_ci(): write_github_step_summary( "### DeepSeek-R1-0528 FP8 HiCache GSM8K (MI35x)\n\n" - f"- score: `{score:.3f}` (threshold `{GSM8K_ACCURACY_THRESHOLD}`)\n" - f"- latency: `{metrics.get('latency', 0):.1f}s`\n" + "| Model | Examples | Max Parallel | Score | Threshold | Latency |\n" + "| ----- | --------- | ------------ | ----- | --------- | ------- |\n" + f"| {self.model} | full | {GSM8K_NUM_THREADS} | " + f"{score:.3f} | {GSM8K_ACCURACY_THRESHOLD:.2f} | " + f"{metrics.get('latency', 0):.1f}s |\n" ) - self.assertGreater( - score, - GSM8K_ACCURACY_THRESHOLD, - f"DSR1-0528 FP8 + HiCache GSM8K accuracy {score:.3f} " - f"below threshold {GSM8K_ACCURACY_THRESHOLD}", - ) + self.assertGreaterEqual(score, GSM8K_ACCURACY_THRESHOLD) if __name__ == "__main__":