更新演示PPT
基于 SGLang 的增强分支,围绕 Prefill/Decode(PD)分离部署 做了系统增强。
sglang-src/ ├── src/ │ ├── python/sglang/srt/ # sglang 推理引擎(可编辑安装) │ │ ├── disaggregation/ │ │ │ ├── kvpact/ # ★ KVPact 压缩传输后端(conn/transport/compression) │ │ │ ├── local_kv/ # ★ 本地 KV 后端 │ │ │ └── ... # 上游 mooncake/nixl 等后端 │ │ ├── managers/ # ★ DP worker 故障检测/恢复/请求迁移 │ │ ├── security/tenant_kv_sentry.py # ★ 多租户 KV 缓存隔离 │ │ └── utils/process_teardown.py # ★ 快速关闭 │ └── sgl-model-gateway/ # router(Rust) + Python bindings(mini-lb/SLOWeaver) ├── demo/ │ ├── kvpact/ # ★ KVPact PD 栈一键启动脚本(4 种拓扑) │ └── recovery/ # ★ 故障恢复演示启停脚本 ├── tests/ # 实验数据汇总(KVPact 带宽扫描/故障恢复/SLOWeaver 消融)
/data2/llms/
--disable-custom-all-reduce
# 1. 创建环境 conda create -n sglang-dev python=3.10 -y conda activate sglang-dev # 2. 安装 sglang(可编辑安装,本仓库即源码) cd sglang-src/src/python pip install -e ".[all]" # 3. router Python bindings(PD 负载均衡用,加入 PYTHONPATH) export GATEWAY_SRC=$PWD/../sgl-model-gateway/bindings/python/src export PYTHONPATH=$GATEWAY_SRC:$PYTHONPATH
demo/ 下的脚本会自动完成 Prefill/Decode/LB 的启动、健康检查和日志管理,验证过可直接运行。
demo/
demo/kvpact/
start_kvpact_stack.sh
start_kvpact_stack_72b.sh
start_kvpact_stack_6p2d_tp1.sh
MODEL_PATH
start_kvpact_stack_qwen3_30b_3p1d.sh
最简启动(1P1D,2 张卡):
cd sglang-src/demo/kvpact # 原始 KV 直传(基线) bash start_kvpact_stack.sh # 启用 KVPact 压缩(quantizer + codec) COMPRESSION=default bash start_kvpact_stack.sh
脚本输出 栈已启动: LB=http://127.0.0.1:33000 即就绪。常用环境变量:
栈已启动: LB=http://127.0.0.1:33000
COMPRESSION
none
default
<config.json>
PREFILL_GPU
DECODE_GPU
PREFILL_GPUS
DECODE_GPUS
LOG_DIR
demo/kvpact/logs_<tag>
PY
sglang-dev
停止服务:日志目录下有 *.pid 文件,逐个 kill $(cat xxx.pid) 即可——SIGTERM 触发优雅关闭,子进程和显存会完整回收。
*.pid
kill $(cat xxx.pid)
demo/recovery/
# 启动 DP=2 服务(GPU 2,3,端口 30910,日志 recover_test/server.log) bash demo/recovery/start_server.sh # 对照组(原始未改动版本,需 sglang-pd conda 环境) bash demo/recovery/start_server_baseline.sh # PD 分离恢复演示(1P2D + mini-lb,GPU 2/3/4,端口 30000) bash demo/recovery/start_pd_test.sh bash demo/recovery/stop_pd_test.sh
服务就绪后,kill 掉任意一个 DP worker 的 scheduler 进程即可观察:控制器 <1s 检测故障、在途请求自动迁移重放、客户端无报错。
python -m sglang.launch_server \ --model-path /data2/llms/Qwen3-30B-A3B-Instruct-2507 \ --host 0.0.0.0 --port 30000 \ --mem-fraction-static 0.85 --trust-remote-code
MODEL=/data2/llms/Qwen3-30B-A3B-Instruct-2507 BACKEND=kvpact # 可选: kvpact / local_kv / mooncake / nixl / fake COMP=default # 可选: none / default / <config.json路径> # [1/3] Decode(GPU 1) CUDA_VISIBLE_DEVICES=1 python -m sglang.launch_server \ --model-path $MODEL --host 127.0.0.1 --port 30200 \ --disaggregation-mode decode \ --disaggregation-transfer-backend $BACKEND \ --disaggregation-kvpact-compression $COMP \ --mem-fraction-static 0.85 --trust-remote-code & # [2/3] Prefill(GPU 0) CUDA_VISIBLE_DEVICES=0 python -m sglang.launch_server \ --model-path $MODEL --host 127.0.0.1 --port 30100 \ --disaggregation-mode prefill \ --disaggregation-transfer-backend $BACKEND \ --disaggregation-kvpact-compression $COMP \ --disaggregation-bootstrap-port 8998 \ --mem-fraction-static 0.85 --trust-remote-code & # [3/3] Load Balancer python -m sglang_router.launch_router \ --pd-disaggregation --mini-lb \ --prefill http://127.0.0.1:30100 8998 \ --decode http://127.0.0.1:30200 \ --host 127.0.0.1 --port 30000
python -m sglang_router.launch_router \ --pd-disaggregation --mini-lb \ --sloweaver-policy slo \ --sloweaver-openkylin-aware \ --sloweaver-worker-numa-nodes \ http://127.0.0.1:30100=0 http://127.0.0.1:30300=1 \ http://127.0.0.1:30200=0 http://127.0.0.1:30400=1 \ --prefill http://127.0.0.1:30100 8998 \ --prefill http://127.0.0.1:30300 8999 \ --decode http://127.0.0.1:30200 \ --decode http://127.0.0.1:30400
运行时 GET /sloweaver/state 可查看 OS 检测结果、PSI、CPU 节流率与压力分数。
GET /sloweaver/state
curl http://127.0.0.1:30000/health curl http://127.0.0.1:30000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model": "'$MODEL'", "messages": [{"role": "user", "content": "你好"}], "max_tokens": 64}'
python -m sglang.bench_serving \ --backend sglang --host 127.0.0.1 --port 30000 \ --dataset-name random --num-prompts 800 \ --random-input-len 1024 --random-output-len 128
# 固定限速: 10Gbps = 1.25e9 B/s KVPACT_WIRE_BPS=1250000000 bash start_kvpact_stack.sh # 动态换挡: 运行中改写文件即生效(压测换挡不重启栈) echo 125000000 > /tmp/wire.txt KVPACT_WIRE_BPS_FILE=/tmp/wire.txt bash start_kvpact_stack.sh
--disaggregation-transfer-backend
kvpact
local_kv
mooncake
nixl
fake
--disaggregation-kvpact-compression
<path>.json
--disaggregation-kvpact-quality-guard
--disaggregation-kvpact-quality-sample-rate
1.0
--disaggregation-kvpact-quality-sample-elements
--disaggregation-kvpact-quality-max-relative-l2
--disaggregation-kvpact-quality-min-cosine
--disaggregation-kvpact-quality-failure-threshold
--disaggregation-kvpact-quality-cooldown-requests
--disaggregation-localkv-slot-count
--disaggregation-localkv-chunk-tokens
--enable-tenant-kv-sentry
--tenant-kv-sentry-secret-file
--tenant-kv-sentry-tenant-header
x-sglang-tenant-id
--tenant-kv-sentry-signature-header
x-sglang-tenant-signature
--tenant-kv-sentry-default-tenant
--sloweaver-openkylin-aware
--sloweaver-worker-numa-nodes
URL=NODE ...
--sloweaver-system-pressure-weight
--sloweaver-cross-numa-penalty-ms
--sloweaver-telemetry-interval-ms
KVPACT_WIRE_BPS
KVPACT_WIRE_BPS_FILE
KVPACT_LOG_LEVEL
SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT
SGLANG_DISAGGREGATION_WAITING_TIMEOUT
SGLANG_INSTANCE_FAILURE_MAX_RETRIES
开启后,OpenAI 接口和原生 /generate 接口都会将租户身份、客户端 cache_salt 与 extra_key 编码为带类型边界的 HMAC 缓存键。租户身份必须由可信网关签名,客户端无法伪造租户名命中其他租户的 Radix Cache;LoRA 身份以独立类型维度加入缓存键。
/generate
cache_salt
extra_key
# 密钥应通过 Kubernetes Secret 等安全方式挂载,不要放入命令行参数 python -c 'import secrets; open("tenant-kv.secret", "wb").write(secrets.token_bytes(32))' chmod 600 tenant-kv.secret python -m sglang.launch_server \ --model-path "$MODEL" \ --enable-tenant-kv-sentry \ --tenant-kv-sentry-secret-file tenant-kv.secret
可信网关用 TenantKVSentry.sign_tenant(tenant_id) 生成 x-sglang-tenant-signature;完全可信的单租户部署可加 --tenant-kv-sentry-default-tenant <tenant> 免签名。当前实现是隔离 MVP,不含 PD Tenant Capsule 和 L2 AES-GCM 加密。
TenantKVSentry.sign_tenant(tenant_id)
--tenant-kv-sentry-default-tenant <tenant>
kvpact/compression/
transformer/
quantizer/
codec/
controller/
config/duo_config/
wire.py
直接 kill <pid>(SIGTERM)即可:服务以退出码 0 退出,完整回收所有子进程(GPU worker、detokenizer 等),不残留进程占用显存。
kill <pid>
DP 部署下某个 worker 进程崩溃时:
tests/ 下有三份整理好的实测数据 CSV,每行带 source 列指向原始数据:
tests/
source
kvpact_wire_sweep_1-10gbps.csv
fault_recovery_summary.csv
sloweaver_admission_ablation.csv
_comparisons.csv
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
面向高效可靠的分离式大模型推理系统
基于 SGLang 的增强分支,围绕 Prefill/Decode(PD)分离部署 做了系统增强。
目录结构
环境部署
前提
/data2/llms/),已验证:Qwen2.5-7B/32B/72B、Qwen3-30B-A3B、Qwen3.5-27B(需--disable-custom-all-reduce)、Llama-3.1-8B安装
启动方式一:Demo 脚本一键启动(推荐)
demo/下的脚本会自动完成 Prefill/Decode/LB 的启动、健康检查和日志管理,验证过可直接运行。KVPact PD 栈(
demo/kvpact/)start_kvpact_stack.shstart_kvpact_stack_72b.shstart_kvpact_stack_6p2d_tp1.shMODEL_PATHstart_kvpact_stack_qwen3_30b_3p1d.sh最简启动(1P1D,2 张卡):
脚本输出
栈已启动: LB=http://127.0.0.1:33000即就绪。常用环境变量:COMPRESSIONnonenone直传 /default内置压缩 /<config.json>自定义压缩配置MODEL_PATHPREFILL_GPU/DECODE_GPUPREFILL_GPUS/DECODE_GPUS)LOG_DIRdemo/kvpact/logs_<tag>PYsglang-dev环境停止服务:日志目录下有
*.pid文件,逐个kill $(cat xxx.pid)即可——SIGTERM 触发优雅关闭,子进程和显存会完整回收。故障恢复演示(
demo/recovery/)服务就绪后,kill 掉任意一个 DP worker 的 scheduler 进程即可观察:控制器 <1s 检测故障、在途请求自动迁移重放、客户端无报错。
启动方式二:手动命令
1. 单机普通推理(基线)
2. PD 分离 + KVPact 压缩(1P1D,手动三步)
3. 多 P 多 D + SLOWeaver
运行时
GET /sloweaver/state可查看 OS 检测结果、PSI、CPU 节流率与压力分数。使用系统
健康检查与推理
压测
链路带宽仿真(模拟跨机房低带宽)
压缩模式选择建议(基于实测)
none或 local_kv360%,交叉点约 45Gbps参数与环境变量参考
新增启动参数
--disaggregation-transfer-backendkvpact/local_kv/mooncake/nixl/fakekvpact与local_kv为本项目新增--disaggregation-kvpact-compressionnone/default/<path>.json--disaggregation-kvpact-quality-guard--disaggregation-kvpact-quality-sample-rate1.0逐请求校验--disaggregation-kvpact-quality-sample-elements--disaggregation-kvpact-quality-max-relative-l2--disaggregation-kvpact-quality-min-cosine--disaggregation-kvpact-quality-failure-threshold--disaggregation-kvpact-quality-cooldown-requests--disaggregation-localkv-slot-count--disaggregation-localkv-chunk-tokens--enable-tenant-kv-sentry--tenant-kv-sentry-secret-file--tenant-kv-sentry-tenant-headerx-sglang-tenant-id--tenant-kv-sentry-signature-headerx-sglang-tenant-signature--tenant-kv-sentry-default-tenant--sloweaver-openkylin-aware--sloweaver-worker-numa-nodesURL=NODE ...--sloweaver-system-pressure-weight--sloweaver-cross-numa-penalty-ms--sloweaver-telemetry-interval-ms环境变量
KVPACT_WIRE_BPSKVPACT_WIRE_BPS_FILEKVPACT_LOG_LEVELSGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUTSGLANG_DISAGGREGATION_WAITING_TIMEOUTSGLANG_INSTANCE_FAILURE_MAX_RETRIESTenantKV-Sentry
开启后,OpenAI 接口和原生
/generate接口都会将租户身份、客户端cache_salt与extra_key编码为带类型边界的 HMAC 缓存键。租户身份必须由可信网关签名,客户端无法伪造租户名命中其他租户的 Radix Cache;LoRA 身份以独立类型维度加入缓存键。可信网关用
TenantKVSentry.sign_tenant(tenant_id)生成x-sglang-tenant-signature;完全可信的单租户部署可加--tenant-kv-sentry-default-tenant <tenant>免签名。当前实现是隔离 MVP,不含 PD Tenant Capsule 和 L2 AES-GCM 加密。压缩管线组成(
kvpact/compression/)transformer/quantizer/codec/controller/config/duo_config/wire.py运维行为
回收资源
直接
kill <pid>(SIGTERM)即可:服务以退出码 0 退出,完整回收所有子进程(GPU worker、detokenizer 等),不残留进程占用显存。DP Worker 故障恢复
DP 部署下某个 worker 进程崩溃时:
实验数据
tests/下有三份整理好的实测数据 CSV,每行带source列指向原始数据:kvpact_wire_sweep_1-10gbps.csvfault_recovery_summary.csvsloweaver_admission_ablation.csv/_comparisons.csv