vLLM 与 SGLang 的参数是对称设计的,差异只有四个字段

2026-08-09

本文的参数名与默认值全部来自 hiyouga/LlamaFactory 仓库 src/llamafactory/hparams/ 下的源码,核对日 2026-08-09。我们没有安装、训练或部署过任何模型,也没有跑过任何一个推理后端。

src/llamafactory/hparams/model_args.py 里 vLLM 那一组和 SGLang 那一组字段并排放一起,会看到一件挺省心的事:它们是照着同一个模子长出来的。最大长度都是 4096,显存占用比例都是 0.7,都留了一个默认 None*_config 口子。真正不成对的字段,两边各两个,一共四个。

这篇不讲两个引擎谁快谁慢——那种数据官方没给,我们也没跑过任何一次推理,不比。这篇只做一件事:把这十个字段的确切名字和源码默认值摆清楚,顺便挑出三处最容易在换后端时踩到的「看起来一样其实不是一回事」。

先确认这些字段住在哪一层

LlamaFactory 把超参按文件切开了。src/llamafactory/hparams/ 目录下有 data_args.pymodel_args.pyfinetuning_args.pygenerating_args.pyevaluation_args.pytraining_args.pymegatron_bridge_args.py,加上 parser.py__init__.py——数据、模型、微调、生成、评测、训练、Megatron 桥接各占一个文件。

本文谈的这十个字段全部在 model_args.py,跟微调那一层(finetuning_args.py)和生成那一层(generating_args.py)不在同一个文件。这个位置信息比看起来重要:后面会看到,跨层有两组词根相同但含义不同的字段,混起来找会浪费时间。

同一个文件里还有一个前置字段:infer_backend,源码默认值是 EngineName.HF。也就是说,默认既不指向 vLLM 也不指向 SGLang。至于这两组带前缀的字段在什么条件下被哪段代码读取、不匹配的前缀会不会被忽略,我们没有读装配逻辑,不做推断,以 llamafactory-cli train -h 的实际输出为准。四个可选后端各自是什么,我们另有一篇专门讲。

对称的三组:名字不同,默认值一模一样

先看成对的部分:

维度vLLM 侧默认值SGLang 侧默认值
最大长度vllm_maxlen4096sglang_maxlen4096
显存占用比例vllm_gpu_util0.7sglang_mem_fraction0.7
透传配置vllm_configNonesglang_configNone

三组里最值得单独记一笔的是中间那行。同样是 0.7,字段名却不同:vLLM 侧叫 vllm_gpu_util,SGLang 侧叫 sglang_mem_fraction。一个用 gpu_util(显存利用率)的说法,一个用 mem_fraction(内存占比)的说法。写 YAML 的时候如果凭着「另一边那个叫什么来着」去补全,很容易把词根记串。真要换后端,最稳的做法就是回 model_args.py-h 输出里对一遍名字,别靠肌肉记忆。

vllm_configsglang_config 默认都是 None,两边各留了这么一个口子。能往里写什么、格式怎么写、它最终被交给引擎的哪一段代码,我们没有读过这部分实现,也没有在事实卡之外核实过,一律以官方文档与 llamafactory-cli train -h 的输出为准。这里只钉住一件事:这两个字段确实存在,默认都是 None

最后补一句限定:这里对称的是参数表的形状,不是两个引擎的行为vllm_maxlensglang_maxlen 默认值都是 4096,只说明这两个字段的 field(default=...) 写的是同一个数,不说明两个引擎对「最大长度」的处理方式相同。我们没有读过任何一侧的实现。

不对称的四个字段

两边各有两个字段在对面找不到位置:

只在 vLLM 侧默认值只在 SGLang 侧默认值
vllm_enforce_eagerFalsesglang_tp_size-1
vllm_max_lora_rank32sglang_lora_backend"triton"

逐个说,但只说名字和默认值,不解释引擎内部在做什么——那部分我们没读过实现,展开就是编。

vllm_enforce_eager,默认 False 这是个布尔开关,默认关着。

vllm_max_lora_rank,默认 32 这是这四个不成对字段里唯一一个正整数默认值,下一节还会再提到它。

sglang_tp_size,默认 -1 这是本文范围内唯一一个负数默认值。其它字段的默认值要么是布尔、要么是正数、要么是 None 或字符串,只有它是 -1。负数在很多项目里被用作哨兵值,但 LlamaFactory 这里的具体语义我们没有核实,不猜。

sglang_lora_backend,默认 "triton" 字符串类型,默认是这个值。

有一处结构上的巧合值得记下来:两侧各自那两个独有字段里,各有一个跟 LoRA 有关——vLLM 侧是 vllm_max_lora_rank(一个数字上限),SGLang 侧是 sglang_lora_backend(一个字符串名字)。它们同样带 lora 词根,但一个描述的是数量维度,一个描述的是实现选择,形状完全不同。这是从参数表读出来的客观对照,不是说哪一侧的设计更好。

32 和 8 不是同一回事

