系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、量化
-
- [1.1 冗余与压缩](#1.1 冗余与压缩)
- [1.2 量化的价值](#1.2 量化的价值)
- [1.3 精度与显存的关系](#1.3 精度与显存的关系)
- [1.4 显存占用估算](#1.4 显存占用估算)
- [二、Transformers 中的主流集成方案](#二、Transformers 中的主流集成方案)
-
- [3.1 GPTQ 面向生成式模型的高效量化](#3.1 GPTQ 面向生成式模型的高效量化)
- [3.2 AWQ 激活感知权重量化](#3.2 AWQ 激活感知权重量化)
- [3.3 BitsAndBytes](#3.3 BitsAndBytes)
- [四、Qwen2.5 模型推理量化实战](#四、Qwen2.5 模型推理量化实战)
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、量化
- 量化 ,听起来是一个复杂的数学概念,但实际非常简单,就是 用较少的信息来表示数据,在尽量不损失模型性能的前提下,降低资源开销。
1.1 冗余与压缩
1.2 量化的价值
(1)降低显存开销,降低功率能耗:通常模型以 FP16(16位浮点数)格式存储,若量化为 INT8(8位整数),显存占用直接减半;若进一步量化为 INT4(4位整数),显存占用仅为原来的 1/4。原本需要多张 A100 才能加载的千亿模型,量化后可能只需一张消费级显卡即可运行。可别忘了,还能省电。
(2)提升推理速度:数据量的减少意味着内存带宽(Memory Bandwidth)压力的降低。在 LLM 推理这种典型的"内存受限(Memory-bound)"场景下,更快的权重加载速度直接转化为更快的 Token 生成速度。
(3) 推动大模型"下乡":千亿参数模型原本得蹲在机房(几十万的服务器),量化后一张3090/4090显卡甚至手机NPU就能跑。
1.3 精度与显存的关系
模型权重通常以浮点数形式存储,不同的精度决定了每个参数占用的字节数。
FP32(Full Precision):单精度浮点数,占用 4 Bytes。这是深度学习训练的默认精度,但在推理时通常不需要这么高。FP16/BF16(Half Precision):半精度浮点数,占用 2 Bytes。FP16:传统的半精度,数值范围较小,容易溢出。BF16(BFloat16):Google 提出的格式,牺牲了小数位精度以换取与 FP32 相同的数值范围(指数位),训练更稳定,是目前大模型训练的主流选择。
INT8:8 位整数,占用 1 Byte。INT4:4 位整数,占用 0.5 Byte(即 4 bit)。
1.4 显存占用估算
- 在计算机存储单位中, 1 G B = 1024 M B 1 GB = 1024 MB 1GB=1024MB, 1 M B = 1024 K B 1 MB = 1024 KB 1MB=1024KB。
- 但在估算模型参数量(如 7 B = 7 B i l l i o n 7B = 7 Billion 7B=7Billion)和显存( G B GB GB)时,为了方便,通常近似认为 1 GB ≈ 10 9 Bytes 1 \text{ GB} \approx 10^9 \text{ Bytes} 1 GB≈109 Bytes。如果追求精确计算,记得除以 1024 3 1024^3 10243。
- 模型所需显存大小的 通用估算公式 如下:
权重显存占用 ≈ 模型参数量 × 每参数占用字节数 \text{权重显存占用} \approx \text{模型参数量} \times \text{每参数占用字节数} 权重显存占用≈模型参数量×每参数占用字节数
- 以 Qwen2.5 为例,这里选择 Qwen2.5-7B (约 70 70 70 亿参数,即 7 × 10 9 7 \times 10^9 7×109):
(1)FP16 / BF16 精度(2 Bytes/参数):
7 × 10 9 × 2 Bytes ≈ 14 GB (13.2) 7 \times 10^9 \times 2 \text{ Bytes} \approx 14 \text{ GB} \tag{13.2} 7×109×2 Bytes≈14 GB(13.2)
(2)INT8 量化(1 Byte/参数):
7 × 10 9 × 1 Byte ≈ 7 GB (13.3) 7 \times 10^9 \times 1 \text{ Byte} \approx 7 \text{ GB} \tag{13.3} 7×109×1 Byte≈7 GB(13.3)
(3)INT4 量化(0.5 Byte/参数):
7 × 10 9 × 0.5 Byte ≈ 3.5 GB (13.4) 7 \times 10^9 \times 0.5 \text{ Byte} \approx 3.5 \text{ GB} \tag{13.4} 7×109×0.5 Byte≈3.5 GB(13.4)
-
但是,这只是模型权重的静态占用。实际运行时,还需要预留显存给:
- KV Cache:上下文缓存,与序列长度(Context Length)成正比,上下文越长,占用越大。
- 激活值:中间层计算结果,与 Batch Size 和序列长度相关。
- 框架开销:PyTorch / CUDA context 本身会占用一定开销。
-
所以,实际显存需求通常比估算值高 20 20%~30% 20。例如加载 7B 的 INT4 模型( 3.5 G B 3.5GB 3.5GB 权重),推荐显存至少 6 G B 6GB 6GB 起步。
二、Transformers 中的主流集成方案
虽然量化方法层出不穷,但在 Hugging Face Transformers 的官方文档与实践中,最常用的三类集成方式是加载
GPTQ、AWQ以及bitsandbytes(bnb)。
- 在代码层面,它们通常通过如下实现相对统一的调用体验。
python
# 搭配相应的配置类(如 GPTQConfig、AwqConfig、BitsAndBytesConfig)
AutoModel*.from_pretrained(..., quantization_config=...)
- 如果从使用场景来区分,
- ·
GPTQ和AWQ主要面向推理部署与加速,它们属于 PTQ(Post-Training Quantization) 算法,生成的模型通常以量化后的检查点形式保存,加载后显存占用低且推理速度快。 bitsandbytes则既常用于 8bit/4bit 推理,也是诸如 QLoRA 在内的一系列低显存微调方案的核心依赖,尤其擅长让大模型在单卡上完成 4-bit 训练。
- ·
PTQ(训练后量化):模型训完直接"硬砍"精度 → 快但容易翻车
QAT(量化感知训练):训练时就模拟量化效果 → 慢但稳如老狗
3.1 GPTQ 面向生成式模型的高效量化
GPTQ(Generative Pre-trained Transformer Quantization) 是一种面向大规模生成式 Transformer 的训练后量化(Post-Training Quantization,PTQ)技术。是经典的
OBQ(Optimal Brain Quantization) 算法在超大模型上的高效进化版,基于近似二阶信息实现了一次性权重量化(one-shot weight quantization)。
3.2 AWQ 激活感知权重量化
3.3 BitsAndBytes
BNB是承载 LLM.int8() 和QLoRA等前沿研究的工程基石。
四、Qwen2.5 模型推理量化实战
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。