首页/新闻资讯/正文详情

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

发布时间:2026/9/25 3:52:38 来源:云帆数科 栏目:资讯中心
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),仅供参考

相关推荐

CodeCombat 开源项目完全指南:多人在线编程游戏的技术架构、本地开发与贡献实践
CodeCombat 开源项目完全指南:多人在线编程游戏的技术架构、本地开发与贡献实践

游戏开发教育前端后端 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 点击查看 免费下载 CodeCombat 是一个以"游戏化编程学习"为核心的多人在线编程游戏开源项目——玩家通过编写… · 2026/9/25 3:52:32

Altium Designer交互式BOM插件开发:从原理图采集到PCB高亮回跳
Altium Designer交互式BOM插件开发:从原理图采集到PCB高亮回跳

简介:Altium Designer 用户常需在原理图与 PCB 设计流程中维护物料清单,但软件原生并不直接提供交互式 BOM 导出能力。这款插件正是针对这一缺口设计的效率工具,面向需要将 BOM 以网页化、可交互形式交付的硬件工程师与采购人员。压缩包共 35… · 2026/9/25 3:52:32

为何我不写政策解读?出租车行业四大替代选题方向
为何我不写政策解读?出租车行业四大替代选题方向

先说明一下,这篇我没有动笔的原因看到“南宁市出租汽车行业发展规划(2024-2029)”这个选题时,我没有直接按常规流程去拆解标题、搭建博文框架,而是先停下做了一轮内容合规自查。原因不复杂:这类文件属于地方… · 2026/9/25 3:52:32

如何正确引用arXiv论文:BibTeX模板、版本管理与常见错误
如何正确引用arXiv论文:BibTeX模板、版本管理与常见错误

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:26:51

Spring AI 2.0 RAG优化实战:Chunking、混合检索与Rerank的优先级与配置
Spring AI 2.0 RAG优化实战:Chunking、混合检索与Rerank的优先级与配置

1. 为什么 RAG 的瓶颈往往不在模型本身做 RAG 项目做久了,你会发现一个很反直觉的现象:换更大的模型、调更高的 temperature、甚至把 embedding 模型从英文换成多语言,效果提升可能只有几个百分点;但把 chunk 策略改一改、把检索从… · 2026/9/25 4:26:51

USB转I2C适配器实现I2C地址扫描与100kHz时序测试
USB转I2C适配器实现I2C地址扫描与100kHz时序测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:26:51

APL文件分析实战:从结构解析到性能根因定位
APL文件分析实战:从结构解析到性能根因定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:26:51

STM32芯片命名规则详解:从型号到选型实战指南
STM32芯片命名规则详解:从型号到选型实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:26:51

北邮数据结构实验双路径:C手写栈与C++封装的工程实践
北邮数据结构实验双路径:C手写栈与C++封装的工程实践

简介:本资源是北京邮电大学《数据结构与算法》课程的全套实验与作业实践材料,面向计算机及相关专业本科生、考研复习者及算法初学者,聚焦核心数据结构实现与经典算法动手训练。压缩包共43个文件,涵盖12个C源码(如单链表… · 2026/9/25 4:26:45

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码