模型量化4bit/8bit显存占用优化方案
量化为什么能省显存?
大模型(如Llama、ChatGLM)动辄占用十几GB甚至几十GB显存,普通显卡根本跑不动。模型量化就是把模型中原本用32位浮点数(FP32)存储的权重,压缩成4位或8位整数(INT4/INT8)。
这样做的好处是显存占用直接降到原来的1/8(4bit)或1/4(8bit),同时推理速度也能提升。
虽然精度会略有下降,但对大多数任务来说,效果依然可用。
环境搭建与依赖安装
你需要一台Linux服务器(推荐Ubuntu 20.04+),显卡建议NVIDIA T4、A10G、RTX 3090及以上,显存不低于8GB。
安装以下依赖:
# 更新pip并安装CUDA和PyTorch
pip install --upgrade pip
# 根据你的CUDA版本选择PyTorch,以CUDA 11.8为例
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 安装AutoGPTQ(支持4bit/8bit量化推理)
pip install auto-gptq
# 安装transformers、accelerate
pip install transformers accelerate
注意:如果你的显卡显存小于8GB,建议先从7B模型(如Llama-2-7B)开始,4bit量化后显存占用约4-5GB。
动手量化——以Llama模型为例
我们使用AutoGPTQ库对HuggingFace上的模型进行量化。
以下是一个完整的量化与推理脚本:
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
# 加载tokenizer
model_name = "meta-llama/Llama-2-7b-hf" # 替换成你的模型
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True)
# 定义量化配置:4bit
quantize_config = BaseQuantizeConfig(
bits=4, # 可选4或8
group_size=128, # 分组大小,影响精度和速度
desc_act=False # 是否用量化激活值,新手建议False
)
# 加载原始模型并量化
model = AutoGPTQForCausalLM.from_pretrained(
model_name,
quantize_config,
device_map="auto"
)
# 保存量化后的模型到本地
model.save_quantized("./llama-2-7b-4bit", use_safetensors=True)
print("量化完成,模型已保存至 ./llama-2-7b-4bit")
关键参数说明:
bits=4:指定位数,也可以设为8。4bit显存更小,但精度稍低;8bit更平衡。group_size=128:压缩粒度,通常设为128或64,数值越小精度越高但模型体积略大。device_map="auto":自动分配显存,如果显存不够会溢出到CPU。
量化后模型体积会大幅减小,原来的13GB(FP32)降为约2GB(4bit)。
避坑说明——常见报错与解决
- “CUDA out of memory”:原始模型加载时需要更多显存,可以在量化前用
load_in_4bit=True先加载?但更好的做法是使用AutoGPTQ的流式量化,或者先降低模型规模。或者把device_map设为"cpu",但速度会很慢。建议至少准备16GB系统内存配合CPU量化。 - “AttributeError: 'NoneType' object has no attribute 'xxxx'”:通常是tokenizer或模型路径不对,请确认模型名称能从HuggingFace正确下载或本地已有。
- 量化后推理结果变差:可以尝试调小
group_size(如64)或增大desc_act=True(需更多显存),或者改用8bit。 - 模型保存后无法加载:确保
use_safetensors=True,且加载时也指定use_safetensors=True。
验证量化效果与性能测试
显存占用测量
使用nvidia-smi实时查看显存,或使用Python代码:
import torch
print(f"显存占用:{torch.cuda.memory_allocated() / 1024**3:.2f} GB")
量化前FP32模型占7B×4B = 28GB(实际约13-14GB),4bit量化后约3.5GB(实际约2GB左右)。
推理时还会多占一部分kv cache,但相比原始显存节省极明显。
推理速度对比
可编写简单脚本,统计相同问题下量化前后每秒生成token数(tokens/s)。
4bit量化后通常能达到原始速度的70%~90%,且显存占用大幅降低。
常见问题解答
- Q:量化后模型还能微调吗? A:可以,但需要使用LoRA等技术,不建议直接全参微调。
- Q:CPU上可以量化吗? A:可以,但速度极慢,建议只在GPU上做。
- Q:8bit和4bit怎么选? A:显存够用优先8bit,精度更高;显存紧张选4bit。
如果你正在处理模型量化4bit/8bit显存占用的优化,建议先按照本文步骤完整操作一遍,再根据自己的显卡容量和精度需求调参。
遇到异常时,多看看避坑部分和AutoGPTQ的官方文档,一般都能解决。
更详细的配置调优可以参考阿里云文档和HuggingFace论坛,但请注意不同显卡型号和驱动可能影响结果,建议先在测试环境验证。