Files
sglang/test/registered/8-gpu-models/test_deepseek_v32.py
2026-02-14 23:00:33 +08:00

203 lines
6.4 KiB
Python

import unittest
from sglang.test.accuracy_test_runner import AccuracyTestParams
from sglang.test.ci.ci_register import register_cuda_ci
from sglang.test.performance_test_runner import PerformanceTestParams
from sglang.test.run_combined_tests import run_combined_tests
from sglang.test.test_utils import ModelLaunchSettings, is_blackwell_system
from sglang.test.tool_call_test_runner import ToolCallTestParams
register_cuda_ci(est_time=5400, suite="nightly-8-gpu-common", nightly=True)
DEEPSEEK_V32_MODEL_PATH = "deepseek-ai/DeepSeek-V3.2"
BASE_ARGS = [
"--trust-remote-code",
"--model-loader-extra-config",
'{"enable_multithread_load": true}',
]
TOOL_CALL_ARGS = [
"--tool-call-parser=deepseekv32",
"--reasoning-parser=deepseek-v3",
]
DP_ARGS = [
"--tp=8",
"--dp=8",
"--enable-dp-attention",
]
# Accuracy thresholds
GSM8K_BASELINE = 0.935
GPQA_BASELINE = 0.835
class TestDeepseekV32(unittest.TestCase):
"""Unified test class for DeepSeek V3.2 performance and accuracy.
Tests multiple variants with both performance and accuracy tests:
- dp: Standard TP=8 + DP=8 with dp-attention
- dp+mtp: DP + EAGLE speculative decoding
- tp: Pure TP=8 only
- tp+mtp: Pure TP=8 + EAGLE speculative decoding
"""
def test_deepseek_v32_all_variants(self):
"""Run performance and accuracy for all DeepSeek V3.2 variants."""
TP_ARGS = [
"--tp=8",
]
MTP_ARGS = [
"--speculative-algorithm=EAGLE",
"--speculative-num-steps=3",
"--speculative-eagle-topk=1",
"--speculative-num-draft-tokens=4",
"--mem-frac=0.7",
]
variants = [
# Variant: "dp" - Standard TP=8 + DP=8 with dp-attention
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + DP_ARGS + TOOL_CALL_ARGS,
variant="DP8",
),
# Variant: "dp+mtp" - DP + EAGLE speculative decoding
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + DP_ARGS + TOOL_CALL_ARGS + MTP_ARGS,
env={"SGLANG_ENABLE_SPEC_V2": "1"},
variant="DP8+MTP",
),
# Variant: "tp" - Pure TP=8 only
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + TP_ARGS + TOOL_CALL_ARGS,
variant="TP8",
),
# Variant: "tp+mtp" - Pure TP=8 + EAGLE speculative decoding
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + TP_ARGS + TOOL_CALL_ARGS + MTP_ARGS,
env={"SGLANG_ENABLE_SPEC_V2": "1"},
variant="TP8+MTP",
),
]
run_combined_tests(
models=variants,
test_name="DeepSeek-V3.2",
accuracy_params=AccuracyTestParams(
dataset="gsm8k", baseline_accuracy=GSM8K_BASELINE
),
performance_params=PerformanceTestParams(
batch_sizes=[1, 8, 16, 64],
profile_dir="performance_profiles_deepseek_v32",
),
tool_call_params=ToolCallTestParams(
test_thinking=True, test_reasoning_usage=True
),
)
@unittest.skipIf(is_blackwell_system(), "Requires H200 system")
def test_deepseek_v32_nsa_backends(self):
"""Test NSA attention backend variants (H200 only).
Tests three NSA backend configurations:
- flashmla: flashmla_sparse prefill + flashmla_kv decode
- fa3: FA3 prefill + FA3 decode
- fp8kvcache: default backends with FP8 KV cache
"""
NSA_FLASHMLA_ARGS = [
"--attention-backend=nsa",
"--nsa-prefill-backend=flashmla_sparse",
"--nsa-decode-backend=flashmla_kv",
]
NSA_FA3_ARGS = [
"--attention-backend=nsa",
"--nsa-prefill-backend=fa3",
"--nsa-decode-backend=fa3",
]
NSA_FP8KV_ARGS = [
"--attention-backend=nsa",
"--kv-cache-dtype=fp8_e4m3",
]
nsa_variants = [
# flashmla backend
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + DP_ARGS + NSA_FLASHMLA_ARGS,
),
# fa3 backend
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + DP_ARGS + NSA_FA3_ARGS,
),
# fp8 kv cache
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + DP_ARGS + NSA_FP8KV_ARGS,
),
]
run_combined_tests(
models=nsa_variants,
test_name="DeepSeek-V3.2 NSA Backends",
accuracy_params=AccuracyTestParams(
dataset="gsm8k", baseline_accuracy=GSM8K_BASELINE
),
performance_params=None,
)
@unittest.skipIf(
not is_blackwell_system(),
"Hardware agnostic - just using B200 for efficiency reasons",
)
def test_deepseek_v32_b200(self):
"""Test DeepSeek V3.2 with GPQA evaluation using thinking mode (B200 only).
This test runs GPQA evaluation with the reasoning parser enabled.
"""
B200_REASONING_ARGS = [
"--tool-call-parser=deepseekv32",
"--reasoning-parser=deepseek-v3",
]
variants = [
ModelLaunchSettings(
DEEPSEEK_V32_MODEL_PATH,
tp_size=8,
extra_args=BASE_ARGS + DP_ARGS + B200_REASONING_ARGS,
),
]
run_combined_tests(
models=variants,
test_name="DeepSeek-V3.2 GPQA (B200)",
accuracy_params=AccuracyTestParams(
dataset="gpqa",
baseline_accuracy=GPQA_BASELINE,
num_examples=198,
num_threads=198,
max_tokens=120000,
thinking_mode="deepseek-v3",
temperature=0.1,
repeat=4,
),
performance_params=None, # Skip performance test for GPQA
)
if __name__ == "__main__":
unittest.main()