8、训练配置与显存估算
本节先掌握: 对照第 8.1 节,把配置读成一次完整的训练安排。第 8.2 节的计算器是更换配置时的选读工具,估算还需要实机验证。
现在回到本章开头的任务:使用第 29 章清洗并划分的数据,在 AutoDL 的现有 V100-32GB 单卡上,对 Qwen/Qwen3-0.6B 做 LoRA 微调。下面不增加新参数,而是试着把整份配置读成一次训练安排。
8.1 首轮训练配置
第 2 节先认识了训练页面和三个批次参数。现在回到 案例与源码-4-微调/configs/keywords_clean_train.yaml,把整套设置连起来读:
先用本章开头的五项设置,把安排说清:每批 4 条、累积 8 批后更新,1,600 条训练数据练 3 轮;学习率按 5e-5 调度,每条完整训练序列最多保留 2048 个 token。预计每轮更新 50 步,合计 150 步。
再核对两个条件:使用匹配的模型与模板,V100 上采用已验证的 FP16。LoRA 先沿用课程设置;日志、验证与保存间隔属于观察和留存安排。
<details> <summary>运行时查阅:首轮训练的完整字段与取值</summary>| 中文名称与配置字段 | 本次取值 | 对应前面学到的含义 |
|---|---|---|
模型路径model_name_or_path | Qwen/Qwen3-0.6B | 指定要微调的模型 |
对话模板template | qwen3_nothink | 按模型要求组织输入与答案 |
思考模式enable_thinking | false | 请求关闭思考;实际处理取决于模板,见第 32 章对照 |
训练集dataset | keywords_train | 1,600 条样本,用于更新参数 |
验证集eval_dataset | keywords_validation | 200 条样本,用于训练中检查 |
自动验证划分val_size | 0 | 已有独立验证文件,不再额外划分 |
截断长度cutoff_len | 2048 | 每条训练序列的 token 数上限 |
| 单卡批处理大小 <code style="white-space: normal; overflow-wrap: anywhere;">per_device_train_batch_size</code> | 4 | 每张卡每个小批次处理 4 条样本 |
| 梯度累积步数 <code style="white-space: normal; overflow-wrap: anywhere;">gradient_accumulation_steps</code> | 8 | 累积 8 个小批次后更新一次参数 |
训练轮数num_train_epochs | 3 | 训练集学习 3 遍,预计共 150 个更新步 |
优化器optim | adamw_torch | 使用 PyTorch 的 AdamW 更新参数 |
学习率learning_rate | 5.0e-5 | 本例预热结束时达到的学习率 |
学习率调度器lr_scheduler_type | cosine | 预热后按余弦曲线降低学习率 |
预热步数warmup_steps | 5 | 前 5 个更新步逐步提高学习率 |
FP16 混合精度fp16 | true | 开启本次 V100 使用的混合精度训练 |
BF16 混合精度bf16 | false | 本次不开启 BF16 |
LoRA 秩lora_rank | 8 | 设置新增分支的中间宽度 |
LoRA 缩放系数lora_alpha | 16 | 配合 rank,按 alpha/r 缩放分支结果 |
LoRA 随机丢弃lora_dropout | 0 | 不随机丢弃分支输入 |
LoRA 作用模块lora_target | all | 在工具识别的适用线性层添加分支 |
日志间隔logging_steps | 5 | 每 5 个更新步记录一次日志 |
验证间隔eval_steps | 50 | 每 50 个更新步检查一次验证损失 |
保存间隔save_steps | 50 | 每 50 个更新步保存一次检查点 |
200 条测试数据留给最终检查,不参与本轮训练或检查点选择。第 31 章会把这份配置对应到 WebUI 的填写位置,并提供可选的命令行入口。
这份配置的取值依据需要分开理解:模型与模板要匹配,计算精度要适合硬件,长度要能保留完整样本,这些都有明确的检查条件;batch、学习率、轮数和 LoRA 参数则组成了一套已运行过的起始安排。已有记录便于复现和比较,不能据此称它为最优组合。
<details> <summary>选读图解:整套训练配置与产物的对应关系</summary>
先不翻前文,试着向别人说明这次训练:
- 训练、验证、测试各用多少条?哪一份数据会让参数发生更新?
- 每次只处理 4 条,为什么不是每轮更新 400 次?第 50 步时准备做什么?
- 使用 LoRA 后,训练结束得到什么?拿到这个文件,是否就能证明关键词抽取变好了?
我们用 1,600 条文章与参考答案训练,只更新选定层的 LoRA 分支。每批处理 4 条,累计 8 批、也就是 32 条后更新一次;每轮 50 步,3 轮共 150 步。每 5 步记录日志,每 50 步用 200 条验证数据检查并保存检查点。验证过程不更新参数,但其结果会用于选择检查点;200 条测试数据继续保留。
训练得到 Adapter、日志和检查点。Adapter 需要与对应的原模型一起使用;接下来还要比较实际生成的关键词,不能只凭 Loss 降了或文件保存成功,就宣布任务效果改善。
</details>能说明这段安排以后,再做一道配置判断题:假设模型加载成功,但处理批次时显存不足。同学建议同时把 batch 改成 2、学习率改成 1e-4、rank 改成 16、截断长度改成 512。你会怎样处理? 先说出报错对应哪部分占用,再决定保留哪些修改。
先把 batch 改为 2,配合累积 16,维持有效批次 32;学习率和 rank 保持课程取值。这次要解决的是同时处理样本的空间问题,增大学习率不会减少占用,增大 rank 还会增加可训练参数的相关开销。
长度先保持 2048。已有记录中最长样本为 957,直接降到 512 会使部分样本无法完整保留。如果后续确实需要缩短,应先检查截断后的输入和答案,不能为了通过第一批而丢掉关键词的来源。
然后核对启动日志:有效批次仍为 32,总更新步数仍为 150。观察原来的报错位置是否通过,并继续看更长批次及验证过程,记录显存与耗时;若仍报错,再按第 33 章检查其他占用。资源问题解决后,实际回答仍按第 32 章验证。
</details>修改配置前,可以用一句话记录实验目的:“我准备改什么,希望改变哪一步,之后用什么结果判断。”例如,比较学习率就固定数据、模型、模板和其他训练设置;比较 rank 并维持相加前的缩放倍数,则按第 6.4 节配套处理 alpha。一次比较围绕一个明确问题,并记录相关设置的变化。 不同实验从约定的相同起点开始、使用不同输出目录,才能把结果对上。
8.2 使用显存计算器
本小节选读。 首次跟做已有课程配置,可以先继续第 9 节。以后更换模型或训练设置时,再用计算器作粗略估算,之后通过实机试跑检查。
记住一个边界:计算器的估算值不等于真实峰值,也不能证明显卡精度兼容或训练一定能完成。
<details> <summary>选读操作:填写显存计算器、理解结果并与实际运行对照</summary>打开 ApX 显存计算器,选择“微调”和“LoRA”,再填写模型与主要训练参数。不要使用“推理”页面估算训练,因为它不包含同样的训练状态。
对照上表,填写模型 Qwen3-0.6B、rank 8、batch 4、长度 2048、梯度累积 8:

