From bd572360f315095e69fbdce52b3029e26b8de3b2 Mon Sep 17 00:00:00 2001 From: Liangsheng Yin Date: Wed, 24 Dec 2025 01:30:26 +0800 Subject: [PATCH] Tiny apply gsm8k mixin to ngram test (#15606) --- python/sglang/test/kits/gsm8k_accuracy_kit.py | 21 ++++++++-- .../spec}/test_ngram_speculative_decoding.py | 41 ++++--------------- test/srt/models/test_ministral3_models.py | 2 +- .../models/test_nvidia_nemotron_nano_v2.py | 10 ++--- .../models/test_nvidia_nemotron_nano_v2_vl.py | 2 +- test/srt/run_suite.py | 1 - 6 files changed, 31 insertions(+), 46 deletions(-) rename test/{srt => registered/spec}/test_ngram_speculative_decoding.py (63%) diff --git a/python/sglang/test/kits/gsm8k_accuracy_kit.py b/python/sglang/test/kits/gsm8k_accuracy_kit.py index 55099450d..2b88f626b 100644 --- a/python/sglang/test/kits/gsm8k_accuracy_kit.py +++ b/python/sglang/test/kits/gsm8k_accuracy_kit.py @@ -1,13 +1,18 @@ from types import SimpleNamespace +from typing import Optional + +import requests from sglang.test.few_shot_gsm8k import run_eval as run_eval_gsm8k -from sglang.test.test_utils import CustomTestCase class GSM8KMixin: - accuracy: float + gsm8k_accuracy_thres: float + gsm8k_accept_length_thres: Optional[float] = None + + def test_gsm8k(self): + requests.get(self.base_url + "/flush_cache") - def test_gsm8k(self: CustomTestCase): args = SimpleNamespace( num_shots=5, data_path=None, @@ -19,4 +24,12 @@ class GSM8KMixin: ) metrics = run_eval_gsm8k(args) print(f"{metrics=}") - self.assertGreaterEqual(metrics["accuracy"], self.accuracy) + self.assertGreaterEqual(metrics["accuracy"], self.gsm8k_accuracy_thres) + + if self.gsm8k_accept_length_thres is not None: + server_info = requests.get(self.base_url + "/server_info") + avg_spec_accept_length = server_info.json()["internal_states"][0][ + "avg_spec_accept_length" + ] + print(f"{avg_spec_accept_length=}") + self.assertGreater(avg_spec_accept_length, self.gsm8k_accept_length_thres) diff --git a/test/srt/test_ngram_speculative_decoding.py b/test/registered/spec/test_ngram_speculative_decoding.py similarity index 63% rename from test/srt/test_ngram_speculative_decoding.py rename to test/registered/spec/test_ngram_speculative_decoding.py index 3106fa970..8212d6e8c 100644 --- a/test/srt/test_ngram_speculative_decoding.py +++ b/test/registered/spec/test_ngram_speculative_decoding.py @@ -1,11 +1,9 @@ import unittest -from types import SimpleNamespace - -import requests from sglang.srt.environ import envs from sglang.srt.utils import kill_process_tree -from sglang.test.few_shot_gsm8k import run_eval as run_eval_few_shot_gsm8k +from sglang.test.ci.ci_register import register_cuda_ci +from sglang.test.kits.gsm8k_accuracy_kit import GSM8KMixin from sglang.test.test_utils import ( DEFAULT_NGRAM_SPECULATIVE_TARGET_MODEL_FOR_TEST, DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, @@ -14,6 +12,8 @@ from sglang.test.test_utils import ( popen_launch_server, ) +register_cuda_ci(est_time=117, suite="stage-b-test-small-1-gpu") + GSM_DATASET_PATH = None @@ -31,12 +31,11 @@ DEFAULT_SERVER_ARGS = [ ] -class TestNgramSpeculativeDecodingBase(CustomTestCase): - +class TestNgramSpeculativeDecodingBase(GSM8KMixin, CustomTestCase): model = DEFAULT_NGRAM_SPECULATIVE_TARGET_MODEL_FOR_TEST base_url = DEFAULT_URL_FOR_TEST - accuracy_threshold = 0.79 # derived tests need to override this - spec_decode_threshold = 1.8 # derived spec decoding tests need to override this + gsm8k_accuracy_thres = 0.79 # derived tests need to override this + gsm8k_accept_length_thres = 1.8 # derived spec decoding tests need to override this @classmethod def get_server_args(cls): @@ -61,32 +60,6 @@ class TestNgramSpeculativeDecodingBase(CustomTestCase): def tearDownClass(cls): kill_process_tree(cls.process.pid) - def test_gsm8k(self): - requests.get(self.base_url + "/flush_cache") - - args = SimpleNamespace( - num_shots=4, - num_questions=100, - max_new_tokens=512, - parallel=128, - host="http://127.0.0.1", - port=int(self.base_url.split(":")[-1]), - data_path=GSM_DATASET_PATH, - ) - metrics = run_eval_few_shot_gsm8k(args) - print(f"{metrics=}") - - # Use the appropriate metric key based on the test class - metric_key = "accuracy" - self.assertGreater(metrics[metric_key], self.accuracy_threshold) - - server_info = requests.get(self.base_url + "/get_server_info") - avg_spec_accept_length = server_info.json()["internal_states"][0][ - "avg_spec_accept_length" - ] - print(f"{avg_spec_accept_length=}") - self.assertGreater(avg_spec_accept_length, self.spec_decode_threshold) - class TestNgramSpeculativeDecodingTriton(TestNgramSpeculativeDecodingBase): diff --git a/test/srt/models/test_ministral3_models.py b/test/srt/models/test_ministral3_models.py index cd12594ea..96626545c 100644 --- a/test/srt/models/test_ministral3_models.py +++ b/test/srt/models/test_ministral3_models.py @@ -9,7 +9,7 @@ MODEL = "mistralai/Ministral-3-3B-Instruct-2512" class TestMinistral3TextOnly(GSM8KMixin, DefaultServerBase): - accuracy = 0.6 + gsm8k_accuracy_thres = 0.6 model = MODEL other_args = ["--trust-remote-code"] diff --git a/test/srt/models/test_nvidia_nemotron_nano_v2.py b/test/srt/models/test_nvidia_nemotron_nano_v2.py index 274e077fe..336db3718 100644 --- a/test/srt/models/test_nvidia_nemotron_nano_v2.py +++ b/test/srt/models/test_nvidia_nemotron_nano_v2.py @@ -7,19 +7,19 @@ from sglang.test.server_fixtures.default_fixture import DefaultServerBase class TestNvidiaNemotronNanoV2BF16(GSM8KMixin, DefaultServerBase): model = "nvidia/NVIDIA-Nemotron-Nano-9B-v2" - accuracy = 0.87 + gsm8k_accuracy_thres = 0.87 other_args = ["--max-mamba-cache-size", "256"] class TestNvidiaNemotronNanoV2FP8(GSM8KMixin, DefaultServerBase): - accuracy = 0.87 + gsm8k_accuracy_thres = 0.87 model = "nvidia/NVIDIA-Nemotron-Nano-9B-v2-FP8" other_args = ["--max-mamba-cache-size", "256"] @unittest.skipIf(not is_blackwell(), "NVFP4 only supported on blackwell") class TestNvidiaNemotronNanoV2NVFP4(GSM8KMixin, DefaultServerBase): - accuracy = 0.855 + gsm8k_accuracy_thres = 0.855 model = "nvidia/NVIDIA-Nemotron-Nano-9B-v2-NVFP4" other_args = ["--max-mamba-cache-size", "256"] @@ -29,7 +29,7 @@ class TestNvidiaNemotronNanoV2NVFP4(GSM8KMixin, DefaultServerBase): "with different hidden sizes (Nemotron-9B: 4480, Llama-3.2-1B: 2048)" ) class TestNvidiaNemotronNanoV2SpeculativeDecoding(GSM8KMixin, DefaultServerBase): - accuracy = 0.87 + gsm8k_accuracy_thres = 0.87 model = "nvidia/NVIDIA-Nemotron-Nano-9B-v2" other_args = [ "--speculative-algorithm", @@ -60,7 +60,7 @@ class TestNvidiaNemotronNanoV2SpeculativeDecoding(GSM8KMixin, DefaultServerBase) class TestNvidiaNemotronNanoV2SpeculativeDecodingBF16Cache( GSM8KMixin, DefaultServerBase ): - accuracy = 0.87 + gsm8k_accuracy_thres = 0.87 model = "nvidia/NVIDIA-Nemotron-Nano-9B-v2" other_args = [ "--speculative-algorithm", diff --git a/test/srt/models/test_nvidia_nemotron_nano_v2_vl.py b/test/srt/models/test_nvidia_nemotron_nano_v2_vl.py index 6fbb0e276..9caca5bdb 100644 --- a/test/srt/models/test_nvidia_nemotron_nano_v2_vl.py +++ b/test/srt/models/test_nvidia_nemotron_nano_v2_vl.py @@ -9,7 +9,7 @@ MODEL = "nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16" class TestNvidiaNemotronNanoV2VLTextOnly(GSM8KMixin, DefaultServerBase): - accuracy = 0.87 + gsm8k_accuracy_thres = 0.87 model = MODEL other_args = ["--max-mamba-cache-size", "256", "--trust-remote-code"] diff --git a/test/srt/run_suite.py b/test/srt/run_suite.py index cbfd33a2f..14389980b 100644 --- a/test/srt/run_suite.py +++ b/test/srt/run_suite.py @@ -79,7 +79,6 @@ suites = { TestFile("test_model_hooks.py", 6), TestFile("test_modelopt_loader.py", 11), TestFile("test_multi_tokenizer.py", 230), - TestFile("test_ngram_speculative_decoding.py", 177), TestFile("test_no_chunked_prefill.py", 108), TestFile("test_no_overlap_scheduler.py", 217), TestFile("test_original_logprobs.py", 41),