bitsandbytes 是 CUDA 自定义函数的轻量级包装器,特别是 8 位优化器、矩阵乘法 (LLM.int8()) 和量化函数。

位和字节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位优化器

  1. 注释掉优化器:#torch.optim.Adam(....)
  2. 添加您选择的 8 位优化器bnb.optim.Adam8bit(....)(参数保持不变)
  3. 如有必要,更换嵌入层:torch.nn.Embedding(..) -> bnb.nn.Embedding(..)

使用 8 位推理

  1. 注释掉 torch.nn.Linear:#linear = torch.nn.Linear(...)
  2. 添加 bnb 8 位线性光模块:(linear = bnb.nn.Linear8bitLt(...)基本参数保持不变)
  3. 有两种模式:
    • 8 位与 16 位主要权重的混合训练。传递参数has_fp16_weights=True(默认)
    • Int8 推理。传递论点has_fp16_weights=False
  4. 要使用完整的 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

发布和功能历史记录

有关即将推出的功能和更改以及完整历史记录,请参阅补丁说明

错误

  1. RuntimeError:CUDA 错误:没有可在设备上执行的内核映像。解决方案
  2. fatbinwrap ..解决方案

从源代码编译

要从源代码编译,您需要安装 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 量化。

如何引用我们

猜你喜欢

转载自blog.csdn.net/sinat_37574187/article/details/131535058