图中 batch 的提示文字提到了“每次优化步”,读时要分清:输入框里的 4 是单卡每个小批次的样本数,配合累积 8 次,才得到每次参数更新的有效批次 32。
计算器中还有三个需要注意的地方:
- 精度统一显示为 FP16/BF16;本次 V100 配置使用 FP16,不能凭这个合并选项判断硬件兼容性。
- 没有 V100 预设时,选择单卡并自定义 32 GB 显存容量;这只匹配容量,不能据此估算 V100 的训练速度。
- 优化器选 AdamW,梯度检查点开启、页面比率为 100%。这是第 5.3 节说的减少中间结果保存,不是训练文件的保存频率。
同一组设置的结果约为 9.8 GB:

这个数是按页面假设分项相加得到的预算:模型权重约 1.2 GB,中间结果约 7.1 GB,LoRA 优化器与梯度约 0.01 GB,框架开销约 1.5 GB,合计约 9.8 GB。各项是计算器估算值,不是训练过程中的测量值。
为什么第 33 章实际采样达到约 27.92 GiB? 两处记录的范围不同:
| 对照项 | 计算器的 9.8 GB | batch 4 对照实验的 27.92 GiB |
|---|---|---|
| 怎样得到 | 按长度 2048 等输入与页面公式估算各项预算 | 运行 LLaMA-Factory,每 200 毫秒采样一次整张 GPU 的已用显存 |
| 包含哪些条件 | 使用页面默认填充、运行开销等假设;没有 alpha、target 的独立入口 | 包含模型加载、训练、验证和保存期间的实际分配与缓存 |
| 数值表示什么 | 简化预算的合计 | 全程最高采样值 28,588 MiB,约 27.92 GiB,即约 29.98 GB |
实际软件在不同阶段会申请临时空间,并保留部分缓存;计算器的固定预算无法完整反映这个过程。现有记录没有逐项显存追踪,因此还不能把差额归到某一个组件。选配置时用估算筛选方案,确定能否稳定运行则要看第 33 章的实际资源记录。
读完这组截图,可以用前面的知识检查自己的理解:如果模型和精度不变,只把 batch 从 4 改为 8,模型权重不会随之翻倍,主要增加的是并行处理样本的计算占用;如果只提高长度上限,影响还取决于实际样本长度、填充方式以及计算器的假设。
需要估算新配置时,可以先只改 batch,记录新读数;再恢复原值,比较长度上限。假如计算器随上限提高而给出更高估算,先看它是否按所填长度计算,不要直接套到当前最长 957 token 的实际数据上。估算帮助筛选待试的方案,真正保留哪个设置,还要对照实际运行的占用、耗时和样本完整性。
估算示例:同一个 8B 模型为什么推理与全参数训练占用不同
下面比较同一计算器在两种输入条件下的估算,用于理解计算过程的差别:
| 模式 | 估算输入条件 | 页面估算 |
|---|---|---|
| 推理 | Qwen3-8B、FP16 权重、FP16/BF16 KV 缓存、batch 1、长度 1024、并发 1 | 17.2 GB |
| 全参数微调 | Qwen3-8B、FP16/BF16、batch 1、长度 1024、梯度累积 1 | 143.4 GB |
全参数训练还要保存大量梯度和优化器状态,所以估算明显增大。143.4 GB 不是 8B LoRA 的显存需求,也不能把两项的比值当成所有模型的固定规律。
</details>