微信扫码
添加专属顾问
我要投稿
大模型微调实战指南:从参数设置到显存优化,两大权威经验助你高效炼丹。核心内容: 1. 北航ACT实验室的调参四步法:学习率、训练轮数、批处理大小与LoRA参数优化 2. LLaMA-Factory核心开发者的完整微调脚本解析与关键参数说明 3. 显存占用核心影响因素与参数组合的平衡策略
本文承接本系列第二篇文章,继续探究各参数应该如何进行设置,以及其对模型显存的影响。
训练模型的过程通常被戏称为“炼丹”。参数组合和结果息息相关,但没有标准最优参数组合。
因此,在自行钻研之前,有必要先看看别人是怎么做的。
北航 ACT 实验室做了一份教程[1],参数经验概括如下:
1.调大学习率
默认的学习率是5e-5,其调大一倍,改成1e-4,调大学习率让模型每轮迭代学习速度提升
2.调大训练轮数
默认的训练轮数是3轮,其调成8轮,让模型更加充分训练
3.调节批处理大小
默认的批处理大小为2,该文章指出:一般保持批处理大小×梯度累积×显卡数量等于 32 即可
4.调大LoRA参数
默认的LoRA秩为8,缩放系数为16,其将LoRA秩调为16,缩放系数调为32
LLaMA-Factory 的核心开发者马勇强在知乎上写了一篇入门文档[2],其在微调时的参数选择脚本如下:
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path /media/codingma/LLM/llama3/Meta-Llama-3-8B-Instruct \
--dataset alpaca_gpt4_zh,identity,adgen_local \
--dataset_dir ./data \
--template llama3 \
--finetuning_type lora \
--output_dir ./saves/LLaMA3-8B/lora/sft \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 1024 \
--preprocessing_num_workers 16 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--logging_steps 50 \
--warmup_steps 20 \
--save_steps 100 \
--eval_steps 50 \
--evaluation_strategy steps \
--load_best_model_at_end \
--learning_rate 5e-5 \
--num_train_epochs 5.0 \
--max_samples 1000 \
--val_size 0.1 \
--plot_loss \
--fp16
对应修改点如下:
1.截断长度下调
截断长度从2048下调到1024
2.预热步数上调
预热步数从0上调到20
3.训练轮数上调
训练轮数从3上调到5
4.最大样本数下调
最大样本数从100000下调到1000
5.验证集比例上调
验证集比例从0上调到0.1(10%)
6.计算类型修改
计算类型从 bf16 改为 fp16
easy-dataset 的作者 ConardLi 的文章[3]也分享了调参经验,总结归纳如下:
1.大 batch_size 需搭配大学习率,小 batch_size 需搭配小学习率,对于小数据集的微调,batchsize可直接从1开始。
2.截断长度应适当调大,调成4096,否则很多数据会不完整。
3.LoRA秩从8开始即可,最低不要 < 8,小数据集不要调的过大。
文章[3]还指出,训练模型时,模型的显存主要由以下几部分组成:
基础模型权重
基础模型权重主要和计算精度有关,以 bf16 精度为例,7B的模型所需显存就是14GB。但实际上无法之间这样去推算,因为使用 bf16 后,系统会进行混合精度训练,实际精度是 bf16 + fp32。
激活值
激活值的计算方法为:显存占用 = 批量大小 × 序列长度 × 隐藏层维度 × 模型层数 × 单个元素字节数 估算方法:以 Qwen2.5-7B-Instruct 为基准,单次处理的 Token 量每增加 1K,显存约增加 2.5G。
单次处理的 token 与批次大小和截断长度相关,批次大小翻倍,单次处理的 token 也翻倍,截断长度变长,如果单次数据集输入数据可能会增加。
LoRA 适配器
LoRA 适配器的计算方法为:显存占用 = LoRA 层数 × 秩(Rank)×(输入维度 + 输出维度)× 2B
LoRA 插入的层数,插入前后的维度很难一次性统计和估计出来,因此这部分只能采用估计的方式。
框架开销
框架开销包括深度学习框架 PyTorch本身的显存占用。
多卡分布开销
多卡联合分布式训练时,需要一部分显存用于通信开销,这部分后面会进行试验。
总结一下,训练模型和推理模型差别很大,影响显存占用的因素更多,因此无法直接去准确衡量,还是需要实验进行测试。
下面来进行实验,使用DeepSeek-R1-7B
作为基础模型,以秩为 8 的 LoRA 作为微调方法,进行“消融实验”。
首先验证一下,使用多卡运行相比单卡运行,需要增加多少显存。
用单卡运行,显存占用16.64GB。
CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui
再用八卡运行,开启DeepSpeed stage 3,显存占用76.88GB。
该实验说明,多卡运行看上去并不是简单的做一些通信开销,而可能存在把模型复制多份的情况,具体策略和控制参数有待研究。
下面以上面八卡运行的显存占用情况作为基准,将LoRA的秩调到16,显存占用80.39GB。
说明调大 LoRA 数值后,显存占用约有4GB左右提升。
下面将批处理大小从 2 调整成 16,显存占用约181.97GB。
说明批处理大小影响很大,基本上是成倍效果的提升。
下面将计算精度从bf16调到fp32,显存占用约183.06GB。
说明计算精度也会对显存占用产生巨大影响,混合精度机制已经省了巨量显存。
下面使用 QLoRA 设置 lora量化等级为4,显存占用约48.83GB。
QLoRA确实也能剩下很多显存。
默认的加速方式采用的是flashattn2。
下面换成 liger_kernel进行测试,显存占用约80.62GB,并没有减少显存占用,反而略微增加。
如果微调多模态模型,视觉编码器和多模态投影编码默认是冻结的,只微调语言模型。
因此,是否同参数量下多模态语言和纯语言模型显存占用差不多呢?
总结一下之前做的实验(实验时batch size取1),结果如下:
结果是不确定,相同参数量下,模型架构不同,影响仍然很大。
[1] Easy Dataset × LLaMA Factory: 让大模型高效学习领域知识:https://buaa-act.feishu.cn/wiki/KY9xwTGs1iqHrRkjXBwcZP9WnL9
[2] LLaMA-Factory QuickStart:https://zhuanlan.zhihu.com/p/695287607
[3]微调模型的各种参数怎么设置?微调的显存消耗如何估算和优化?:https://mp.weixin.qq.com/s/AbyWaTaPOp9sr5mz5SOVwg
大模型微调相关:
1.【大模型微调】1.LLaMA-Factory简介和基本使用流程
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-03-24
2025-03-24
2025-04-01
2025-03-24
2025-04-30
2025-04-19
2025-04-16
2025-04-20
2025-04-16
2025-05-26