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

大模型量化与双重量化(2)-- 代码示例与解释

文章目录

    • 代码示例
    • BitsAndBytesConfig 配置详解
      • `load_in_4bit=True`
      • `bnb_4bit_use_double_quant=True`
      • `bnb_4bit_quant_type="nf4"`
      • `bnb_4bit_compute_dtype=torch.bfloat16`
    • 内存使用对比
    • 为什么选择这些参数

代码示例

from transformers import AutoModelForCausalLM
import torch# 定义量化配置
bnb_config = BitsAndBytesConfig(load_in_4bit=True,                    # 4位量化bnb_4bit_use_double_quant=True,       # 双重量化bnb_4bit_quant_type="nf4",           # NF4量化类型bnb_4bit_compute_dtype=torch.bfloat16, # 计算数据类型
)# 加载量化模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf",quantization_config=bnb_config,device_map="auto"
)

这段代码创建了一个BitsAndBytesConfig配置对象,用于设置模型的量化参数。下面是每个参数的含义和作用:

BitsAndBytesConfig 配置详解

load_in_4bit=True

作用:启用4位量化加载模型

  • 将模型权重从FP32/FP16压缩到4位整数
  • 内存使用量减少约87.5%(32位→4位)
  • 例如:7B模型从28GB压缩到约3.5GB

bnb_4bit_use_double_quant=True

作用:启用双重量化(前面详细解释过的技术)

  • 对量化过程中的缩放因子也进行量化
  • 进一步节省10-15%的内存
  • 这是QLoRA的核心创新之一

bnb_4bit_quant_type="nf4"

作用:指定量化类型为NF4(NormalFloat4)

  • NF4:专为神经网络权重分布优化的4位数据类型
  • 相比传统的均匀量化(fp4),NF4能更好地处理权重的正态分布特性
  • 在相同压缩率下提供更好的模型性能

bnb_4bit_compute_dtype=torch.bfloat16

作用:设置计算时的数据类型

  • 虽然权重以4位存储,但计算时会临时转换为bfloat16
  • bfloat16相比float16有更大的数值范围,减少溢出风险
  • 在推理过程中提供数值稳定性

内存使用对比

以Llama-2-7B模型为例:

原始模型

  • 存储:~28GB(7B参数 × 4字节)
  • 计算:FP32

使用此配置后

  • 存储:~3.2GB(4位权重 + 双重量化的缓存参数)
  • 计算:临时转换为bfloat16进行运算
  • 内存节省:约88%

为什么选择这些参数

NF4 vs FP4

  • NF4专门针对神经网络权重的分布特性设计
  • 在[-1, 1]范围内提供更密集的量化点
  • 对于接近0的小权重值有更高精度

bfloat16计算类型

  • 比float16有更大的数值范围(指数部分更宽)
  • 减少数值溢出和下溢问题
  • 在现代硬件上有良好支持

这个配置是目前QLoRA微调和推理的标准设置,在保持模型性能的同时最大化内存效率。

http://www.xdnf.cn/news/8449.html

相关文章:

  • Neo4j入门第二期(Spring Data Neo4j的使用)
  • Oracle 的 MOVE 操作是否重建表?
  • 【学习笔记】Sophus (Python) 使用文档
  • C#调用第三方C++版本SDK过程
  • windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内
  • ES6 新增 API 方法
  • ​​3D 几何建模工具库​Open CASCADE(OCCT)简单介绍。
  • 如何评估物联网框架的交互体验?
  • springboot SnailJob client(客户端) 启动失败
  • 机器学习与深度学习:区别与联系
  • 【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10
  • 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面
  • 带您了解工业级网络变压器的浪涌等级测试有哪些条件?
  • mysql底层数据结构
  • 怎么判断一个Android APP使用了React Native 这个跨端框架
  • 【Golang】部分语法格式和规则
  • matlab时间反转镜算法
  • 2025年电工杯A题第一版本Q1-Q4详细思路求解+代码运行
  • day24Node-node的Web框架Express
  • C# Windows Forms应用程序-001
  • 国产矢量网络分析仪怎么样?能用在哪里?
  • 打破传统范式,线上 3D 画展彰显多元亮点
  • C语言---动态内存管理、柔性数组
  • unity控制相机围绕物体旋转移动
  • Maven打包SpringBoot项目,因包含SpringBootTest单元测试和Java预览版特性导致打包失败
  • 【leetcode】3356. 零数组变换②
  • 【uniapp】 iosApp开发xcode原生配置项(iOS平台Capabilities配置)
  • SFP与Unsloth:大模型微调技术全解析
  • 如何使用patch-package给npm包打补丁
  • 基于Java的话剧购票小程序【附源码】