跳到主要内容

MiniCPM4.1 & MiniCPM4

MiniCPM 文本系列

根据训练目标选择官方代码或 LLaMA-Factory 路线,了解数据准备、训练配置以及 LoRA / QLoRA 等方式。不同模型与训练配置的资源需求不同,请先核对目标版本、硬件和样例参数。

硬件要求​

模型尺寸全量微调最低显卡要求LoRA 微调最低显卡要求
0.5B至少 1 张 12GB 以上显存的 20 系显卡至少 1 张 8GB 显存的 20 系显卡
8B至少 4 张 24GB 显存的显卡至少 2 张 24GB 显存的 20 系显卡

官方代码微调(SFT推荐)​

设备需求:最少一张24g显存,20系列以上显卡,qlora可尝试12g显卡

使用 git 获取官方代码​

Bash
git clone https://github.com/OpenBMB/MiniCPM

准备数据集​

对话数据集,处理成以下json格式,每一条数据就是一个messages

以下标红的system字段非必需:

JSON
[
{
"messages": [
{
"role": "system",
"content": "<system prompt text>"
},
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
},
// ... Muti Turn,多轮对话
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
}
]
}
]

修改 MiniCPM/finetune/lora_finetune_ocnli.sh 文件​

Bash
formatted_time=$(date +"%Y%m%d%H%M%S")
echo $formatted_time

#4090添加这两行代码
export NCCL_P2P_DISABLE=1
export NCCL_IB_DISABLE=1

deepspeed --include localhost:1 --master_port 19888 finetune.py \
--model_name_or_path openbmb/MiniCPM3-4B \ # 可以修改为本地模型目录
--output_dir output/OCNLILoRA/$formatted_time/ \ # 可以修改为其他用来保存输出模型的地址
--train_data_path data/ocnli_public_chatml/train.json \ # 这里写按照第二步处理好的训练集地址
--eval_data_path data/ocnli_public_chatml/dev.json \ # 这里写按照第二步处理好的验证集
--learning_rate 5e-5 \ # 学习率
--per_device_train_batch_size 16 \ # 每张卡训练时的batch_size
--per_device_eval_batch_size 128 \ # 每张卡测试时的batch_size
--model_max_length 1024 \ # 模型训练时最大token数,超出将截断
--bf16 \ # 是否使用bf16数据格式,如果不是改为false
--use_lora \ # 是否使用lora
--gradient_accumulation_steps 1 \ # 梯度累计次数
--warmup_steps 100 \ # 预热步数
--max_steps 1000 \ # 最大训练步数,到达后停止训练
--weight_decay 0.01 \ # 权重正则化值
--evaluation_strategy steps \ # 测试方法,可以改为epoch
--eval_steps 500 \ # 与evaluation_strategy steps一起起作用,500个step测试一一次
--save_strategy steps \ # 模型保存策略,可以改为epoch即每个epoch保存一次
--save_steps 500 \ # save_strategy steps一起起作用,代表500步保存一次
--seed 42 \ # 随机种子
--log_level info --logging_strategy steps --logging_steps 10 \ # logging的设置
--deepspeed configs/ds_config_zero2_offload.json # deepspeed配置文件设置,如果显存充足可以改为configs/ds_config_zero2_offload.json

使用 lora / qlora 训练(可选)​

lora​

MiniCPM/finetune/lora_finetune_ocnli.sh文件中增加use_lora参数,

如不确定就把以下代码加到--deepspeed configs/ds_config_zero2_offload.json的前一行

Bash
--use_lora \

qlora​

MiniCPM/finetune/lora_finetune_ocnli.sh文件中增加use_lora,qlora参数,

如不确定就把以下代码加到--deepspeed configs/ds_config_zero2_offload.json的前一行

Bash
--use_lora \
--qlora \

修改以上bash文件后,输入以下指令开始训练:​

Bash
cd MiniCPM/finetune
bash lora_finetune_ocnli.sh

Llama_Factory微调(RLHF微调推荐)​

使用方法与【微调教程】MiniCPM2.0基本相同,如果不是训练工具调用能力,仅需修改 template: cpm3,训练工具调用能力请期待我们向 llama-factory 提的pr

首先安装 Llama_Factory 依赖​

Bash
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"

处理数据​

将数据集处理成 Minicpm/finetune/llama_factory_example/llama_factory_data 文件夹中的格式,示例包括 DPO、KTO、SFT 三种微调方式并放置到llama_factory/data目录下。

DPO 数据格式​

以下是对于 Llama_Factory 中对于构造多轮对话的 DPO 数据示例,其中:

JSON
{
"instruction": "你是一个科技百科小助手,能够回复大部分科技领域问题",
"input": "我想知道 MiniCPM4 到底好不好呀?",
"chosen": "亲呀,MiniCPM4 真的很不错呢!它运用了 NSA 注意力机制呀,这使得它在处理信息等方面有着很出色的表现,能够更加精准地理解和生成内容,无论是文本创作还是辅助学习等场景,都可以发挥挺不错的作用呢,很多用户使用后都反馈体验挺好的哦。",
"rejected": "哎呀,MiniCPM4 嘛,就是一般般啦。它虽然有一些功能,但是在实际使用中,也没有特别突出的亮点呀,和其他同类产品比起来,优势也不是特别明显呢,反正就是能用,但也没达到让人惊艳的程度啦。",
"history": [
[
"我听说 MiniCPM4 挺智能的,是真的吗?",
"亲,那确实呀,MiniCPM4 挺智能的呢,它有着独特的技术加持,在很多任务上都能展现出不错的智能水平,能帮大家解决不少问题哦。"
],
[
"那它在语言理解方面表现如何呢?",
"亲,它在语言理解方面的表现可圈可点哦,靠着相关的技术,像 NSA 注意力机制助力,对各种语句的理解还是挺准确的呢,能较好地把握语义呀。"
],
]
}

