使用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对大语言模型LLaMA做Fine-tune

  • 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 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   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
      • 新地址:https://huggingface.co/baffo32/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==3.32.0 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=3 CUDA_VISIBLE_DEVICES=0,1,2
    
    nohup 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=3 CUDA_VISIBLE_DEVICES=0,1,2 HF_DATASETS_OFFLINE=1 TRANSFORMERS_OFFLINE=1 
    
    nohup 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时)
    使用LoRA对大语言模型LLaMA做Fine-tune
    使用LoRA对大语言模型LLaMA做Fine-tune
    使用LoRA对大语言模型LLaMA做Fine-tune

  • 训练结果模型文件,样例如下
    使用LoRA对大语言模型LLaMA做Fine-tune

  • 设备监控信息,样例如下(用的 nvitop 命令,需要单独安装pip3 install --upgrade nvitop

    • --micro_batch_size 2
      使用LoRA对大语言模型LLaMA做Fine-tune
    • --micro_batch_size 4
      使用LoRA对大语言模型LLaMA做Fine-tune

模型的使用 Inference

  • 训练完成后会在my_model_save目录下生成文件,包括adapter_config.jsonadapter_model.bin和一系列checkpoint文件。(见上面的截图)

  • 选择最新的checkpoint文件夹(如 checkpoint-1200),将其中的pytorch_model.bin文件拷贝到my_model_save目录下,并重命名为adapter_model.bin
    使用LoRA对大语言模型LLaMA做Fine-tune

  • 做推断时需要的文件包括原始LLaMA-7B文件,以及my_model_save目录下的adapter_config.jsonadapter_model.bin文件

  • 下面启动推断服务,命令样例如下

    WORLD_SIZE=3 CUDA_VISIBLE_DEVICES=0,1,2
    
    python generate.py \
    --base_model "decapoda-research/llama-7b-hf" \
    --lora_weights './my_model_save' \
    --load_8bit
    
  • 我是在本离线使用的,所以我的命令如下

    WORLD_SIZE=3 CUDA_VISIBLE_DEVICES=0,1,2 HF_DATASETS_OFFLINE=1 TRANSFORMERS_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/' 
    

使用LoRA对大语言模型LLaMA做Fine-tune文章来源地址https://www.toymoban.com/news/detail-484986.html

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

参考

  • 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

问题汇总

  • 关于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 callable
      
      SUCCESS!
      Installation was successful!
      

到了这里,关于使用LoRA对大语言模型LLaMA做Fine-tune的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解AI大模型行业黑话,迅速搞懂提示工程(prompt)、向量工程(embedding)、微调工程(fine-tune)

    大家都在讨论大模型,似乎什么都可以与大模型结合,可当初学者也想上手时,却面临一堆令人头大的词汇,什么Prompt、、Embedding、Fine-tuning,看到瞬间头都大了。一堆英文就算了,还不容易查到正确解释,怎么办呢?别担心,本文就用一种有趣的方式让大家认识它们。 首先

    2024年02月02日
    浏览(40)
  • 【LLM】大语言模型学习之LLAMA 2:Open Foundation and Fine-Tuned Chat Model

    自从开源以来,LLAMA可以说是 AI 社区内最强大的开源大模型。但因为开源协议问题,一直不可免费商用。近日,Meta发布了期待已久的免费可商用版本LLAMA 2。 在这项工作中,我们开发并发布了LLAMA 2,这是一系列预训练和微调的大型语言模型(LLMs),规模从70亿到700亿个参数不

    2024年02月15日
    浏览(59)
  • 对Stable Diffusion做fine-tune时遇见的bug

     由于我的显卡比较垃圾(3050),加载模型时都用的  后来用下列方式保存模型: 报了错: 在网上查到的各种方法都无法解决,折腾了一天后(想紫砂),又审视了一下这句话,意思是\\\"dtype\\\"这种类型不能JSON序列化,我的理解是,因为我的模型的dtype=float16,因此不能用这种方式

    2024年02月12日
    浏览(35)
  • OpenAI LLM 应用最佳实践:提示词工程、Fine-Tune、RAG

    一、背景 本文介绍了 2023 年 11 月 OpenAI DevDay 中的一个演讲,演讲者为 John Allard 和 Colin Jarvis。演讲中,作者对 LLM 应用落地过程中遇到的问题和相关改进方案进行了总结。虽然其中用到的都是已知的技术,但是进行了很好的总结和串联,并探索了一条改进 LLM 应用的切实可行

    2024年03月11日
    浏览(39)
  • 【论文解读】(如何微调BERT?) How to Fine-Tune BERT for Text Classification?

    论文地址:https://arxiv.org/pdf/1905.05583.pdf 论文年份:2019年05月 论文代码: https://github.com/xuyige/BERT4doc-Classification 论文引用量:1191 (截止2023-04-28) 论文阅读前提:熟悉NLP、深度学习、Transformer、BERT、多任务学习等。 现在NLP任务方式大多都是对BERT进行微调。例如:我们要做一个

    2024年02月07日
    浏览(42)
  • 十分钟读完 Meta提出Llama 2模型的经典论文:Llama 2: Open Foundation and Fine-Tuned Chat Models

    随着人工智能技术的飞速发展,大型语言模型(LLMs)已经成为了人类智能助手的代表,它们在需要专业知识的复杂推理任务中表现出色,涵盖了编程、创意写作等多个专业领域。这些模型通过直观的聊天界面与人类互动,迅速获得了广泛的应用和认可。 然而,尽管训练方法

    2024年01月24日
    浏览(50)
  • 对 ChatGLM-6B 做 LoRA Fine-tuning

    ChatGLM-6B 是一个支持中英双语的对话语言模型,基于 GLM (General Language Model)。它只有 62 亿个参数,量化后最低 (INT4 量化) 只需要 6GB 的显存,完全可以部署到消费级显卡上。在实际使用这个模型一段时间以后,我们发现模型的对话表现能力确实非常不错。那么,基于这个模型做

    2023年04月25日
    浏览(34)
  • 自然语言基础 IMDB下的 MLM (掩码模型) & Bert Fine-tuning (模型微调)

    本文是Hugging Face 上 NLP的一篇代码教程,通过imdb数据集, Fine-tuning微调 Bert预训练模型。 涉及包括: MLM, Bert, Fine-tuning, IMDB, Huggingface Repo 微调的方式是通过调整训练模型的学习率来重新训练模型,这个来自 早期 ACL 2018的一篇paper: 《Universal Language Model Fine-tuning for Text

    2024年02月15日
    浏览(43)
  • 了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

    🍉 CSDN 叶庭云 : https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要巨大的计算资源来运行。特别是,当需要为特定的下游

    2024年04月14日
    浏览(69)
  • 基于ChatYuan-large-v2 语言模型 Fine-tuning 微调训练 广告生成 任务

    ChatYuan-large-v2 是一个开源的支持中英双语的功能型对话语言大模型,与其他 LLM 不同的是模型十分轻量化,并且在轻量化的同时效果相对还不错,仅仅通过 0.7B 参数量就可以实现 10B 模型的基础效果,正是其如此的轻量级,使其可以在普通显卡、 CPU 、甚至手机上进行推理,而

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包