使用LoRA对大语言模型LLaMA做Fine-tune
- 前言
- 下载
- 配置环境
- 模型的训练 Fine-tune
- 模型的使用 Inference
- 参考
前言
-
目前有大量对LLM(大语言模型)做Fine-tune的方式,不过需要消耗的资源非常高,例如
- Stanford Alpaca: 对LLaMA-7B做Fine-tune,需要4颗A100 (80GB) GPU
- FastChat/Vicuna: 对LLaMA-7B做Fine-tune,需要4颗A100 (40GB) GPU
-
这种资源需求令普通的学习者望而却步,使用LoRA则可以较好的解决这个问题
-
LoRA全称为Low-Rank Adaptation of Large Language Models,是一种模拟Full Fine-tune的特殊方法:不改变原模型的情况下,在旁边增加一个降维和升维操作来模拟intrinsic rank,从而达到和Full Fine-tune几乎一样的效果。(具体原理请自行查找。另外,提一下:LoRA原本是用于LLM的,不过目前在StableDiffusion上也得到了非常好的应用。)
-
LoRA 的最大优势是速度快、内存消耗少。Alpaca-LoRA使用一颗RTX 4090即可实现对LLaMA-7B的Fine-tune,目前也有很多网友使用单颗RTX 4070 Ti、RTX 4080完成过训练。
-
下面就来说说整个训练过程。
-
我使用的设备是3颗老旧的Tesla 4T(不要问我为什么用推理专用GPU做训练),信息如下
(base) [root@xxx-yyy-gpu ~]# nvidia-smi Mon May 29 16:29:50 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.91.03 Driver Version: 460.91.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 Off | 00000000:3B:00.0 Off | 0 | | N/A 60C P0 67W / 70W | 9344MiB / 15109MiB | 99% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 1 Tesla T4 Off | 00000000:AF:00.0 Off | 0 | | N/A 64C P0 68W / 70W | 9344MiB / 15109MiB | 91% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 2 Tesla T4 Off | 00000000:D8:00.0 Off | 0 | | N/A 63C P0 70W / 70W | 9344MiB / 15109MiB | 100% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 516641 C ...a3/envs/alpaca/bin/python 9341MiB | | 1 N/A N/A 516642 C ...a3/envs/alpaca/bin/python 9341MiB | | 2 N/A N/A 516643 C ...a3/envs/alpaca/bin/python 9341MiB | +-----------------------------------------------------------------------------+ (base) [root@xxx-yyy-gpu ~]#
下载
- LLaMA模型文件(decapoda-research/llama-7b-hf,非MetaAI官方)
- 下载地址:https://huggingface.co/decapoda-research/llama-7b-hf/tree/main
- 点击下载按钮即可(每个文件),全部保存到同一个目录。
- 如果你的环境是联网的,可以不下载,后续会在运行训练阶段自动下载
- Alpaca-LoRA项目
- 地址:https://github.com/tloen/alpaca-lora
- 下载该项目代码,我们需要使用到该项目写好的
finetune.py
代码 - 稍后还需安装该项目下
requirements.txt
中的依赖
- 训练用的数据集
- 地址:https://github.com/LC1332/Chinese-alpaca-lora/tree/main/data
- 下载
trans_chinese_alpaca_data.json
文件,这是该项目翻译为中文的对话数据 - 你也可以按照该格式构建出自己的数据集,做出自己的专业领域模型(例如中文医学对话)
- Anaconda、Python、PyTorch
- Anaconda 是Python虚拟环境管理工具,我用的 Miniconda,请自行安装
- Python 用的3.9版本,先不下载,等下用conda创建
- PyTorch 用的1.13.1版本,先不下载,等下安装
配置环境
- 安装Python、PyTorch
- 利用Miniconda创建Python虚拟环境,命令
$ conda create -n alpaca python=3.9
- 进入该环境,命令
$ conda activate alpaca
- 安装PyTorch,命令如下(二选一)
- Conda方式:
$ conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia
- Pip方式:
$ pip3 install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
- Conda方式:
- 利用Miniconda创建Python虚拟环境,命令
- 安装项目的Python依赖
- 在刚才新创建的Python虚拟环境
alpaca
中,如果直接安装alpaca-lora项目下的requirements.txt
,可能会漏掉一些依赖包。你可以试试,操作如下- 进入到alpaca-lora项目目录下,命令
$ pip install -r requirements.txt
- 进入到alpaca-lora项目目录下,命令
- 建议直接这样安装,命令
$ pip install accelerate appdirs loralib black datasets fire peft transformers sentencepiece gradio scipy bitsandbytes
- 注意看
requirements.txt
文件中的描述,transformers需要>=4.28.0
transformers
库用于加载、训练、保存模型,peft
库则是用于帮助你使用LoRA的
- 在刚才新创建的Python虚拟环境
- 准备好资源
- 请将下载好的“LLaMA模型文件”放置一个文件夹内(没下载就不管,等下会自动下),如
/root/.cache/huggingface/hub/models--decapoda-research--llama-7b-hf
- 请将下载好的“Alpaca-LoRA项目”放置一个文件夹内,如
/home/gpt/alpaca-lora
- 请将下载好的“训练用的数据集”放置一个文件夹内,如
/home/gpt/data/trans_chinese_alpaca_data.json
- 请将下载好的“LLaMA模型文件”放置一个文件夹内(没下载就不管,等下会自动下),如
模型的训练 Fine-tune
-
进入到Alpaca-LoRA项目目录下
-
若是单个显卡,训练命令样例如下
python finetune.py \ --base_model 'decapoda-research/llama-7b-hf' \ --data_path '/home/gpt/data/trans_chinese_alpaca_data.json' \ --output_dir './my_model_save'
-base_model
是预训练模型LLaMA在huggingface的标识或本地存储路径--data_path
是训练用的数据的路径--output_dir
是训练完成后模型的保存路径
-
若是多个显卡,训练命令样例如下
WORLD_SIZE=3 CUDA_VISIBLE_DEVICES=0,1,2 torchrun \ --nproc_per_node=3 \ --master_port=1234 \ finetune.py \ --base_model 'decapoda-research/llama-7b-hf' \ --data_path '/home/gpt/data/trans_chinese_alpaca_data.json' \ --output_dir './my_model_save' \ --micro_batch_size 2 \ --num_epochs 2
WORLD_SIZE
是全局进程数(一般一个显卡对应一个进程)CUDA_VISIBLE_DEVICES
是具体的几张显卡的ID--nproc_per_node
是每个物理节点上面进程的数量--micro_batch_size
是微批次的数,越大占用内存越高,请根据你的情况调整--num_epochs
是训练轮数,2个epoch基本上可以达到较好的效果
-
环境有网络的话,正常情况下会自动下载LLaMA模型文件,接着就开始训练了
-
如果没网,但之前单独下载了LLaMA模型文件,需要
- 设置transformers、datasets库的离线模式,在SHELL中添加变量,命令
$ HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1
- 指定LLaMA模型文件路径,例如将
--base_model 'decapoda-research/llama-7b-hf'
改为--base_model '/root/.cache/huggingface/hub/models--decapoda-research--llama-7b-hf'
- 设置transformers、datasets库的离线模式,在SHELL中添加变量,命令
-
我因为一些特殊情况,训练时必须离线,所以我的最终命令如下
WORLD_SIZE=3 CUDA_VISIBLE_DEVICES=0,1,2 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 torchrun \ --nproc_per_node=3 \ --master_port=1234 \ finetune.py \ --base_model '/root/.cache/huggingface/hub/models--decapoda-research--llama-7b-hf' \ --data_path '/home/gpt/data/trans_chinese_alpaca_data.json' \ --output_dir './my_model_save' \ --micro_batch_size 2 \ --num_epochs 2
-
训练过程的输出如下(
--num_epochs 1
时的样例)
-
设备监控信息样例如下(用的 nvitop)
模型的使用 Inference
- 命令如下
python generate.py \
--base_model "decapoda-research/llama-7b-hf" \
--lora_weights './my_model_save' \
--load_8bit
- 后续补充详细的
参考
- Alpaca-LoRA: https://github.com/tloen/alpaca-lora
- Stanford Alpaca: https://github.com/tatsu-lab/stanford_alpaca
- Chinese-alpaca-lora: https://github.com/LC1332/Chinese-alpaca-lora
- FastChat: https://github.com/lm-sys/FastChat