当前位置: 首页 > news >正文

BitsAndBytes(简称 BnB)是一个用于“压缩”大语言模型的工具包

BitsAndBytes(简称 BnB)是一个用于“压缩”大语言模型的工具包,能把模型从原来的16位或32位,压成4位或8位,减少显存占用,同时保持尽量高的精度。


🧩 为什么叫 Bits and Bytes?

它的名字就揭示了它的本质:

  • Bits(比特):指的是更小单位的表示,比如 4-bit、8-bit 的低精度表示。
  • Bytes(字节):指的是标准 8-bit 表示 或 更多位的数据。
    合在一起,意思是“控制模型用多少位来表示参数”,从而节省资源。

💡 为什么要用 BitsAndBytes?

训练/推理 大型语言模型(LLaMA、GPT、Mistral 等)时,如果使用原始精度(16-bit float),会导致:

  • 显存爆炸(16GB 显卡跑不动)
  • 加载速度慢
  • 部署成本高

而 BitsAndBytes 允许我们把模型压缩成 8-bit 或 4-bit,让你:

✅ 在消费级显卡上运行
✅ 加载更快
✅ 精度损失小,可控


🔢 举例说明:原始模型 vs BnB 压缩模型

以 LLaMA 2-7B 模型为例:

模型格式占用显存(大概)精度情况
FP16 原始模型14~16 GB精度最高
BnB 8-bit 模型8~9 GB精度接近
BnB 4-bit 模型4~5.5 GB精度略降

🔧 技术实现

BitsAndBytes 使用了两种核心压缩方式:

压缩类型说明举例
8-bit 量化把每个参数从 16-bit → 8-bit数值范围从 ±65536 → ±256
4-bit 量化每个参数用 4-bit 表示,更极限一个 float 压缩为 16 分之一大小

它也提供了三种主流 量化模式(不用深究,但知道名字有用):

  • nf4(最常用,效果稳定)
  • fp4(浮点 4bit)
  • int4(整数 4bit)

🧪 示例:怎么用 BitsAndBytes 加载压缩模型(Python)

from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import BitsAndBytesConfig# 配置 4-bit 加载
bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_compute_dtype="float16",  # 用 fp16 来计算bnb_4bit_quant_type="nf4",         # 用 NF4 量化算法
)model_name = "unsloth/llama-3.1-8b-unsloth-bnb-4bit"model = AutoModelForCausalLM.from_pretrained(model_name,quantization_config=bnb_config,device_map="auto"
)tokenizer = AutoTokenizer.from_pretrained(model_name)

📌 总结一下,说得更简单点:

  • BitsAndBytes 就是个压缩工具包,能让大模型“瘦身”,轻松跑在普通电脑上;
  • 你只要看到 bnb-4bit、bnb-8bit,就知道用了这个工具
  • Unsloth 只是把它优化得更厉害一些而已

🧱 1. 什么是「量化(Quantization)」?

把模型里那些“高精度的数字”变成“低精度的小数字”,以此来减少模型体积、降低显存占用、提升加载速度


🎯 举个例子:

比如你有个模型参数是:

原始值:0.123456789(float32,32位)

如果我们只保留4位小数:

量化后:0.1235(float16 或 8-bit 或 4-bit)

你会失去一点精度,但整体性能几乎没变,资源节省巨大!


🧠 2. FP16 是什么?

✅ 定义:

  • FP16 = “16-bit Floating Point”
  • 是一种精度比 float32 低、但比 8-bit 高的数据格式

✅ 用途:

  • 用来训练或推理大型模型时节省内存
  • 精度和速度之间取得平衡,几乎不影响模型效果

🔢 3. 什么是 4-bit?

✅ 定义:

  • 表示每个参数只用 4位(半个字节)来存储
  • 比 FP16(16位)压缩了 4倍

✅ 代价:

  • 节省显存最多
  • 但精度有所降低(不同算法影响不同)

🛠️ 4. BitsAndBytes 是什么?

✅ 定义:

BitsAndBytes(简称 BnB)是一个库,用于自动把大模型做成 8-bit 或 4-bit 的压缩版本,并且保持它们能在 GPU 上跑。

✅ 用法:

  • 在 Transformers 中加载模型时配合使用:
from transformers import BitsAndBytesConfig

✅ 支持的压缩方式:

模式含义用处
bnb-8bit8-bit 量化精度几乎不降,省一半显存
bnb-4bit4-bit 量化精度略降,显存最省

🧱 5. 什么是 bnb-4bit?

✅ 定义:

就是“使用 BitsAndBytes 工具,将模型压缩成 4bit 精度的版本”。

你看到名字中有:

llama-2-7b-bnb-4bit

就说明这个模型:

  • 是用 BitsAndBytes 压成了 4-bit
  • 通常占用显存为原始的 1/4 ~ 1/3
  • 精度比 FP16 略低,但在很多实际应用中,效果差异不大

🧩 总结一下:区别和联系

