集成
bitsandbytes 广泛集成到 Hugging Face 和更广泛的 PyTorch 生态系统中的许多库中。本指南简要概述了这些集成以及如何将 bitsandbytes 与它们一起使用。有关更多详细信息,您应参考每个库的链接文档。
Transformers
在 bitsandbytes Transformers 集成指南中了解更多信息。
使用 Transformers,加载任何 4 位或 8 位模型并动态对其进行量化非常容易。要配置量化参数,请在BitsAndBytesConfig类中指定它们。
例如,要将模型加载并量化为 4 位,并使用 bfloat16 数据类型进行计算
如果您的硬件支持,bfloat16 是理想的compute_dtype
。虽然默认的compute_dtype
,float32,确保向后兼容性(由于广泛的硬件支持)和数值稳定性,但它很大并且会减慢计算速度。相反,float16 更小且更快,但会导致数值不稳定。bfloat16 结合了这两者的优点;它提供了 float32 的数值稳定性和 16 位数据类型的减少内存占用和速度。检查您的硬件是否支持 bfloat16,并使用BitsAndBytesConfig中的bnb_4bit_compute_dtype
参数进行配置!
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)
model_4bit = AutoModelForCausalLM.from_pretrained(
"bigscience/bloom-1b7",
device_map=device_map,
quantization_config=quantization_config,
)
8 位优化器
您可以通过将任何 8 位或分页优化器传递给初始化时的Trainer类来与 Transformers 一起使用它们。所有 bitsandbytes 优化器都支持在TrainingArgumentsoptim
参数中传递正确的字符串。例如,要加载PagedAdamW32bit优化器
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
...,
optim="paged_adamw_32bit",
)
trainer = Trainer(model, training_args, ...)
trainer.train()
PEFT
在 bitsandbytes PEFT 集成指南中了解更多信息。
PEFT 基于 bitsandbytes Transformers 集成,并通过几个步骤对其进行了扩展以进行训练。让我们准备上一节中用于训练的 4 位模型。
调用~peft.prepare_model_for_kbit_training
方法来准备模型进行训练。这仅适用于 Transformers 模型!
from peft import prepare_model_for_kbit_training
model_4bit = prepare_model_for_kbit_training(model_4bit)
设置一个~peft.LoraConfig
来使用 QLoRA
from peft import LoraConfig
config = LoraConfig(
r=16,
lora_alpha=8,
target_modules="all-linear",
lora_dropout=0.05
bias="none",
task_type="CAUSAL_LM"
)
现在在您的模型和配置上调用~peft.get_peft_model
函数以创建一个可训练的PeftModel
。
from peft import get_peft_model
model = get_peft_model(model_4bit, config)
Accelerate
在 bitsandbytes Accelerate 集成指南中了解更多信息。
bitsandbytes 也易于从 Accelerate 中使用,您可以通过传递具有所需设置的BnbQuantizationConfig来量化任何 PyTorch 模型,然后调用load_and_quantize_model函数对其进行量化。
from accelerate import init_empty_weights
from accelerate.utils import BnbQuantizationConfig, load_and_quantize_model
from mingpt.model import GPT
model_config = GPT.get_default_config()
model_config.model_type = 'gpt2-xl'
model_config.vocab_size = 50257
model_config.block_size = 1024
with init_empty_weights():
empty_model = GPT(model_config)
bnb_quantization_config = BnbQuantizationConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16, # optional
bnb_4bit_use_double_quant=True, # optional
bnb_4bit_quant_type="nf4" # optional
)
quantized_model = load_and_quantize_model(
empty_model,
weights_location=weights_location,
bnb_quantization_config=bnb_quantization_config,
device_map = "auto"
)
PyTorch Lightning 和 Lightning Fabric
bitsandbytes 可从以下途径获取
- PyTorch Lightning,一个面向专业 AI 研究人员和机器学习工程师的深度学习框架,它提供了最大的灵活性和可扩展性,同时保证了性能。
- Lightning Fabric,一种快速且轻量级的方式,用于在不增加样板代码的情况下扩展 PyTorch 模型。
在 bitsandbytes PyTorch Lightning 集成 指南 中了解更多信息。
Lit-GPT
bitsandbytes 集成到 Lit-GPT 中,后者是一个可修改的、最先进的开源大型语言模型实现。Lit-GPT 基于 Lightning Fabric,可用于训练、微调和推理期间的量化。
在 bitsandbytes Lit-GPT 集成 指南 中了解更多信息。
博文
要详细了解 bitsandbytes 的一些集成,请查看以下博文
- 使用 bitsandbytes、4 位量化和 QLoRA 使 LLM 更易访问
- 使用 Hugging Face Transformers、Accelerate 和 bitsandbytes 对大型 Transformer 进行 8 位矩阵乘法的简介