位和字节bitsandbytes
bitsandbytes 是 CUDA 自定义函数的轻量级包装器,特别是 8 位优化器、矩阵乘法 (LLM.int8()) 和量化函数。
资源:
长话短说
要求 Python >=3.8。Linux 发行版(Ubuntu、MacOS 等)+ CUDA > 10.0。
(已弃用:CUDA 10.0 已弃用,仅 CUDA >= 11.0)将在版本 0.39.0 中受支持)
安装:
pip install bitsandbytes
在某些情况下,您可能需要从源代码进行编译。如果发生这种情况,请考虑提交包含信息的错误报告python -m bitsandbytes
。接下来是一些简短的说明,如果nvcc
安装了这些说明,这些说明可以开箱即用。如果这些不起作用,请参阅下文。
编译快速入门:
git clone https://github.com/timdettmers/bitsandbytes.git
cd bitsandbytes
# CUDA_VERSIONS in {110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120}
# make argument in {cuda110, cuda11x, cuda12x}
# if you do not know what CUDA you have, try looking at the output of: python -m bitsandbytes
CUDA_VERSION=117 make cuda11x
python setup.py install
将 Int8 推理与 HuggingFace 转换器结合使用
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
'decapoda-research/llama-7b-hf,
device_map='auto',
load_in_8bit=True,
max_memory=f'{
int(torch.cuda.mem_get_info()[0]/1024**3)-2}GB')
更详细的示例可以在Examples/int8_inference_huggingface.py中找到。
使用8位优化器:
- 注释掉优化器:
#torch.optim.Adam(....)
- 添加您选择的 8 位优化器
bnb.optim.Adam8bit(....)
(参数保持不变) - 如有必要,更换嵌入层:
torch.nn.Embedding(..) -> bnb.nn.Embedding(..)
使用 8 位推理:
- 注释掉 torch.nn.Linear:
#linear = torch.nn.Linear(...)
- 添加 bnb 8 位线性光模块:(
linear = bnb.nn.Linear8bitLt(...)
基本参数保持不变) - 有两种模式:
- 8 位与 16 位主要权重的混合训练。传递参数
has_fp16_weights=True
(默认) - Int8 推理。传递论点
has_fp16_weights=False
- 8 位与 16 位主要权重的混合训练。传递参数
- 要使用完整的 LLM.int8() 方法,请使用
threshold=k
参数。我们推荐k=6.0
。
# LLM.int8()
linear = bnb.nn.Linear8bitLt(dim1, dim2, bias=True, has_fp16_weights=False, threshold=6.0)
# inputs need to be fp16
out = linear(x.to(torch.float16))
特征
- 具有混合精度分解的 8 位矩阵乘法
- LLM.int8() 推理
- 8 位优化器:Adam、AdamW、RMSProp、LARS、LAMB、Lion(节省 75% 内存)
- 稳定的嵌入层:通过更好的初始化和标准化提高稳定性
- 8 位量化:分位数、线性和动态量化
- 快速分位数估计:比其他算法快 100 倍
要求和安装
要求:anaconda、cudatoolkit、pytorch
硬件要求:
- LLM.int8():NVIDIA Turing(RTX 20xx;T4)或 Ampere GPU(RTX 30xx;A4-A100);(2018 年或更早的 GPU)。
- 8 位优化器和量化:NVIDIA Kepler GPU 或更新版本 (>=GTX 78X)。
支持的 CUDA 版本:10.2 - 12.0
目前,bitsandbytes 库仅在 Linux 发行版上受支持。目前不支持 Windows。
通过 anaconda 安装 pytorch 可以最好地满足这些要求。您可以按照官方网站上的“入门”说明安装 PyTorch。
要安装运行:
pip install bitsandbytes
使用位和字节
使用 Int8 矩阵乘法
对于直接 Int8 矩阵乘法和混合精度分解,您可以使用bnb.matmul(...)
. 要启用混合精度分解,请使用阈值参数:
bnb.matmul(..., threshold=6.0)
有关如何在您自己的代码中使用 LLM.int8() 推理层的说明,请参阅上面的 TL;DR 或有关扩展说明,请参阅此博客文章。
使用 8 位优化器
通过位和字节,可以通过更改代码库中的一行代码来使用 8 位优化器。对于 NLP 模型,我们还建议使用 StableEmbedding 层(见下文),这可以改善结果并有助于稳定的 8 位优化。要开始使用 8 位优化器,只需按以下方式用 8 位优化器替换旧优化器就足够了:
import bitsandbytes as bnb
# adam = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.995)) # comment out old optimizer
adam = bnb.optim.Adam8bit(model.parameters(), lr=0.001, betas=(0.9, 0.995)) # add bnb optimizer
adam = bnb.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.995), optim_bits=8) # equivalent
torch.nn.Embedding(...) -> bnb.nn.StableEmbedding(...) # recommended for NLP models
请注意,默认情况下,所有少于 4096 个元素的参数张量都保持为 32 位,即使您使用 8 位优化器初始化这些参数也是如此。这样做是因为这样小的张量不会节省太多内存,并且通常包含高度可变的参数(偏差)或需要高精度的参数(批量规范、层规范)。您可以像这样更改此行为:
<span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code># parameter tensors with less than 16384 values are optimized in 32-bit
# it is recommended to use multiplies of 4096
adam = bnb.optim.Adam8bit(model.parameters(), min_8bit_size=16384)
</code></span></span></span>
更改各个参数的位和其他超参数
如果你想用 32 位 Adam 优化一些不稳定的参数,用 8 位 Adam 优化其他参数,你可以使用GlobalOptimManager
. 这样,我们还可以为特定层配置特定的超参数,例如嵌入层。为此,我们需要做两件事:(1) 在参数仍在 CPU 上时注册参数,(2) 使用新的所需超参数覆盖配置(随时随地)。请参阅我们的指南了解更多详情
Fairseq 用户
要使用稳定嵌入层,请覆盖build_embedding(...)
模型的相应函数。确保还使用该--no-scale-embedding
标志来禁用单词嵌入层的缩放(也不用层规范替换)。您可以通过替换相应文件(等)中的优化器来使用优化器adam.py
。
发布和功能历史记录
有关即将推出的功能和更改以及完整历史记录,请参阅补丁说明。
错误
从源代码编译
要从源代码编译,您需要安装 CUDA。如果nvcc
没有安装,可以通过以下命令用nvcc安装CUDA Toolkit。
wget https://raw.githubusercontent.com/TimDettmers/bitsandbytes/main/cuda_install.sh
# Syntax cuda_install CUDA_VERSION INSTALL_PREFIX EXPORT_TO_BASH
# CUDA_VERSION in {110, 111, 112, 113, 114, 115, 116, 117, 118, 120, 121}
# EXPORT_TO_BASH in {0, 1} with 0=False and 1=True
# For example, the following installs CUDA 11.8 to ~/local/cuda-11.8 and exports the path to your .bashrc
bash cuda install 118 ~/local 1
要仅使用特定的 CUDA 版本进行单次编译运行,您可以设置变量CUDA_HOME
,例如以下命令libbitsandbytes_cuda117.so
使用 cuda11x 的编译器标志进行编译,cuda 版本为~/local/cuda-11.7
:
CUDA_HOME=~/local/cuda-11.7 CUDA_VERSION=117 make cuda11x
如需更详细的说明,请遵循compile_from_source.md说明。
执照
大多数 bitandbytes 均已获得 MIT 许可,但该项目的部分内容可根据单独的许可条款获得:Pytorch 已获得 BSD 许可。
我们感谢 Fabio Cannizzo 在FastBinarySearch方面所做的工作,我们将其用于 CPU 量化。