Py之bitsandbytes:bitsandbytes的简介、安装、使用方法之详细攻略

Py之bitsandbytes:bitsandbytes的简介、安装、使用方法之详细攻略

目录

bitsandbytes的简介

1、bitsandbytes的特点

2、《通过块级量化的8位优化器》翻译与解读

bitsandbytes的安装

T1、直接安装

T2、从源代码编译

bitsandbytes的使用方法

1、基础用法

在HuggingFace Transformers中使用Int8推断

使用8位优化器和使用8位推断

使用Int8矩阵乘法

使用8位优化器

如果需要高精度的参数

更改单个参数的位数和其他超参数


bitsandbytes的简介

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

GitHubhttps://github.com/TimDettmers/bitsandbytes

文档Module tree: — bitsandbytes v0.0.24 documentation

论文https://arxiv.org/abs/2110.02861

1、bitsandbytes的特点

混合精度分解的8位矩阵乘法
LLM.int8()推断
8位优化器:Adam、AdamW、RMSProp、LARS、LAMB、Lion(节省75%的内存)
稳定的嵌入层:通过更好的初始化和归一化改进稳定性
8位量化:分位数、线性和动态量化
快速分位数估计:比其他算法快100倍

2、《通过块级量化的8位优化器》翻译与解读

地址

论文:https://arxiv.org/abs/2110.02861

时间

2021年10月6日

作者

Tim Dettmers, Mike Lewis, Sam Shleifer, Luke Zettlemoyer

Facebook

       本文开发了首个使用8位统计信息的优化器,同时保持了使用32位优化器状态时的性能水平。为了克服计算、量化和稳定性方面的挑战,我们开发了块级动态量化。块级量化将输入张量划分为较小的块,每个块都独立进行量化,通过在核心之间并行处理每个块,实现更快的优化和高精度的量化。为了保持稳定性和性能,我们结合了块级量化两个额外的改变:(1)动态量化,一种对于大幅度和小幅度值都准确的非线性优化方法;(2)稳定的嵌入层,用于减小语言模型中输入标记高度不均匀分布所带来的梯度方差。因此,我们的8位优化器在各种任务上都能保持32位性能,仅占用少量内存,包括15亿参数的语言建模、GLUE微调、ImageNet分类、WMT'14机器翻译、MoCo v2对比ImageNet预训练+微调以及RoBERTa预训练,而无需更改原始优化器的超参数。我们以开源方式发布我们的8位优化器,可直接替换,仅需要进行两行代码更改

状态化优化器:通过时间维护梯度统计信息,例如趋势平滑和平方和(Adam)的过去梯度值。这种状态可以加速优化与 简单的随机梯度下降相比,但使用的内存会限制在实践中训练的模型大小。

Stateful optimizers maintain gradient statistics over time, e.g., the exponentially smoothed sum (SGD with momentum) or squared sum (Adam) of past gradient values. This state can be used to accelerate optimization compared to plain stochastic gradient descent but uses memory that might otherwise be allocated to model parameters, thereby limiting the maximum size of models trained in practice. In this paper, we develop the first optimizers that use 8-bit statistics while maintaining the performance levels of using 32-bit optimizer states. To overcome the resulting computational, quantization, and stability challenges, we develop block-wise dynamic quantization. Block-wise quantization divides input tensors into smaller blocks that are independently quantized. Each block is processed in parallel across cores, yielding faster optimization and high precision quantization. To maintain stability and performance, we combine block-wise quantization with two additional changes: (1) dynamic quantization, a form of non-linear optimization that is precise for both large and small magnitude values, and (2) a stable embedding layer to reduce gradient variance that comes from the highly non-uniform distribution of input tokens in language models. As a result, our 8-bit optimizers maintain 32-bit performance with a small fraction of the memory footprint on a range of tasks, including 1.5B parameter language modeling, GLUE finetuning, ImageNet classification, WMT'14 machine translation, MoCo v2 contrastive ImageNet pretraining+finetuning, and RoBERTa pretraining, without changes to the original optimizer hyperparameters. We open-source our 8-bit optimizers as a drop-in replacement that only requires a two-line code change.

状态性优化器会在一段时间内保留梯度统计信息,例如过去梯度值的指数平滑和(带动量的随机梯度下降)或平方和(Adam)。这种状态可以加速优化过程,相较于普通的随机梯度下降,但会使用可能本应分配给模型参数的内存,从而限制了实际训练中模型的最大尺寸。在本文中,我们开发了首个使用8位统计信息的优化器,同时保持了使用32位优化器状态的性能水平。为了克服由此产生的计算、量化和稳定性挑战,我们开发了块级动态量化。块级量化将输入张量划分为较小的块,每个块都独立进行量化。每个块在多个核心上并行处理,实现更快的优化和高精度量化。为了保持稳定性和性能,我们将块级量化与两个附加改变相结合:

(1)动态量化,一种对大幅度值和小幅度值均准确的非线性优化方法,以及

