SGLang vs llama.cpp 双引擎对比与取舍

SGLang vs llama.cpp 双引擎对比与取舍

硬件: 双 RTX 3090 24GB · 模型: Qwen3.8-27B (两引擎各一格式)
场景: 单人 coding agent (opencode / deer-flow / deepseek-harness)
实测日期: 2026-08-15, 全部数据来自同机真实测试

一、部署形态

GPU1 SGLang GPU0 llama.cpp
容器 sgl-qwen27b-gpu1 lla-qwen27B-gpu0
模型格式 dbirks AutoRound W4A16 (19.5GB) unsloth IQ4_XS GGUF (15.7GB)
量化 W4A16 compressed-tensors IQ4_XS + MTP 头
KV cache fp8_e4m3 q8_0 / q8_0
端口 :15433 :11434

GPU1 SGLang 关键参数

--mem-fraction-static 0.95 --max-mamba-cache-size 15
--kv-cache-dtype fp8_e4m3 --attention-backend flashinfer
--context-length 65536 --reasoning-parser qwen3 --tool-call-parser qwen3_coder

GPU0 llama.cpp 关键参数

--ctx-size 131072 --cache-type-k q8_0 --cache-type-v q8_0
--parallel 1 --spec-type draft-mtp --spec-draft-n-max 2
--flash-attn on -ngl 99 -t 8 -tb 4

二、核心性能对比(全部实测)

2.1 单请求生成速度

场景 SGLang llama.cpp 差距
200 tokens 输出 49.1 t/s 57.1 t/s llama +16%

2.2 并发聚合吞吐

并发 SGLang llama.cpp 说明
1 49.1 57.1 llama 快
2 88.9 57.1 SGLang +56%
3 130.2 57.1 (串行) SGLang +128%

> llama.cpp parallel=1 串行, 多请求排队; SGLang 连续批处理真并行

2.3 多轮对话稳定性 (5 轮)

引擎 速度序列 稳定性
SGLang 48.6 / 47.0 / 47.5 / 47.3 / 47.0 稳定 (±1)
llama.cpp 44.5 / 48.6 / 57.1 / 44.8 / 50.5 波动 (±13)

2.4 长上下文 prefill(60K prompt 实测)

引擎 prefill 吞吐 60K 总耗时
SGLang ~1260 tok/s 40.3s
llama.cpp ~1061 tok/s 45.6s

> 意外发现: 长上下文场景 SGLang 反而快 12%(prefill 效率优势)

2.5 上下文上限

引擎 单请求上限 显存占用
SGLang 65511 ~24GB (占满)
llama.cpp 131072 ~22GB (余 2.5GB)

三、应用场景适配(coding agent)

3.1 各工具配置现状

工具 当前模型 说明
opencode GPU1 SGLang (small/explore/general) 子代理并行
deer-flow GPU1 qwen27b-gpu1 (subagents) 多子代理
deepseek-harness GPU0 llama.cpp 单代理
hermes DeepSeek 云端 不依赖本地
mlaistock 双 adapter (可切换) :15433 默认

3.2 场景需求分析

coding agent 单请求 token 构成:

system prompt (模型+工具定义): ~2-4K
单文件分析:                   5-30K
多文件 diff:                   10-50K
长对话累积:                    10-40K

典型分布:

场景 token 范围 占比
简单问答/小文件 2-8K ~60%
单文件审查 10-30K ~25%
多文件/长对话 30-65K ~12%
超长 (65K+) >65K <3%

结论: 65K 上下文覆盖 97% 场景, 128K 只服务 <3% 超长需求。

四、核心权衡:并发 vs 上下文

4.1 物理约束(24GB 显存, KV 池总量固定)

GPU0 llama.cpp:  128K×1并发 或 64K×2并发 或 43K×3并发 (互斥)
GPU1 SGLang:     90K×1并发 或 78K×2并发 或 65K×3并发 (可调)

关键规律: 并发 × 上下文 = KV 池 ≈ 常数。两者不可兼得。

4.2 为什么不能两全

一、llama.cpp parallel>1 → 每个 slot 上下文减半 (128K→64K@2并发), 失去长上下文优势
二、SGLang 降并发 → 长上下文 (90K@1并发), 但失去子代理并行

4.3 双引擎的最优分工

引擎 坚守一端 价值
SGLang (GPU1) 3 并发 高频收益: 每次子代理并行任务时间 /3
llama.cpp (GPU0) 128K 上下文 低频保险: <3% 超长场景备用

五、取舍结论

5.1 为什么 SGLang 作为主引擎

一、并发是高频收益 — opencode 派子代理每次受益(任务时间 /3)

二、65K 覆盖 97% — coding agent 几乎不需要 65K+ 单请求

三、多轮稳定 — ±1 t/s 无衰减(llama 波动 ±13)

四、原生工具调用 — tool_calls 结构化输出, opencode 兼容最佳

五、长上下文反而快 — prefill 1260 vs 1061 tok/s (60K 场景 SGLang 快 12%)

5.2 llama.cpp 的不可替代价值

一、128K 上下文 — 超长文档/多超大文件场景唯一选择

二、单请求快 16% — 57 vs 49 t/s

三、MTP 投机解码 — 单并发场景效率高

四、显存余量 2.5GB — 资源更宽裕

5.3 最终决策

opencode 系统(主/子代理)  → GPU1 SGLang (3 并发 + 65K)
超长上下文单任务            → GPU0 llama.cpp (128K, 按需调用)
开发项目                    → 各自独立 (双 adapter 可切换)

核心逻辑: 双引擎各守一端,不强行两全。并发归 SGLang(高频),长上下文归 llama.cpp(低频备用)。两个容器同时在线,按需路由,无需改配置。

5.4 何时应该切换偏好

如果你的使用模式是… 应偏向
大量子代理并行 / 多 agent 协作 SGLang 3 并发
单请求超长文档 / 整仓库分析 llama.cpp 128K
两者兼有 (默认) 双引擎按需路由

六、附:性能数据速查表

指标 SGLang llama.cpp
单请求 49.1 t/s 57.1 t/s
3 并发聚合 130.2 t/s 57.1 (串行)
多轮稳定性 47±1 50±13
上下文 65511 131072
长 prompt 60K 40.3s 45.6s
prefill 1260 tok/s 1061 tok/s
显存 24GB (满) 22GB (余2.5GB)
工具调用 原生结构化 兼容

相关文档

一、docs/sglang-qwen3.8-27b-deployment-tuning.md — SGLang 部署调优专题

二、docs/review/sglang-qwen3.8-27b-parameter-tuning-experiments-2026-08-15.md — 参数实验记录

三、docs/local-model-config-update-gpu1-qwen3.8-27b-2026-08-15.md — 配置更新记录

四、docs/llamacpp-qwen3.6-27b-optimization-guide.md — llama.cpp 27B 调优

五、docs/inference-engine-comparison-sglang-vs-llamacpp.md — 早期引擎对比

数据实测日期: 2026-08-15, 同机双 3090, 同模型 Qwen3.8-27B


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