微调模型量化,INT4/INT8压缩降低显存占用

微调大模型时显存不够用,最直接的办法不是换卡,而是把模型权重从 FP16 压缩到 INT4 或 INT8。
量化后的模型体积能减少约 50%~75%,配合 LoRA 微调,一张 8GB 显存的消费级显卡也能跑 7B 级模型。
下面这份教程从安装依赖开始,带你完成量化微调的完整流程。

先判断你的场景是否需要量化

量化适合两类情况:一是单卡显存跑不满模型加载,二是想降低单位训练成本。
注意,INT4 和 INT8 量化会轻微损失精度,如果任务对结果要求极高,建议先在 FP16 上试几个 step 对比损失变化。

微调阶段使用量化,通常搭配 LoRA 或 QLoRA。
LoRA 只训练少量可学习参数,原始权重冻结并量化存储,这样显存消耗大头就从模型权重变成了激活值和优化器状态。
如果你打算全量微调,量化带来的收益会大打折扣,因为反传时需要高精度梯度。

安装依赖和确认显卡驱动

推荐使用 Python 3.9 以上版本,并安装 PyTorch 与 CUDA 版本匹配的依赖。
核心库是 bitsandbytes,它负责在 GPU 上加载量化后的权重。

pip install bitsandbytes transformers accelerate peft

验证 bitsandbytes 是否能识别 GPU:

python -c "import bitsandbytes as bnb; print(bnb.cuda_setup())"

没有报错就说明环境正常。
如果输出里出现 libbitsandbytes_cuda.so 找不到,通常是 CUDA 版本不匹配,可以尝试重新安装对应 CUDA 版本的 bitsandbytes,或升级驱动到 525 以上。

用 INT4/INT8 加载模型并配置微调参数

加载模型时,通过 BitsAndBytesConfig 指定量化类型。
下面是 INT4 的配置示例:

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype="float16",
    bnb_4bit_use_double_quant=True
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True
)

要把 load_in_4bit 换成 load_in_8bit=True 即为 INT8 量化。device_map="auto" 很关键,
它会自动把部分层放到 CPU 或 GPU 上,
避免单卡溢出。

接着用 Peft 初始化 LoRA 配置:

from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training

model = prepare_model_for_kbit_training(model)
lora_config = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)

prepare_model_for_kbit_training 会冻结原有权重并启用梯度检查点,进一步降低显存。

训练时的关键参数如下:

  • per_device_train_batch_size:从 1 开始试,逐步加大。
  • gradient_accumulation_steps:用累积步数弥补 batch size 的不足。
  • fp16=Truebf16=True:混合精度训练能减少显存占用。
  • gradient_checkpointing=True:开启后显存占用下降约 30%,代价是训练变慢。

常见报错和避坑提示

显存溢出仍然出现。 优先把 batch size 降到 1,关闭 model.max_memory 设置,并检查是否有其他进程占用显存。
也可以用 torch.cuda.empty_cache() 手动释放缓存。

训练中 loss 变成 nan。 多数是 bnb_4bit_compute_dtype 设置过高,比如用了 float32 导致部分算子溢出。
改为 float16,并确保输入数据也转成 model.dtype

加载模型速度很慢。 首次加载需要下载权重并量化,第二次开始有缓存。
如果磁盘空间不足,也可能触发反复加载,建议保留至少 15GB 空闲空间。

另外,
不同模型的 target_modules 不一样,
如果 LoRA 找不到目标模块,
去模型 config 里查看 modules_to_save 或对应的模块名,
一般包含 q_projv_projk_projo_proj 这些 attention 层。

验证量化微调后的效果

训练完成后,保存 LoRA 权重:

model.save_pretrained("./lora-int4")

评估效果时不要只看显存数字,还要对比量化前后的困惑度或任务准确率。
一个简单的验证方法是用同一段 prompt 分别让量化模型和原模型生成回答,观察语义是否偏差过大。
如果想确认显存确实降了,可以在训练过程中用 nvidia-smi 观察显存峰值,通常 INT4 加载 7B 模型只需 5~7GB,相比 FP16 能节省一半以上。

量化微调是显存受限环境下的实用方案,但请留意:不同显卡和驱动对 bitsandbytes 的支持程度有差异,遇到未知报错时,优先以官方 GitHub 和 Transformers 文档为准。
如果你正在处理 INT4/INT8 量化微调显存占用问题,建议照本文步骤跑通一个小模型,再替换成自己的目标模型;
遇到异常时回看避坑部分,多半能定位到原因。

分享到:
上一篇
Agent会话导出,完整对话历史导出JSON用于问题复盘
下一篇
Agent限流区分用户组,免费版限制工具调用次数
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意