SGLang 上下文扩展:65K 到 119K 的挖掘之路

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) = 5no_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 晚的完整研究过程与成果,含源码证据链和实测数据,可直接复现。


皖ICP备2025105865号-2|皖公网安备34010402704739号