`cutoff_len` 2048、`val_size` 0.0:数据侧 28 个参数的默认值

2026-08-09

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

看别人的 YAML 学微调有个隐蔽的坑:那份 YAML 里通常只写了三五个数据侧参数,你照抄过来能跑,但你并不知道剩下二十多个参数此刻取的是什么值。 LlamaFactory 的数据侧参数集中定义在 src/llamafactory/hparams/data_args.py,我们实读这一份文件,一共 28 个参数。这篇不讲该调成多少——那取决于你的数据和硬件,官方也没给通用值——只把 28 个默认值摆齐,再讲清楚这张表该怎么读。

先把 28 个默认值放在一起

按功能分了组,参数名与默认值逐个照抄自 hparams/data_args.py

参数默认值
数据来源datasetNone
数据来源eval_datasetNone
数据来源dataset_dir"data"
数据来源media_dirNone
模板与系统提示templateNone
模板与系统提示default_systemNone
模板与系统提示tool_formatNone
长度与采样cutoff_len2048
长度与采样max_samplesNone
损失范围train_on_promptFalse
损失范围mask_historyFalse
损失范围ignore_pad_token_for_lossTrue
思维链enable_thinkingTrue
思维链preserve_thinkingFalse
验证与评估val_size0.0
验证与评估eval_on_each_datasetFalse
验证与评估eval_num_beamsNone
打包packingNone
打包neat_packingFalse
流式与混合streamingFalse
流式与混合buffer_size16384
流式与混合mix_strategy"concat"
流式与混合interleave_probsNone
预处理与缓存overwrite_cacheFalse
预处理与缓存preprocessing_batch_size1000
预处理与缓存preprocessing_num_workersNone
预处理与缓存tokenized_pathNone
预处理与缓存data_shared_file_systemFalse

分组是我们为了好读加的,源码里没有这层分类。

先看这张表的整体形状,比逐条抠更有用:28 个参数里有 12 个默认是 None,10 个是布尔量,剩下 6 个是有具体数值或字符串的(dataset_dir"data"cutoff_len2048buffer_size16384mix_strategy"concat"preprocessing_batch_size1000val_size0.0)。

10 个布尔量里,默认为 True 的只有两个ignore_pad_token_for_lossenable_thinking。其余八个(train_on_promptmask_historystreamingoverwrite_cacheeval_on_each_datasetneat_packingpreserve_thinkingdata_shared_file_system)默认全是 False。也就是说,这一层的默认姿态是几乎所有开关都关着,你不主动打开就不会生效。这个观察是我们照着上表数出来的,不是文档里的现成结论。

这些参数在哪一层,跨层口径对得上吗

data_args.py 是参数定义的其中一份,与模型侧、微调方法侧的参数文件并列。本文只核了数据这一份,别的层里相关的参数我们在这篇不下结论。

跨层对照有两处值得说:

一处对得上。 data/README.md 的 TIP 里写 enable_thinkingTrue 是「慢思考」且是默认值,data_args.pyenable_thinking 的默认值也确实是 True。文档口径和源码口径一致,这在参数文档里不算理所当然,能对上就记一笔。

一处写法不同。 data/README.mddataset_info.json 必须放在 dataset_dir 目录下,可以改 dataset_dir 用别的目录,默认值是 ./data;而 data_args.pydataset_dir 的默认值是字符串 "data"。两处指的是同一个相对目录,但字面写法一处带 ./ 一处不带。这是仓库里能核实到的差异,如实说到这儿就够了,哪一处「更对」、为什么不一致,我们不推断。

顺带一提,data/README.md 那条 TIP 的原文用的还是带连字符的旧名 LLaMA-Factory,而仓库当前路径是 hiyouga/LlamaFactory。新旧写法在仓库里并存,搜资料时两种拼法都试一遍即可。

数据来源那四个:默认全是「你不说我就不动」

dataset 默认 None,这和 data/README.md 开头的要求是同一件事的两面——使用自定义数据集时,必须在 dataset_info.json 里加一段 dataset description,并在训练前指定 dataset: dataset_name。默认值是 None 意味着这一项没有兜底,不写就是没有。

dataset_dir 的默认值是一个相对路径(源码里写作 "data"data/README.md 里写作 ./data)。相对路径要落到哪个绝对位置,取决于运行时怎么解析它——这一层我们没有读过实现,不下结论。能说的是:默认值不是绝对路径,所以「我明明把 dataset_info.json 放对了位置却读不到」这类情况,值得先把 dataset_dir 显式写成你确定的那个目录,再看问题还在不在。

Windows 和 Linux/macOS 在写这个值时形态不同:Linux/macOS 的绝对路径是 /path/to/data 这类形式;Windows 的路径分隔符是反斜杠,写进 YAML 时容易和转义规则撞车,常见做法是改用正斜杠或给整个值加引号。这一条属于通用的 YAML 与路径书写习惯,不是 LlamaFactory 文档里的内容——官方文档没有专门讲 Windows 路径怎么写。

