Rust in Everything

关键参数对照

主线位置:启动参数,作用在「一个请求的一生」的调度、KV 块分配、前向几段。参数解析在两个引擎里都是 Python:vLLM 的字段在 vllm/config/,命令行由 vllm/engine/arg_utils.py 生成;SGLang 的字段在 python/sglang/srt/arg_groups/fields/,解析钩子在同目录的 *_hook.py。打开 Rust 前端后,前端自己的参数另算(见两种 Rust 前端),下表这些仍由 Python 引擎读。

版本:vLLM v0.32.0、SGLang v0.5.22

结论:

  • 名字相近的参数不一定同义。最要紧的一对:vLLM --gpu-memory-utilization 管整个引擎,SGLang --mem-fraction-static 只管权重加 KV(显存预算)。
  • 两边很多参数的默认值是 None,意思是「启动时按显存、模型或其他参数推出来」。表里的「默认」写的是推出来的结果和推导它的位置,不是字段上的 None。
  • 默认值对 24 GB 卡、单卡、8B 生成模型、CUDA 而言。换卡型或模型,分档的那几行会变。
flowchart LR
  cli["命令行参数"] --> field["配置字段<br/>默认常为 None"]
  field --> hook{"启动时推导"}
  hook -->|"按显存分档"| mem["预算、分块、并发"]
  hook -->|"按模型能力"| cap["分块开关、前缀缓存"]
  hook -->|"按 profile / 公式"| kv["KV 池大小"]
  mem --> eff["生效值<br/>(启动日志里打印)"]
  cap --> eff
  kv --> eff

显存与长度

