AI测试架构知识库AI测试架构知识库
首页
  • 方法论体系
  • 评估体系
  • 对比分析
  • 最佳实践
  • LLM技术
  • VLM技术
  • Agent技术
  • RAG技术
  • 模型评估
  • 自愈测试
  • UI测试场景
  • API测试场景
  • 性能测试场景
  • 安全测试场景
  • 移动测试场景
  • 数据工程
  • MLOps实践
  • 平台建设
  • DevOps集成
  • 质量评估
  • 效果度量
  • 风险控制
  • 合规审计
  • 视觉融合
  • 稳定性测试
  • 服务端技术
  • 系统架构
  • 前沿探索
  • 软技能
首页
  • 方法论体系
  • 评估体系
  • 对比分析
  • 最佳实践
  • LLM技术
  • VLM技术
  • Agent技术
  • RAG技术
  • 模型评估
  • 自愈测试
  • UI测试场景
  • API测试场景
  • 性能测试场景
  • 安全测试场景
  • 移动测试场景
  • 数据工程
  • MLOps实践
  • 平台建设
  • DevOps集成
  • 质量评估
  • 效果度量
  • 风险控制
  • 合规审计
  • 视觉融合
  • 稳定性测试
  • 服务端技术
  • 系统架构
  • 前沿探索
  • 软技能
  • 模型训练

    • 模型训练与微调
    • 预训练(Pre-training)
    • 指令微调(SFT)
    • 模型压缩(Compression)
    • 偏好对齐(Alignment)

📦 模型压缩(Compression)

一句话总结:模型压缩在尽量不损失精度的前提下,减少模型的参数量、计算量和内存占用,让大模型能够部署到资源受限的环境中。

📋 目录

  • 压缩概述
  • 量化(Quantization)
  • 剪枝(Pruning)
  • 知识蒸馏(Knowledge Distillation)
  • 综合对比
  • 实践指南

📖 压缩概述

为什么需要压缩?

压缩效果对比(Llama-3-70B 示例)

精度模型大小显存占用推理速度质量损失
FP16140 GB140 GB+基准0%
FP870 GB70 GB+×1.5-2<1%
INT835 GB35 GB+×2-31-3%
INT417.5 GB17.5 GB+×3-43-8%
FP4~12 GB~12 GB+×4-55-15%

🔢 量化(Quantization)

量化类型对比

量化基础概念

概念说明
线性量化int8 = round(float / scale) + zero_point
per-channel每个通道独立 scale(权重常用)
per-token每个 token 独立 scale(激活常用)
混合精度不同层使用不同精度
对称量化zero_point = 0,范围 [-127, 127]
非对称量化范围 [0, 255] 或自定义

INT8 vs INT4 量化

特性INT8INT4
精度损失小 (1-3%)中 (3-8%)
压缩率2×4×
硬件支持广泛(TensorRT)部分(GGUF/AWQ)
部署难度低中
推荐场景服务端端侧 / 高并发

GGUF / llama.cpp

AWQ(Activation-Aware Quantization)

# AWQ 核心思想:保护重要权重的精度
# 通过激活值感知,识别对输出影响大的权重

import awq

quant_config = {
    "zero_point": True,      # 使用 zero_point
    "q_group_size": 128,     # 量化组大小
    "w_bit": 4,              # 权重位宽
    "version": "GEMM",       # 使用 GEMM kernel
}

model = AutoAWQForCausalLM.from_pretrained(
    "model_path",
    quant_config=quant_config
)
model.quantize(tokenizer, quant_config=quant_config)

SmoothQuant

问题:激活值的动态范围远大于权重
  激活: [-100, 100] → 量化困难
  权重: [-0.1, 0.1] → 容易量化

SmoothQuant 解法:在矩阵乘法前偏移动态范围
  引入参数 s: out = (X/s) × (W×s)
  让 X/s 和 W×s 的动态范围接近

✂️ 剪枝(Pruning)

剪枝分类

结构化 vs 非结构化

特性结构化剪枝非结构化剪枝
粒度通道/层/头单个权重
速度提升显著(稀疏→稠密)不明显(需特殊库)
精度损失较大较小
实现复杂度简单复杂
硬件利用好(标准矩阵运算)差(需稀疏加速)

通道剪枝

# 基于通道范数的结构化剪枝示例
import torch

def prune_channels(model, ratio=0.2):
    """
    基于权重范数剪枝模型中的冗余通道
    """
    for name, module in model.named_modules():
        if isinstance(module, (torch.nn.Linear,)):
            # 计算每个输出的权重 L2 范数
            weight = module.weight.data
            channel_norm = weight.norm(dim=1)
            
            # 找到需要剪枝的通道(范数最小的)
            num_prune = int(ratio * len(channel_norm))
            prune_indices = torch.topk(channel_norm, num_prune, largest=False).indices
            
            # 掩码化
            mask = torch.ones_like(channel_norm)
            mask[prune_indices] = 0
            module.weight.data *= mask[:, None]

