导出九个参数:`export_size` 5、`export_device` cpu

2026-08-09

本文所有事实以 hiyouga/LlamaFactory 官方仓库 2026-08-09 的内容为准。我们没有安装、训练或部署过任何模型,文中数字均为仓库源码与示例配置里写着的值。

导出常被当成训练完顺手一跑的收尾动作,直到你在 llamafactory-cli export 前面愣住:这条命令到底认哪些参数?答案是九个,一个不多一个不少,全部以 export_ 开头,全部定义在 src/llamafactory/hparams/model_args.py 里。而官方那份合并 LoRA 的示例配置,只显式写了其中四个。

这篇不讲怎么合并 LoRA 更划算,只做一件事:把九个参数名、源码默认值、示例配置里的实际取值三者摆到一起对一遍,顺带说清哪些东西我们核实到了、哪些没有。

先确认它们住在哪一层

LlamaFactory 把超参按职责拆进了 src/llamafactory/hparams/ 下的八个文件:data_args.pyevaluation_args.pyfinetuning_args.pygenerating_args.pymegatron_bridge_args.pymodel_args.pyparser.pytraining_args.py(外加 __init__.py)。

九个 export_ 参数在 model_args.py,和 model_name_or_pathadapter_name_or_pathtrust_remote_codequantization_bitinfer_backend 这些是邻居。它们不在 finetuning_args.py——stagefinetuning_typelora_rank 那一堆才在那里。

这个归属不是纯粹的代码洁癖,它决定了你翻文档时该往哪找。导出在这套划分里被归到”模型怎么装载、怎么落盘”这一层,而不是”怎么训”那一层。所以当你想调整导出行为时,去 finetuning_args.py 的参数表里找是找不到的。

顺带一提,megatron_bridge_args.pyparser.pytraining_args.py 这三个文件的字段我们没有逐个抽取过,本文不涉及它们的内容。

九个参数与源码默认值

这张表是本篇的正题,逐个照抄自 model_args.pyfield(default=...)

参数源码默认值
export_dirNone
export_size5
export_device"cpu"
export_quantization_bitNone
export_quantization_datasetNone
export_quantization_nsamples128
export_quantization_maxlen1024
export_legacy_formatFalse
export_hub_model_idNone

数一下就会发现,九个里有四个默认是 None——export_direxport_quantization_bitexport_quantization_datasetexport_hub_model_id,也就是”不给就没有值”。剩下五个是带具体默认值的:三个数字(export_size5export_quantization_nsamples128export_quantization_maxlen1024)、一个字符串(export_device"cpu")、一个布尔(export_legacy_formatFalse)。四加五正好九个,对不上就是抄错了。

示例只写了四个,另外五个吃默认

官方的合并 LoRA 示例是 examples/merge_lora/qwen3_lora_sft.yaml,全文如下:

### Note: DO NOT use quantized model or quantization_bit when merging lora adapters

### model
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/lora/sft
template: qwen3_nothink
trust_remote_code: true

### export
export_dir: saves/qwen3_sft_merged
export_size: 5
export_device: cpu  # choices: [cpu, auto]
export_legacy_format: false

### export 块只有四行,对应 export_direxport_sizeexport_deviceexport_legacy_format。剩下五个 export_ 参数在这份配置里根本没出现,走的是源码默认值。

把这四行和上面那张表对一遍,会发现一件挺有意思的事:export_size: 5 与源码默认 5 一致,export_device: cpu 与源码默认 "cpu" 一致,export_legacy_format: false 与源码默认 False 一致。也就是说,四个显式写出来的字段里有三个写的就是默认值,唯一一个”不写就没有值”的是 export_dir——源码默认 None,示例给了 saves/qwen3_sft_merged

这一点值得和同一份文件里的另一处对照着看:这份 YAML 也写了 trust_remote_code: true,而 model_args.pytrust_remote_code 的源码默认值是 False。同一个文件里,export_ 那几行是”示例与源码默认一致”,trust_remote_code 那行是”示例与源码默认不一致”。两处差异都可以核实,说到这儿就够了,我们不推断哪种写法是”对的”,也不推断作者为什么这么写。

export_size 这个 5,我们核实到哪一步

老实交代边界:我们核实到的是参数名叫 export_size、源码 field(default=...) 里写的是 5、示例 YAML 里写的也是 5。仅此而已。

它的单位是什么、这个数字影响的是分片还是别的什么,我们没有从仓库里核实到明确说法,因此本文不做任何解释、不给换算、也不猜。要确认语义,请以 llamafactory-cli export -h 的实际输出和官方文档为准——顺带提一句,README 里把官方文档页标了 (WIP),这是仓库自己写的状态标注。

这种”只报数不解释”的写法看着别扭,但比编一个听起来合理的解释强。参数名的字面意思和它的实际行为不是一回事,这一点在任何框架里都成立。

export_device 的取值只有两个

export_device 的源码默认是 "cpu"。它的可选值写在示例 YAML 的行内注释里:# choices: [cpu, auto]。就两个,没有第三个。

