ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

bitsandbytes FSDP-QLoRA:让 4-bit 量化权重以浮点存储,在双 24GB 显卡上训练 70B 大模型

bitsandbytes FSDP-QLoRA:让 4-bit 量化权重以浮点存储,在双 24GB 显卡上训练 70B 大模型 人工智能大模型模型量化模型优化【免费下载链接】bitsandbytesAccessible large language models via k-bit quantization for PyTorch.项目地址https://gitcode.com/gh_mirrors/bi/bitsandbytes点击查看免费下载本篇指南围绕仓库文档 docs/source/fsdp_qlora.md 展开讲解 FSDP-QLoRA 的核心机制与实操流程FSDP 要求分片的参数必须是浮点类型而 4-bit 量化权重默认以torch.uint8整数存储这正是二者冲突的根源。读完后你将掌握通过quant_storage/bnb_4bit_quant_storage参数将量化权重转为浮点存储的完整配置方法能够使用 Accelerate Transformers PEFT TRL 搭建一套可运行的 FSDP-QLoRA 训练流程并理解 bitsandbytes 源码中为此所做的量化状态重建、state_dict 保存等配套支持。FSDP-QLoRA 是什么FSDP-QLoRA 将三种技术组合在一起数据并行FSDPFully Sharded Data Parallel 把模型参数、优化器状态和梯度分片sharding到多张 GPU 上每张卡只保存完整模型的一个切片从而把显存占用摊薄4-bit 量化基座模型权重以 4-bitNF4/FP4存储进一步压缩参数体积LoRA只训练低秩适配器梯度与优化器状态集中在少量可训练参数上。按 docs/source/fsdp_qlora.md 的说法该技术由 Answer.AI 联合 bitsandbytes 发布目标是让最高 70B 参数的 LLM 微调可以运行在双 24GB GPU 的消费级硬件上。其原理性细节可参考 Answer.AI 的相关技术文章《You can now train a 70b language model at home》与《Enabling 70B Finetuning on Consumer GPUs》本文则聚焦 bitsandbytes 仓库内部对 FSDP-QLoRA 的支撑实现。量化数据的存储quant_storage参数FSDP 只分片浮点类型的问题FSDP 只支持对浮点数据类型的参数进行分片而量化权重通常以整数类型uint8存储。对 bitsandbytes 来说这个问题并不存在——从源码结构看它内部通过StoreChar之类的机制读写量化权重与存储 dtype 解耦4-bit 值先被打包进uint8字节而这些字节本身可以重新view成任意等宽浮点类型而不改变比特内容。这一点在各后端实现中可以直接看到。以 default纯 PyTorch后端为例bitsandbytes/backends/default/ops.py 中的quantize_4bit内核在打包完成后packed ((q8[::2] 4) | q8[1::2]).unsqueeze(1) if quant_storage ! torch.uint8: packed packed.squeeze().view(quant_storage).unsqueeze(1)即当quant_storage不是torch.uint8时直接对同一个比特缓冲做view(quant_storage)把打包字节“解释”为 bf16/fp16 等浮点类型。CUDA、Triton、MPS 后端如 bitsandbytes/backends/triton/ops.py、bitsandbytes/backends/mps/ops.py均有同样的处理因此这一机制在所有后端一致可用。参数在模块与函数 API 中的位置quant_storage参数出现在多个层次默认值统一为torch.uint8保持向后兼容nn.Params4bit4-bit 参数类quant_storage作为构造参数保存为实例属性并参与__getstate__/__setstate__序列化bitsandbytes/nn/modules.py保证 checkpoint 往返后存储类型不丢失nn.Linear4bit、LinearNF4、LinearFP4等模块均透传该参数bitsandbytes/nn/modules.py函数式 APIbnb.functional.quantize_4bit同样接受quant_storage参数bitsandbytes/functional.py其文档字符串明确说明“The dtype of the tensor used to store the result. Defaults totorch.uint8”。在Params4bit上存储类型还随设备迁移保持to()/cuda()重建新参数时会原样传递quant_storagebitsandbytes/nn/modules.py从预量化状态恢复时则以数据本身的 dtype 推断from_prequantized中self.quant_storage data.dtypebitsandbytes/nn/modules.py。通过BitsAndBytesConfig配置实际使用时你通常从transformers.BitsAndBytesConfig设置bnb_4bit_quant_storage参数。注意quant_storage的数据类型必须与模型其余部分使用的数据类型一致因为 FSDP 只能包装具有相同浮点类型的层和模块类型对齐才能保证模型被正确地分片。另外需要区分compute_dtype与quant_storagecompute_dtype是 CUDA 内核中实际计算使用的数据类型4-bit 权重会从quant_storage中解包并反量化到compute_dtype。文档建议在硬件支持时优先使用torch.bfloat16以获得更好的数值稳定性。from transformers import BitsAndBytesConfig, AutoModelForCausalLM import torch bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_quant_storagetorch.bfloat16, ) model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-70b, quantization_configbnb_config, torch_dtypetorch.bfloat16, )训练 FSDP-QLoRAFSDP 是分布式训练框架必须通过 Accelerate 或torchrun之类的工具以分布式训练任务的方式启动。bitsandbytes 与 Hugging Face 生态深度集成可以便捷地配合 Transformers、PEFT、TRL 使用PEFT 官方提供了 FSDP-QLoRA 的配置示例fsdp_config_qlora.yaml、启动脚本run_peft_qlora_fsdp.sh与训练脚本train.py并附有“Use PEFT QLoRA and FSDP for finetuning large models on multiple GPUs”的专项文档可作为完整可运行配置的参照。1. 安装依赖开始之前确保安装了最新的库pip install -U bitsandbytes accelerate transformers peft trl2. 配置量化参数使 FSDP-QLoRA 训练成为可能的关键改动就是BitsAndBytesConfig中的bnb_4bit_quant_storage参数——它允许把量化权重的存储类型设置为浮点类型from transformers import BitsAndBytesConfig import torch bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_storagetorch.bfloat16, )参数说明参数示例值作用load_in_4bitTrue以 4-bit 方式加载基座模型bnb_4bit_quant_typenf4量化数据类型bitsandbytes 支持nf4与fp4见 quantize_4bit 的类型校验bnb_4bit_compute_dtypetorch.bfloat16内核计算与反量化目标类型建议 bf16bnb_4bit_use_double_quantTrue对 absmax 统计量再做一层量化嵌套量化进一步节省显存bnb_4bit_quant_storagetorch.bfloat16FSDP-QLoRA 的关键量化权重的存储类型必须为 FSDP 支持的浮点类型且与模型 dtype 一致3. 加载模型并对齐 dtype把BitsAndBytesConfig传给模型即可为其启用 FSDP-QLoRA。应将torch_dtype设置为与bnb_4bit_quant_storage一致这样每个Linear4bit层会与Linear层以相同方式被 FSDP 包装如果存储类型不匹配每个Linear4bit层会被单独包装破坏分片效率。from transformers import AutoModelForCausalLM import torch model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-70b, quantization_configbnb_config, torch_dtypetorch.bfloat16, )4. 配置 LoRA为 QLoRA 训练配置LoraConfig通过target_modulesall-linear覆盖所有线性层from peft import LoraConfig peft_config LoraConfig( lora_alpha16, lora_dropout0.1, r64, biasnone, task_typeCAUSAL_LM, target_modulesall-linear, )5. 交给SFTTrainer训练最后把模型、LoRA 配置与数据一起传给 TRL 的SFTTrainerfrom trl import SFTTrainer trainer SFTTrainer( modelmodel, train_datasetdataset, peft_configpeft_config, processing_classtokenizer, argstraining_arguments, ) trainer.train()训练脚本需以分布式方式启动例如使用 Accelerate 的accelerate launch命令配合 FSDP 配置文件执行训练脚本PEFT 仓库中的run_peft_qlora_fsdp.sh展示了典型启动方式。源码纵深bitsandbytes 为 FSDP 做的三项配套支持除了quant_storage本身bitsandbytes 还为 FSDP 场景做了若干针对性处理理解它们有助于排查分布式训练中的状态丢失与 checkpoint 问题FSDP 遍历量化状态的属性代理。FSDP 的_get_fqns()通过getattr逐点解析参数属性例如把weight.absmax解析为getattr(weight, absmax)来识别需要分片的量化统计量。为此Params4bit定义了absmax、code、offset、nested_absmax等property代理到内部QuantStatebitsandbytes/nn/modules.py。源码注释说明使用 property 而非__getattr__是有意为之Dynamo 可以追踪描述符协议访问但无法追踪 Tensor 子类的__getattr__后者会导致torch.compile图断裂关联 issue #1904。量化状态丢失后的重建。参数在 FSDP 包装过程中转换时可能丢失quant_statefix_4bit_weight_quant_state_from_module会在Linear4bit.forward入口处从模块上恢复权重属性bitsandbytes/nn/modules.pyLinear4bit.forward第一行即调用它bitsandbytes/nn/modules.py。state_dict 保存量化元数据。Linear4bit._save_to_state_dict在保存 weight 之外还会把quant_state.as_dict(packedTrue)的各分量以weight.key的形式写入 state_dictbitsandbytes/nn/modules.py使得 4-bit 权重能从量化元数据完整重建。仓库中的集成测试 tests/fsdp_state_dict_save.py 验证了这一点它用一个“冻结 4-bit 基座 可训练 adapter”的 QLoRA 风格模型包装 FSDP调用get_model_state_dict(cpu_offloadTrue)覆盖了过去会因Params4bit缺少absmax属性而崩溃的_get_fqns()遍历路径issue #1405。该脚本需通过torchrun --nproc_per_node1 tests/fsdp_state_dict_save.py启动可直接用于回归验证。此外Params4bit.cuda()/xpu()在从 CPU 迁移到加速器前会检测packing_format_for_cpu标记并先做布局还原bitsandbytes/nn/modules.py防止已量化的权重在 CPU→GPU 迁移时被重复量化——这正是文档 TIP 中提到的“防止把已量化的权重再次量化”的实现位置。关键要点与常见坑类型必须对齐bnb_4bit_quant_storage、torch_dtype、模型中非量化层的 dtype 三者保持一致推荐 bf16否则Linear4bit会被逐层单独包装FSDP 分片失效。compute_dtype与quant_storage职责不同前者决定内核内反量化后的计算精度后者决定权重在显存/分片中的存储类型二者独立配置。默认值保持兼容quant_storage在各处默认torch.uint8即不显式设置时行为与旧版本完全一致只有显式传入浮点类型才启用 FSDP 友好的存储方式。分布式启动是前提FSDP 不是普通单机训练模式务必通过 Accelerate 或torchrun启动。验证手段单卡场景下可运行 tests/fsdp_state_dict_save.py 检查 FSDP 对 4-bit 模块的 state_dict 收集是否正常。延伸阅读Answer.AI 发布的 FSDP-QLoRA 参考仓库AnswerDotAI/fsdp_qlora与两篇技术博客介绍方法动机与 70B 消费级微调细节PyTorch 官方博客《Introducing PyTorch Fully Sharded Data Parallel (FSDP) API》了解 FSDP 分片机制Hugging Face 博客《Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRA》了解 4-bit 量化与 QLoRA 的背景仓库内文档 docs/source/integrations.mdx 与参考手册 docs/source/reference/nn/linear4bit.mdx、docs/source/reference/functional.mdx可查阅Linear4bit与quantize_4bit的完整 API 说明。赞分享人工智能大模型模型量化模型优化【免费下载链接】bitsandbytesAccessible large language models via k-bit quantization for PyTorch.项目地址https://gitcode.com/gh_mirrors/bi/bitsandbytes点击查看免费下载相关推荐如何用FSDP-QLoRA在消费级GPU上训练70B大模型完整步骤解析如何用FSDP QLoRA在消费级GPU上训练70B大模型完整步骤解析 FSDP QLoRA是一个结合了FSDPFully Sharded Data Par人工智能大模型微调LoRA分布式训练模型量化QLoRA训练指南基于bitsandbytes的4-bit量化技术全面解析QLoRA训练指南基于bitsandbytes的4 bit量化技术全面解析 引言大模型训练的显存困境与QLoRA解决方案 你是否还在为训练大语言模型时的显存人工智能大模型模型量化模型优化QLoRA 4-bit量化训练技术剖析QLoRA 4 bit量化训练技术剖析 QLoRA 4 bit量化训练技术是现代大语言模型高效训练和推理的核心技术通过将32位浮点权重压缩到4位表示实现了显人工智能大模型模型量化模型优化上一篇OpenSpeedy时间函数拦截技术游戏帧率突破的工程实践下一篇3步搞定yuzu模拟器版本管理轻松解决游戏兼容性问题的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表