-
Notifications
You must be signed in to change notification settings - Fork 3.1k
[CI] Add CI test for DeepSeek V3.2 MTP #11835
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,105 @@ | ||||||||||||||||||||||||||||||
import unittest | ||||||||||||||||||||||||||||||
from types import SimpleNamespace | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
import requests | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
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.send_one import BenchArgs, send_one_prompt | ||||||||||||||||||||||||||||||
from sglang.test.test_utils import ( | ||||||||||||||||||||||||||||||
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, | ||||||||||||||||||||||||||||||
DEFAULT_URL_FOR_TEST, | ||||||||||||||||||||||||||||||
CustomTestCase, | ||||||||||||||||||||||||||||||
is_in_ci, | ||||||||||||||||||||||||||||||
popen_launch_server, | ||||||||||||||||||||||||||||||
write_github_step_summary, | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
FULL_DEEPSEEK_V3_MODEL_PATH = "deepseek-ai/DeepSeek-V3.2-Exp" | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
class TestDeepseekV32MTP(CustomTestCase): | ||||||||||||||||||||||||||||||
@classmethod | ||||||||||||||||||||||||||||||
def setUpClass(cls): | ||||||||||||||||||||||||||||||
cls.model = FULL_DEEPSEEK_V3_MODEL_PATH | ||||||||||||||||||||||||||||||
Comment on lines
+18
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The constant Ideally, this constant should be defined once in a shared location and imported where needed to adhere to the DRY (Don't Repeat Yourself) principle.
Suggested change
|
||||||||||||||||||||||||||||||
cls.base_url = DEFAULT_URL_FOR_TEST | ||||||||||||||||||||||||||||||
other_args = [ | ||||||||||||||||||||||||||||||
"--trust-remote-code", | ||||||||||||||||||||||||||||||
"--tp", | ||||||||||||||||||||||||||||||
"8", | ||||||||||||||||||||||||||||||
"--dp", | ||||||||||||||||||||||||||||||
"8", | ||||||||||||||||||||||||||||||
"--enable-dp-attention", | ||||||||||||||||||||||||||||||
"--speculative-algorithm", | ||||||||||||||||||||||||||||||
"EAGLE", | ||||||||||||||||||||||||||||||
"--speculative-num-steps", | ||||||||||||||||||||||||||||||
"3", | ||||||||||||||||||||||||||||||
"--speculative-eagle-topk", | ||||||||||||||||||||||||||||||
"1", | ||||||||||||||||||||||||||||||
"--speculative-num-draft-tokens", | ||||||||||||||||||||||||||||||
"4", | ||||||||||||||||||||||||||||||
"--mem-frac", | ||||||||||||||||||||||||||||||
"0.7", | ||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||
cls.process = popen_launch_server( | ||||||||||||||||||||||||||||||
cls.model, | ||||||||||||||||||||||||||||||
cls.base_url, | ||||||||||||||||||||||||||||||
timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, | ||||||||||||||||||||||||||||||
other_args=other_args, | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
@classmethod | ||||||||||||||||||||||||||||||
def tearDownClass(cls): | ||||||||||||||||||||||||||||||
kill_process_tree(cls.process.pid) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
def test_a_gsm8k( | ||||||||||||||||||||||||||||||
self, | ||||||||||||||||||||||||||||||
): # Append an "a" to make this test run first (alphabetically) to warm up the server | ||||||||||||||||||||||||||||||
requests.get(self.base_url + "/flush_cache") | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
args = SimpleNamespace( | ||||||||||||||||||||||||||||||
num_shots=8, | ||||||||||||||||||||||||||||||
data_path=None, | ||||||||||||||||||||||||||||||
num_questions=1400, | ||||||||||||||||||||||||||||||
parallel=1400, | ||||||||||||||||||||||||||||||
max_new_tokens=512, | ||||||||||||||||||||||||||||||
host="http://127.0.0.1", | ||||||||||||||||||||||||||||||
port=int(self.base_url.split(":")[-1]), | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
metrics = run_eval_few_shot_gsm8k(args) | ||||||||||||||||||||||||||||||
print(f"{metrics=}") | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
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=}") | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
if is_in_ci(): | ||||||||||||||||||||||||||||||
write_github_step_summary( | ||||||||||||||||||||||||||||||
f"### test_gsm8k (deepseek-v32 mtp)\n" | ||||||||||||||||||||||||||||||
f'{metrics["accuracy"]=:.3f}\n' | ||||||||||||||||||||||||||||||
f"{avg_spec_accept_length=:.2f}\n" | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
self.assertGreater(metrics["accuracy"], 0.935) | ||||||||||||||||||||||||||||||
self.assertGreater(avg_spec_accept_length, 2.9) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
def test_bs_1_speed(self): | ||||||||||||||||||||||||||||||
args = BenchArgs(port=int(self.base_url.split(":")[-1]), max_new_tokens=2048) | ||||||||||||||||||||||||||||||
acc_length, speed = send_one_prompt(args) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
print(f"{acc_length=:.2f} {speed=:.2f}") | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
if is_in_ci(): | ||||||||||||||||||||||||||||||
write_github_step_summary( | ||||||||||||||||||||||||||||||
f"### test_bs_1_speed (deepseek-v32 mtp)\n" | ||||||||||||||||||||||||||||||
f"{acc_length=:.2f}\n" | ||||||||||||||||||||||||||||||
f"{speed=:.2f} token/s\n" | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
self.assertGreater(acc_length, 2.9) | ||||||||||||||||||||||||||||||
self.assertGreater(speed, 75) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
if __name__ == "__main__": | ||||||||||||||||||||||||||||||
unittest.main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test class shares a lot of duplicate code with
TestDeepseekV32Basic
intest/srt/test_deepseek_v32_basic.py
. For example, thetearDownClass
method and large parts of the test methods (test_a_gsm8k
,test_bs_1_speed
) are identical or very similar.To improve maintainability and follow the DRY (Don't Repeat Yourself) principle, consider refactoring the common code into a base test class. The subclasses (
TestDeepseekV32Basic
andTestDeepseekV32MTP
) would then only need to define their specific configurations (e.g.,other_args
insetUpClass
) and any specific assertions.A possible structure could be:
This would make the tests cleaner and easier to maintain in the long run.