0


使用LoRA对大语言模型LLaMA做Fine-tune

使用LoRA对大语言模型LLaMA做Fine-tune

前言

  • 目前有大量对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
  • LoRA 的最大优势是训练参数少、速度快、内存消耗少。例如Alpaca-LoRA使用一颗RTX 4090即可实现对LLaMA-7B的Fine-tune,目前也有很多网友使用单颗RTX 4070 Ti、RTX 4080完成过训练。
  • 下面就来说说整个训练过程。
  • 我使用的设备是3颗老旧的Tesla T4(不要问我为什么用推理专用GPU做训练),信息如下(base)[root@xxx-yyy-gpu ~]# nvidia-smi Mon May 2916: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 31C P8 8W / 70W | 0MiB / 15109MiB |0% Default |||| N/A |+-------------------------------+----------------------+----------------------+|1 Tesla T4 Off | 00000000:AF:00.0 Off |0|| N/A 32C P8 9W / 70W | 0MiB / 15109MiB |0% Default |||| N/A |+-------------------------------+----------------------+----------------------+|2 Tesla T4 Off | 00000000:D8:00.0 Off |0|| N/A 31C P8 9W / 70W | 0MiB / 15109MiB |0% Default |||| N/A |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+| Processes: || GPU GI CI PID Type Process name GPU Memory || ID ID Usage ||=============================================================================|| No running processes found |+-----------------------------------------------------------------------------+
  • 理论上2颗Tesla T4也行 😃

下载

  • 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.pygenerate.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
  • 安装项目的Python依赖- 在刚才新创建的Python虚拟环境alpaca中,如果直接安装alpaca-lora项目下的requirements.txt,可能会漏掉一些依赖包。你可以试试,操作如下 - 进入到alpaca-lora项目目录下,命令$ pip install -r requirements.txt- 建议直接这样安装,命令$ pip install accelerate appdirs loralib black datasets fire peft==0.3.0 transformers==4.29.2 sentencepiece gradio scipy bitsandbytes==0.37.2- 注意看requirements.txt文件中的描述,transformers需要>=4.28.0,太高也会出问题,建议用4.29.2。另外,bitsandbytes的版本不要用0.38.x,会报OOM,建议用0.37.2,但是又可能会出现其他错误(0.38.x修复了这个问题,解决方式见文末)。peft库的官方代码也在经常变动,我目前使用的是0.3.0,建议保持一致。- transformers库用于加载、训练、保存模型,peft库则是用于帮助你使用LoRA的
  • 准备好资源- 请将下载好的“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

模型的训练 Fine-tune

  • 进入到Alpaca-LoRA项目目录下,如/home/gpt/alpaca-lora
  • 若是单个显卡,训练命令样例如下nohup 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'\--batch_size 128\--micro_batch_size 2\--num_epochs 2\--learning_rate 3e-4 \1>train.log 2>&1&- --base_model 是预训练模型LLaMA在huggingface的标识或本地存储路径- --data_path 是训练用的数据的路径- --output_dir 是训练完成后模型的保存路径- --micro_batch_size 是微批次的大小,会通过梯度累积的方式来节省显存。越大占用显存越高,请根据你的情况调整。- --batch_size- --num_epochs 是训练轮数,2~3个epoch基本上可以达到较好的效果- --learning_rate 是训练时的学习率,3e-40.0003- nohup1>train.log 2>&1 &1>train.log 2>&1用于将所有训练信息输出到train.log文件,方便后面查看。同时,利用nohup&可以让程序置于后台运行,以防止shell连接突然断掉导致程序结束(因为训练时间很长)。(另外提一下:使用nohup后,最好手动exit退出下终端,因为非正常退出可能会导致程序终止)
  • 若是多个显卡,训练命令样例如下WORLD_SIZE=3CUDA_VISIBLE_DEVICES=0,1,2nohup 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'\--batch_size 128\--micro_batch_size 2\--num_epochs 2\--learning_rate 3e-4 \1>train.log 2>&1&- WORLD_SIZE 是全局进程数(一般一个显卡对应一个进程)- CUDA_VISIBLE_DEVICES 是具体的几张显卡的ID- --nproc_per_node 是每个物理节点上面进程的数量
  • 环境有网络的话,正常情况下会自动下载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'
  • 我因为一些特殊情况,训练时必须离线,所以我的最终命令如下WORLD_SIZE=3CUDA_VISIBLE_DEVICES=0,1,2 HF_DATASETS_OFFLINE=1TRANSFORMERS_OFFLINE=1nohup 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'\--batch_size 128\--micro_batch_size 4\--num_epochs 3\1>train.log 2>&1&
  • 训练过程的输出,样例如下(当--num_epochs 3--micro_batch_size 4时)train_001train_002train_003
  • 训练结果模型文件,样例如下result
  • 设备监控信息,样例如下(用的 nvitop 命令,需要单独安装pip3 install --upgrade nvitop)- 当--micro_batch_size 2gpu_mbatch2- 当--micro_batch_size 4gpu_mbatch4

