书生大模型实战营(第三期)-XTuner 微调个人小助手认知
微调教程:Tutorial/docs/L1/XTuner at camp3 · InternLM/Tutorial · GitHub
1. 微调前InternLM2-chat-1_8b的回答
让模型回答“请介绍一下你自己”时,模型反馈是xxx的小助手之类的回答,下面我们对模型进行微调,让模型认识到自己是你的一个助手。
2. 微调后
命名为“Serein同学”的小助手
修改准备数据的脚本
import json
# 设置用户的名字
name = 'Serein同学'
# 设置需要重复添加的数据次数
n = 3750
# 初始化数据
data = [
{"conversation": [{"input": "请介绍一下你自己", "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)}]},
{"conversation": [{"input": "你在实战营做什么", "output": "我在这里帮助{}完成XTuner微调个人小助手的任务".format(name)}]},
{"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)
执行该脚本来生成数据文件。
cd /root/InternLM/XTuner
conda activate xtuner0121
python xtuner_generate_assistant.py
准备好数据文件后,我们的目录结构如下
├── Shanghai_AI_Laboratory
│ └── internlm2-chat-1_8b -> /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b
│ ├── README.md
│ ├── config.json
│ ├── configuration.json
│ ├── configuration_internlm2.py
│ ├── generation_config.json
│ ├── model-00001-of-00002.safetensors
│ ├── model-00002-of-00002.safetensors
│ ├── model.safetensors.index.json
│ ├── modeling_internlm2.py
│ ├── special_tokens_map.json
│ ├── tokenization_internlm2.py
│ ├── tokenization_internlm2_fast.py
│ ├── tokenizer.model
│ └── tokenizer_config.json
├── datas
│ └── assistant.json
├── xtuner_generate_assistant.py
微调
修改微调配置文件后,运行./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
微调用时大约40分钟(10%的A100)
微调后的目录结构如下:
├── Shanghai_AI_Laboratory
│ └── internlm2-chat-1_8b -> /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b
│ ├── README.md
│ ├── config.json
│ ├── configuration.json
│ ├── configuration_internlm2.py
│ ├── generation_config.json
│ ├── model-00001-of-00002.safetensors
│ ├── model-00002-of-00002.safetensors
│ ├── model.safetensors.index.json
│ ├── modeling_internlm2.py
│ ├── special_tokens_map.json
│ ├── tokenization_internlm2.py
│ ├── tokenization_internlm2_fast.py
│ ├── tokenizer.model
│ └── tokenizer_config.json
├── datas
│ └── assistant.json
├── internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
├── work_dirs
│ └── internlm2_chat_1_8b_qlora_alpaca_e3_copy
│ ├── 20240822_205405
│ │ ├── 20240822_205405.log
│ │ └── vis_data
│ │ ├── 20240822_205405.json
│ │ ├── config.py
│ │ ├── eval_outputs_iter_383.txt
│ │ └── scalars.json
│ ├── internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
│ ├── iter_384.pth
│ └── last_checkpoint
└── xtuner_generate_assistant.py
iter_384.pth
是我们训练好的权重文件
将模型转为Huggingface格式
转换后的目录结构如下:
├── Shanghai_AI_Laboratory
│ └── internlm2-chat-1_8b -> /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b
│ ├── README.md
│ ├── config.json
│ ├── configuration.json
│ ├── configuration_internlm2.py
│ ├── generation_config.json
│ ├── model-00001-of-00002.safetensors
│ ├── model-00002-of-00002.safetensors
│ ├── model.safetensors.index.json
│ ├── modeling_internlm2.py
│ ├── special_tokens_map.json
│ ├── tokenization_internlm2.py
│ ├── tokenization_internlm2_fast.py
│ ├── tokenizer.model
│ └── tokenizer_config.json
├── datas
│ └── assistant.json
├── hf
│ ├── README.md
│ ├── adapter_config.json
│ ├── adapter_model.bin
│ └── xtuner_config.py
├── internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
├── work_dirs
│ └── internlm2_chat_1_8b_qlora_alpaca_e3_copy
│ ├── 20240822_205405
│ │ ├── 20240822_205405.log
│ │ └── vis_data
│ │ ├── 20240822_205405.json
│ │ ├── config.py
│ │ ├── eval_outputs_iter_383.txt
│ │ └── scalars.json
│ ├── internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
│ ├── iter_384.pth
│ └── last_checkpoint
└── xtuner_generate_assistant.py
出现hf文件夹
模型合并
后并后的目录结构如下:
├── Shanghai_AI_Laboratory
│ └── internlm2-chat-1_8b -> /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b
│ ├── README.md
│ ├── config.json
│ ├── configuration.json
│ ├── configuration_internlm2.py
│ ├── generation_config.json
│ ├── model-00001-of-00002.safetensors
│ ├── model-00002-of-00002.safetensors
│ ├── model.safetensors.index.json
│ ├── modeling_internlm2.py
│ ├── special_tokens_map.json
│ ├── tokenization_internlm2.py
│ ├── tokenization_internlm2_fast.py
│ ├── tokenizer.model
│ └── tokenizer_config.json
├── datas
│ └── assistant.json
├── hf
│ ├── README.md
│ ├── adapter_config.json
│ ├── adapter_model.bin
│ └── xtuner_config.py
├── internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
├── 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
├── work_dirs
│ └── internlm2_chat_1_8b_qlora_alpaca_e3_copy
│ ├── 20240822_205405
│ │ ├── 20240822_205405.log
│ │ └── vis_data
│ │ ├── 20240822_205405.json
│ │ ├── config.py
│ │ ├── eval_outputs_iter_383.txt
│ │ └── scalars.json
│ ├── internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
│ ├── iter_384.pth
│ └── last_checkpoint
└── xtuner_generate_assistant.py
在模型合并完成后保存在merged文件夹中,我们就可以看到最终的模型和原模型文件夹非常相似,包括了分词器、权重文件、配置信息等等。
3. 微调后的回答
对比微调前的回答,模型可以准确说出自己是XXX的小助手。