作用vLLM默认SGLang默认
显存比例--gpu-memory-utilization:引擎总预算 / 总显存0.92(cache.py#L102)--mem-fraction-static:(权重 + KV) / 总显存None → 按公式推,24 GiB 卡约 0.704(schedule.py#L27、memory_hook.py#L283)
直接给 KV 大小--kv-cache-memory-bytes(字节);--num-gpu-blocks-override(块数,测试用)都是 None(cache.py#L257、#L135)--max-total-tokens(token 数)None(schedule.py#L39)
最大长度--max-model-len;-1 表示按 KV 自动缩None → 模型 config.json 推出的长度(model.py#L245、#L2624)--context-lengthNone → config.json(model.py#L104);单请求实际上限再和 KV 池取小(tp_worker.py#L549)
权重精度--dtypeauto(model.py#L196)--dtypeauto(model.py#L154)
KV 精度--kv-cache-dtypeauto,跟模型精度(cache.py#L122)--kv-cache-dtypeauto(model.py#L191)

两点补充:

  • vLLM 的 --max-model-len 大于模型配置推出的长度时直接报错,除非设 VLLM_ALLOW_LONG_MAX_MODEL_LEN=1(model.py#L2662)。
  • KV 精度的可选值、FP8 的 scale 存在哪,见 KV 量化。

并发与每步 token

作用vLLM默认SGLang默认
运行中请求上限--max-num-seqsNone → 按显存与入口分档,24 GB 卡起 OpenAI 服务 256(get_batch_defaults)--max-running-requestsNone → 按 KV 池推,2048 到 4096 之间且不超过 KV token 数的一半(schedule.py#L31、resolve_max_num_reqs)
每步 token 上限--max-num-batched-tokens(解码和预填充共用)None → 同上分档,24 GB 卡 OpenAI 服务 2048--max-prefill-tokens(一个预填充批的输入上限)16384(schedule.py#L67)
吞吐模式--performance-mode throughput:没手设的上面两项翻倍balanced(vllm.py#L433,翻倍在 arg_utils.py#L3129)无对应—

vLLM 启动时还会检查:关了分块预填充时 max_num_batched_tokens 不能小于 max_model_len;任何时候不能小于 max_num_seqs(scheduler.py#L314)。

调度

作用vLLM默认SGLang默认
分块预填充--enable-chunked-prefill / --no-enable-chunked-prefillNone → 模型支持就开,生成模型都支持(arg_utils.py#L2993)--chunked-prefill-size;-1 关None → 按显存分档,24 GB 卡 4096(schedule.py#L52、memory_hook.py#L101)
长 prompt 单步上限 / 混批--long-prefill-token-threshold0,不限(scheduler.py#L79)--enable-mixed-chunk:解码搭进预填充批False(schedule.py#L202)
队列顺序--scheduling-policy:fcfs、priorityfcfs(scheduler.py#L159)--schedule-policy:fcfs、lpm 等九种fcfs(schedule.py#L82)
优先级同上取 priority—--enable-priority-schedulingFalse(schedule.py#L99)
收请求的保守程度无对应—--schedule-conservativeness:乘到 new_token_ratio 初值上1.0(schedule.py#L135)

两边「分块」的意思不同:vLLM 是一个 token 预算统一分给解码和预填充块;SGLang 是预填充批里预填充 token 的上限,默认不和解码混。见连续批处理和分块预填充。

前缀缓存

作用vLLM默认SGLang默认
开关--enable-prefix-caching / --no-enable-prefix-cachingNone → 模型支持就开,decoder 生成模型支持(arg_utils.py#L3021、model.py#L2221)--disable-radix-cacheFalse,即开;可被解析钩子改写(memory.py#L64)
哈希算法--prefix-caching-hash-algosha256(cache.py#L143)无,树的键就是 token—

--no-enable-prefix-caching 这种写法来自 argparse.BooleanOptionalAction,vLLM 对布尔字段统一这样生成(arg_utils.py#L380)。SGLang 的前缀树有若干模型和后端会自动关掉,命中机制见前缀缓存。

并行、量化、投机解码

作用vLLM默认SGLang默认
张量并行--tensor-parallel-size / -tp1(parallel.py#L141)--tp-size / --tensor-parallel-size1(parallel.py#L45)
权重量化--quantization / -qNone → 读模型配置里的量化信息(model.py#L260)--quantizationNone,可解析(model.py#L171)
投机解码入口--speculative-config / -sc:一个 JSON,method 选 ngram、eagle、eagle3、medusa 等None,不开(arg_utils.py#L714、method 字段 speculative.py#L399)--speculative-algorithm:EAGLE、EAGLE3、NGRAM、STANDALONE 等,配套 --speculative-* 一组参数None,不开(spec.py#L31)

两边的投机解码入口形状不同:vLLM 把草稿模型、步数等都放进一个 JSON;SGLang 是一组平铺的命令行参数。机制和接受率在 04 部分;效果待实测(C3-5)。张量并行的通信量在 05 部分;多卡数字待实测(C3-7)。

文本与请求

作用vLLM默认SGLang默认
聊天模板--chat-template(文件或字符串)None → 依次找处理器、分词器自带的模板,再找内置兜底(cli_args.py#L86、hf.py#L272)--chat-templateNone → 用分词器自带的(serving.py#L170)
自定义模型代码--trust-remote-codeFalse(model.py#L193)--trust-remote-codeFalse(model.py#L100)
超长输入截断无服务端开关;请求里的 truncate_prompt_tokensNone,不截(protocol.py#L285)--allow-auto-truncateFalse,超长报错(serving.py#L248)

怎么确认生效值

字段上的默认值和最终生效值常常不同,以启动日志为准:

  • vLLM:Chunked prefill is enabled with max_num_batched_tokens=…(scheduler.py#L306);Available KV cache memory: … GiB;GPU KV cache size: … tokens, Maximum concurrency for … tokens per request: …。
  • SGLang:max_total_num_tokens=…, chunked_prefill_size=…, max_prefill_tokens=…, max_running_requests=…, context_len=…(scheduler.py#L1234)。

小结

  • 显存:vLLM --gpu-memory-utilization 0.92 管整个引擎;SGLang --mem-fraction-static 默认按公式推,只管权重加 KV。两边都能绕过比例直接给 KV 大小。
  • 长度和并发:vLLM 的 --max-model-len、--max-num-seqs、--max-num-batched-tokens 默认都按模型或显存推出,24 GB 卡起服务是模型长度、256、2048;SGLang 的 --context-length 跟模型,--max-running-requests 按 KV 池推,--chunked-prefill-size 24 GB 卡 4096。
  • 开关类:两边的前缀缓存默认开、调度默认 fcfs、TP 默认 1、KV 精度默认跟模型、量化默认读模型配置、投机解码默认关。SGLang 的混批默认关。
  • 默认是 None 的参数,以启动日志打印的值为准。

💬 关联讨论

发起讨论
加载中...