SGLang 上下文扩展:65K 到 119K 的挖掘之路
日期: 2026-08-16 晚
环境: 双 RTX 3090 24GB · Ryzen 5950X · SGLang v0.5.17 · Qwen3.8-27B AutoRound W4A16
成果: 单卡上下文从 65,536 → 119,000 tokens(+82%),并发 3 保持,显存零额外投入
方法论: 深度挖掘官方源码 + 决定性实验验证,每个杠杆都有源码证据链
摘要
在已稳定的 SGLang 部署基础上,通过系统性梳理显存预算链的每个环节,找到并应用了 3 个上下文扩展杠杆(其中 2 个为本次深度研究新发现),实现上下文 +82%。整个过程不换模型、不改内核、不降并发,纯参数级优化。
| 阶段 | 关键改动 | KV 池 | context-length | 提升 |
|---|---|---|---|---|
| 初始 | extra_buffer + cache15 |
66,640 | 65,536 | 基准 |
| 1 | no_buffer + cache9 + disable-overlap-schedule |
81,006 | 80,000 | +22% |
| 2 | --mm-feature-transport=cpu |
120,079 | 119,000 | +48% |
一、研究起点:显存预算链
上下文的本质 = KV 池能容纳多少 token。KV 池大小由显存预算链逐环节决定:
24GB 总显存
→ mem_fraction_static 0.95 (显式) → ~22.8GB 预算
→ 减 模型权重 (17.67GB 加载后)
→ 减 CUDA IPC 多模态池 (1024 MiB) ← 第 2 个杠杆
→ 减 Mamba 状态缓存 (0.70GB)
→ 减 activation reserve (3.6GB, 有 2048 下限锁死)
→ 减 slack (5% × 22.8GB ≈ 1.14GB)
→ 剩余 = KV 池预算 → 每 token 32.75KB (fp8) → token 数
深度研究策略:对预算链每个环节逐一查源码,确认”能否压缩”。5 个环节中,3 个被证明无法压缩,2 个可压缩(mamba cache 配置 + CUDA IPC 池)。
二、杠杆 1:mamba radix cache 策略(no_buffer)
源码发现(kv_cache_configurator.py)
mamba_full_memory_ratio 是死参数(在显式 --max-mamba-cache-size 时):L1882 显式分支:只用 max_mamba_cache_size,不读 ratio;L1925 auto-fit 分支:mamba_budget = total × ratio/(1+ratio) 才用 ratio。
真正的杠杆是 mamba_radix_cache_strategy(决定每请求占几个 mamba slot):overrides.py:1493 auto 解析:overlap+支持 → extra_buffer,否则 no_buffer;slots_per_req(kv_cache_configurator.py:1662):base(3) + extra_buffer加成(2) = 5;no_buffer = 3。
结论
extra_buffer:cache15 ÷ 5 slots = 3 并发,mamba 缓存 1.12GB。no_buffer:cache9 ÷ 3 slots = 3 并发(并发不变),mamba 缓存降到 0.70GB。省出的 0.42GB → KV 池 +14,366 tokens。
实测
| 指标 | extra_buffer+cache15 | no_buffer+cache9 |
|---|---|---|
| KV 池 | 66,640 | 81,006 |
| Mamba 缓存 | 1.12 GB | 0.70 GB |
| 并发 | 3 | 3 |
> ⚠️ no_buffer 要求 –disable-overlap-schedule=True(首次尝试 AssertionError 后修正)。
三、杠杆 2:多模态特征池释放(mm-feature-transport=cpu)⭐ 本轮最大发现
源码发现(environ.py:969 + server_args.py:7591)
# environ.py:969
SGLANG_MM_FEATURE_CACHE_MB = EnvInt(1 * 1024) # 多模态池默认 1024 MiB!
单节点 CUDA 部署,mm_feature_transport auto 解析为 cuda_ipc(server_args.py:7591)。cuda_ipc 在 Load weight 之前预留 1024 MiB 给多模态特征池(base_processor.py:351)。日志明示: “Pass --mm-feature-transport=cpu to opt out”。
关键洞察
这 1024 MiB 是纯预留,即使从不使用多模态也占用。改 cpu 后:多模态 feature 经 CPU 传输(功能保留,图/视频推理变慢);文本/coding agent 场景完全不受影响(不使用多模态);释放的 1GB 直接进入 KV 预算。
实测
| 指标 | cuda_ipc (原) | cpu (新) |
|---|---|---|
| KV 池 | 81,006 | 120,079 |
| 权重加载后 avail | 4.30 GB | 5.56 GB |
| K+V 各 | 1.24 GB | 1.83 GB |
| context-length | 80,000 | 119,000 |
| 并发 | 3 | 3 |
| 推理/并发/长输出 | — | ✅ 全通过 |
四、研究过的”死胡同”(排除的杠杆,留痕防重复)
| 环节 | 源码证据 | 为什么不可行 |
|---|---|---|
| context-length 提升 | tp_worker.py:407 max_req_len = min(ctx-1, pool-1) |
池 > ctx 时只差 1006 tokens,收益可忽略 |
| mamba cache 再压缩 | mamba_utils.py dtype_map={float32,bfloat16,float16} |
bfloat16 已最小;cache9÷3slots=3 并发下限 |
| mem-fraction 提高 | server_args.py:4779 auto 推导 |
显式 0.95 已覆盖 auto(0.835),avail 0.63GB 极限 |
| activation reserve 降低 | server_args.py:4872 max(chunked, 2048) |
2048 下限锁死,调小 chunked_prefill 无效 |
| KV dtype 再降 | 实测 fp4 慢 4 倍 | 反量化不融合,不可用 |
五、方法论沉淀(本次深度研究的价值)
1. 显存预算链思考法
上下文扩展 = 逐环节审计显存分配。每 1MB 都有归属,找到”非必要预留”就是找到杠杆。
2. 源码优先于文档
所有结论来自源码逐行验证(kv_cache_configurator / environ / server_args / base_processor),不依赖社区说法。官方文档只提供线索(如 “Pass cpu to opt out”),最终以源码为准。
3. 决定性实验验证
每个假设都建临时容器实测(sgl-nobuffer-test / sgl-mmtrans-test),确认后应用到生产。测试容器用完即删,生产零风险。
4. 排除法防浪费
5 个候选杠杆,3 个被源码证伪(避免白跑实验),只实测真正可行的 2 个。先读源码筛掉死胡同,再花时间实测。
5. 风险可控的取舍
每个杠杆都评估代价(并发/多模态/速度),选择对本场景(coding agent + 文本)零影响的方案。
六、当前最终配置(生产运行中)
sgl-qwen27b-gpu1:
command: >
python3 -m sglang.launch_server
--model-path /models/Qwen3.8-27B-W4A16-AutoRound
--port 30000 --host 0.0.0.0
--dtype bfloat16
--context-length 119000
--mem-fraction-static 0.95
--mamba-full-memory-ratio 0.5
--max-mamba-cache-size 9
--mamba-radix-cache-strategy no_buffer
--disable-overlap-schedule
--mm-feature-transport cpu
--attention-backend flashinfer
--mamba-ssm-dtype bfloat16
--kv-cache-dtype fp8_e4m3
--trust-remote-code
--reasoning-parser qwen3
--tool-call-parser qwen3_coder
--sleep-on-idle
运行指标:KV 池 120,079 tokens · K+V 各 1.83 GB · 权重 17.67 GB · Mamba 0.70 GB · avail 0.63 GB;并发 3(cache9 ÷ 3 slots)· 速度 1/2/3并发 = 46/89/130 t/s;CG 捕获 192s · 推理/并发/长输出全通过。
七、相关文档
../deployment/sglang-qwen3.8-27b-deployment-tuning.md §七·八 — 研究点全景(源码级);../deployment/current-configuration.md — 当前配置总览;../review/sglang-qwen3.8-27b-parameter-tuning-experiments-2026-08-15.md — 前置实验(mem-fraction/cache/fp4);qwen3.8-27b-deployment-research.md — 部署研究总纲。
本文记录 2026-08-16 晚的完整研究过程与成果,含源码证据链和实测数据,可直接复现。
