用Swift框架的lora微调Qwen-7B大模型
官方有提供使用自定义数据集的几种方式:我捣鼓第二种方式,即修改dataset_info.json的方式没捣鼓明白,最后还是用第一种最方便了。直接在命令行修改,这里要注意格式必须是swift指定的格式类型,数据文件地址不要写错。CUDA_VISIBLE_DEVICES=0,1,2,3 \ # 我用了4张卡--dataset /home/zhangsan/my_dataset/data.csv \ #
记录一次微调大模型的流程,希望之后微调能够更快速上手,也希望能够为你提供一点帮助
一、选择微调方式和模型
选择的依据,我主要看服务器显存情况,比如用lora微调一个Qwen-7B起码需要14G以上的显存,一般建议是20G以上(听说就是模型后面这个参数量乘二,还得加上微调的空间、存储一些梯度优化器的空间)。lora微调能够明显降低对显存的需求,比全参数微调要求的空间少很多。(因为lora是只微调了很少一部分的参数,这里可以看专门的lora原理帖理解)
更详细的微调方式+模型对应的显存需求,可以参考文章:如何评估大模型全参数微调需要的显存_全局微调 需要多少资源配置-CSDN博客
二、安装Swift框架
Swift框架源码如下,在Readme里的Installation部分,介绍了安装的方法。基本没有问题,如果有问题大概率是环境问题,那因人而异了,祝大家好运。
三、下载模型快速开始训练
如果上一步没有问题的话,那就成功一大半了,可以先使用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
六、结束语
记录了一次微调大模型的流程,不足有
- 只使用了lora这一种微调方式,其他微调方式没有进行尝试
- 本贴只记录了启动训练和测试的流程,对于如何获得更好的效果没有涉及(因为本人的效果就非常一般,让我直接放弃了这个方法
最后总结:Swift框架真好用,启动很简便,文档很清晰(而且有中文文档),示例很明白,以后如果微调还会使用Swift。
更多推荐
所有评论(0)