任务链接:Tutorial/docs/L1/XTuner/task.md at camp3 · InternLM/Tutorial · GitHub
目录
1. 基础任务
使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知
参考资料:XTuner微调前置基础
1.1 安装 XTuner
# 配置环境略
# 用来存放源代码
mkdir -p /root/InternLM/code
cd /root/InternLM/code
# 下载XTuner
git clone -b v0.1.21 https://github.com/InternLM/XTuner /root/InternLM/code/XTuner
# 进入到源码目录
cd XTuner
conda activate lmdeploy
# 执行安装
pip install -e '.[deepspeed]'
# 查看 xtuner 帮助
xtuner help
1.2 微调前模型
# 创建一个目录,用来存放微调的所有资料,后续的所有操作都在该路径中进行
mkdir -p /root/InternLM/XTuner
cd /root/InternLM/XTuner
mkdir -p Shanghai_AI_Laboratory
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b Shanghai_AI_Laboratory/internlm2-chat-1_8b
# 使用tree观察目录结构
apt-get install -y tree
tree -l
# 运行网页端demo
# Tutorial(https://github.com/InternLM/Tutorial) 仓库的资料保存在 /root/Tutorial
streamlit run /root/Tutorial/tools/xtuner_streamlit_demo.py
运行结果
1.3 指令跟随微调
为了让模型按照我们预期的结果进行回复,需要通过在微调数据集中大量加入这样的数据。我们准备一个数据集文件datas/assistant.json
,文件内容为对话数据。
cd /root/InternLM/XTuner
mkdir -p datas
# 存储对话数据
touch datas/assistant.json
# 用脚本自动生成数据
touch xtuner_generate_assistant.py
xtuner_generate_assistant.py
import json
# 设置用户的名字
name = 'Finn'
# 设置需要重复添加的数据次数,假如想要让微调后的模型能够完完全全认识到你的身份,我们还可以把第6行的n的值调大一点。不过n值太大的话容易导致过拟合,无法有效回答其他问题
n = 3750
# 初始化数据
data = [
{"conversation": [{"input": "请介绍一下你自己", "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)}]},
{"conversation": [{"input": "你在实战营做什么", "output": "我在这里帮助{}完成XTuner微调个人小助手的任务".format(name)}]}
]
# 通过循环,将初始化的对话数据重复添加到data列表中
for i in range(n):
data.append(data[0])
data.append(data[1])
# 将data列表中的数据写入到'datas/assistant.json'文件中
with open('datas/assistant.json', 'w', encoding='utf-8') as f:
# 使用json.dump方法将数据以JSON格式写入文件
# ensure_ascii=False 确保中文字符正常显示
# indent=4 使得文件内容格式化,便于阅读
json.dump(data, f, ensure_ascii=False, indent=4)
运行代码
python xtuner_generate_assistant.py
1.3.1 准备配置文件
xtuner list-cfg -p internlm2
xtuner list-cfg # 命令用于列出内置的所有配置文件
-p internlm2 # -p or --pattern 表示模式匹配, 在所有的配置文件里进行模糊匹配搜索 internlm2
1.3.2 复制配置文件
使用 internlm2_chat_1_8b_qlora_alpaca_e3 对 internlm2_chat_1_8b 进行指令微调
xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .
xtuner copy-cfg # 复制一个内置的配置文件
CONFIG # 需要复制的配置文件名称,
SAVE_PATH # 复制的目标路径
1.3.3 修改配置文件
配置文件的基本信息
PART 1 Settings:涵盖了模型基本设置,如预训练模型的选择、数据集信息和训练过程中的一些基本参数(如批大小、学习率等)。
PART 2 Model & Tokenizer:指定了用于训练的模型和分词器的具体类型及其配置,包括预训练模型的路径和是否启用特定功能(如可变长度注意力),这是模型训练的核心组成部分。
PART 3 Dataset & Dataloader:描述了数据处理的细节,包括如何加载数据集、预处理步骤、批处理大小等,确保了模型能够接收到正确格式和质量的数据。
PART 4 Scheduler & Optimizer:配置了优化过程中的关键参数,如学习率调度策略和优化器的选择,这些是影响模型训练效果和速度的重要因素。
PART 5 Runtime:定义了训练过程中的额外设置,如日志记录、模型保存策略和自定义钩子等,以支持训练流程的监控、调试和结果的保存。
具体修改的内容:
1. 在PART1中修改模型路径,数据集路径和问题设置
2. 在PART3中修改数据集和处理数据的函数
#######################################################################
# PART 1 Settings #
#######################################################################
- pretrained_model_name_or_path = 'internlm/internlm2-chat-1_8b'
+ pretrained_model_name_or_path = '/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b'
- alpaca_en_path = 'tatsu-lab/alpaca'
+ alpaca_en_path = 'datas/assistant.json'
evaluation_inputs = [
- '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai'
+ '请介绍一下你自己', 'Please introduce yourself'
]
#######################################################################
# PART 3 Dataset & Dataloader #
#######################################################################
alpaca_en = dict(
type=process_hf_dataset,
- dataset=dict(type=load_dataset, path=alpaca_en_path),
+ dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),
tokenizer=tokenizer,
max_length=max_length,
- dataset_map_fn=alpaca_map_fn,
+ dataset_map_fn=None,
template_map_fn=dict(
type=template_map_fn_factory, template=prompt_template),
remove_unused_columns=True,
shuffle_before_pack=True,
pack_to_max_length=pack_to_max_length,
use_varlen_attn=use_varlen_attn)
1.3.4 启动微调
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
# 命令解析
xtuner train # 启动模型微调
--CONFIG # 用于指定微调配置文件
--work-dir # 指定特定的文件保存位置
运行结果截图
看起来是训练前的输出结果?
训练后的结果,不过英文结果变成BERT了是为啥
1.3.5 模型格式转换
将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式
# 先获取最后保存的一个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
# 命令解析
xtuner convert pth_to_hf # 用于进行模型格式转换
--CONFIG # 表示微调的配置文件
--PATH_TO_PTH_MODEL # 微调的模型权重
--SAVE_PATH_TO_HF_MODEL # 转换后的 HuggingFace 格式文件的保存路径
--fp32 # 以fp32的精度开启, 默认为fp16
--max-shard-size {GB} # 每个权重文件最大的大小(默认为2GB)
运行结果
-- hf
| |-- README.md
| |-- adapter_config.json
| |-- adapter_model.bin
| `-- xtuner_config.py
此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”,即Adapter
1.3.6 模型合并
将Adapter与模型合并
xtuner convert merge /root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b ./hf ./merged --max-shard-size 2GB
# 命令解析
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模型,假如是的话就要加上,不是就不需要添加
运行结果
最终目录
-- merged
| |-- config.json
| |-- configuration_internlm2.py
| |-- generation_config.json
| |-- modeling_internlm2.py
| |-- pytorch_model-00001-of-00002.bin
| |-- pytorch_model-00002-of-00002.bin
| |-- pytorch_model.bin.index.json
| |-- special_tokens_map.json
| |-- tokenization_internlm2.py
| |-- tokenization_internlm2_fast.py
| |-- tokenizer.json
| |-- tokenizer.model
| `-- tokenizer_config.json
1.3.7 与微调后模型对话
# 首先修改 xtuner_streamlit_demo.py 中的模型路径
- model_name_or_path = "/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b"
+ model_name_or_path = "/root/InternLM/XTuner/merged"
运行模型demo
streamlit run /root/Tutorial/tools/xtuner_streamlit_demo.py
运行结果
2. 进阶任务
自定义微调:用 MS-Agent 数据集 赋予 LLM 以 Agent 能力
conda activate xtuner
mkdir ~/xtuner019 && cd ~/xtuner019
# 拉取 0.1.9 的版本源码
git clone -b v0.1.9 https://github.com/InternLM/xtuner
# 无法访问github的用户请从 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner
# 进入源码目录
cd xtuner
# 从源码安装 XTuner
pip install -e '.[all]'
# 准备工作
mkdir ~/ft-msagent && cd ~/ft-msagent
cp -r ~/ft-oasst1/internlm-chat-7b .
# 查看配置文件
xtuner list-cfg | grep msagent
# 复制配置文件到当前目录
xtuner copy-cfg internlm_7b_qlora_msagent_react_e3_gpu8 .
# 修改配置文件中的模型为本地路径
vim ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py
注:如果在使用 xtuner 时遇到:
ImportError: cannot import name 'split_torch_state_dict_into_shards' from 'huggingface_hub' (/root/.conda/envs/xtuner0.1.9/lib/python3
.10/site-packages/huggingface_hub/__init__.py)
可以尝试更新 huggingface_hub
pip install --upgrade huggingface_hub
对 internlm_7b_qlora_msagent_react_e3_gpu8_copy.py 修改如下
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'
开始微调
xtuner train ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py --deepspeed deepspeed_zero2
2.1 直接使用
由于微调十分费时,也可以直接下载微调好的 Adapter
cd ~/ft-msagent
apt install git git-lfs
git lfs install
git lfs clone https://www.modelscope.cn/xtuner/internlm-7b-qlora-msagent-react.git
目录检查
-internlm_7b_qlora_msagent_react_e3_gpu8_copy.py
-internlm-7b-qlora-msagent-react
-internlm-chat-7b
-work_dir(可有可无)
2.1.1 添加 serper 环境变量
export SERPER_API_KEY=<YOUR_API_KEY>
2.1.2 启动
xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent
如果遇到
ModuleNotFoundError: No module named 'griffe.enumerations'
需要降低一下 griffe 的版本
pip install griffe==0.48
如果遇到:
TypeError: transformers.models.auto.auto_factory._BaseAutoModelClass.from_pretrained() got multiple values for keyword argument 'trust_remote_code'
需要修改
vim /root/xtuner019/xtuner/xtuner/tools/chat.py
# 注释掉 'trust_remote_code': True,
model_kwargs = {
'quantization_config': quantization_config,
'load_in_8bit': load_in_8bit,
'device_map': 'auto',
'offload_folder': args.offload_folder,
# 'trust_remote_code': True,
'torch_dtype': TORCH_DTYPE_MAP[args.torch_dtype]
}
2.1.3 结果
没有微调前的模型
xtuner chat ./internlm-chat-7b
运行结果
微调后运行结果
尽力了...