(2)稳定的嵌入层,以减小语言模型中输入标记高度不均匀分布带来的梯度变异。结果,我们的8位优化器在一系列任务上保持了32位性能,仅占用了小部分内存空间,包括15亿参数的语言建模、GLUE微调、ImageNet分类、WMT'14机器翻译、MoCo v2对比ImageNet预训练+微调和RoBERTa预训练,而不需要更改原始优化器的超参数。我们将我们的8位优化器作为可直接替换的开源代码发布,仅需要进行两行代码更改。

bitsandbytes的安装

整体要求:Python >= 3.8。Linux发行版(如Ubuntu、MacOS等)+ CUDA > 10.0。(已弃用:CUDA 10.0已被弃用,只支持CUDA >= 11.0,将在0.39.0版本发布中支持)

库依赖要求: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。

T1、直接安装

pip install bitsandbytes
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bitsandbytes

T2、从源代码编译

在某些情况下,可能需要从源代码编译。如果遇到此问题,请考虑使用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

bitsandbytes的使用方法

1、基础用法

在HuggingFace Transformers中使用Int8推断

更详细的示例可以在examples/int8_inference_huggingface.py中找到

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')

使用8位优化器和使用8位推断

使用8位优化器

使用8位优化器:

注释掉优化器:#torch.optim.Adam(....)

添加你选择的8位优化器 bnb.optim.Adam8bit(....)(参数保持不变)

根据需要替换嵌入层:torch.nn.Embedding(..) -> bnb.nn.Embedding(..)

使用8位推断

使用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

要使用完整的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))

使用Int8矩阵乘法

对于直接的Int8矩阵乘法与混合精度分解,您可以使用bnb.matmul(...)。要启用混合精度分解,请使用threshold参数:

bnb.matmul(..., threshold=6.0)

使用8位优化器

使用bitsandbytes,可以通过更改代码中的一行来使用8位优化器。对于自然语言处理模型,我们建议还使用StableEmbedding层(见下文),以改善结果并帮助稳定8位优化。要开始使用8位优化器,只需使用以下方式将旧的优化器替换为8位优化器:

import bitsandbytes as bnb

adam = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.995)) # 注释掉旧的优化器
adam = bnb.optim.Adam8bit(model.parameters(), lr=0.001, betas=(0.9, 0.995)) # 添加bnb优化器
adam = bnb.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.995), optim_bits=8) # 等效

torch.nn.Embedding(...) -> bnb.nn.StableEmbedding(...) # 推荐用于自然语言处理模型

如果需要高精度的参数

请注意,默认情况下,即使使用8位优化器初始化这些参数,所有元素少于4096个的参数张量仍保持32位。这是因为这种小张量节省的内存不多,而且通常包含高度可变的参数(偏差)或需要高精度的参数(批归一化、层归一化)。您可以像这样更改此行为:

# 优化器将小于16384个值的参数张量优化为32位
# 建议使用4096的倍数
adam = bnb.optim.Adam8bit(model.parameters(), min_8bit_size=16384)

更改单个参数的位数和其他超参数

        如果您想要使用32位Adam优化某些不稳定的参数,同时使用8位Adam优化其他参数,可以使用GlobalOptimManager。使用它,我们还可以为特定层配置特定的超参数,例如嵌入层。为此,我们需要两个步骤:
(1)在参数还在CPU上时注册它们,
(2)使用新的所需超参数覆盖配置(随时随地)。

有关更多详细信息,请参阅我们的指南。

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,关于imblearn库的安装使用,我可以为您提供以下攻略: imblearn/imbalanced-learn库简介: imblearn/imbalanced-learn是一个用于不平衡数据处理的Python库,可以帮助我们有效地应对数据不平衡问题。在机器学习和数据挖掘领域中,不平衡数据是常见的问题,也是影响模型效果的重要因素之一。imblearn库提供了一系列的方法和技术来处理不平衡数据,包括欠采样、过采样、集成方法等。 imblearn库的安装: 可以通过pip命令进行安装,具体步骤如下: 1. 打开终端或命令行窗口 2. 输入命令:pip install -U imbalanced-learn 3. 等待安装完成即可 使用imblearn库: 在导入库后,我们可以调用其中的函数和方法来处理不平衡数据。下面是一些常用的函数和方法: 1. RandomUnderSampler:欠采样方法,可以随机删除多数类样本 2. RandomOverSampler:过采样方法,可以随机复制少数类样本 3. SMOTE:一种合成数据的过采样方法,可以根据少数类样本生成新数据 4. Ensemble methods:集成方法,如EasyEnsemble、BalanceCascade等,可以通过组合多个分类器来处理不平衡数据 使用方法示例: ```python from imblearn.under_sampling import RandomUnderSampler from imblearn.over_sampling import RandomOverSampler from imblearn.over_sampling import SMOTE # 使用RandomUnderSampler进行欠采样 rus = RandomUnderSampler(random_state=0) X_resampled, y_resampled = rus.fit_resample(X, y) # 使用RandomOverSampler进行过采样 ros = RandomOverSampler(random_state=0) X_resampled, y_resampled = ros.fit_resample(X, y) # 使用SMOTE进行过采样 smote = SMOTE(random_state=0) X_resampled, y_resampled = smote.fit_resample(X, y) ``` 以上就是关于imblearn库的简介安装使用方法攻略,希望能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个处女座的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值