先写实践体会:
- 基础岛课程中最难一课,不再是应用层面,而是深入模型内部。
- 微调流程:
- 目标模型准备
- 微调数据准备
- 微调配置文件
- 微调实施
- 格式转换
- 模型合并
- 测试
- 微调时间,在10%的A100GPU下,3000条指令数据下,本文所用的纯微调时间大约为:
- 微调:40min、转换:15m、合并:5m,合计1H左右
- 微调结果准确!和预设数据完全相同,而且能结合LLM自身能力去分解。详见文末测试。
- XTuner支持4090消费级GPU的微调
- XTuner的参数很多,微调的设定很多、掌握需要更深入的学习和理解LLM模型知识
- 指令微调相对简单
- 合理的微调数据是关键之一
一、XTuner介绍
https://xtuner.readthedocs.io/zh-cn/latest/index.html
XTuner是低成本大模型训练工具箱,也是internLM全链条工具链中,微调工具的一环。XTuner支持与书生·浦语(InternLM)、Llama等多款开源大模型的适配,可执行增量预训练、指令微调、工具类指令微调等任务类型。硬件要求上,开发者最低使用消费级显卡便可进行训练,实现大模型特定需求能力。
二、模型微调流程
- 模型准备
- 微调数据准备
- 配置文件准备
- 微调实施
- 模型格式转换
- 模型合并
- 微调结果测试
三、模型微调的种类
- 指令微调
- 传统微调
- 对齐微调
在传统微调中,语言模型预测样本的标签,而在指令微调中,语言模型回答指令集中的问题。两者之间的差别:
- 目标
- 传统微调:在特定任务或数据集上进一步优化预训练模型的性能。
- 指令微调:使模型能够更好地理解和执行自然语言指令。
- 数据集
- 传统微调:通常使用单一任务的专用数据集,例如情感分析、命名实体识别等。数据量可能较小,但高度特定于目标任务。
- 指令微调:使用包含各种任务和指令的大规模多任务数据集。这些数据集涵盖了多个领域和任务类型。数据量通常非常大,涵盖广泛的指令和任务示例。
- 应用场景
- 传统微调:适用于需要在特定任务上获得最佳性能的应用,例如医学影像分析、语音识别等。
- 指令微调:适用于需要处理多种任务和指令的自然语言处理应用,例如智能助理、聊天机器人等
指令微调侧重于让模型学会遵循特定指令,生成符合要求的输出,适用于需要模型执行特定任务的场景。
此外,还有对齐微调
对齐微调侧重于使模型的行为与人类价值观和期望一致,适用于需要生成内容符合特定价值观或标准的场景。
本次是进行指令微调:
指令跟随微调(Instruction Following Fine-Tuning)是指在大型语言模型(LLM)的训练过程中,通过提供明确的指令或任务描述,对模型进行有针对性的微调,使其能够更好地理解和执行特定任务。这种方式旨在让模型学习如何根据给定的指令生成符合要求的输出。
四、微调实践
(一)xtuner安装
# 创建虚拟环境
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
# 创建一个目录,用来存放源代码
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
# 执行安装
pip install -e '.[deepspeed]'
安装确认
xtuner version
08/08 17:28:22 - mmengine - INFO - 0.1.21
帮助查看
xtuner help
08/08 17:29:02 - mmengine - INFO -
Arguments received: ['xtuner', 'help']. xtuner commands use the following syntax:
xtuner MODE MODE_ARGS ARGS
Where MODE (required) is one of ('list-cfg', 'copy-cfg', 'log-dataset', 'check-custom-dataset', 'train', 'test', 'chat', 'convert', 'preprocess', 'mmbench', 'eval_refcoco')
MODE_ARG (optional) is the argument for specific mode
ARGS (optional) are the arguments for specific command
Some usages for xtuner commands: (See more by using -h for specific command!)
1. List all predefined configs:
xtuner list-cfg
2. Copy a predefined config to a given path:
xtuner copy-cfg $CONFIG $SAVE_FILE
3-1. Fine-tune LLMs by a single GPU:
xtuner train $CONFIG
3-2. Fine-tune LLMs by multiple GPUs:
NPROC_PER_NODE=$NGPUS NNODES=$NNODES NODE_RANK=$NODE_RANK PORT=$PORT ADDR=$ADDR xtuner dist_train $CONFIG $GPUS
4-1. Convert the pth model to HuggingFace's model:
xtuner convert pth_to_hf $CONFIG $PATH_TO_PTH_MODEL $SAVE_PATH_TO_HF_MODEL
4-2. Merge the HuggingFace's adapter to the pretrained base model:
xtuner convert merge $LLM $ADAPTER $SAVE_PATH
xtuner convert merge $CLIP $ADAPTER $SAVE_PATH --is-clip
4-3. Split HuggingFace's LLM to the smallest sharded one:
xtuner convert split $LLM $SAVE_PATH
5-1. Chat with LLMs with HuggingFace's model and adapter:
xtuner chat $LLM --adapter $ADAPTER --prompt-template $PROMPT_TEMPLATE --system-template $SYSTEM_TEMPLATE
5-2. Chat with VLMs with HuggingFace's model and LLaVA:
xtuner chat $LLM --llava $LLAVA --visual-encoder $VISUAL_ENCODER --image $IMAGE --prompt-template $PROMPT_TEMPLATE --system-template $SYSTEM_TEMPLATE
6-1. Preprocess arxiv dataset:
xtuner preprocess arxiv $SRC_FILE $DST_FILE --start-date $START_DATE --categories $CATEGORIES
6-2. Preprocess refcoco dataset:
xtuner preprocess refcoco --ann-path $Ref