认知篇#15:ms-swift微调中gradient_accumulation_steps和warmup_ratio等参数的意义与设置

一、引言

MS-SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是由ModelScope(魔搭)社区推出的一个开源框架,专为大模型和多模态大模型提供全流程的轻量化微调、部署与评估解决方案。它集成了LoRA、QLoRA等高效的训练技术,支持对超过++500种大模型和200多种多模态模型++(如Qwen、DeepSeek、GLM系列)进行训练、量化与推理,并兼容从消费级显卡到专业服务器等多种硬件。通过命令行、Python API或图形界面,用户可以快速实现对模型的个性化微调,例如改变模型的"自我认知",并将其高效部署。

二、微调参数说明

如上所述,ms-swift是一个给大模型进行微调(俗称训练)的平台,其内含了大量的微调方式,最常见的有sft和rlhf。今天要说明的是一些在官方说明文档中没有解释清楚的参数含义与设置(可能比较基础)。官方文档网址如下:

命令行参数 --- swift 4.0.0.dev0 文档

Swift 复制代码
NPROC_PER_NODE=8 \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
swift sft \
    --model Qwen/Qwen2.5-32B \
    --tuner_type full \
    --dataset 'liucong/Chinese-DeepSeek-R1-Distill-data-110k-SFT' \
    --torch_dtype bfloat16 \
    --max_steps 2000 \
    --streaming true \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-5 \
    --gradient_accumulation_steps 2 \
    --packing true \
    --eval_steps 200 \
    --save_steps 200 \
    --logging_steps 5 \
    --max_length 8192 \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 8 \
    --dataset_num_proc 8 \
    --save_total_limit 2 \
    --save_only_model true \
    --output_dir output/Qwen2.5-32B \
    --deepspeed zero3 \
    --use_liger_kernel true \
    --attn_impl flash_attn

以上是一段官方给出的全参数SFT训练Qwen模型的配置config,我们基于此进行解释。

1、per_device_train_batch_size:

指的是每个device训练的批次大小,批次越大,每次训练的样本数就越多。所谓的device即一张卡,默认值1,即一卡一次一样本

per_device_eval_batch_size也是同理,eval表示评测;

2、gradient_accumulation_steps:

官方文档中:

gradient_accumulation_steps: 梯度累加。默认为None,即设置gradient_accumulation_steps使得total_batch_size>=16 。total_batch_size等于per_device_train_batch_size * gradient_accumulation_steps * world_size

梯度累积步数(gradient_accumulation_steps) 是一种在显存不足时,模拟更大批次训练的技术。

核心作用

  1. 节省显存:将一个大批次拆分成多个小步计算,累积梯度后再更新权重,降低单步显存需求。

  2. 稳定训练:间接增大有效批次大小,使梯度更新更稳定,有利于模型收敛。

核心公式 :**有效批次大小 = 单步批次大小 × 梯度累积步数。**你需要先确定目标有效批次大小。

示例:目标批次为64,但显卡最多只能一次装16张图。可设置单步批次为16,梯度累积步数为4(16×4=64),每4步更新一次模型。

官方有在示例配置里提过一种设置方法:

--gradient_accumulation_steps (expr 16 / nproc_per_node) \

结果 = 16 ÷ nproc_per_node

nproc_per_node表示用于训练的GPU的卡数,因此当四卡训练的时候,这里就是4。

3、warmup_ratio:

默认为0,由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳

设置预热步数 (num_warmup_steps)

经验法则:

小规模数据(< 10k 样本): 预热步数占总步数的 10%~20%

中/大规模数据(> 10k 样本): 预热步数占总步数的 5%~10%

超大数据(> 1M 样本): 预热步数可设为 1%~2%

**4、**dataloader_num_workers:

根据官方文档:

dataloader_num_workers: 默认为None,若是windows平台,则设置为0,否则设置为1

官方示例中又是 --dataloader_num_workers 8 \

一般开始是将num_workers设置为等于计算机上的CPU数量, num_workers的经验设置值是自己电脑/服务器的CPU核心数

影响的是训练的速度。

5、ddp_find_unused_parameters:

默认为None。

find_unused_parameters是PyTorch DDP策略中的一个重要参数。当模型在前向传播过程中某些参数未被使用时,设置此参数为True可以让DDP正确处理这些情况。这在以下场景中特别有用:

  1. 动态计算图模型中,某些参数可能在某些迭代步骤中不被使用
  2. 条件分支导致部分参数在某些情况下被跳过
  3. 复杂的模型结构导致参数使用不规律

可以设置为True。

6、deepspeed:

DeepSpeed的核心是ZeRO(Zero Redundancy Optimizer),简单来说,它是一种显存优化的数据并行(data parallelism, DP)方案。

官方文档中:

deepspeed: 默认为None。可以设置为'zero0', 'zero1', 'zero2', 'zero3', 'zero2_offload', 'zero3_offload'来使用ms-swift内置的deepspeed配置文件。你也可以传入自定义deepspeed配置文件的路径

可实现用少数GPU训练大模型,对训练的效果没有影响。

三、结论

MS-SWIFT是一个开源的大模型微调框架,支持500+大模型和200+多模态模型的高效训练与部署。本文重点解析了其微调参数配置:1)批次大小设置(per_device_train_batch_size);2)梯度累积(gradient_accumulation_steps)用于显存优化;3)学习率预热(warmup_ratio)提升训练稳定性;4)数据加载并行(dataloader_num_workers)加速训练;5)DeepSpeed配置实现大模型训练优化。这些参数设置对模型训练效果和效率具有重要影响。

相关推荐
AngelPP1 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年1 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼2 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS2 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区3 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈3 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang3 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx
shengjk15 小时前
NanoClaw 深度剖析:一个"AI 原生"架构的个人助手是如何运转的?
人工智能
西门老铁7 小时前
🦞OpenClaw 让 MacMini 脱销了,而我拿出了6年陈的安卓机
人工智能