趋近智
尽管量化 (quantization)LoRA (QLoRA) 通过使用4位量化大幅减少了基础模型权重 (weight)的内存占用,但训练过程中所需的优化器状态仍可能是显著的内存瓶颈。像AdamW这样的标准优化器会为每个可训练参数 (parameter)维护多个状态(例如,动量和方差估计)。即使LoRA训练的参数远少于全量微调 (fine-tuning),优化器仍可能根据原始模型大小分配内存,或者至少为LoRA参数本身需要大量内存,尤其是在规模很大的模型上。
这时分页优化器便发挥作用了,它提供了一种互补的方法,可进一步降低微调过程中GPU内存消耗,使QLoRA更加容易使用。
以AdamW优化器为例。对于每个被训练的参数 (parameter),它通常存储:
如果这些状态以32位精度(FP32)存储,每个参数会占用12字节(4字节用于梯度 + 4字节用于动量 + 4字节用于方差)。虽然LoRA与全量模型相比显著减少了可训练参数的数量,但优化器状态内存仍可能很大,尤其是在微调 (fine-tuning)具有数十亿参数的模型时,即使只有一小部分通过LoRA进行调整。这种内存使用量随可训练参数数量增加而扩展,即使基础模型本身由于量化 (quantization)而适配,也可能阻止在VRAM有限的GPU上训练。
分页优化器,以bitsandbytes等库中提供的8位AdamW实现为例,通过使用CPU内存作为优化器状态的溢出缓冲区来解决这一挑战。其核心思想类似于操作系统中的虚拟内存管理:
这种动态的数据移动确保了在任何给定时刻,只有一小部分全部优化器状态需要存在于GPU显存中,从而大幅降低了优化器在GPU上的峰值内存需求。
QLoRA训练期间分页优化器设置中的数据流。大部分优化器状态驻留在CPU内存中,仅在计算需要时才被页入GPU显存,从而最大限度地减少优化器带来的GPU内存开销。
分页优化器与QLoRA结合使用时尤其有效:
使用分页优化器通常涉及在设置训练循环时指定特定优化器实现。例如,使用bitsandbytes库时,您可能会选择AdamW的8位变体。
# 使用训练器设置的示例
# 注意:实际实现取决于框架/库(例如,Hugging Face Transformers,自定义PyTorch循环)
import bitsandbytes.optim as bnb_optim
# ... 模型设置(已启用QLoRA) ...
# ... 训练参数 ...
# 不使用torch.optim.AdamW,而是使用bitsandbytes版本
optimizer = bnb_optim.AdamW8bit(
model.parameters(),
lr=training_args.learning_rate,
# 其他AdamW参数...
# bitsandbytes特定的参数可能可用,例如用于块大小的参数
)
# ... 训练循环的其余部分 ...
注意事项:
bitsandbytes)在您的硬件环境(CUDA版本等)中正确安装和配置。总之,分页优化器代表了使大型模型微调 (fine-tuning)更高效和易于使用的又一个重要进展。通过智能管理CPU和GPU之间的优化器状态内存,它们与QLoRA等技术配合使用,支持在资源受限的硬件上进行高级微调流程。
这部分内容有帮助吗?
bitsandbytes Library Documentation, bitsandbytes-foundation and Contributors, 2024 - 提供了在bitsandbytes库中实现8位优化器(包括AdamW8bit)的实用指南和示例,以支持内存高效的LLM训练。© 2026 ApX Machine Learning用心打造