说明
本文是过程记录,部分文字原封不动照搬了教程,因为教程写的很简练了(不是原创,没有版权)
下面二维码链接可以直达入门NPC,可以从零开始(需要有一定的代码理解基础更和)。
微调前的准备
3.2.1 准备数据文件
为了让模型能够认清自己的身份弟位,在询问自己是谁的时候按照我们预期的结果进行回复,我们就需要通过在微调数据集中大量加入这样的数据。我们准备一个数据集文件datas/assistant.json
,文件内容为对话数据。
(通过一个脚本可以执行几千次,每次都只有这一个对话,所以它就能学到了!)
3.2.2 准备配置文件
配置文件是一种用于定义和控制模型训练和测试过程中各个方面的参数和设置的工具。
根据我们选择的微调方法结合微调方案,找到与最匹配的配置文件,减少对配置文件的修改量。
如何选择配置文件?
1 查找可能匹配的文件:
命令:
xtuner list-cfg -p internlm2
xtuner list-cfg
命令用于列出内置的所有配置文件。
参数-p
或--pattern
表示模式匹配,后面跟着的内容将会在所有的配置文件里进行模糊匹配搜索,然后返回最有可能得内容。
比如我们这里微调的是书生·浦语的模型,我们就可以匹配搜索internlm2
。
2 复制预设的配置文件:
命令:
xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .
xtuner copy-cfg
命令用于复制一个内置的配置文件。该命令需要两个参数:
CONFIG
代表需要复制的配置文件名称,
SAVE_PATH
代表复制的目标路径。
在我们的输入的这个命令中,
CONFIG
对应的是上面搜索到的internlm2_chat_1_8b_qlora_alpaca_e3
,
SAVE_PATH
则是当前目录.
。
3 按自己的需求修改配置文件
常用参数介绍
参数名 | 解释 |
---|---|
data_path | 数据路径或 HuggingFace 仓库名 |
max_length | 单条数据最大 Token 数,超过则截断 |
pack_to_max_length | 是否将多条短数据拼接到 max_length,提高 GPU 利用率 |
accumulative_counts | 梯度累积,每多少次 backward 更新一次参数 |
sequence_parallel_size | 并行序列处理的大小,用于模型训练时的序列并行 |
batch_size | 每个设备上的批量大小 |
dataloader_num_workers | 数据加载器中工作进程的数量 |
max_epochs | 训练的最大轮数 |
optim_type | 优化器类型,例如 AdamW |
lr | 学习率 |
betas | 优化器中的 beta 参数,控制动量和平方梯度的移动平均 |
weight_decay | 权重衰减系数,用于正则化和避免过拟合 |
max_norm | 梯度裁剪的最大范数,用于防止梯度爆炸 |
warmup_ratio | 预热的比例,学习率在这个比例的训练过程中线性增加到初始学习率 |
save_steps | 保存模型的步数间隔 |
save_total_limit | 保存的模型总数限制,超过限制时删除旧的模型文件 |
prompt_template | 模板提示,用于定义生成文本的格式或结构 |
… | … |
4 启动微调
命令:
cd /root/InternLM/XTuner
conda activate xtuner0121
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
xtuner train
命令用于启动模型微调进程。
该命令需要一个参数:CONFIG
用于指定微调配置文件。这里我们使用修改好的配置文件internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
。
训练过程中产生的所有文件,包括日志、配置文件、检查点文件、微调后的模型等,默认保存在work_dirs
目录下,也可以通过添加--work-dir
指定文件保存位置。
这个命令一执行,就开始了~~洗脑(不是)~~训练的过程了:
训练完成以后的目录情况
5 模型格式转换:
命令:
xtuner convert pth_to_hf
将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式文件。
我们其实还可以在转换的命令中添加几个额外的参数,包括:
参数名 | 解释 |
---|---|
–fp32 | 代表以fp32的精度开启,假如不输入则默认为fp16 |
–max-shard-size {GB} | 代表每个权重文件最大的大小(默认为2GB) |
# 先获取最后保存的一个pth文件
pth_file=`ls -t ./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth | head -n 1`
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py ${pth_file} ./hf
此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”(可以简单理解:LoRA 模型文件 = Adapter)
6 模型合并:
对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。
对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 Adapter ,因此是不需要进行模型整合的。
在 XTuner 中提供了一键合并的命令 xtuner convert merge
,在使用前我们需要准备好三个路径,包括原模型的路径、训练好的 Adapter 层的(模型格式转换后的)路径以及最终保存的路径。
xtuner convert merge
命令用于合并模型。该命令需要三个参数:LLM
表示原模型路径,ADAPTER
表示 Adapter 层的路径,SAVE_PATH
表示合并后的模型最终的保存路径。
在模型合并这一步还有其他很多的可选参数,包括:
参数名 | 解释 |
---|---|
–max-shard-size {GB} | 代表每个权重文件最大的大小(默认为2GB) |
–device {device_name} | 这里指的就是device的名称,可选择的有cuda、cpu和auto,默认为cuda即使用gpu进行运算 |
–is-clip | 这个参数主要用于确定模型是不是CLIP模型,假如是的话就要加上,不是就不需要添加 |
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert merge /root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b ./hf ./merged --max-shard-size 2GB
对应出现的目录结构:
开始对话!
这样就成功~
可能因为之前给的剧本里只有一句话,所以它也只会这一句
但是感觉它好可爱,有点像c-3po刚出场的时候。。