KTO 数据格式​

  1. 其中每个 messages代表一条数据,label代表是该条数据的回复是否合理
  2. 不需要和 DPO 那样相同问题不同答案,对于每个问题和答案对给予一个评价
  3. 每个问题和回复都可以有一个 True(好的),或者 False(不好的评价)
  4. 需要修改的地方已经标红
JSON
{
"messages": [
{
"content": "minicpm4.0哪里最强?",
"role": "user"
},
{
"content": "哪里都强,六边形战士好吗",
"role": "assistant"
}
],
"label": true
},
{
"messages": [
{
"content": "minicpm3.0 有哪些优点。",
"role": "user"
},
{
"content": "1.长文本能力。2.function call能力 3.其他所有能力",
"role": "assistant"
},
{
"content": "细说长文本能力",
"role": "user"
},
{
"content": "反正很强,细说就去我们github吧。https://github.com/OpenBMB/MiniCPM.git",
"role": "assistant"
}
],
"label": false
}
]

sft数据格式如下,每个字典组成一条数据​

alpaca格式:

JSON
[
{
"instruction": "你现在比牛顿还牛的科学家",
"input": "识别并解释给定列表中的两个科学理论:细胞理论和日心说。",
"output": "细胞理论是生物科学的一个理论,它认为所有生命体都是由微小的基本单元——细胞所构成。这是生物学的一个基础理论,认为细胞是所有生物的基本结构和功能单位,所有的生物都是由一个或多个细胞组成,细胞只能通过细胞分裂产生新的细胞。这一理论由薛定谔、施瓦内和雪莱于1839年首次提出。\n\n日心说是指太阳是太阳系的中心,也就是说,行星围绕太阳旋转的理论。这个理论打破了传统的地心说观点,认为地球并不是宇宙的中心。日心说的提出者是尼古拉·哥白尼,他在16世纪初发表了他的著作《天体运行论》,阐述了太阳系行星围绕太阳运行的模型,为天文学的发展做出了巨大贡献。"
}
]

chatml格式:

JSON
[
{
"messages": [
{
"content": "Who are they?",
"role": "user"
},
{
"content": "They're Kane and Gretzka from Bayern Munich.",
"role": "assistant"
},
{
"content": "What are they doing?<image>",
"role": "user"
},
{
"content": "They are celebrating on the soccer field.",
"role": "assistant"
}
]
}
]

将数据信息添加到dataset_info.json​

在llama_factory/data/dataset_info.json中添加数据集信息,保证dataset_info.json中能找到你的数据集,如下例:

  1. file_name为制作数据集的文件名
  2. 比如"sft_zh_demo"代表数据名称,在面配置文件yaml中会用到
  3. 需要修改的就只有两个,一个是数据的键名,比如"sft_zh_demo",另外一个是file_name对应值数据文件名,比如:alpaca_zh_demo.json
  4. 所有需要修改的位置已经标红
JSON
{"identity": {
"file_name": "identity.json"
},
"sft_zh_demo": {
"file_name": "alpaca_zh_demo.json"
},
"kto_en_demo": {
"file_name": "kto_en_demo.json",
"formatting": "sharegpt",
"columns": {
"messages": "messages",
"kto_tag": "label"
},
"tags": {
"role_tag": "role",
"content_tag": "content",
"user_tag": "user",
"assistant_tag": "assistant"
}
},
"dpo_en_demo":{
"file_name":"dpo_en_demo.json",
"ranking":"true",
"columns":{
"prompt":"instruction",
"query":"input",
"chosen":"chosen",
"rejected":"rejected",
"history": "history"
}
}
}

设置训练脚本​

将MiniCPM/finetune/llama_factory_example中文件复制到LLaMA-Factory/examples/minicpm目录下​

Bash
cd LLaMA-Factory/examples
mkdir minicpm
#以下代码中的/your/path要改成你的MiniCPM代码和LLaMA-Factory路径
cp -r /your/path/MiniCPM/finetune/llama_factory_example/* /your/path/LLaMA-Factory/examples/minicpm

根据你需要微调的方式,以dpo为例。LLaMA-Factory/examples/minicpm/minicpm_dpo.yaml必须修改的配置参数如下​

YAML
model_name_or_path: openbmb/MiniCPM3-4B # 或者你本地保存的地址
template: cpm3 #注意如果微调minicpm3或者minicpm4就写cpm3,如果是minicpm2则写cpm
dataset: dpo_en_demo # 这里写dataset_info.json中的键名
output_dir: your/finetune_minicpm/save/path # 你微调后模型的保存地址
bf16: true # 如果你的设备支持bf16,否则false
deepspeed: examples/deepspeed/ds_z2_config.json # 如果显存不够可以改成ds_z3_config.json

如果需要lora微调,在yaml文件中修改以下代码:​

Bash
finetuning_type: lora
lora_target: all

开始训练​

Bash
cd LLaMA-Factory
FORCE_TORCHRUN=1 llamafactory-cli train examples/train_full/MiniCPM4.yaml

开发者精选

查看全部 →