L1-XTuner 微调个人小助手认知任务

 任务链接:Tutorial/docs/L1/XTuner/task.md at camp3 · InternLM/Tutorial · GitHub

 

目录

1. 基础任务

1.1 安装 XTuner

 1.2 微调前模型

1.3 指令跟随微调

1.3.1 准备配置文件

1.3.2 复制配置文件

1.3.3 修改配置文件

1.3.4 启动微调

1.3.5 模型格式转换

1.3.6 模型合并

1.3.7 与微调后模型对话

2. 进阶任务

2.1 直接使用

2.1.1 添加 serper 环境变量 

2.1.2 启动

 2.1.3 结果


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

 运行结果

微调后运行结果

 

尽力了... 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值