快速结论
跟着书生浦语教程快速体验丐版lora微调~
效果:
教程:https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/XTuner/readme.md
安装
(internlm-demo) root@intern-studio-50006073:~/demo/Shanghai_AI_Laboratory/internlm2-chat-1_8b# xtuner version
09/12 08:42:50 - mmengine - INFO - 0.1.21
查看代码结构
(internlm-demo) root@intern-studio-50006073:~/demo/Shanghai_AI_Laboratory/internlm2-chat-1_8b# tree -l
.
|-- 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
造数据
拷贝一份造数据脚本、改成自己的名字、然后运行
cp /root/InternLM/Tutorial/tools/xtuner_generate_assistant.py ./
python xtuner_generate_assistant.py
查看&设置config
//xtuner list-cfg 命令用于列出内置的所有配置文件。参数 -p 或 --pattern 表示模式匹配,后面跟着的内容将会在所有的配置文件里进行模糊匹配搜索,然后返回最有可能得内容。比如我们这里微调的是书生·浦语的模型,我们就可以匹配搜索 internlm2。
//xtuner copy-cfg 命令用于复制一个内置的配置文件。该命令需要两个参数:CONFIG 代表需要复制的配置文件名称,SAVE_PATH 代表复制的目标路径。在我们的输入的这个命令中,我们的 CONFIG 对应的是上面搜索到的 internlm2_chat_1_8b_qlora_alpaca_e3 ,而 SAVE_PATH 则是当前目录 .。
xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .
修改配置文件:
#######################################################################
# 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)
模型训练
配置好config、运行
xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
模型格式转换、合并
转换
模型转换的本质其实就是将原本使用 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
合并
对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。
对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 Adapter ,因此是不需要进行模型整合的。
# 合并模型
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
合并后效果:
(internlm-demo) root@intern-studio-50006073:~/demo/Shanghai_AI_Laboratory/merged# tree -l
.
|-- 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
0 directories, 13 files
模型路径:
/root/demo/Shanghai_AI_Laboratory/merged
运行微调好的模型
用之前课程的cmd命令调用微调好的模型 python cli_demo_1_8b.py
=Welcome to InternLM chatbot, type ‘exit’ to exit.=
User >>> 请介绍一下你是谁
我是纸灰的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦time cost:154.1717
User >>> 你在实战营做什么
我在这里帮助纸灰完成XTuner微调个人小助手的任务time cost:15.6601
Done!😄