记录一次微调大模型的流程,希望之后微调能够更快速上手,也希望能够为你提供一点帮助

一、选择微调方式和模型

选择的依据,我主要看服务器显存情况,比如用lora微调一个Qwen-7B起码需要14G以上的显存,一般建议是20G以上(听说就是模型后面这个参数量乘二,还得加上微调的空间、存储一些梯度优化器的空间)。lora微调能够明显降低对显存的需求,比全参数微调要求的空间少很多。(因为lora是只微调了很少一部分的参数,这里可以看专门的lora原理帖理解)

更详细的微调方式+模型对应的显存需求,可以参考文章:如何评估大模型全参数微调需要的显存_全局微调 需要多少资源配置-CSDN博客

二、安装Swift框架

Swift框架源码如下,在Readme里的Installation部分,介绍了安装的方法。基本没有问题,如果有问题大概率是环境问题,那因人而异了,祝大家好运。

modelscope/ms-swift: Use PEFT or Full-parameter to CPT/SFT/DPO/GRPO 500+ LLMs (Qwen2.5, Llama4, InternLM3, GLM4, Mistral, Yi1.5, DeepSeek-R1, ...) and 200+ MLLMs (Qwen2.5-VL, Qwen2.5-Omni, Qwen2-Audio, Ovis2, InternVL3, Llava, MiniCPM-V-2.6, GLM4v, Xcomposer2.5, DeepSeek-VL2, Phi4, GOT-OCR2, ...).https://github.com/modelscope/ms-swift/tree/main

三、下载模型快速开始训练

如果上一步没有问题的话,那就成功一大半了,可以先使用Readme的Quick Start的命令来快速开始,确保框架已经没有问题能够正常使用。第一次输入下面命令进行训练时会下载指定的模型,需要一些时间,之后就会直接使用了。摘抄并备注Quick Start的命令如下:

CUDA_VISIBLE_DEVICES=0 \                                   # 这里是启用的显卡数量
swift sft \
    --model Qwen/Qwen2.5-7B-Instruct \                     # 这个示例的模型是Qwen2.5-7B
    --train_type lora \                                    # 利用lora进行微调
    --dataset 'AI-ModelScope/alpaca-gpt4-data-zh#500' \    # 这里是使用了魔塔社区的数据集
              'AI-ModelScope/alpaca-gpt4-data-en#500' \    # 如果用自己的数据需更换成地址
              'swift/self-cognition#500' \
    --torch_dtype bfloat16 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 1 \                      # 这里就是batch的size了
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-4 \
    --lora_rank 8 \                                        # 这些部分相当于超参
    --lora_alpha 32 \                                      # 可以根据自己实际情况调整
    --target_modules all-linear \
    --gradient_accumulation_steps 16 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 2 \
    --logging_steps 5 \
    --max_length 2048 \                                    # 最大长度限制,我设的是4096        
    --output_dir output \                                  # 输出权重的文件地址
    --system 'You are a helpful assistant.' \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4 \
    --model_author swift \
    --model_name swift-robot

四、使用自定义的数据集进行训练

官方有提供使用自定义数据集的几种方式:

Custom Dataset — swift 3.3.0.dev0 documentationhttps://swift.readthedocs.io/en/latest/Customization/Custom-dataset.html我捣鼓第二种方式,即修改dataset_info.json的方式没捣鼓明白,最后还是用第一种最方便了。

直接在命令行修改,这里要注意格式必须是swift指定的格式类型,数据文件地址不要写错。

CUDA_VISIBLE_DEVICES=0,1,2,3 \                          # 我用了4张卡
swift sft \
    --model Qwen/Qwen2.5-7B-Instruct \
    --train_type lora \
    --dataset /home/zhangsan/my_dataset/data.csv \      # 这个就是我的数据地址
    --torch_dtype bfloat16 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 4 \                   # 显存还够,所以调高了batch_size
    --per_device_eval_batch_size 4 \
    --learning_rate 1e-4 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 4 \                   # 要相应减少,保持乘机总数不变
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 5 \
    --logging_steps 5 \
    --max_length 4096 \                                 # 最大长度限制修改成4096了
    --output_dir output \
    --system 'You are a helpful assistant.' \
    --warmup_ratio 0.05 \
    --dataloader_num_workers 4 \
    --model_author swift \
    --model_name swift-robot

我的数据格式示例如下,是csv文件:

instruction input output
一般认为这里是问题的背景 问题的输入 问题的输出
数学问题,以XX口吻回复 1+1等于几 等于2,.......

input可以为空,但不能没有这列,不然会报错,运行后可以看到终端反馈,原数据条数600,过滤后数据条数为0,然后就会报错没有训练数据。

(大概类似这样的报错信息:

[INFO:swift] Dataset filtered, origin length: 600, filtered dataset length: 0

assert train_sample > 0   AssertionError)

还有很多其他格式,建议参考Swift源文件里dataset_info.json提到的魔塔社区的那些数据,安装他们的格式来改自己的数据,基本就没问题,比如json文件的第一个AI-ModelScope/OpenO1-SFT,直接去社区搜索就可以看到数据预览了。

五、测试微调后的模型

在上一步完成训练后,就可以进行测试,参考官方提供的测试命令:

# Using an interactive command line for inference.
CUDA_VISIBLE_DEVICES=0 \                        # 这里是启用显卡数量
swift infer \
    --adapters output/vx-xxx/checkpoint-xxx \   # 训练保存的权重,就是终端输出的最后一个
    --stream true \
    --temperature 0 \
    --max_new_tokens 2048                       # 还是最大长度限制

这样运行后可以开始推理,即你输入一个问题,这个微调后的大模型反馈一个答案。如果要进行批量测试,官方也提供了说明如下,可以参考“自定义评测集”部分设置自己的测试数据集。

评测 — swift 3.4.0.dev0 文档(中文文档非常友好)

这里也记录一下我自己的测试命令,要注意输出地址不能给一个文件夹地址,要具体到文件名。我记得测试集的格式应该要和训练集一样,output将会作为标签来计算准确率。

#这是批量测试代码
CUDA_VISIBLE_DEVICES=0,1,2,3 \                               # 仍旧是4张卡
swift infer \
    --adapters output/v5-20250406-113536/checkpoint-371 \    # 训练完成后终端最后显示的权重名
    --stream true \
    --infer_backend pt \
    --eval_dataset /home/zhangsan/my_dataset/test.csv \      # 测试数据地址(具体到文件名)
    --result_path /home/zhangsan/my_dataset/result.csv \     # 结果输出的地址(具体到文件名)
    --max_new_tokens 4096

六、结束语

记录了一次微调大模型的流程,不足有

  1. 只使用了lora这一种微调方式,其他微调方式没有进行尝试
  2. 本贴只记录了启动训练和测试的流程,对于如何获得更好的效果没有涉及(因为本人的效果就非常一般,让我直接放弃了这个方法

最后总结:Swift框架真好用,启动很简便,文档很清晰(而且有中文文档),示例很明白,以后如果微调还会使用Swift。

Logo

更多推荐