术语类别是啥?举例和别人啥关系
量化技术名词降低模型精度压缩模型FP32 → 8bit → 4bit总称,下面几种都属于量化方式
FP16精度类型用16位浮点表示参数原始模型的精简版是一种 中等压缩的量化方式
4-bit精度类型每个参数只用4位表示参数值范围更小精度最低,但节省显存最多
BitsAndBytes工具把模型压成 4bit/8bit 工具bnb-4bit 就是它压的实现量化的工具库
bnb-4bit文件/模型后缀使用 BitsAndBytes 做的 4-bit 模型llama-2-7b-bnb-4bit是 4-bit 的一种具体实现方式

📌 举个通俗场景类比

想象你有一本书:

格式类比
FP32原版硬皮精装书
FP16纸质平装版
bnb-8bit黑白复印本
bnb-4bit缩印+删图版手册

你还能看懂它在讲啥,但体积轻多了。


✅ 如果你在开发中怎么选?

你拥有的资源推荐格式使用方式
显卡很强(A100/4090)FP16 或 FP32不用压缩,保持最佳精度
显卡一般(8GB)bnb-4bit用 BitsAndBytes 量化运行
CPU 推理GGUF+CPU 模式用 llama.cpp 加载 .gguf

🧠 一句话总结:

FP32、FP16、8bit、4bit 都是表示数字的格式,表示的越精细,占用的空间越大。
压缩后模型运行更快、显存占用更小,但精度也会降低。


📦 它们的关系(由高到低精度):

格式全称精度(位)精度高吗?显存占用举例
FP32Float 32位32-bit⭐⭐⭐⭐⭐🟥最大0.1234567890123456(精确)
FP16Float 16位16-bit⭐⭐⭐⭐☆🟧中等0.1234(舍去一部分小数)
8bit整数8位8-bit⭐⭐☆☆☆🟨小0.12(小数更少)
4bit整数4位4-bit⭐☆☆☆☆🟩最小0.1(最粗略的近似)

💬 用比喻来说:

格式类比成衣服定制
FP32高级西装,按厘米剪裁(超精准)
FP16成衣店西装,按大中小分尺码(较精准)
8bit淘宝快时尚,按身高估尺码(能穿)
4bit地摊衣服,只分男女(凑合能穿)

🔢 用数字实际表示的范围与精度

假设你要保存数字 0.123456789

格式实际能保存成啥
FP320.123456789 (全部保留)
FP160.1235(只保留4位有效)
8bit0.12(可能只有两位有效)
4bit0.1(基本靠近大概意思)

🧪 举个真实例子:加载 LLaMA2-7B 模型

格式模型大小显存要求精度变化是否可训练
FP3214GB+28~32GB无损✅ 可训练
FP16~13GB14~16GB几乎无损✅ 可训练
8bit~8GB8~9GB有些误差❌ 通常只推理
4bit~4.2GB5~6GB精度损失多❌ 通常只推理

🔧 技术区别

格式类型是否浮点描述
FP32浮点数✅ 是32位浮点,训练 & 推理标准格式
FP16浮点数✅ 是用一半的位表示 float
8bit整数/量化❌ 否一般用于推理(int8)
4bit整数/量化❌ 否极致压缩,用于推理(int4)

✅ 什么时候用哪个?

你有的显存/算力推荐格式原因
>= 32GB 显存FP32最高精度,适合训练
>= 16GB 显存FP16精度接近 FP32,适合训练和推理
>= 8GB 显存8bit可跑大模型推理,损失精度较少
>= 4GB 显存4bit极限压缩,仅用于推理,速度快

🧠 总结一句话:

想省资源用 4bit 或 8bit,
想高精度用 FP16 或 FP32,
模型越小、速度越快,精度也会越低。


http://www.lryc.cn/news/571850.html

相关文章:

  • OpenStack入门
  • Karate UI 基本概念之一
  • python校园服务交流系统
  • 自动打电话软件设计与实现
  • cloudera manager 页面启动nodemanager失败,后端没有启动 8040
  • Python装饰器decorators和pytest夹具fixture详解和使用
  • 【强化学习】【笔记】【ch.10】GRPO / DAPO - 目前最优强化微调算法
  • openEuler安装BenchmarkSQL
  • AI Agent 与 Agentic AI 有何不同?
  • 7.索引库操作
  • 代码随想录算法训练营day8
  • 前端打断点
  • SSRF7 SSRF漏洞的检测方式
  • Uniapp 中根据不同离开页面方式处理 `onHide` 的方法
  • 意法STM32F103C8T6 单片机ARM Cortex-M3 国民MCU 电机控制到物联网专用
  • Ubuntu22.04安装opengauss并配置远程访问、JDBC连接
  • 2025年中总结
  • 项目:Gitlab HSD CI/CD总结
  • 从零Gazebo中实现Cartographer算法建图(新目录)
  • Win11用户尽快删除更新!微软6月又推Bug
  • VGG-19(Visual Geometry Group)模型
  • Linux系统移植11:修改网络驱动
  • 获取jenkins中的构建数据
  • FPGA基础 -- Verilog行为级建模之时序控制
  • markRaw
  • 【java中使用stream处理list数据提取其中的某个字段,并由List<String>转为List<Long>】
  • 爱普特APT32F1104C8T6单片机 高抗干扰+硬件加密双保障
  • 支持向量机(SVM)例题
  • VS Code自动删除末尾空行设置
  • 无需公网IP:Termux+手机+内网穿透实现Minecraft远程多人联机