剪枝效果

剪枝率模型大小速度提升精度损失
10%90%×1.2<1%
30%70%×1.51-3%
50%50%×23-8%
70%30%×3+8-15%

🧪 知识蒸馏(Knowledge Distillation)

蒸馏原理

蒸馏损失函数

L_total = α × L_hard + β × L_soft + γ × L_feature
损失项公式作用
L_hardCE(y_true, y_pred)保持原始任务性能
L_softKL(T_logit, S_logit/T)学习教师知识分布
L_featureMSE(h_t, h_s)中间层特征对齐

蒸馏策略对比

策略描述学生模型效果
Logits 蒸馏学习 Soft Labels7B-13B⭐⭐⭐⭐
Feature 蒸馏中间层对齐3B-7B⭐⭐⭐⭐⭐
交互蒸馏师生交替训练1B-3B⭐⭐⭐⭐
自蒸馏自训练自蒸馏同规模⭐⭐⭐
MoE 蒸馏稠密→稀疏7B MoE⭐⭐⭐⭐

实战:LLaMA-2-70B → LLaMA-2-7B

from transformers import DistillationTrainer, AutoModelForCausalLM

# 教师模型(冻结)
teacher = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-70b-hf")
teacher.eval()
teacher.requires_grad_(False)

# 学生模型
student = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")

# 蒸馏训练配置
distill_config = {
    "alpha": 0.5,    # hard loss 权重
    "beta": 0.5,     # soft loss 权重
    "temperature": 4.0,  # soft logit 温度
}

trainer = DistillationTrainer(
    model=student,
    teacher=teacher,
    args=training_args,
    distillation_config=distill_config,
    ...
)

蒸馏效果对比

学生模型方法MMLU 得分HumanEval
LLaMA-2-7B 基线仅 SFT64.3%23.2%
LLaMA-2-7BLogits 蒸馏67.1%28.5%
LLaMA-2-7BFeature 蒸馏69.8%32.1%
LLaMA-2-13B 基线仅 SFT68.2%32.8%
LLaMA-2-7B特征蒸馏+增强70.5%35.2%

Pro Tip:蒸馏的效果高度依赖训练数据质量。使用 SFT 高质量数据做蒸馏,效果远好于使用预训练数据。

📊 综合对比

方法选择矩阵

场景推荐方法预期效果
快速部署,精度优先INT8 PTQ + 校准×2 速度,<2% 损失
极致压缩,可接受损失INT4 AWQ×4 速度,5% 损失
移动端部署INT4 GGUF手机可运行 7B
训练资源充足蒸馏 + 量化小模型接近大模型
推理成本敏感量化 + 剪枝组合最大化吞吐

组合压缩策略

🛠️ 实践指南

量化流程

# 完整量化流程
from optimum.bettertransformer import BetterTransformer
from auto_gptq import AutoGPTQForCausalLM

# 1. 加载模型
model = AutoModelForCausalLM.from_pretrained("model_path")

# 2. 准备校准数据(256-512 条真实 query)
calibration_data = load_calibration_dataset("samples", n_samples=512)

# 3. 执行量化
quantized_model = AutoGPTQForCausalLM.from_pretrained(
    model,
    quantize_config={
        "bits": 4,
        "group_size": 128,
        "damp_percent": 0.01,
        "desc_act": False,
    }
)
quantized_model.quantize(calibration_data)

# 4. 评估效果
eval_results = evaluate(quantized_model, test_dataset)
print(f"MMLU: {eval_results['mmlu']:.1f}%")  # 检查精度损失

# 5. 保存
quantized_model.save_quantized("quantized_model/")

评估 checklist

指标目标检查方法
模型大小压缩到目标比例du -sh model/
推理速度提升 2×+benchmark latency
吞吐量提升 3×+benchmark TPS
精度损失<5% (INT8) / <10% (INT4)MMLU/GSM8K
功能完整性无明显退化人工测试

📚 延伸阅读

  • AWQ: Activation-Aware Quantization
  • SmoothQuant: Accurate and Efficient Post-Training Quantization
  • GPTQ: Accurate Post-Training Quantization
  • Distilling the Knowledge in a Neural Network — 蒸馏开山之作
  • LoRA vs Quantization: Which is Better? — 实践对比
在线编辑文档
上次更新: 2026/4/28 17:49
贡献者: colewort
Prev
指令微调(SFT)
Next
偏好对齐(Alignment)