vLLM 与 SGLang 推理调度机制解析
说明 vLLM 在 KV cache 紧张时如何抢占并重算,以及 SGLang 的默认请求调度、前缀缓存和分块预填充,帮助你按并发与缓存需求调整启动参数。
vLLM 的调度重点落在 KV cache、批处理与显存压力;SGLang 则把请求调度策略、RadixAttention 前缀缓存和 chunked prefill 作为主要控制面,分别见 vLLM 的优化与调优文档 和 SGLang 的服务器参数文档。评估时应先确认请求是否共享长前缀、并发序列需要多少缓存,以及模型能否装入 GPU,再调整调度、缓存和批处理参数。
先准备运行环境与模型
先准备模型权重、可用 GPU、独立的 Python 环境和部署配置,不要直接复用另一套引擎的依赖环境。SGLang 的安装文档要求 Python 3.10 或更高版本,以及兼容的 CUDA 13 环境;vLLM 的 Python、CUDA 和驱动兼容范围则应以其当前安装文档为准。
SGLang 官方给出的 Python 环境安装命令是:
uv pip install --prerelease=allow sglang
安装后应记录实际使用的 Python、CUDA 和 SGLang 版本,避免启动或排障时把环境差异误判为调度问题。
vLLM:调度、缓存与批处理
在线服务时,可以用 vLLM 的 vllm serve CLI 参考中定义的参数明确资源边界:
vllm serve YOUR_MODEL \
--max-model-len YOUR_MAX_MODEL_LEN \
--max-num-seqs YOUR_MAX_NUM_SEQS \
--max-num-batched-tokens YOUR_MAX_NUM_BATCHED_TOKENS
--max-model-len 表示 prompt 与 output 合计的上下文长度;未设置时从模型配置推导,设为 -1 或 auto 时会选择能装入 GPU 的最大长度。--max-num-seqs 限制一次迭代处理的序列数,--max-num-batched-tokens 限制一次迭代处理的 token 数。--gpu-memory-utilization 的文档默认值为 0.92,且按实例生效;如果设置了 --kv-cache-memory-bytes,后者会覆盖该显存比例设置。模板中的占位值应依据模型和机器填写,不能照搬其他部署。
KV cache 空间耗尽时,vLLM 会抢占请求,并在空间恢复后重新计算;V1 的默认抢占模式是 RECOMPUTE,不是 SWAP。vLLM 的优化与调优文档给出的调整方向,是先检查 gpu_memory_utilization,再考虑降低 max_num_seqs 或 max_num_batched_tokens,以减少批次并发和 KV cache 压力。
前缀复用由 Automatic Prefix Caching 完成。已有请求的 KV cache 会被保存,新请求只要共享相同前缀,就能跳过共享部分的计算。官方文档特别指出,它适合针对同一长文档反复提问,以及多轮对话复用历史内容;Python engine 中使用的配置项是:
enable_prefix_caching=True
SGLang:策略、前缀缓存与分块预填充
SGLang 的快速入门给出的最小启动命令为:
sglang serve MODEL_PATH --host 0.0.0.0 --port 30000
以下参数均来自 SGLang 的服务器参数文档:
--schedule-policy控制请求调度,默认值为fcfs;可选值包括lpm、random、fcfs、dfs-weight、lof、priority和routing-key。- RadixAttention 是默认开启的前缀缓存机制;
--disable-radix-cache可将其关闭。 --chunked-prefill-size设置每个 prefill 分块的最大 token 数,设为-1会关闭 chunked prefill。--mem-fraction-static控制模型权重和 KV cache 内存池的静态分配比例;出现 out-of-memory 错误时,应尝试降低该值。--tensor-parallel-size与--tp-size设置张量并行大小,默认值为1;--dp-size用于设置数据并行副本。- YAML 配置可通过
--config传入,同名 CLI 参数会覆盖配置文件中的值。
需要核对完整参数时,运行:
python3 -m sglang.launch_server --help
如何确认服务已经工作
SGLang 的快速入门将以下输出作为服务就绪标志:
The server is fired up and ready to roll!
随后可通过 POST 访问 /v1/chat/completions。官方页面公开的 URL 和请求头如下,完整请求体应直接取自该页面的当前版本:
curl http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json"
vLLM 的 CLI 参考说明了服务参数,但没有给出可通用于所有模型的健康检查端点或请求体。不要把 SGLang 的本地端点直接当作 vLLM 的既定接口;直接部署 vLLM 时,应按其当前服务文档发送模型支持的请求。
常见出错点与排查顺序
- 安装版本异常:如果
uv低于0.12.0且未带--prerelease=allow,SGLang 的安装文档说明它可能静默安装旧版 SGLang0.5.9。先核对实际版本,再排查启动参数。 - 前缀缓存没有收益:Automatic Prefix Caching 文档明确指出,APC 只缩短 prefill,不缩短新 token 的生成;当答案很长或新请求没有共享前缀时,不会带来性能收益。
- 显存或抢占问题:记录完整启动参数、模型上下文长度、批处理上限和错误发生阶段,再回到对应参数段逐项调整,不要同时改变多个变量。
- 接口行为不一致:分别核对实际使用的引擎、启动版本和对应服务文档,不要从另一套引擎的端点或参数推断行为。
这些步骤依据正文链接的官方文档整理,未做运行或测量;使用前应按当前版本复核。