开发机中已经提供了模型本地文件,不需要再下载。通过以下代码一键通过符号链接的方式链接到模型文件,这样既节省了空间,也便于管理。
#创建一个目录,用来存放微调的所有资料,后续的所有操作都在该路径中进行mkdir-p/root/InternLM/XTunercd/root/InternLM/XTunermkdir-pShanghai_AI_Laboratoryln-s/root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8bShanghai_AI_Laboratory/internlm2-chat-1_8b安装tree命令来惯常目录结构
准备一个Streamlit程序的脚本
condaactivatextuner0121streamlitrun/root/InternLM/Tutorial/tools/xtuner_streamlit_demo.py端口映射之后再本地访问:
ssh-CNg-L8501:127.0.0.1:8501root@ssh.intern-ai.org.cn-p435513.2指令跟随微调下面我们对模型进行微调,让模型认识到自己的弟位,了解它自己是你的一个助手。
为了让模型能够认清自己的身份弟位,在询问自己是谁的时候按照我们预期的结果进行回复,我们就需要通过在微调数据集中大量加入这样的数据。我们准备一个数据集文件datas/assistant.json,文件内容为对话数据。
cd/root/InternLM/XTunermkdir-pdatastouchdatas/assistant.json为了简化数据文件准备,我们也可以通过脚本生成的方式来准备数据。创建一个脚本文件
xtuner_generate_assistant.py:cd/root/InternLM/XTunertouchxtuner_generate_assistant.py输入脚本内容并保存:xtuner_generate_assistant.py
为了训练出自己的小助手,需要将脚本中name后面的内容修改为你自己的名称。
将对应的name进行修改(在第4行的位置)
假如想要让微调后的模型能够完完全全认识到你的身份,我们还可以把第6行的n的值调大一点。不过n值太大的话容易导致过拟合,无法有效回答其他问题。
然后执行该脚本来生成数据文件。
准备好数据文件后,我们的目录结构应该是这样子的。
在准备好了模型和数据集后,我们就要根据我们选择的微调方法结合微调方案来找到与我们最匹配的配置文件了,从而减少我们对配置文件的修改量。
配置文件其实是一种用于定义和控制模型训练和测试过程中各个方面的参数和设置的工具。
XTuner提供多个开箱即用的配置文件,可以通过以下命令查看。
xtunerlist-cfg命令用于列出内置的所有配置文件。参数-p或--pattern表示模式匹配,后面跟着的内容将会在所有的配置文件里进行模糊匹配搜索,然后返回最有可能得内容。比如我们这里微调的是书生·浦语的模型,我们就可以匹配搜索internlm2。
condaactivatextuner0121xtunerlist-cfg-pinternlm2配置文件名的解释
由于我们是对internlm2-chat-1_8b模型进行指令微调,所以与我们的需求最匹配的配置文件是internlm2_chat_1_8b_qlora_alpaca_e3,这里就复制该配置文件。
xtunercopy-cfg命令用于复制一个内置的配置文件。该命令需要两个参数:CONFIG代表需要复制的配置文件名称,SAVE_PATH代表复制的目标路径。在我们的输入的这个命令中,我们的CONFIG对应的是上面搜索到的internlm2_chat_1_8b_qlora_alpaca_e3,而SAVE_PATH则是当前目录.。
cd/root/InternLM/XTunercondaactivatextuner0121xtunercopy-cfginternlm2_chat_1_8b_qlora_alpaca_e3.复制好配置文件后,我们的目录结构应该是这样子的。
在选择了一个最匹配的配置文件并准备好其他内容后,下面我们要做的事情就是根据我们自己的内容对该配置文件进行调整,使其能够满足我们实际训练的要求。
配置文件介绍
在PART1的部分,由于我们不再需要在HuggingFace上自动下载模型,因此我们先要更换模型的路径以及数据集的路径为我们本地的路径。
为了训练过程中能够实时观察到模型的变化情况,XTuner贴心的推出了一个evaluation_inputs的参数来让我们能够设置多个问题来确保模型在训练过程中的变化是朝着我们想要的方向前进的。我们可以添加自己的输入。
在PART3的部分,由于我们准备的数据集是JSON格式的数据,并且对话内容已经是input和output的数据对,所以不需要进行格式转换。
常用参数介绍修改完后的完整的配置文件是:configs/internlm2_chat_1_8b_qlora_alpaca_e3_copy.py。
可以直接复制到当前目录。
cd/root/InternLM/XTunercp/root/InternLM/Tutorial/configs/internlm2_chat_1_8b_qlora_alpaca_e3_copy.py./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py3.2.3启动微调完成了所有的准备工作后,我们就可以正式的开始我们下一阶段的旅程:XTuner启动~!
当我们准备好了所有内容,我们只需要将使用xtunertrain命令令即可开始训练。
xtunertrain命令用于启动模型微调进程。该命令需要一个参数:CONFIG用于指定微调配置文件。这里我们使用修改好的配置文件internlm2_chat_1_8b_qlora_alpaca_e3_copy.py。训练过程中产生的所有文件,包括日志、配置文件、检查点文件、微调后的模型等,默认保存在work_dirs目录下,我们也可以通过添加--work-dir指定特定的文件保存位置。
cd/root/InternLM/XTunercondaactivatextuner0121xtunertrain./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py在训练完后,我们的目录结构应该是这样子的。
模型转换的本质其实就是将原本使用Pytorch训练出来的模型权重文件转换为目前通用的HuggingFace格式文件,那么我们可以通过以下命令来实现一键转换。
我们可以使用xtunerconvertpth_to_hf命令来进行模型格式转换。
xtunerconvertpth_to_hf命令用于进行模型格式转换。该命令需要三个参数:CONFIG表示微调的配置文件,PATH_TO_PTH_MODEL表示微调的模型权重文件路径,即要转换的模型权重,SAVE_PATH_TO_HF_MODEL表示转换后的HuggingFace格式文件的保存路径。
除此之外,我们其实还可以在转换的命令中添加几个额外的参数,包括:
参数名解释--fp32代表以fp32的精度开启,假如不输入则默认为fp16--max-shard-size{GB}代表每个权重文件最大的大小(默认为2GB)
先获取最后保存的一个pth文件
pth_file=`ls-t./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth|head-n1`exportMKL_SERVICE_FORCE_INTEL=1exportMKL_THREADING_LAYER=GNUxtunerconvertpth_to_hf./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py${pth_file}./hf模型格式转换完成后,我们的目录结构应该是这样子的。
转换完成后,可以看到模型被转换为HuggingFace中常用的.bin格式文件,这就代表着文件成功被转化为HuggingFace格式了。
此时,hf文件夹即为我们平时所理解的所谓“LoRA模型文件”可以简单理解:LoRA模型文件=Adapter
对于LoRA或者QLoRA微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。
对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的Adapter,因此是不需要进行模型整合的。
在XTuner中提供了一键合并的命令xtunerconvertmerge,在使用前我们需要准备好三个路径,包括原模型的路径、训练好的Adapter层的(模型格式转换后的)路径以及最终保存的路径。
xtunerconvertmerge命令用于合并模型。该命令需要三个参数:LLM表示原模型路径,ADAPTER表示Adapter层的路径,SAVE_PATH表示合并后的模型最终的保存路径。
在模型合并这一步还有其他很多的可选参数,包括:参数名解释--max-shard-size{GB}代表每个权重文件最大的大小(默认为2GB)--device{device_name}这里指的就是device的名称,可选择的有cuda、cpu和auto,默认为cuda即使用gpu进行运算--is-clip这个参数主要用于确定模型是不是CLIP模型,假如是的话就要加上,不是就不需要添加cd/root/InternLM/XTunercondaactivatextuner0121
exportMKL_SERVICE_FORCE_INTEL=1exportMKL_THREADING_LAYER=GNUxtunerconvertmerge/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b./hf./merged--max-shard-size2GB模型合并完成后,我们的目录结构应该是这样子的。
在模型合并完成后,我们就可以看到最终的模型和原模型文件夹非常相似,包括了分词器、权重文件、配置信息等等。