返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

【大模型微调】5.调参经验总结与显存占用因素探究

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 21:19 |阅读模式 打印 上一主题 下一主题

引言

本文承接本系列第二篇文章,继续探究各参数应该如何进行设置,以及其对模型显存的影响。

调参参考经验总结

训练模型的过程通常被戏称为“炼丹”。参数组合和结果息息相关,但没有标准最优参数组合。

因此,在自行钻研之前,有必要先看看别人是怎么做的。

1. 北航 ACT 实验室的调参经验

北航 ACT 实验室做了一份教程[1],参数经验概括如下:

  • 1.调大学习率
    默认的学习率是5e-5,其调大一倍,改成1e-4,调大学习率让模型每轮迭代学习速度提升

  • 2.调大训练轮数
    默认的训练轮数是3轮,其调成8轮,让模型更加充分训练

  • 3.调节批处理大小
    默认的批处理大小为2,该文章指出:一般保持批处理大小×梯度累积×显卡数量等于 32 即可

  • 4.调大LoRA参数
    默认的LoRA秩为8,缩放系数为16,其将LoRA秩调为16,缩放系数调为32

2. 核心开发者的调参经验

LLaMA-Factory 的核心开发者马勇强在知乎上写了一篇入门文档[2],其在微调时的参数选择脚本如下:

CUDA_VISIBLE_DEVICES=0llamafactory-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_len1024\
--preprocessing_num_workers16\
--per_device_train_batch_size2\
--per_device_eval_batch_size1\
--gradient_accumulation_steps8\
--lr_scheduler_type cosine \
--logging_steps50\
--warmup_steps20\
--save_steps100\
--eval_steps50\
--evaluation_strategy steps \
--load_best_model_at_end \
--learning_rate5e-5\
--num_train_epochs5.0\
--max_samples1000\
--val_size0.1\
--plot_loss \
--fp16

对应修改点如下:

  • 1.截断长度下调
    截断长度从2048下调到1024

  • 2.预热步数上调
    预热步数从0上调到20

  • 3.训练轮数上调
    训练轮数从3上调到5

  • 4.最大样本数下调
    最大样本数从100000下调到1000

  • 5.验证集比例上调
    验证集比例从0上调到0.1(10%)

  • 6.计算类型修改
    计算类型从 bf16 改为 fp16

3. 其它博主的调参经验

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 作为微调方法,进行“消融实验”。

1. 多卡开销有多大?

首先验证一下,使用多卡运行相比单卡运行,需要增加多少显存。

用单卡运行,显存占用16.64GB。

CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui

再用八卡运行,开启DeepSpeed stage 3,显存占用76.88GB。

该实验说明,多卡运行看上去并不是简单的做一些通信开销,而可能存在把模型复制多份的情况,具体策略和控制参数有待研究。

2. LoRA数值影响多大?

下面以上面八卡运行的显存占用情况作为基准,将LoRA的秩调到16,显存占用80.39GB。

说明调大 LoRA 数值后,显存占用约有4GB左右提升。

3. 批处理大小影响多大?

下面将批处理大小从 2 调整成 16,显存占用约181.97GB。

说明批处理大小影响很大,基本上是成倍效果的提升。

4. 计算精度影响多大?

下面将计算精度从bf16调到fp32,显存占用约183.06GB。

说明计算精度也会对显存占用产生巨大影响,混合精度机制已经省了巨量显存。

5. 量化影响多大?

下面使用 QLoRA 设置 lora量化等级为4,显存占用约48.83GB。

QLoRA确实也能剩下很多显存。

6. liger_kernel可以节省显存吗?

默认的加速方式采用的是flashattn2。

下面换成 liger_kernel进行测试,显存占用约80.62GB,并没有减少显存占用,反而略微增加。

7. 多模态模型和纯语言模型显存占用差别有多大?

如果微调多模态模型,视觉编码器和多模态投影编码默认是冻结的,只微调语言模型。

因此,是否同参数量下多模态语言和纯语言模型显存占用差不多呢?

总结一下之前做的实验(实验时batch size取1),结果如下:

总结表

结果是不确定,相同参数量下,模型架构不同,影响仍然很大。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