[Spec] Add DFLASH basic sanity CI test (#29338)

This commit is contained in:
Liangsheng Yin
2026-06-28 23:45:05 -07:00
committed by GitHub
parent 62d7929b3a
commit c0d45cda29
2 changed files with 87 additions and 2 deletions
+5 -2
View File
@@ -212,15 +212,18 @@ class FwdOccupancyMixin:
]
if avg_accept is not None:
perf_rows.append(["avg spec accept", f"{avg_accept:.3f}"])
# Lead each table with a text title line so the two tables stay
# visually separated even when CI prefixes every line with a timestamp
# (which turns blank separator lines into non-empty lines).
print(
"\n"
"\n[perf metrics]\n"
+ tabulate.tabulate(
perf_rows, headers=["perf metric", "value"], tablefmt="github"
)
)
print(
"\n\n"
"\n[fwd_occupancy stats]\n"
+ tabulate.tabulate(
[
["samples (n)", len(samples)],
@@ -0,0 +1,82 @@
"""Stage-a basic sanity with DFLASH spec decoding enabled. Mirrors
test_basic_sanity.py / test_basic_sanity_eagle3.py with the DFLASH path active
(overlap scheduling on by default)."""
import unittest
from sglang.srt.utils import kill_process_tree
from sglang.test.ci.ci_register import register_cuda_ci
from sglang.test.kits.basic_api_contract_kit import BasicAPIContractMixin
from sglang.test.kits.basic_decode_correctness_kit import BasicDecodeCorrectnessMixin
from sglang.test.kits.basic_scheduler_stress_kit import BasicSchedulerStressMixin
from sglang.test.kits.eval_accuracy_kit import GSM8KMixin
from sglang.test.kits.fwd_occupancy_kit import FwdOccupancyMixin
from sglang.test.test_utils import (
DEFAULT_DRAFT_MODEL_DFLASH,
DEFAULT_TARGET_MODEL_DFLASH,
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
DEFAULT_URL_FOR_TEST,
CustomTestCase,
popen_launch_server,
)
register_cuda_ci(est_time=200, stage="base-a", runner_config="1-gpu-small")
class TestBasicSanityDFlash(
BasicAPIContractMixin,
BasicDecodeCorrectnessMixin,
BasicSchedulerStressMixin,
FwdOccupancyMixin,
GSM8KMixin,
CustomTestCase,
):
served_model_name = DEFAULT_TARGET_MODEL_DFLASH
fwd_occupancy_threshold = 97.5
fwd_occupancy_max_new_tokens = 4096
# DFLASH accepts a full block per verify, so its acc length runs well above
# EAGLE3's; keep a safe lower bound here.
fwd_occupancy_acc_length_threshold: float = 2.0
model = DEFAULT_TARGET_MODEL_DFLASH
gsm8k_num_questions = 1400
gsm8k_accuracy_thres = 0.74
gsm8k_accept_length_thres = 2.8
attention_backend = "triton"
draft_attention_backend = "triton"
@classmethod
def setUpClass(cls):
cls.base_url = DEFAULT_URL_FOR_TEST
cls.process = popen_launch_server(
DEFAULT_TARGET_MODEL_DFLASH,
cls.base_url,
timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
other_args=[
"--trust-remote-code",
"--attention-backend",
cls.attention_backend,
"--speculative-draft-attention-backend",
cls.draft_attention_backend,
"--speculative-algorithm",
"DFLASH",
"--speculative-draft-model-path",
DEFAULT_DRAFT_MODEL_DFLASH,
"--cuda-graph-max-bs",
"4",
"--mem-fraction-static",
"0.7",
"--enable-metrics",
"--disable-piecewise-cuda-graph",
],
env={"SGLANG_ENABLE_METRICS_DEVICE_TIMER": "1"},
)
@classmethod
def tearDownClass(cls):
kill_process_tree(cls.process.pid)
if __name__ == "__main__":
unittest.main()