众所周知,LLM 规模庞大,假如在也能消费类硬件中运转或练习它们将是其亲民化的巨大进步。咱们之前撰写的 LLM.int8 博文 展现了咱们是怎么将 LLM.int8 论文 中的技能经过 bitsandbytes
库集成到 transformers
中的。在此根底上,咱们不断尽力以不断降低大模型的准入门槛。在此过程中,咱们决议再次与 bitsandbytes
联手,支撑用户以 4 比特精度运转任何模态 (文本、视觉、多模态等) 上的绝大多数 HF 模型。用户还能够运用 Hugging Face 生态体系中的工具在 4 比特模型之上练习适配器。这一作业根据 Dettmers 等人最近在 QLoRA 这篇论文中介绍的一种新办法,其论文摘要如下:
咱们提出了 QLoRA,这是一种高效的微调办法,可削减内存运用量,使得在单个 48GB GPU 上就能够微调 65B 的模型,并且所得模型的功用与全 16 比特微调适当。QLoRA 经过冻住 4 比特量化的预练习言语模型将梯度反向传播到低秩适配器 (LoRA) 中。咱们最好的模型 (咱们将其命名为 Guanaco) 仅需在单个 GPU 上进行 24 小时微调,就能在 Vicuna 基准测验中优于一切之前公开发布的模型,且达到了 ChatGPT 功用水平的 99.3%。QLoRA 引入了多项创新技能,在不献身功用的情况下节省内存:(a) 4 位 NormalFloat (NF4),一种新的数据类型,在信息论含义上是正态分布权重的最佳标明 (b) 双量化,经过对量化系数进行二次量化来削减均匀内存占用,以及 (c) 用于降低峰值内存占用的分页优化器。咱们运用 QLoRA 微调了 1000 多个模型,并给出了它们在指令依从、谈天等使命上的具体功用剖析,其中涵盖了 8 个指令数据集、多种模型架构 (LLaMA、T5),还包含了无法用惯例办法微调的大模型 (例如 33B 和 65B 模型)。成果标明,在小型高质量数据集的进行 QLoRA 微调能带来最先进的功用,且所需的模型尺度更小。咱们运用人类和 GPT-4 对谈天机器人的功用进行了具体评价剖析,成果标明 GPT-4 评价是替代人类评价的廉价且合理的计划。此外,咱们发现当前的谈天机器人基准测验在精确评价谈天机器人的功用水平这一方面并不十分可信。咱们还选择了一些样本,对 Guanaco 比 ChatGPT 做得欠好的案例进行了剖析。咱们发布了一切模型和代码,包含用于 4 比特练习的 CUDA 核函数。
资源
下面是一些 4 比特模型和 QLoRA 的入门资源:
- 原始论文
- 有关 bitsandbytes 根底用法的 Google Colab 笔记本 – 该笔记本展现了怎么对 4 比特模型进行推理,以及怎么在免费的 Google Colab 实例上运转 GPT-neo-X 模型 (20B) 。
- 微调的 Google Colab 笔记本 – 该笔记本展现了怎么运用 Hugging Face 生态体系在下游使命上微调 4 比特模型。咱们证明了能够在 Google Colab 实例上微调 GPT-neo-X 20B!
- 用于复现论文成果的原始代码库
- Guanaco 33B 的演示空间 – 下文中也包含了这个演示空间。
导言
假如你对模型精度及一些常见的数据类型 (float16、float32、bfloat16、int8) 尚不熟悉,主张你仔细阅览 咱们的第一篇博文,这篇博文图文并茂地具体介绍了相关概念的细节。
如需更多信息,主张查阅 这篇 wikibook 文档 以了解浮点标明的根底知识。
QLoRA 论文中探讨了两种不同的数据类型: 4 比特 Float 和 4 比特 NormalFloat。这儿咱们将讨论 4 比特 Float 数据类型,由于它更简单理解。
FP8 和 FP4 别离代表浮点 8 比特和 4 比特精度。它们归于 minifloats 浮点值系列 (minifloats 系列还包含其他精度,如 bfloat16 和 float16)。
咱们先看一下怎么用 FP8 格局标明浮点值,然后了解 FP4 格局是什么样子的。
FP8 格局
正如之前的博文中所讨论的,n 比特的浮点数中每个比特都归于一个特定类别,担任标明数字的各个组成部分 (符号、尾数和指数)。
FP8 for Deep Learning 这篇论文初次引入了 FP8 (浮点 8) 格局,其有两种不同的编码办法: E4M3 (4 位指数,3 位尾数) 和 E5M2 (5 位指数,2 位尾数)。
尽管随着比特数从 32 削减到 8,精度大大降低了,但这两种 8 比特编码仍有很多用武之地。现在,咱们能够经过 Transformer Engine 库 来运用它们,HF 生态体系的 accelerate 库也集成了 Transformer Engine 库。
E4M3 格局能够标明的浮点数规模为 -448 到 448。而 E5M2 格局由于增加了指数位数,其标明规模扩大为 -57344 到 57344 – 但其相对 E4M3 而言精度会有丢失,由于两者可标明的数的个数坚持不变。经历证明,E4M3 最适合前向核算,E5M2 最适合后向核算。
FP4 精度简述
符号位标明符号 (+/-),指数位转译成该部分所标明的整数的 2 次方 (例如 2^{010} = 2^{2} = 4
)。分数或尾数位标明成 -2 的幂的总和,假如第 i 位为 1
,则和加上 2^-i
,否则坚持不变,这儿 i 是该位在比特序列中的位置。例如,关于尾数 1010,咱们有 (2^-1 + 0 + 2^-3 + 0) = (0.5 + 0.125) = 0.625
,然后,咱们给分数加上一个 1 ,得到 1.625
。最终,再将一切成果相乘。举个比如,运用 2 个指数位和 1 个尾数位,编码 1101 对应的数值为:
-1 * 2^(2)*(1 + 2^-1) = -1 * 4 * 1.5 = -6
FP4 没有固定的格局,因此能够尝试不同尾数/指数的组合。一般来说,在大多数情况下,3 个指数位的作用会更好一些。但某些情况下,2 个指数位加上 1 个尾数位功用会更好。
QLoRA,经由量化实现大模型自由的新途径
简而言之,与规范 16 比特模型微调相比,QLoRA 在不献身功用的前提下削减了 LLM 微调的内存运用量。运用该办法,咱们可在单个 24GB GPU 上微调 33B 模型,还能够在单个 46GB GPU 上微调 65B 模型。
更具体地说,QLoRA 运用 4 比特量化来压缩预练习的言语模型。然后冻住根底模型的参数,并将相对少数的可练习参数以低秩适配器的形式添加到模型中。在微调过程中,QLoRA 经过冻住的 4 比特量化预练习言语模型将梯度反向传播到低秩适配器中。LoRA 层的权重是练习期间仅有可更新的参数。你可阅览 原始 LoRA 论文 以了解更多有关 LoRA 的信息。
QLoRA 有一个用于存储根底模型权重的数据类型 (通常为 4 比特 NormalFloat) 和一个用于履行核算的数据类型 (16 比特 BrainFloat)。QLoRA 将权重从存储数据类型反量化为核算数据类型,以履行前向和后向传播,但仅核算 bfloat16 的 LoRA 参数的权重梯度。权重仅在需求时才解压缩,因此在练习和推理期间内存运用率都能坚持较低水平。
广泛的试验标明 QLoRA 微调与 16 比特微调的功用旗鼓适当。此外,在 OpenAssistant 数据集 (OASST1) 上对 LLaMA 模型运用 QLoRA 微调而得的 Guanaco 模型是现在最先进的谈天机器人体系,其在 Vicuna 基准测验中体现挨近 ChatGPT。这是 QLoRA 微调威力的进一步展现。
怎么在 transformers 中运用它?
在本节中,咱们将介绍该办法在 transformers
中的集成、怎么运用它以及现在支撑的模型。
入门
作为快速入门,咱们能够从源代码安装 accelerate
和 transformers
,以加载 4 比特模型,另请确保已安装最新版别的 bitsandbytes
库 (0.39.0)。
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
快速开始
以 4 比特加载模型的根本办法是经过在调用 from_pretrained
办法时传递参数 load_in_4bit=True
,并将设备映射设置成 “auto”
。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m", load_in_4bit=True, device_map="auto")
...
这样就行了!
一般地,咱们主张用户在运用 device_map
加载模型后不要手动设置设备。因此,在该行之后应避免对模型或模型的任何子模块进行任何设备分配 – 除非你知道自己在做什么。
请记住,加载量化模型会主动将模型的其他子模块转换为 float16
数据类型。你能够经过将 torch_dtype=dtype
传递给 from_pretrained
办法来修正此行为 (例如,假如你期望在层规一化算子中运用 float32
)。
高级用法
你能够运用 4 比特量化的不同变体,例如 NF4 (NormalFloat4 (默许) ) 或纯 FP4 量化。从理论剖析和实证成果来看,咱们主张运用 NF4 量化以取得更好的功用。
其他选项包含 bnb_4bit_use_double_quant
,它在第一轮量化之后会进行第二轮量化,为每个参数额定节省 0.4 比特。最终是核算类型,尽管 4 比特 bitsandbytes 以 4 比特存储权重,但核算依然以 16 或 32 比特进行,这儿能够选择任意组合 (float16、bfloat16、float32 等)。
假如运用 16 比特核算数据类型 (默许 torch.float32),矩阵乘法和练习将会更快。用户应该运用 transformers 中最新的 BitsAndBytesConfig
来更改这些参数。下面是运用 NF4 量化加载 4 比特模型的示例,比如中运用了双量化以及 bfloat16 核算数据类型以加速练习:
from transformers import BitsAndBytesConfig
nf4_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
model_nf4 = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=nf4_config)
更改核算数据类型
如上所述,你还能够经过更改 BitsAndBytesConfig
中的 bnb_4bit_compute_dtype
参数来更改量化模型的核算数据类型。
import torch
from transformers import BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
嵌套量化
要启用嵌套量化,你能够运用 BitsAndBytesConfig
中的 bnb_4bit_use_double_quant
参数。这将会在第一轮量化之后启用第二轮量化,以便每个参数额定节省 0.4 比特。咱们在上文提及的微调 Google Colab 笔记本中也运用了此功用。
from transformers import BitsAndBytesConfig
double_quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
)
model_double_quant = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=double_quant_config)
当然,正如本节最初提到的,一切这些功用都是可任意组合的。你能够将一切这些参数组合在一起,找到最适合你的配置。经历法则是: 假如内存有限制,运用双量化; 运用 NF4 以取得更高的精度; 运用 16 比特浮点加速微调速度。作为一个比如,在 推理演示运用 中,咱们运用嵌套量化、bfloat16 核算数据类型以及 NF4 量化在单个 16GB GPU 中运用 4 比特完成了对 gpt-neo-x-20b (40GB) 模型的拟合。
常见问题
本节咱们来答复一些常见问题。
FP4 量化有硬件要求吗?
请留意,此办法仅与 GPU 兼容,现在尚无法在 CPU 上对模型进行 4 比特量化。在 GPU 中,此办法没有任何硬件要求,只需安装了 CUDA>=11.2,任何 GPU 都能够用于运转 4 比特量化。
另请记住,核算不是以 4 比特完成的,仅仅是权重和激活被压缩为该格局,而核算仍在指定的或许原始数据类型上进行。
支撑哪些模型?
与 这篇博文 中介绍的 LLM.int8 集成相似,咱们的集成严峻依赖于 accelerate
库。因此,任何支撑 accelerate
库加载的模型 (即调用 from_pretrained
时支撑 device_map
参数) 都能够进行 4 比特量化。另请留意,这与模态彻底无关,只需能够运用 device_map
参数加载模型,就能够量化它们。
关于文本模型,到本文撰写时,最常用的架构都是支撑的,例如用于纯文本的 Llama、OPT、GPT-Neo、GPT-NeoX,用于多模态的 Blip2 等。
到本文撰写时,支撑 accelerate
的模型有:
[
'bigbird_pegasus', 'blip_2', 'bloom', 'bridgetower', 'codegen', 'deit', 'esm',
'gpt2', 'gpt_bigcode', 'gpt_neo', 'gpt_neox', 'gpt_neox_japanese', 'gptj', 'gptsan_japanese',
'lilt', 'llama', 'longformer', 'longt5', 'luke', 'm2m_100', 'mbart', 'mega', 'mt5', 'nllb_moe',
'open_llama', 'opt', 'owlvit', 'plbart', 'roberta', 'roberta_prelayernorm', 'rwkv', 'switch_transformers',
't5', 'vilt', 'vit', 'vit_hybrid', 'whisper', 'xglm', 'xlm_roberta'
]
请留意,假如你最喜欢的模型不在列表中,你能够提交一个 PR 或在 transformers 中提交一个问题,以添加对该架构的 accelerate 加载的支撑。
咱们能够练习 4 比特 / 8 比特模型吗?
对这些模型进行全模型 4 比特练习是不或许的。但是,你能够运用参数高效微调 (PEFT) 来练习这些模型,即在根底模型之上练习新增部分如适配器。QLoRA 论文便是这么做的,Hugging Face 的 PEFT 库也正式支撑了该办法。咱们供给了相应的 微调笔记本。假如咱们想要复现论文的成果,还能够查阅 QLoRA 代码库。
这项作业还有什么其他含义?
这项作业能够为社区和人工智能研讨带来一些积极的影响,由于它能够影响很多或许的用法或运用场景。在 RLHF (根据人类反应的强化学习) 中,能够加载单个 4 比特根底模型,并在其上练习多个适配器,一个用于奖赏建模,另一个用于价值战略练习。咱们很快就会发布关于此用法的更具体的博文。
咱们还针对这种量化办法对在消费类硬件上练习大模型的影响涉及了一些基准测验。咱们在英伟达 T4 (16GB) 上对 2 种不同的架构 Llama 7B (fp16 时,模型巨细为 15GB) 和 Llama 13B (fp16 时,模型巨细为 27GB) 进行了多次微调试验,成果如下:
模型 | 半精度模型巨细 (GB) | 硬件 / 总显存 | 量化办法 (CD = 核算数据类型 / GC = 梯度 checkpointing / NQ = 双量化) | batch size | 梯度累积步数 | 优化器 | 序列长度 | 成果 |
---|---|---|---|---|---|---|---|---|
<10B 模型 | ||||||||
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | LLM.int8 (8-bit) + GC | 1 | 4 | AdamW | 512 | 无 OOM |
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | LLM.int8 (8-bit) + GC | 1 | 4 | AdamW | 1024 | OOM |
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | 4bit + NF4 + bf16 CD + no GC | 1 | 4 | AdamW | 512 | 无 OOM |
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | 4bit + FP4 + bf16 CD + no GC | 1 | 4 | AdamW | 512 | 无 OOM |
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | 4bit + NF4 + bf16 CD + no GC | 1 | 4 | AdamW | 1024 | OOM |
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | 4bit + FP4 + bf16 CD + no GC | 1 | 4 | AdamW | 1024 | OOM |
decapoda-research/llama-7b-hf | 14GB | 1xNVIDIA-T4 / 16GB | 4bit + NF4 + bf16 CD + GC | 1 | 4 | AdamW | 1024 | 无 OOM |
10B+ 模型 | ||||||||
decapoda-research/llama-13b-hf | 27GB | 2xNVIDIA-T4 / 32GB | LLM.int8 (8-bit) + GC | 1 | 4 | AdamW | 512 | 无 OOM |
decapoda-research/llama-13b-hf | 27GB | 1xNVIDIA-T4 / 16GB | LLM.int8 (8-bit) + GC | 1 | 4 | AdamW | 512 | OOM |
decapoda-research/llama-13b-hf | 27GB | 1xNVIDIA-T4 / 16GB | 4bit + FP4 + bf16 CD + no GC | 1 | 4 | AdamW | 512 | OOM |
decapoda-research/llama-13b-hf | 27GB | 1xNVIDIA-T4 / 16GB | 4bit + FP4 + fp16 CD + no GC | 1 | 4 | AdamW | 512 | OOM |
decapoda-research/llama-13b-hf | 27GB | 1xNVIDIA-T4 / 16GB | 4bit + NF4 + fp16 CD + GC | 1 | 4 | AdamW | 512 | 无 OOM |
decapoda-research/llama-13b-hf | 27GB | 1xNVIDIA-T4 / 16GB | 4bit + NF4 + fp16 CD + GC | 1 | 4 | AdamW | 1024 | OOM |
decapoda-research/llama-13b-hf | 27GB | 1xNVIDIA-T4 / 16GB | 4bit + NF4 + fp16 CD + GC + NQ | 1 | 4 | AdamW | 1024 | 无 OOM |
咱们运用了 TRL 库中最新的 SFTTrainer
,你能够在 此处 找到基准测验脚本。
演示空间
想试试论文中的 Guananco 模型的话,能够玩玩这个 演示空间,咱们还把它直接嵌入到了下面供你直接把玩。
致谢
HF 团队感谢华盛顿大学参与该项意图一切人员,感谢他们向社区贡献了他们的作业。
作者还要感谢 Pedro Cuenca 帮助审理了博文,并感谢 Olivier Dehaene 和 Omar Sanseviero 对在 HF Hub 上集成该论文供给了快速而有力的支撑。
英文原文: hf.co/blog/4bit-t…
原文作者: Younes Belkada,Tim Dettmers,Artidoro Pagnoni,Sylvain Gugger,Sourab Mangrulkar
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,作业方向为 transformer-family 模型在各模态数据上的运用及大规模模型的练习推理。
审校/排版: zhongdongy (阿东)