这是本篇最容易翻车的一处跨层混淆。

vllm_max_lora_rank 默认 32,住在 model_args.py。而训练侧的 lora_rank 默认是 8,住在 finetuning_args.py——那是另一个文件、另一层参数,examples/train_lora/qwen3_lora_sft.yaml 里写的也是这个默认口径。

两个字段词根相同(都带 lorarank),默认值不同(32 与 8),所属文件不同。它们之间该保持什么关系、你的场景里两个值该怎么填,官方没有给通用值,我们也不推断——这属于要回官方文档和 -h 输出确认的事。这里只把「它们是两个层的两个字段、默认值不一样」这个事实钉住,避免你在 YAML 里改了一个以为另一个跟着变了。

4096 和 1024 也不是同一回事

第二处跨层混淆在生成参数那一层。

vllm_maxlen / sglang_maxlen 默认都是 4096,在 model_args.py。而 generating_args.py 里的 max_length 默认是 1024max_new_tokens 默认也是 1024。同一个「长度」概念,在两个文件里有三个字段、两个不同的默认量级。

生成那一层还有几个常被凭印象记错的值:do_sample 默认 Truetemperature 默认 0.95top_p 默认 0.7top_k 默认 50。这几个默认值我们另有一篇专门讲,这里只提一句,是为了说明一件事:带引擎前缀的那组字段定义在 model_args.py,生成参数定义在 generating_args.py,是两份文件、两组独立的默认值。至于运行时两层之间怎么互相取值,我们没有读装配逻辑,不做推断。

同一文件里还有第三组前缀

model_args.py 里跟推理沾边的前缀其实不止两个。KTransformers 那组有六个字段:use_kt(默认 False)、kt_weight_pathkt_expert_checkpoint_pathkt_use_lora_expertskt_lora_expert_numkt_lora_expert_intermediate_size(后五个默认都是 None)。

把它跟前两组并排看,形状明显不一样:kt_ 这组没有「maxlen + 显存比例 + config 逃生口」这套三件套,而是以一个 use_* 布尔开关加一串路径与数量字段为主。这是三组参数在表层的结构差异,说到这里为止,不推断为什么这么设计。

另外,推理路径上还有两个不带引擎前缀、但同在 model_args.py 的通用字段:infer_dtype 默认 "auto"use_kv_cache 默认 True

换后端时,实际要核对的几件事

如果你已经决定要在这两个后端之间切换,按下面这个顺序核对,比对着参数表逐行猜省事:

  1. 先确认 infer_backend 有没有显式写。 源码默认是 EngineName.HF,不是这两个中的任何一个。
  2. 再确认前缀和词根都写对了。 两组是分开的两套字段名,vllm_gpu_util 在 SGLang 侧对应的字段叫 sglang_mem_fraction,不是同一个名字换个前缀。这一条是本文最实用的一句。
  3. 两个 maxlen 都默认 4096,但它跟 generating_args.py 里的 max_length(默认 1024)是两个文件里的两个字段,别把其中一个当成另一个的写法变体。
  4. 要设的选项如果不在这几个字段里,两边各有一个默认 None*_config 字段,具体写法回各引擎自己的文档确认。
  5. trust_remote_code 这类跨训练与推理都会用到的字段另有口径差异(源码默认 Falseexamples/ 下的示例 YAML 里显式写 true),我们另有一篇专门讲这处差异,这里只提醒你在切后端时顺手看一眼自己那份 YAML 写的是哪个。

至于每个值该设成多少:取决于你的模型、数据和硬件,官方没有给通用值,本文也不给。我们能负责的只有「字段叫什么、源码里的默认值是什么」这一层。

这篇没回答的问题

说清楚边界,比多写两段更有用:

  • 谁更快、谁更省显存:官方没给这两个后端的对比数据,我们也没有跑过推理,这一维不比。
  • 两个 0.7 是不是等价vllm_gpu_utilsglang_mem_fraction 默认值相同、名字不同,语义是否一一对应要看两个引擎各自的定义,我们没读实现,不下结论。
  • -1 到底代表什么sglang_tp_size 的默认值是 -1,含义以官方文档与 -h 输出为准。
  • 该选哪个后端:这取决于你的部署环境和已有技术栈,参数表这一层给不出这个答案。

参数与默认值会随版本变动,尤其是这种直接跟着上游引擎走的字段。真要动手前,回 llamafactory-cli train -h 的实际输出对一遍,比抄任何一篇文章(包括这篇)都可靠。


本文依据 LlamaFactory 官方仓库(github.com/hiyouga/LlamaFactory)的 README、data/README.mdexamples/ 下的配置与 src/llamafactory/hparams/ 的参数定义整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有安装、训练或部署过任何模型,文中显存数字均为官方标注的估算值(README 原文标 * estimated)而非实测占用。参数与默认值随版本变动,请以 llamafactory-cli train -h 的实际输出为准。安全相关做法请结合自身环境评估,本文不构成安全方案建议。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。