模型的使用 Inference

  • 训练完成后会在my_model_save目录下生成文件,包括adapter_config.jsonadapter_model.bin和一系列checkpoint文件。(见上面的截图)
  • 选择最新的checkpoint文件夹(如 checkpoint-1200),将其中的pytorch_model.bin文件拷贝到my_model_save目录下,并重命名为adapter_model.binresult_000
  • 做推断时需要的文件包括原始LLaMA-7B文件,以及my_model_save目录下的adapter_config.jsonadapter_model.bin文件
  • 下面启动推断服务,命令样例如下WORLD_SIZE=3CUDA_VISIBLE_DEVICES=0,1,2python generate.py \--base_model "decapoda-research/llama-7b-hf"\--lora_weights './my_model_save'\--load_8bit
  • 我是在本离线使用的,所以我的命令如下WORLD_SIZE=3CUDA_VISIBLE_DEVICES=0,1,2 HF_DATASETS_OFFLINE=1TRANSFORMERS_OFFLINE=1 python generate.py \--load_8bit \--base_model "/root/.cache/huggingface/hub/models--decapoda-research--llama-7b-hf"\--lora_weights '/home/gpt/alpaca-lora/my_model_save/'

infer

  • 因为集成了 gradio,我们可以直接在Web界面访问(http://IP:7860),样例如下infer_web
  • 因为训练用的数据是翻译的,质量还有些问题,会导致部分回答不佳,还需要提高数据集的质量。(Open Assistant应该是一个不错的选择)
  • 预测过程中GPU的监控信息如下infer_gpu

参考

问题汇总

  • 关于bitsandbytes导致的问题(2023-05-30记录) - 目前bitsandbytes 0.37.2可能会出现找不到当前需要使用的cuda的版本的问题(如果你用conda安装pytorch的话)bitsandbytes doesn’t work#452- 在bitsandbytes 0.38.x中已经修复了该问题,不过又会出现OOM的问题 New OOM bug introduced in bitsandbytes 0.38.x?#324,并且最新的0.39.0也还没修复这个问题- 所以就非常矛盾,需要我们改下bitsandbytes的python源码- 找到你在conda中安装的bitsandbytes库的位置,编辑下面的./cuda_setup/main.py文件,例如$ vim /root/anaconda3/envs/alpaca/lib/python3.9/site-packages/bitsandbytes/cuda_setup/main.py- 找到这行代码 if not torch.cuda.is_available(): return 'libsbitsandbytes_cpu.so', None, None, None, None- 修改为 if torch.cuda.is_available(): return 'libbitsandbytes_cuda117.so', None, None, None, None(cuda117改成你自己的cuda版本即可)- 执行 $ python -m bitsandbytes,进行测试,如果最后输出如下内容,就没问题了......Running a quick check that: + library is importable + CUDA function is callableSUCCESS!Installation was successful!

本文转载自: https://blog.csdn.net/alionsss/article/details/130930292
版权归原作者 蒋含竹 所有, 如有侵权,请联系我们删除。

“使用LoRA对大语言模型LLaMA做Fine-tune”的评论:

还没有评论