ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Accelerate 模型量化实战:基于 bitsandbytes 的 8-bit / 4-bit 模型加载与推理

Accelerate 模型量化实战:基于 bitsandbytes 的 8-bit / 4-bit 模型加载与推理 人工智能深度学习分布式训练【免费下载链接】accelerate A simple way to launch, train, and use PyTorch models on almost any device and distributed configuration, automatic mixed precision (including fp8), and easy-to-configure FSDP and DeepSpeed support项目地址https://gitcode.com/gh_mirrors/ac/accelerate点击查看免费下载导读本文围绕 HuggingFace Accelerate 项目当前仓库src/accelerate的 模型量化指南 展开系统讲解如何借助bitsandbytes集成用几行代码将任意 PyTorch 模型以 8-bit 或 4-bit 精度加载从而在显存受限的设备如单卡 GPU、Google Colab上运行数十亿参数的大模型。读完本文你将掌握BnbQuantizationConfig的全部配置项与取值、load_and_quantize_model的底层加载流程、8-bit 模型保存与重新加载、CPU/磁盘模块卸载offload以及量化模型的 PEFT 微调注意事项。bitsandbytes 集成总览Accelerate 将bitsandbytes的量化能力封装进了自身工具链你可以在不改变模型架构的前提下把模型中的torch.nn.Linear层替换为bitsandbytes的 8-bitbnb.nn.Linear8bitLt或 4-bitbnb.nn.Linear4bit实现其余层保持原始精度。这一集成主要落地在三个位置配置类 BnbQuantizationConfig定义量化参数并做合法性校验加载入口 load_and_quantize_model完成层替换、权重装载与设备分发工具导出 utils/init.py从accelerate.utils暴露BnbQuantizationConfig与load_and_quantize_model。如果你使用的是transformers模型建议直接遵循 transformers 官方量化文档其底层同样调用 Accelerate 的这套机制而本文面向的是任意 PyTorch 模型示例使用 minGPT 的 GPT-2。环境准备Pre-Requisites动手前需要安装以下依赖安装bitsandbytes库pip install bitsandbytes非 CUDA 设备如 ROCm 多后端请参照 bitsandbytes 的安装指南选择对应后端版本。从源码安装最新版accelerate8-bit / 4-bit 量化能力持续演进建议使用最新源码而非过旧的 PyPI 发布版pip install githttps://github.com/huggingface/accelerate.git安装示例依赖minGPT与huggingface_hubgit clone https://github.com/karpathy/minGPT.git pip install minGPT/ pip install huggingface_hub核心加载流程init_empty_weights load_and_quantize_model第一步用 init_empty_weights 构建空模型init_empty_weights是一个上下文管理器在其内部创建的模型所有参数都会被放到metadevice 上因此实例化模型几乎不消耗任何显存或内存。源码见 big_modeling.py它通过init_on_device(torch.device(meta))劫持register_parameter把参数注册为 meta 设备上的空张量。这解决了先加载 FP32 模型再量化导致的峰值内存问题。以 minGPT 的 GPT-2 为例from accelerate import init_empty_weights 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)注意在init_empty_weights下创建的模型没有实际权重不能直接model.to(device)必须通过后续的权重装载函数把权重填进去详见下文。第二步获取权重路径权重路径可以是以下任意一种一个完整的state_dict文件如pytorch_model.bin一个分片 checkpoint 的索引.json文件一个包含唯一.index.json索引与若干分片文件的目录一个包含唯一pytorch_model.bin文件的目录。用huggingface_hub下载分片权重from huggingface_hub import snapshot_download weights_location snapshot_download(repo_idmarcsun13/gpt2-xl-linear-sharded)第三步配置 BnbQuantizationConfigBnbQuantizationConfig定义见 dataclasses.py是量化的参数中心。其字段、默认值与说明如下参数默认值说明load_in_8bitFalse是否启用 8-bit 量化llm_int8_threshold6.0离群值outlier阈值仅load_in_8bitTrue时生效load_in_4bitFalse是否启用 4-bit 量化bnb_4bit_quant_typefp44-bit 量化数据类型可选{fp4, nf4}bnb_4bit_use_double_quantFalse是否启用嵌套量化对第一次量化的量化常数再次量化bnb_4bit_compute_dtypefp16计算精度可选{fp32, fp16, bf16}输入可以是 fp32 而计算用 bf16 以提速torch_dtypeNone其余未量化层的数据类型bitsandbytes 建议 8-bit 模型设为torch.float164-bit 模型与计算精度一致skip_modulesNone不参与量化的模块名列表这些模块保持torch_dtypekeep_in_fp32_modulesNone不参与量化且保持torch.float32的模块名列表8-bit 配置示例from accelerate.utils import BnbQuantizationConfig bnb_quantization_config BnbQuantizationConfig(load_in_8bitTrue, llm_int8_threshold6)4-bit 配置示例from accelerate.utils import BnbQuantizationConfig bnb_quantization_config BnbQuantizationConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_typenf4, )参数校验与自动补全源码级细节从 dataclasses.py 的__post_init__可以看到以下约束load_in_4bit与load_in_8bit不能同时为True也不能同时为False否则抛ValueErrorbnb_4bit_quant_type仅接受fp4/nf4bnb_4bit_compute_dtype与torch_dtype支持传入字符串fp32/fp16/bf16并自动转换为对应的torch.dtypeload_in_4bitTrue时目标 dtype 被设为CustomDtype.INT4load_in_8bitTrue时被设为torch.int8llm_int8_threshold仅对 8-bit 有意义若 4-bit 下修改该值会发出警告torch_dtype未指定时8-bit 模型默认torch.float164-bit 模型默认等于bnb_4bit_compute_dtype。第四步加载并量化from accelerate.utils import load_and_quantize_model quantized_model load_and_quantize_model( empty_model, weights_locationweights_location, bnb_quantization_configbnb_quantization_config, )底层发生了什么load_and_quantize_model的实现位于 utils/bnb.py核心步骤可以概括为版本检查8-bit 需要is_8bit_bnb_available()4-bit 需要is_4bit_bnb_available()版本不兼容直接报错确定跳过模块若未显式传skip_modules会自动调用 get_keys_to_not_convert 找出需要保持全精度的模块典型如lm_head以及被 tie 的权重以保证数值稳定性同时keep_in_fp32_modules会被追加进不转换名单标记兼容属性给模型挂上is_loaded_in_4bit/is_loaded_in_8bit便于 PEFT 等库识别空模型分支若模型在 meta 设备上则在init_empty_weights上下文中通过 replace_with_bnb_layers 递归地把所有nn.Linear替换为bnb.nn.Linear8bitLt8-bit传入llm_int8_threshold或bnb.nn.Linear4bit4-bit传入 compute dtype、double quant、quant type随后计算设备映射、用load_checkpoint_in_model装载权重、最后用dispatch_model分发已加载模型分支若模型已带权重会发出不推荐警告后直接在原模型上做层替换与 dtype 转换keep_in_fp32_modules保持 fp32其余浮点参数转为torch_dtype并把模型搬到 GPU/XPU。仓库测试 tests/test_quantization.py 覆盖了上述路径包括 8-bit / 4-bit 的内存占用验证test_memory_footprint、线性层确实被替换为 bnb 层test_linear_are_8bit/test_linear_are_4bit、fp32 保留模块转换test_fp32_8bit_conversion、自定义 device_map 加载test_cpu_gpu_loading_custom_device_map等可作为你自行验证行为的参考。8-bit 模型的保存与重新加载你可以用Accelerator.save_model保存量化后的模型from accelerate import Accelerator accelerate Accelerator() new_weights_location path/to/save_directory accelerate.save_model(quantized_model, new_weights_location) quantized_model_from_saved load_and_quantize_model( empty_model, weights_locationnew_weights_location, bnb_quantization_configbnb_quantization_config, device_mapauto, )Accelerator.save_model实现见 accelerator.py默认以safetensors格式safe_serializationTrue保存支持按max_shard_size默认10GB自动分片若模型包含被卸载的参数会先聚合离线的 state dict 再保存。需要特别注意的是4-bit 模型的序列化目前尚不支持只有 8-bit 模型可以保存与重新加载。将模块卸载到 CPU 与磁盘Offload当 GPU 显存不足以容纳整个量化模型时可以把部分模块卸载到 CPU 甚至磁盘这复用了 Accelerate 大模型推理big model inference的底层能力参见 大模型推理指南 与 big_modeling.py 中dispatch_model的实现。被卸载的模块在前向传播需要时会被临时搬到 GPU用完再放回。8-bit 量化被选中的模块会被转换为 8-bit 精度4-bit 量化被选中的模块会保持你在BnbQuantizationConfig中传入的torch_dtype待 4-bit 序列化支持落地后这些卸载模块的 4-bit 转换能力也会随之补充。只需传入自定义device_map即可device_map { transformer.wte: 0, transformer.wpe: 0, transformer.drop: 0, transformer.h: cpu, transformer.ln_f: disk, lm_head: disk, }从 utils/bnb.py 的源码可以看到当device_map是包含多键的字典时值为cpu/disk的模块会被加入modules_on_cpu并且在 4-bit 模式下会被追加到skip_modules即这些模块不被 4-bit 化保持torch_dtype。另外若使用device_mapauto/balanced/balanced_low_0/sequential等字符串策略get_quantized_model_device_map 会结合max_memory、no_split_module_classes自动推断设备映射其中 4-bit 模型不允许将量化模块自动派发到 CPU/磁盘——此时应显式传入自定义device_map并配合offload_folder使用。量化模型的微调PEFT 适配器路线量化模型不支持纯 8-bit / 4-bit 的全量训练。可行的微调方式是参数高效微调PEFT——在量化权重之上训练 LoRA 等适配器。需要注意的是目前并非任意量化模型都能直接挂适配器对于 transformers 模型其官方已支持在量化模型上添加适配器可遵循 transformers 官方量化文档并参考其 4-bit 微调 demo加载用于训练的量化模型时不要传device_map模型会被自动加载到 GPUdevice_mapauto仅用于推理场景。实战效果参考Google Colab 上运行 GPT2-1.5B官方提供了一个 Google Colab demo演示在免费单卡环境运行量化后的 GPT2 模型。文中给出的数据作为可复现的实测参考GPT2-1.5B 的 FP32 检查点约占 6GB 内存量化后8-bit 模块占用约 1.6GB4-bit 模块占用约 1.2GB显存开销缩减至原来的约 1/41/5这正是 bitsandbytes 集成的核心价值让消费级 GPU 也能加载与推理大模型。总结与适用边界何时使用单卡显存不足以加载 FP32/FP16 模型时优先考虑 8-bit / 4-bit 量化加载核心 API 一览init_empty_weights空模型BnbQuantizationConfig量化参数load_and_quantize_model装载与量化Accelerator.save_model仅 8-bit 可保存 自定义device_mapCPU/磁盘卸载已知限制4-bit 模型暂不支持序列化量化模型只能通过 PEFT 适配器微调4-bit 自动 device_map 不允许把量化层派发到 CPU/磁盘运行前提量化过程需要 GPU或 Intel XPU环境CPU 上无法完成 bitsandbytes 量化加载。以上能力均可在当前仓库 src/accelerate/utils/bnb.py、src/accelerate/utils/dataclasses.py 与 tests/test_quantization.py 中进一步验证与探索。赞分享人工智能深度学习分布式训练【免费下载链接】accelerate A simple way to launch, train, and use PyTorch models on almost any device and distributed configuration, automatic mixed precision (including fp8), and easy-to-configure FSDP and DeepSpeed support项目地址https://gitcode.com/gh_mirrors/ac/accelerate点击查看免费下载相关推荐Oumi 模型量化实战指南基于 AWQ 与 BitsAndBytes 的 4-bit/8-bit 权重量化Oumi 模型量化实战指南基于 AWQ 与 BitsAndBytes 的 4 bit/8 bit 权重量化 Oumi 提供了内置的模型量化Quantizat人工智能大模型预训练微调强化学习模型推理服务模型评测MCP 服务分布式训练模型量化TorchVision 量化 ResNeXt 模型使用指南基于 QuantizableResNet 的 8-bit 推理实战TorchVision 量化 ResNeXt 模型使用指南基于 QuantizableResNet 的 8 bit 推理实战 本文以 docs/source/计算机视觉深度学习图像处理数据集OLMo 模型推理基于 AutoGPTQ 的 4-bit 后训练量化实战指南OLMo 模型推理基于 AutoGPTQ 的 4 bit 后训练量化实战指南 本篇技术指南聚焦 OLMo 开源项目中的 LLM 推理子模块 inferenc人工智能大模型预训练微调上一篇魔兽争霸III终极修复指南5分钟解决现代系统兼容性问题下一篇精准高效WeChatExporter自定义日期区间导出微信聊天记录实用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表