"git@developer.sourcefind.cn:renzhc/diffusers_dcu.git" did not exist on "81e71447830ca32879c92d4d90f9d1646fe76f36"
Unverified Commit ebaba856 authored by Ke Bao's avatar Ke Bao Committed by GitHub
Browse files

Update ci test and doc for MTP api change (#5952)

parent de2faef9
...@@ -153,12 +153,10 @@ The precompilation process typically takes around 10 minutes to complete. ...@@ -153,12 +153,10 @@ The precompilation process typically takes around 10 minutes to complete.
**Description**: SGLang implements DeepSeek V3 Multi-Token Prediction (MTP) based on [EAGLE speculative decoding](https://docs.sglang.ai/backend/speculative_decoding.html#EAGLE-Decoding). With this optimization, the decoding speed can be improved by **1.8x** for batch size 1 and **1.5x** for batch size 32 respectively on H200 TP8 setting. **Description**: SGLang implements DeepSeek V3 Multi-Token Prediction (MTP) based on [EAGLE speculative decoding](https://docs.sglang.ai/backend/speculative_decoding.html#EAGLE-Decoding). With this optimization, the decoding speed can be improved by **1.8x** for batch size 1 and **1.5x** for batch size 32 respectively on H200 TP8 setting.
**Usage**: **Usage**:
Add arguments `--speculative-algorithm`, `--speculative-draft-model-path`, Add arguments `--speculative-algorithm`, `--speculative-num-steps`, `--speculative-eagle-topk` and `--speculative-num-draft-tokens` to enable this feature. For example:
`--speculative-num-steps`, `--speculative-eagle-topk` and `--speculative-num-draft-tokens` to enable this feature. For example:
``` ```
python3 -m sglang.launch_server --model-path deepseek-ai/DeepSeek-V3-0324 --speculative-algorithm EAGLE --speculative-draft-model-path lmsys/DeepSeek-V3-0324-NextN --speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2 --trust-remote-code --tp 8 python3 -m sglang.launch_server --model-path deepseek-ai/DeepSeek-V3-0324 --speculative-algorithm EAGLE --speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2 --trust-remote-code --tp 8
``` ```
- The draft model are available at huggingface: [lmsys/DeepSeek-V3-0324-NextN](https://huggingface.co/lmsys/DeepSeek-V3-0324-NextN), [lmsys/DeepSeek-R1-NextN](https://huggingface.co/lmsys/DeepSeek-R1-NextN). It can also be exported from original DeepSeek-V3/R1 model with [export_deepseek_nextn.py](https://github.com/sgl-project/sglang/blob/main/scripts/export_deepseek_nextn.py) script.
- The best configuration for `--speculative-num-steps`, `--speculative-eagle-topk` and `--speculative-num-draft-tokens` can be searched with [bench_speculative.py](https://github.com/sgl-project/sglang/blob/main/scripts/playground/bench_speculative.py) script for given batch size. The minimum configuration is `--speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2`, which can achieve speedup for larger batch sizes. - The best configuration for `--speculative-num-steps`, `--speculative-eagle-topk` and `--speculative-num-draft-tokens` can be searched with [bench_speculative.py](https://github.com/sgl-project/sglang/blob/main/scripts/playground/bench_speculative.py) script for given batch size. The minimum configuration is `--speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2`, which can achieve speedup for larger batch sizes.
When using FlashInfer MLA wrapper (`--attention-backend flashinfer`) with speculative decoding, set the `--speculative-eagle-topk` parameter to `1`. The FlashAttention 3 backend also only supports `--speculative-eagle-topk 1`. When using FlashInfer MLA wrapper (`--attention-backend flashinfer`) with speculative decoding, set the `--speculative-eagle-topk` parameter to `1`. The FlashAttention 3 backend also only supports `--speculative-eagle-topk 1`.
- To enable DeepSeek MTP for large batch sizes (>32), there are some parameters should be changed (Reference [this discussion](https://github.com/sgl-project/sglang/issues/4543#issuecomment-2737413756)): - To enable DeepSeek MTP for large batch sizes (>32), there are some parameters should be changed (Reference [this discussion](https://github.com/sgl-project/sglang/issues/4543#issuecomment-2737413756)):
......
...@@ -347,10 +347,13 @@ class ServerArgs: ...@@ -347,10 +347,13 @@ class ServerArgs:
model_arch = get_model_arch(self) model_arch = get_model_arch(self)
# Auto set draft_model_path DeepSeek-V3/R1 # Auto set draft_model_path DeepSeek-V3/R1
if self.speculative_draft_model_path is None and model_arch in [ if model_arch == "DeepseekV3ForCausalLM":
"DeepseekV3ForCausalLM" if self.speculative_draft_model_path is None:
]: self.speculative_draft_model_path = self.model_path
self.speculative_draft_model_path = self.model_path else:
logger.warning(
"DeepSeek MTP does not require setting speculative_draft_model_path."
)
# Auto choose parameters # Auto choose parameters
if self.speculative_num_steps is None: if self.speculative_num_steps is None:
......
...@@ -80,8 +80,6 @@ class TestDeepseekV3MTP(CustomTestCase): ...@@ -80,8 +80,6 @@ class TestDeepseekV3MTP(CustomTestCase):
"--trust-remote-code", "--trust-remote-code",
"--speculative-algorithm", "--speculative-algorithm",
"EAGLE", "EAGLE",
"--speculative-draft",
"lmsys/DeepSeek-V3-0324-NextN",
"--speculative-num-steps", "--speculative-num-steps",
"3", "3",
"--speculative-eagle-topk", "--speculative-eagle-topk",
......
...@@ -50,6 +50,63 @@ class TestMLADeepseekV3(CustomTestCase): ...@@ -50,6 +50,63 @@ class TestMLADeepseekV3(CustomTestCase):
class TestDeepseekV3MTP(CustomTestCase): class TestDeepseekV3MTP(CustomTestCase):
@classmethod
def setUpClass(cls):
cls.model = "lmsys/sglang-ci-dsv3-test"
cls.base_url = DEFAULT_URL_FOR_TEST
other_args = [
"--trust-remote-code",
"--cuda-graph-max-bs",
"2",
"--disable-radix",
"--enable-torch-compile",
"--torch-compile-max-bs",
"1",
"--speculative-algorithm",
"EAGLE",
"--speculative-num-steps",
"2",
"--speculative-eagle-topk",
"4",
"--speculative-num-draft-tokens",
"4",
]
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_gsm8k(self):
requests.get(self.base_url + "/flush_cache")
args = SimpleNamespace(
num_shots=5,
data_path=None,
num_questions=200,
max_new_tokens=512,
parallel=128,
host="http://127.0.0.1",
port=int(self.base_url.split(":")[-1]),
)
metrics = run_eval_few_shot_gsm8k(args)
print(metrics)
self.assertGreater(metrics["accuracy"], 0.60)
server_info = requests.get(self.base_url + "/get_server_info")
avg_spec_accept_length = server_info.json()["avg_spec_accept_length"]
print(f"{avg_spec_accept_length=}")
self.assertGreater(avg_spec_accept_length, 2.5)
# compatible with old APIs
class TestDeepseekV3MTPWithDraft(CustomTestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
cls.model = "lmsys/sglang-ci-dsv3-test" cls.model = "lmsys/sglang-ci-dsv3-test"
......
...@@ -118,8 +118,6 @@ class TestFlashinferMLAMTP(CustomTestCase): ...@@ -118,8 +118,6 @@ class TestFlashinferMLAMTP(CustomTestCase):
"1", "1",
"--speculative-algorithm", "--speculative-algorithm",
"EAGLE", "EAGLE",
"--speculative-draft",
"lmsys/sglang-ci-dsv3-test-NextN",
"--speculative-num-steps", "--speculative-num-steps",
"3", "3",
"--speculative-eagle-topk", "--speculative-eagle-topk",
......
...@@ -162,8 +162,6 @@ class TestDeepseekV3MTPBlockInt8(CustomTestCase): ...@@ -162,8 +162,6 @@ class TestDeepseekV3MTPBlockInt8(CustomTestCase):
"1", "1",
"--speculative-algorithm", "--speculative-algorithm",
"EAGLE", "EAGLE",
"--speculative-draft",
"sgl-project/sglang-ci-dsv3-block-int8-test-NextN",
"--speculative-num-steps", "--speculative-num-steps",
"2", "2",
"--speculative-eagle-topk", "--speculative-eagle-topk",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment