QLoRa:在消费级GPU上微调大型语言模型

这篇具有很好参考价值的文章主要介绍了QLoRa:在消费级GPU上微调大型语言模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大多数大型语言模型(LLM)都无法在消费者硬件上进行微调。例如,650亿个参数模型需要超过780 Gb的GPU内存。这相当于10个A100 80gb的gpu。就算我们使用云服务器,花费的开销也不是所有人都能够承担的。

而QLoRa (Dettmers et al., 2023),只需使用一个A100即可完成此操作。

QLoRa:在消费级GPU上微调大型语言模型

在这篇文章中将介绍QLoRa。包括描述它是如何工作的,以及如何使用它在GPU上微调具有200亿个参数的GPT模型。

为了进行演示,本文使用nVidia RTX 3060 12 GB来运行本文中的所有命令。这样可以保证小显存的要求,并且也保证可以使用免费的Google Colab实例来实现相同的结果。但是,如果你只有较小内存的GPU,则必须使用较小的LLM。

QLoRa: Quantized LLMs with Low-Rank Adapters

2021年6月,发布的LoRa让我们的微调变得简单,我也在以前的文章中也有过介绍。

LoRa为LLM的每一层添加了少量的可训练参数(适配器),并冻结了所有原始参数。这样对于微调,只需要更新适配器权重,这可以显著减少内存占用。

而QLoRa更进一步,引入了4位量化、双量化和利用nVidia统一内存进行分页。

简而言之,QLoRa工作原理如下:

  • 4位NormalFloat量化:这是一种改进量化的方法。它确保每个量化仓中有相同数量的值。这避免了计算问题和异常值的错误。
  • 双量化:QLoRa的作者将其定义如下“对量化常量再次量化以节省额外内存的过程。”
  • 统一内存分页:它依赖于NVIDIA统一内存管理,自动处理CPU和GPU之间的页到页传输。它可以保证GPU处理无错,特别是在GPU可能耗尽内存的情况下。

所有这些步骤都大大减少了微调所需的内存,同时性能几乎与标准微调相当。

使用QLoRa对GPT模型进行微调

硬件要求:

下面的演示工作在具有12gb VRAM的GPU上,用于参数少于200亿个模型,例如GPT-J。

如果你有一个更大的卡,比如24gb的VRAM,则可以用一个200亿个参数的模型,例如GPT-NeoX-20b。

内存建议至少6 Gb,这个条件现在都能满足对吧

GPT-J和GPT-NeoX-20b都是非常大的模型。所以硬盘议至少有100gb的可用空间。

如果你的机器不满足这些要求,可以使用Google Colab的免费实例,因为它就足够使用了。

软件要求:

必须要CUDA。这是肯定的。然后还需要一些依赖:

  • bitsandbytes:包含量化LLM所需的所有库。
  • Hugging Face的Transformers和Accelerate:这些是标准库,用于训练模型。
  • PEFT:提供了各种微调方法的实现,我们只需要里面的LoRa。
  • 数据集:自己的数据集,这里安装了Hugging Face的datasets,这个是备选,装不装无所谓,因为这玩意挺难用的

PIP安装命令如下:

 pip install -q -U bitsandbytes
 pip install -q -U git+https://github.com/huggingface/transformers.git 
 pip install -q -U git+https://github.com/huggingface/peft.git
 pip install -q -U git+https://github.com/huggingface/accelerate.git
 pip install -q datasets

下面就是Python代码

1、GPT模型的加载与量化

我们需要以下导入来加载和量化LLM。

 import torch
 from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

我们将对EleutherAI预训练的GPT NeoX模型进行微调。这是一个有200亿个参数的模型。注意:GPT NeoX具有允许商业使用的宽松许可证(Apache 2.0)。

可以从hug Face Hub获得这个模型和相关的标记器:

 model_name = "EleutherAI/gpt-neox-20b"
 
 #Tokenizer
 tokenizer = AutoTokenizer.from_pretrained(model_name)

然后配置量化器,如下所示:

 quant_config = BitsAndBytesConfig(
     load_in_4bit=True,
     bnb_4bit_use_double_quant=True,
     bnb_4bit_quant_type="nf4",
     bnb_4bit_compute_dtype=torch.bfloat16
 )
  • load_in_4bit:模型将以4位精度加载到内存中。
  • bnb_4bit_use_double_quant:QLoRa提出的双量化。
  • bnb_4bit_quant_type:这是量化的类型。“nf4”代表4位的NormalFloat。
  • bnb_4bit_compute_dtype:当以4位加载和存储模型时,在需要时对其进行部分量化,并以16位精度(bfloat16)进行所有计算。

然后就可以加载4位模型:

 model = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=quant_config, device_map={"":0})

下一步启用梯度检查点,这样可以减少内存占用,但是速度会稍微降低一些:

 model.gradient_checkpointing_enable()

2、LoRa的GPT模型预处理

为LoRa准备模型,为每一层添加可训练的适配器。

 from peft import prepare_model_for_kbit_training, LoraConfig, get_peft_model
 
 model = prepare_model_for_kbit_training(model)
 
 config = LoraConfig(
     r=8, 
     lora_alpha=32, 
     target_modules=["query_key_value"], 
     lora_dropout=0.05, 
     bias="none", 
     task_type="CAUSAL_LM"
 )
 
 model = get_peft_model(model, config)

在LoraConfig中,可以使用r、alpha和dropout来获得更好的任务结果。具体内容可以在PEFT文档中找到更多选项和详细信息。

使用LoRa,我们只添加了800万个参数。并且只训练这些参数,这样使得微调很快。

3、数据集

对于这个演示,我们使用“english_quotes”数据集。这是一个由名言组成的数据集,在CC BY 4.0许可下发布。我们为了方便使用datasets直接加载。

 from datasets import load_dataset
 data = load_dataset("Abirate/english_quotes")
 data = data.map(lambda samples: tokenizer(samples["quote"]), batched=True)

4、微调

微调的代码非常标准

 import transformers
 
 tokenizer.pad_token = tokenizer.eos_token
 
 trainer = transformers.Trainer(
     model=model,
     train_dataset=data["train"],
     args=transformers.TrainingArguments(
         per_device_train_batch_size=1,
         gradient_accumulation_steps=8,
         warmup_steps=2,
         max_steps=20,
         learning_rate=2e-4,
         fp16=True,
         logging_steps=1,
         output_dir="outputs",
         optim="paged_adamw_8bit"
     ),
     data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
 )
 trainer.train()

要记住optim=”paged_adamw_8bit”。它将使用分页实现更好的内存管理。没有它可能会出现内存不足错误。

在Google Colab上运行这个微调只需要5分钟。VRAM消耗的峰值是15gb。

它有用吗?让我们试试推理。

基于QLoRa推理

微调的QLoRa模型可以直接与标准的Transformers的推理一起使用,如下所示:

 text = "Ask not what your country"
 device = "cuda:0"
 inputs = tokenizer(text, return_tensors="pt").to(device)
 
 outputs = model.generate(**inputs, max_new_tokens=20)
 print(tokenizer.decode(outputs[0], skip_special_tokens=True))

你应该得到这样的输出:

 Ask not what your country can do for you, ask what you can do for your country.”
 
 – John F.

5分钟的微调效果还可以吧。

总结

LoRa让我们的微调变得简单,而QLoRa可以让我们使用消费级的GPU对具有10亿个参数的模型进行微调,并且根据QLoRa论文,性能不会显著下降。

如果你对QLoRa感兴趣,看看他的代码吧:

https://avoid.overfit.cn/post/4c4c86e3f7974157a7a8e81c57a0f8a4文章来源地址https://www.toymoban.com/news/detail-468352.html

到了这里,关于QLoRa:在消费级GPU上微调大型语言模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Ubuntu安装mysql5.7(适用于大多数ubuntu版本)

    前言:网上mysql的安装方式参差不齐,有的装了缺少配置文件,有的装了少库少表 所以现在出一个完整的mysql安装方案 装完没有密码,需要自己进去设置密码 装完有默认密码,需要查看并进去在自己修改 安装的时候输入密码,安装完成后直接使用 本文使用的正是第三种 my

    2024年02月16日
    浏览(56)
  • Kali必学Kali下DDos攻击步骤(解决大多数可见问题)

    写在前面: 本文仅限学术交流,请勿用他人实践 DDos攻击方式(本文注意 大小写 ) 1.sudo -i获取root权限 2.输入 进入DDos目录 有的人在这里可能会遇到无法进入的问题 首先我们检查文字大小写有没有问题 如果无误那应该是没有配置好文件 只需输入 即可clone,一般能解决掉问题

    2023年04月27日
    浏览(49)
  • java 8 stream流的19种用法,可应对大多数集合的处理场景

    java 8的Stream API是一种非常强大的集合处理工具,它提供了一种新的、高效的、声明式的方式来处理集合数据。下面我们就来看一下Java 8 Stream API的所有用法。 可以使用Stream.of()方法创建一个Stream: 也可以使用集合的stream()方法创建一个Stream: 可以使用filter()方法过滤Stream中的

    2023年04月08日
    浏览(77)
  • 微调(Fine-Tune)或不微调:用于 AI 驱动业务转型的大型语言模型

    目录 To Fine-Tune or Not Fine-Tune: Large Language Models for AI-Driven Business Transformation微调或不微调:用于 AI 驱动业务转型的大型语言模型 LLMs - Large Language ModelsLLMs - 大型语言模型 Where do LLMs come from?LLMs 从何而来? How are LLMs trained? LLMs 是如何训练的? 

    2024年02月07日
    浏览(42)
  • 为什么mysql使用的是B+树而nosql类型的数据库大多数使用的是LSM树

    MySQL和LSM Tree(一种基于日志的存储引擎)都是关系型数据库,但它们在数据结构的选择上有所不同。 MySQL使用B+树作为其默认的索引结构,因为B+树在某些方面比LSM树更适合作为默认的索引结构。B+树的查询和更新速度相对较快,而且它的写入操作通常是基于内存的。这意味着

    2024年02月06日
    浏览(103)
  • 大模型微调技术LoRA与QLoRA

    大模型的参数量都在100B级别,由于算力的吃紧,在这个基础上进行所有参数的微调变得不可能。LoRA正是在这个背景下提出的解决方案。 虽然模型的参数众多,但其实模型主要依赖低秩维度的内容( low intrinsic dimension ),由此引出低秩自适应方法lora,通过低秩分解来模拟参数的

    2024年02月11日
    浏览(46)
  • Phi-2小语言模型QLoRA微调教程

    就在不久前,微软正式发布了一个 27 亿参数的语言模型——Phi-2。这是一种文本到文本的人工智能程序,具有出色的推理和语言理解能力。同时,微软研究院也在官方 X 平台上声称:“Phi-2 的性能优于其他现有的小型语言模型,但它足够小,可以在笔记本电脑或者移动设备上

    2024年01月16日
    浏览(41)
  • 一文读懂大型语言模型参数高效微调:Prefix Tuning与LLaMA-Adapter

    芝士AI吃鱼 在快速发展的人工智能领域中,高效、有效地使用大型语言模型变得日益重要,参数高效微调是这一追求的前沿技术,它允许研究人员和实践者在最小化计算和资源占用的同时,重复使用预训练模型。这还使我们能够在更广泛的硬件范围内训练AI模型,包括计算能

    2024年01月17日
    浏览(53)
  • 大语言模型之七- Llama-2单GPU微调SFT

    (T4 16G)模型预训练colab脚本在github主页面。详见Finetuning_LLama_2_0_on_Colab_with_1_GPU.ipynb 在上一篇博客提到两种改进预训练模型性能的方法Retrieval-Augmented Generation (RAG) 或者 finetuning。本篇博客过一下模型微调。 微调:这是采用预训练的LLM并在较小的特定数据集上进一步训练它以

    2024年02月10日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包