- 使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知),记录复现过程并截图。
1.创建虚拟环境
首先是创建开发机,确保自己已经克隆了Tutorial仓库的资料到本地。
mkdir -p /root/InternLM/Tutorial git clone -b camp3 https://github.com/InternLM/Tutorial /root/InternLM/Tutorial
在安装 XTuner 之前,我们需要先创建一个虚拟环境。使用 Anaconda
创建一个名为 xtuner0121
的虚拟环境,可以直接执行命令。
# 创建虚拟环境 conda create -n xtuner0121 python=3.10 -y # 激活虚拟环境(注意:后续的所有操作都需要在这个虚拟环境中进行) conda activate xtuner0121 # 安装一些必要的库 conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y # 安装其他依赖 pip install transformers==4.39.3 pip install streamlit==1.36.0
2 安装 XTuner
虚拟环境创建完成后,就可以安装 XTuner 了。首先,从 Github 上下载源码。
# 创建一个目录,用来存放源代码 mkdir -p /root/InternLM/code cd /root/InternLM/code git clone -b v0.1.21 https://github.com/InternLM/XTuner /root/InternLM/code/XTuner
其次,进入源码目录,执行安装。
# 进入到源码目录 cd /root/InternLM/code/XTuner conda activate xtuner0121 # 执行安装 pip install -e '.[deepspeed]'
2.1 模型准备
软件安装好后,我们就可以准备要微调的模型了。
对于学习而言,我们可以使用 InternLM 推出的1.8B的小模型来完成此次微调演示。
对于在 InternStudio 上运行的小伙伴们,可以不用通过 HuggingFace、OpenXLab 或者 Modelscope 进行模型的下载,在开发机中已经为我们提供了模型的本地文件,直接使用就可以了。
我们可以通过以下代码一键通过符号链接的方式链接到模型文件,这样既节省了空间,也便于管理。
# 创建一个目录,用来存放微调的所有资料,后续的所有操作都在该路径中进行 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
执行上述操作后,Shanghai_AI_Laboratory/internlm2-chat-1_8b
将直接成为一个符号链接,这个链接指向 /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b
的位置。
这意味着,当我们访问 Shanghai_AI_Laboratory/internlm2-chat-1_8b
时,实际上就是在访问 /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b
目录下的内容。通过这种方式,我们无需复制任何数据,就可以直接利用现有的模型文件进行后续的微调操作,从而节省存储空间并简化文件管理。
模型文件准备好后,我们可以使用tree
命令来观察目录结构。
通过Streamlit来直接启动应用。
conda activate xtuner0121 streamlit run /root/InternLM/Tutorial/tools/xtuner_streamlit_demo.py
运行后,在访问前,我们还需要做的就是将端口映射到本地。
然后在本地使用 PowerShell 或者命令行终端,执行以下命令:
其中,
8501
是Streamlit程序的服务端口,43551
需要替换为自己的开发机的端口。
ssh -CNg -L 8501:127.0.0.1:8501 root@ssh.intern-ai.org.cn -p 43551
3 指令跟随微调
下面我们对模型进行微调,让模型认识到自己的位,了解它自己是你的一个助手。
3.1准数据文件
为了让模型能够认清自己的身份弟位,在询问自己是谁的时候按照我们预期的结果进行回复,我们就需要通过在微调数据集中大量加入这样的数据。我们准备一个数据集文件datas/assistant.json
,文件内容为对话数据。
cd /root/InternLM/XTuner mkdir -p datas touch datas/assistant.json
为了简化数据文件准备,我们也可以通过脚本生成的方式来准备数据。创建一个脚本文件 xtuner_generate_assistant.py
:
cd /root/InternLM/XTuner touch xtuner_generate_assistant.py
输入脚本内容并保存:
xtuner_generate_assistant.py
import json # 设置用户的名字 name = '伍鲜同志' # 设置需要重复添加的数据次数 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)
然后执行该脚本来生成数据文件。
cd /root/InternLM/XTuner conda activate xtuner0121 python xtuner_generate_assistant.py
XTuner 提供多个开箱即用的配置文件,可以通过以下命令查看。
xtuner list-cfg
命令用于列出内置的所有配置文件。参数-p
或--pattern
表示模式匹配,后面跟着的内容将会在所有的配置文件里进行模糊匹配搜索,然后返回最有可能得内容。比如我们这里微调的是书生·浦语的模型,我们就可以匹配搜索internlm2
。
conda activate xtuner0121 xtuner list-cfg -p internlm2
3.2复制一个预设的配置文件
由于我们是对internlm2-chat-1_8b
模型进行指令微调,所以与我们的需求最匹配的配置文件是 internlm2_chat_1_8b_qlora_alpaca_e3
,这里就复制该配置文件。
xtuner copy-cfg
命令用于复制一个内置的配置文件。该命令需要两个参数:CONFIG
代表需要复制的配置文件名称,SAVE_PATH
代表复制的目标路径。在我们的输入的这个命令中,我们的CONFIG
对应的是上面搜索到的internlm2_chat_1_8b_qlora_alpaca_e3
,而SAVE_PATH
则是当前目录.
。
cd /root/InternLM/XTuner conda activate xtuner0121 xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3
在 PART 1 的部分,由于我们不再需要在 HuggingFace 上自动下载模型,因此我们先要更换模型的路径以及数据集的路径为我们本地的路径。
为了训练过程中能够实时观察到模型的变化情况,XTuner 贴心的推出了一个 evaluation_inputs
的参数来让我们能够设置多个问题来确保模型在训练过程中的变化是朝着我们想要的方向前进的。我们可以添加自己的输入。
在 PART 3 的部分,由于我们准备的数据集是 JSON 格式的数据,并且对话内容已经是 input
和 output
的数据对,所以不需要进行格式转换。
####################################################################### # 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)
除此之外,我们还可以对一些重要的参数进行调整,包括学习率(lr)、训练的轮数(max_epochs)等等。
3.3启动微调
完成了所有的准备工作后,我们就可以正式的开始我们下一阶段的旅程:XTuner 启动~!
当我们准备好了所有内容,我们只需要将使用 xtuner train
命令令即可开始训练。
xtuner train
命令用于启动模型微调进程。该命令需要一个参数:CONFIG
用于指定微调配置文件。这里我们使用修改好的配置文件internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
。
训练过程中产生的所有文件,包括日志、配置文件、检查点文件、微调后的模型等,默认保存在work_dirs
目录下,我们也可以通过添加--work-dir
指定特定的文件保存位置。
cd /root/InternLM/XTuner conda activate xtuner0121 xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py
微调完成后,我们可以再次运行xtuner_streamlit_demo.py
脚本来观察微调后的对话效果,不过在运行之前,我们需要将脚本中的模型路径修改为微调后的模型的路径。
# 直接修改脚本文件第18行 - model_name_or_path = "/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b" + model_name_or_path = "/root/InternLM/XTuner/merged"
然后,我们可以直接启动应用。
conda activate xtuner0121 streamlit run /root/InternLM/Tutorial/tools/xtuner_streamlit_demo.py
运行后,确保端口映射正常,最后,通过浏览器访问来进行对话了。