eval_datasetmedia_dir 同样默认 None

cutoff_len 2048:最常被改的那个值

data_args.pycutoff_len 的默认值是 2048,也是数据侧最常被改的一个值。

到这里我必须停住,不给建议。很多文章会顺势说「显存不够就把 cutoff_len 调小」——这一步推理在本文的证据范围之外。README 里的显存表原文标了 * estimated(估算),不是实测占用;我们也没有跑过任何一次训练。既然连显存基线都是官方标注的估算值,就更不能拿它反推「你把 cutoff_len 从 2048 改到 4096,你那张卡够不够」。

能确定的只有这一句:cutoff_len 默认是 2048,你不写它就是 2048。该设多少取决于你的数据长度分布和硬件,官方没给通用值。

同组的 max_samples 默认 None,即默认不额外限制样本数。

「哪部分参与损失」是这张表里最值得先看懂的一块

这块由两处共同决定:一半在数据格式里,一半在这几个开关里。

先说格式那一半,data/README.md 有两条硬规则:

  • Alpaca 格式的 history 列,是历史消息里的 prompt-response 对;原文明确写着,监督微调时历史里的 response 也会被模型学习
  • ShareGPT 格式里,gptfunction 会被模型学习

也就是说,你往 history 里塞的多轮上下文不是白送的上下文,它是训练目标的一部分。这一点不看 data/README.md 很难猜到。

再看开关这一半:train_on_prompt 默认 Falsemask_history 默认 False,两个都是与「哪部分参与损失」相关的开关,默认都关着。ignore_pad_token_for_loss 默认 True,是这张表里默认为真的两个之一。这三个具体如何作用于损失计算的实现细节,我们没有逐行读过,不展开。

enable_thinking 的三态,以及那句「必须一致」

enable_thinking 默认 Truepreserve_thinking 默认 False。前者的行为在 data/README.md 的 TIP 里写得很完整,照原文转述:

若模型有推理能力(例如 Qwen3)但数据集不含 CoT,会自动补一个空 CoT。enable_thinkingTrue(慢思考,默认值)时,空 CoT 会被加到模型响应里,并计入损失计算;否则(快思考)空 CoT 会被加到用户提示词里,损失计算会忽略它

第三态是 None:想让含 CoT 的数据走慢思考、不含 CoT 的数据走快思考,可以把 enable_thinking 设为 None;但原文同时提醒,这个特性相对复杂,使用需谨慎(should be used with caution)。

最后一句是整张表里少见的、官方给了明确约束的地方:训练与推理时 enable_thinking 必须保持一致。 这也是这个参数与别的参数最不一样的地方——大多数数据侧参数只影响训练侧,它却牵着推理侧。你在训练 YAML 里改了它,推理那边就得跟着改。

val_size 0.0:默认压根不切验证集

val_size 默认 0.0,含义是默认不切验证集。同组的 eval_dataset 默认 Noneeval_on_each_dataset 默认 Falseeval_num_beams 默认 None

这四个默认值合在一起是一个挺重要的事实:照抄一份没写这几项的 YAML,你这次训练就是没有验证集的。如果你打算靠某条曲线判断有没有过拟合,得先确认自己显式设过其中之一。至于 val_size 该切多少,同样取决于你的数据规模,官方没给通用值,本文不编一个。

打包、流式、缓存:剩下九个的默认姿态

packing 默认 Noneneat_packing 默认 False,是两个与序列打包相关的开关。

streaming 默认 False,配套的 buffer_size 默认 16384;多数据集混合由 mix_strategy(默认 "concat")与 interleave_probs(默认 None)控制。默认是不流式、按 concat 混合。

预处理与缓存这一组:overwrite_cache 默认 Falsepreprocessing_batch_size 默认 1000preprocessing_num_workers 默认 Nonedata_shared_file_system 默认 Falsetokenized_path 默认 None,用于预处理产物,仓库里对应的示例是 examples/train_lora/qwen3_preprocess.yaml

读这张表的三条纪律

第一,默认值不是推荐值。 这张表回答的是「我没写它的时候它是多少」,不是「我该写多少」。这两个问题的答案在这个仓库里没有被绑定过。

第二,先确认默认姿态,再决定改哪一个。 默认姿态可以概括成一句:数据来源全空、模板全空、开关几乎全关、不切验证集、截断 2048。你的多数「怎么和预期不一样」,第一步应该回来对一遍这张表,而不是先怀疑算法。

第三,参数会随版本变。 这 28 个是我们在 2026-08-09 这天读到的 data_args.py 的内容。真要落到你的环境上,以 llamafactory-cli train -h 的实际输出为准。

template 默认 None 这一条,本文只交代到「默认是空的、必须自己指定」这一层;每个模型该填哪个 template 名、为什么训练和推理两侧要对齐,我们另有一篇专门讲。dataset_info.json 的完整字段规格、两种数据格式各自的写法,也各有专篇,这篇不重复搬。


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

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