feat(cli): per-role --mem-fraction-static + use in E4-pressured

E4-v1 / v2 / pressured-v1 all failed to fire admission rejections in
this workload because the default 0.6 mem-fraction-static gives
288K-token kv_pool per decoder, more than enough to absorb the
50-session trace even at concurrency=32.

This commit adds:
  --decode-mem-fraction-static  (overrides per-decode SGLang arg)
  --prefill-mem-fraction-static (symmetric for completeness)

Plumbed via topology.{decode,prefill}_extra_server_args. The
pressured sweep now uses --decode-mem-fraction-static 0.4 which
shrinks decoder kv_pool to ~192K tokens — should force enough
admission rejections to actually exercise the D→P snapshot path.
This commit is contained in:
Claude Code Agent
2026-05-13 10:43:26 +08:00
parent fbeb968f2f
commit f6d6dc01ea
2 changed files with 39 additions and 5 deletions

View File

@@ -566,6 +566,23 @@ def main() -> None:
"See docs/D_TO_P_SYNC_DESIGN_ZH.md."
),
)
benchmark.add_argument(
"--decode-mem-fraction-static",
type=float,
default=None,
help=(
"Override SGLang's --mem-fraction-static on decode workers. "
"Smaller value → smaller KV pool → admit_direct_append rejects "
"more often → reseed path fires more often. Pressure tool for "
"E4-style D→P sync experiments."
),
)
benchmark.add_argument(
"--prefill-mem-fraction-static",
type=float,
default=None,
help="Override --mem-fraction-static on prefill workers.",
)
benchmark.add_argument(
"--sample-profile",
choices=["default", "small-append"],
@@ -897,11 +914,25 @@ def _topology_from_args(args: argparse.Namespace):
trust_remote_code=not args.no_trust_remote_code,
ib_device=args.ib_device,
enable_d_to_p_sync=getattr(args, "enable_d_to_p_sync", False),
prefill_extra_server_args=("--disable-overlap-schedule",),
decode_extra_server_args=("--disable-overlap-schedule",),
direct_extra_server_args=("--enable-streaming-session",),
prefill_extra_server_args=_build_extra_server_args(args, "prefill"),
decode_extra_server_args=_build_extra_server_args(args, "decode"),
direct_extra_server_args=_build_extra_server_args(args, "direct"),
)
def _build_extra_server_args(args, role: str) -> tuple[str, ...]:
base: tuple[str, ...]
if role == "direct":
base = ("--enable-streaming-session",)
else:
base = ("--disable-overlap-schedule",)
mem_frac = getattr(args, "decode_mem_fraction_static", None) if role == "decode" else None
if mem_frac is None and role == "prefill":
mem_frac = getattr(args, "prefill_mem_fraction_static", None)
if mem_frac is not None and mem_frac > 0:
base = base + ("--mem-fraction-static", f"{mem_frac:.3f}")
return base
if __name__ == "__main__":
main()