至于两个取值各自意味着什么、你该选哪一个,仓库里没有给出说明,官方也没有给通用值,我们没有跑过任何一次导出,所以不解释也不给建议。你能确定的只有两条:可选值就这两个;不显式写这一行,走的就是 cpu

四个 export_quantization_* 与那条全大写的禁令

九个参数里有四个是量化相关的:export_quantization_bit(默认 None)、export_quantization_dataset(默认 None)、export_quantization_nsamples(默认 128)、export_quantization_maxlen(默认 1024)。前两个默认没有值,后两个默认带数字。同样地,这四个字段的具体语义我们没有核实,只报名字和默认值。

真正需要你留意的是示例文件的首行注释,原文照抄:

### Note: DO NOT use quantized model or quantization_bit when merging lora adapters

合并 LoRA 适配器时不要使用量化模型或 quantization_bit。这是一条全大写的操作禁令,不是”建议不要”,我们不做任何软化转述。

这里有个容易混的地方必须点破:quantization_bitexport_quantization_bit两个不同的参数。前者在 model_args.py 的量化加载那一组里,默认 None,同组还有 quantization_method(默认 QuantizationMethod.BNB)、quantization_type(默认 "nf4")、double_quantization(默认 True);后者是导出侧的那九个之一。禁令原文点名的是 quantization_bit 和”量化模型”。两个参数名只差一个前缀,配置文件里写错一个字,你以为自己关掉了某个开关,实际动的是另一层。

另外,从 examples/README.md 的配方清单看,“Merging LoRA Adapters and Quantization” 这一节下面是两条并列的配方:一条是合并 LoRA 适配器,另一条是用 AutoGPTQ 量化模型。examples/merge_lora/ 目录里的五个文件也印证了这一点,其中有一份就叫 qwen3_gptq.yaml。合并与量化在这套示例里是分开的两件事。

剩下两个:export_legacy_formatexport_hub_model_id

export_legacy_format 默认 False,示例里显式写了 false,两处一致。export_hub_model_id 默认 None,示例里没有出现。它到底做什么、名字里的 hub 具体指向哪一层,我们同样没有从仓库里核实到明确说法,按前面那条规矩办:只报名字和默认值,语义以 -h 输出为准。

顺便记一下相关的三个 token 字段:hf_hub_tokenms_hub_tokenom_hub_token,都默认 None,分别对应 Hugging Face、ModelScope、Modelers 三个 Hub。写到密钥一律用环境变量或 <YOUR_API_KEY> 占位,别把真值提交进 YAML。

导出这一步在整条链路上的位置

README Quickstart 抬出来的是三条命令:

llamafactory-cli train examples/train_lora/qwen3_lora_sft.yaml
llamafactory-cli chat examples/inference/qwen3_lora_sft.yaml
llamafactory-cli export examples/merge_lora/qwen3_lora_sft.yaml

对应的三份 YAML 字段是严格对齐的:同一个基座 Qwen/Qwen3-4B-Instruct-2507,同一个 template: qwen3_nothink,训练配置的 output_dir: saves/qwen3-4b/lora/sft 正是推理和导出配置里 adapter_name_or_path 的值,导出产物落到 export_dir: saves/qwen3_sft_merged

注意导出配置里也写了 template,而且和训练、推理侧是同一个值。关于 template 为什么必须几处对齐,我们另有一篇专门讲,这里只提醒:导出配置不是只有 export_ 那四行,上面的 model 块同样是链路的一部分。三份 YAML 的 template 是同一个值,改了其中一处而没同步另外两处,这条闭环就不再对齐了——至于会表现成什么样,我们没有跑过,不做描述。

那么该怎么填

这篇能给你的确定结论只有三条:导出相关参数一共九个,全在 model_args.py;官方示例只显式写四个,其中三个写的就是默认值;合并 LoRA 时有一条全大写的禁令,别用量化模型和 quantization_bit

export_size 该给多少、export_device 该选 cpu 还是 auto、要不要动那四个 export_quantization_*,取决于你的模型、硬件和后续用途,官方没有给通用值,我们也没有实际跑过导出,所以不给推荐值。真要定,先跑 llamafactory-cli export -h 看当前版本的参数说明,再对照 examples/merge_lora/ 下与你场景最接近的那一份配置。

这个目录一共五个文件:mossvl_lora_sft.yamlqwen3_full_sft.yamlqwen3_gptq.yamlqwen3_lora_sft.yamlqwen3vl_lora_sft.yaml。除了本文逐行拆过的 qwen3_lora_sft.yaml,另外四份我们没有读过,所以本文不描述它们的内容,也不替它们归类——文件名里的 qwen3 / qwen3vl / mossvlfull_sft / lora_sft / gptq 这些片段能帮你缩小范围,但打开之前别当成结论。挑最贴近你手上情况的那个文件名自己打开看,比照着一篇文章的示例改配置更靠谱。


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

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