【大模型微调】6.模型微调实测与格式转换导出
引言
本文继续研究 LLaMA-Factory 微调数据的流程,侧重于微调结果与模型导出。
数据集准备
首先参考 LLaMA-Factory 核心开发者的文章[1],下载用于微调的公开的商品文案数据集 AdvertiseGen。
下载地址:https%3A//cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/%3Fdl%3D1
其总共包含了10w+条这样的数据:
{"content": "类型#上衣*版型#h*材质#蚕丝*风格#复古*图案#条纹*图案#复古*图案#撞色*衣样式#衬衫*衣领型#小立领", "summary": "小女人十足的条纹衬衣,缎面一点点的复古,还有蓝绿色这种高级气质复古色,真丝材质,撞色竖条纹特别的现代感味道,直h型的裁剪和特别的衣长款式,更加独立性格。双层小立领,更显脸型。"}
LLaMA-Factory 内置了格式映射转换,因此实际上不需要像前文那样手动编写脚本进行格式转换,只需要在dataset_info.json
里面按照如下方式进行注册:
"adgen_local": {"file_name": "AdvertiseGen_train.json","columns": {"prompt": "content","response": "summary"}
}
微调过程及结果测试
参数设置主要调节以下内容:
- 预热步数从0上调到20
- 训练轮数从3上调到5
- 最大样本数从100000下调到1000
- 验证集比例从0上调到0.1
这样调整意味着不会将所有的数据进行训练,训练的数据总数为1000 * 0.9 = 900条。
使用 DeepSeek-R1-7B
模型进行 LoRA 微调,差不多10分钟训练完成。
从结果看 loss 还是比较大,正常情况 < 1 会比较好,说明还有收敛空间。
下面加载模型进行测试,微调前模型问答效果如下
选择检查点,载入训练完的 LoRA 适配器,
微调后模型问答效果如下:
看上去,微调完的有点意思,但效果不是特别明显。微调前模型会产生“可能”之类的不确定表述,微调之后模型会更“自信”。
结果导出到Ollama
后面我又用 easy dataset做了一个几十条规模的小数据集,尝试在DeepSeek-R1-32B
的模型基础上微调,效果不达预期,这里就不放结果,只讨论如何进行模型导出。
首先在webui的export菜单中,将模型进行导出。需注意,使用 bf16 精度格式无法直接导出量化的模型版本。
同时,LoRA层会合并到原始模型中,大约会占据1B左右的参数。
之后安装 GGUF 库,用于模型的格式转换。
通过官方仓库安装,版本最新:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp/gguf-py
pip install --editable .
将模型转换成 gguf 格式:
python convert_hf_to_gguf.py /home/zxy/code/LLaMA-Factory/output_model
转换时,参考其输出日志,可发现其会自动将某些层变成fp16和fp32。
INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00014.safetensors'
INFO:hf-to-gguf:token_embd.weight, torch.bfloat16 --> F16, shape = {5120, 152064}
INFO:hf-to-gguf:blk.0.attn_norm.weight, torch.bfloat16 --> F32, shape = {5120}
INFO:hf-to-gguf:blk.0.ffn_down.weight, torch.bfloat16 --> F16, shape = {27648, 5120}
INFO:hf-to-gguf:blk.0.ffn_gate.weight, torch.bfloat16 --> F16, shape = {5120, 27648}
INFO:hf-to-gguf:blk.0.ffn_up.weight, torch.bfloat16 --> F16, shape = {5120, 27648}
INFO:hf-to-gguf:blk.0.ffn_norm.weight, torch.bfloat16 --> F32, shape = {5120}
INFO:hf-to-gguf:blk.0.attn_k.bias, torch.bfloat16 --> F32, shape = {1024}
转换完成后,会在模型原路径下得到gguf文件。
用 ollama 注册模型,执行以下命令,my_deepseek_r1_32b
为模型名称。
ollama create my_deepseek_r1_32b -f /home/zxy/code/LLaMA-Factory/output_model/Modelfile
ollama会将模型再拷贝一份到其存储路径中。
注册完成后,就可以通过ollama list
看到自己创建的模型。
导出为fp16+fp32的混合精度,比原本从ollama上拉取的int4精度大不少。
结论
实测发现,模型微调的主要功能是增强模型在某方面的能力。
如果通过信息查询对去微调模型,效果并不会很理想,RAG更加适合去查询信息。
当数据集较大时,模型微调时间可能会很长。本文中,选取900条数据进行微调,大约耗时10分钟。如果选取全部10w+条数据,估计需要耗时会在16小时左右。
如果微调参数量更大的模型,可能花费的时间会以天计。
此外,由于 LLaMA-Factory 封装得很好,实践过程中遇到的报错很难通过调代码解决,后面考虑研究vllm,探寻模型微调更为底层的相关原理。
参考资料
[1] LLaMA-Factory QuickStart:https://zhuanlan.zhihu.com/p/695287607