介绍
MiniCPM 是面壁智能发布的一款模型,只有2B大小。官方介绍说只需要一张1080/2080可实现高效参数微调,所以我尝试按官方的步骤进行微调,给自己用。
准备
环境
根据官方介绍
LORA 微调: 1张显卡,占用 10619MiB 显存。
我的卡是2060s,只有8G的VRAM,所以我换了一张有12G VRAM的3060来测试。
同时在测试途中,发现训练中使用的FlashAttention2.0库,只有图灵架构之后的显卡支持bf16格式,也就是尽量使用30系之后的显卡。
测试途中发现win平台环境搭建机器困难(主要是deepspeed),我这里直接使用了ubuntu22.04系统
我安装了目前deepspeed支持的最高版本CUDA 12.1.1
使用conda(miniconda)开了一个3.10的python环境,并安装最新版本的torch
仓库和基底模型
需要确保装上了git的lfs组件,以免模型没下载
克隆MiniCPM官方的git仓库,切到微调目录
克隆基底模型到目录,这里看自己网络环境,可以去huggingface也可以去魔搭社区
这里我用的是sft模型
装上环境
还是在前面新建好的conda环境里把依赖装上,时间会比较久
准备数据
训练需要train.json
微调数据集和eval.json
验证数据集,两种数据格式一样的,参考官方文档的说明
更改训练参数,并跑起来
这里的参数看自己需求来调整,我只描述一个大概
我们要编辑lora_finetune.sh
的部分参数,以便在12G显存的前提下进行训练。
--include localhost:0
显卡的编号,一张卡就写0--model_name_or_path MiniCPM-2B-sft-bf16
模型路径--output_dir output/test/$formatted_time/
lora输出路径,看着改--train_data_path data/test/train.json
训练数据集--eval_data_path data/test/dev.json
测试数据集--per_device_train_batch_size 32
12G显存只能用1或者2,用不了32--per_device_eval_batch_size 64
,同上,只能用1或者2--max_steps 3000
看你想训练的轮次,总数 = 数据条数 / batch_size * 训练轮次--save_steps 500
多少步保存一次,看你需求改,硬盘空间要够--deepspeed configs/ds_config_zero3_offload.json
我用的ds_config_zero2_offload.json,看自己需求
改完之后直接跑,如果跑不起来,多改几次试试
测试lora结果
我用的下面的代码测试的,看自己需求来修改
如果测试没问题,可以进行合并模型操作
合并模型
使用下面的代码,看自己需求来修改
合并后是safetensor格式的hf模型
转成llama.cpp格式
准备好llama.cpp
转换hf模型到gguf
根据自己的实际路径修改
量化模型
我这里量化到Q4_K_M
,根据自己的需求来修改
Nice!