Bitsandbytes 文档

概览

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

概述

8 位优化器 在不降低任何性能的情况下减少了 32 位优化器的内存占用,这意味着你可以更快地训练具有许多参数的大型模型。8 位优化器的核心是分块量化,它实现了量化精度、计算效率和稳定性。

bitsandbytes 通过基类 Optimizer8bit 提供 8 位优化器,并额外为 2 状态(例如 Adam)和 1 状态(例如 Adagrad)优化器分别提供 Optimizer2StateOptimizer1State。要提供自定义的优化器超参数,请使用 GlobalOptimManager 类来配置优化器。

Optimizer8bit

class bitsandbytes.optim.optimizer.Optimizer8bit

< >

( params defaults optim_bits = 32 is_paged = False )

__init__

< >

( params defaults optim_bits = 32 is_paged = False )

参数

  • params (torch.tensor) — 用于优化的输入参数。
  • optim_bits (int, 默认为 32) — 优化器状态的位数。
  • is_paged (bool, 默认为 False) — 优化器是否为分页优化器。

基础的 8 位优化器类。

Optimizer2State

class bitsandbytes.optim.optimizer.Optimizer2State

< >

( optimizer_name params lr = 0.001 betas = (0.9, 0.999) eps = 1e-08 weight_decay = 0.0 optim_bits = 32 args = None min_8bit_size = 4096 percentile_clipping = 100 block_wise = True max_unorm = 0.0 skip_zeros = False is_paged = False alpha = 0.0 t_alpha: typing.Optional[int] = None t_beta3: typing.Optional[int] = None )

__init__

< >

( optimizer_name params lr = 0.001 betas = (0.9, 0.999) eps = 1e-08 weight_decay = 0.0 optim_bits = 32 args = None min_8bit_size = 4096 percentile_clipping = 100 block_wise = True max_unorm = 0.0 skip_zeros = False is_paged = False alpha = 0.0 t_alpha: typing.Optional[int] = None t_beta3: typing.Optional[int] = None )

参数

  • optimizer_name (str) — 优化器的名称。
  • params (torch.tensor) — 用于优化的输入参数。
  • lr (float, 默认为 1e-3) — 学习率。
  • betas (tuple, 默认为 (0.9, 0.999)) — 优化器的 beta 值。
  • eps (float, 默认为 1e-8) — 优化器的 epsilon 值。
  • weight_decay (float, 默认为 0.0) — 优化器的权重衰减值。
  • optim_bits (int, 默认为 32) — 优化器状态的位数。
  • args (object, 默认为 None) — 包含附加参数的对象。
  • min_8bit_size (int, 默认为 4096) — 用于 8 位优化的参数张量的最小元素数。
  • percentile_clipping (int, 默认为 100) — 通过跟踪最近 100 次的梯度范数,并在某个百分位数处裁剪梯度,自动调整裁剪阈值以提高稳定性。
  • block_wise (bool, 默认为 True) — 是否独立量化张量的每个块,以减少异常值影响并提高稳定性。
  • max_unorm (float, 默认为 0.0) — 用于归一化每个块的最大值。
  • skip_zeros (bool, 默认为 False) — 是否为稀疏梯度和模型跳过零值,以确保正确更新。
  • is_paged (bool, 默认为 False) — 优化器是否为分页优化器。
  • alpha (float, 默认为 0.0) — AdEMAMix 优化器的 alpha 值。
  • t_alpha (Optional[int], 默认为 None) — 使用 AdEMAMix 进行 alpha 调度时的迭代次数。
  • t_beta3 (Optional[int], 默认为 None) — 使用 AdEMAMix 进行 beta 调度时的迭代次数。

基础的 2 状态更新优化器类。

Optimizer1State

class bitsandbytes.optim.optimizer.Optimizer1State

< >

( optimizer_name params lr = 0.001 betas = (0.9, 0.0) eps = 1e-08 weight_decay = 0.0 optim_bits = 32 args = None min_8bit_size = 4096 percentile_clipping = 100 block_wise = True max_unorm = 0.0 skip_zeros = False is_paged = False )

__init__

< >

( optimizer_name params lr = 0.001 betas = (0.9, 0.0) eps = 1e-08 weight_decay = 0.0 optim_bits = 32 args = None min_8bit_size = 4096 percentile_clipping = 100 block_wise = True max_unorm = 0.0 skip_zeros = False is_paged = False )

参数

  • optimizer_name (str) — 优化器的名称。
  • params (torch.tensor) — 用于优化的输入参数。
  • lr (float, 默认为 1e-3) — 学习率。
  • betas (tuple, 默认为 (0.9, 0.0)) — 优化器的 beta 值。
  • eps (float, 默认为 1e-8) — 优化器的 epsilon 值。
  • weight_decay (float, 默认为 0.0) — 优化器的权重衰减值。
  • optim_bits (int, 默认为 32) — 优化器状态的位数。
  • args (object, 默认为 None) — 包含附加参数的对象。
  • min_8bit_size (int, 默认为 4096) — 用于 8 位优化的参数张量的最小元素数。
  • percentile_clipping (int, 默认为 100) — 通过跟踪最近 100 次的梯度范数,并在某个百分位数处裁剪梯度,自动调整裁剪阈值以提高稳定性。
  • block_wise (bool, 默认为 True) — 是否独立量化张量的每个块,以减少异常值影响并提高稳定性。
  • max_unorm (float, 默认为 0.0) — 用于对每个块进行归一化的最大值。
  • skip_zeros (bool, 默认为 False) — 是否跳过稀疏梯度和模型中的零值,以确保正确更新。
  • is_paged (bool, 默认为 False) — 优化器是否为分页优化器。

基础 1-状态更新优化器类。

实用工具

class bitsandbytes.optim.GlobalOptimManager

< >

( )

一个用于启用自定义优化器配置的全局优化器管理器。

override_config

< >

( parameters key = None value = None key_value_dict = None )

参数

  • parameters (torch.Tensorlist(torch.Tensors)) — 输入参数。
  • key (str) — 要覆盖的超参数。
  • value — 超参数值。
  • key_value_dict (dict) — 一个包含多个要覆盖的键值对的字典。

使用特定的超参数覆盖初始优化器配置。

输入参数的优化器配置的键值对被覆盖。这可以是优化器参数,如 betaslr,也可以是 8 位特定参数,如 optim_bitspercentile_clipping

示例

import torch
import bitsandbytes as bnb

mng = bnb.optim.GlobalOptimManager.get_instance()

model = MyModel()
mng.register_parameters(model.parameters()) # 1. register parameters while still on CPU

model = model.cuda()
# use 8-bit optimizer states for all parameters
adam = bnb.optim.Adam(model.parameters(), lr=0.001, optim_bits=8)

# 2. override: the parameter model.fc1.weight now uses 32-bit Adam
mng.override_config(model.fc1.weight, 'optim_bits', 32)
< > 在 GitHub 上更新