Skip to content

技术原理核心

模型量化的本质

什么是"简化版本"

在 LLM 领域,"简化版本"通常指通过模型压缩技术减小模型体积的计算资源需求,主要手段包括:

  1. 量化(Quantization):降低数值精度

    • FP32 → FP16/BF16:半精度浮点
    • FP16 → INT8:8 位整数量化
    • FP16 → INT4:4 位整数量化
    • 更激进的 2-bit、3-bit 量化
  2. 剪枝(Pruning):移除不重要的神经元或连接

    • 结构化剪枝:删除整个层或通道
    • 非结构化剪枝:稀疏化权重矩阵
  3. 蒸馏(Distillation):用小模型学习大模型的知识

    • Teacher-Student 架构
    • 软标签训练

量化的操作对象

量化主要操作模型的权重(Weights)激活值(Activations)

权重量化

权重量化是将神经网络层的参数矩阵从高精度浮点转换为低精度整数:

python
# 原始权重矩阵(FP16)
W_fp16 = [[1.234, -0.567], [0.891, -1.234]]  # 2×2 矩阵

# 量化到 INT4(4-bit,范围 -8 到 7)
scale = 0.1
zero_point = 0
W_int4 = [[12, -6], [9, -12]]  # 量化后的整数值

# 反量化(推理时)
W_dequant = (W_int4 - zero_point) * scale  # 恢复为浮点值

激活值量化

激活值量化是在推理过程中,对中间层的输出进行动态量化:

量化过程的技术细节

1. 后训练量化(PTQ, Post-Training Quantization)

直接在预训练模型上应用量化,无需重新训练:

bash
# 使用 AutoGPTQ 进行 INT4 量化
python -m auto_gptq --model Llama-2-7b-hf \
  --quantize \
  --bits 4 \
  --group-size 128 \
  --desc-act \
  --save llama-2-7b-4bit

关键参数

  • --bits: 量化位数(4/8)
  • --group-size: 分组大小(128 表示每 128 个参数共享一个量化参数)
  • --desc-act: 是否激活描述符(影响量化策略)

2. 量化感知训练(QAT, Quantization-Aware Training)

在训练过程中模拟量化误差:

python
import torch
import torch.nn as nn
from torch.quantization import prepare_qat, convert

# 定义模型
model = MyModel()

# 准备 QAT
model.qconfig = torch.get_default_qat_qconfig('fbgemm')
model = prepare_qat(model)

# 模拟训练(使用量化误差)
model.train()
for data in train_loader:
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()

# 转换为量化模型
model = convert(model.eval())

量化后的模型文件结构

量化后的模型文件通常包含:

json
{
  "model.architecture": "LlamaForCausalLM",
  "quantization": {
    "bits": 4,
    "group_size": 128,
    "method": "GPTQ"
  },
  "layers": [
    {
      "layer_id": 0,
      "q_weight": "量化后的权重数组(INT4)",
      "scale": "量化比例因子",
      "zero_point": "零点偏移",
      "g_idx": "分组索引(用于非分组量化)"
    }
  ]
}

MLX 格式的技术解析

什么是 MLX

MLX 是 Apple 推出的深度学习框架,专为 Apple Silicon(M1/M2/M3)芯片优化。MLX 格式的模型文件(.mlxm.gguf)是经过优化的二进制格式。

MLX 格式的设计哲学

核心特点

  1. Unified Memory:CPU 和 GPU 共享内存,减少数据拷贝
  2. Metal 加速:利用 Apple GPU 的并行计算能力
  3. 静态图优化:编译时进行算子融合和内存优化

MLX 模型文件结构

MLX 格式的模型文件包含:

├── config.json          # 模型配置(层数、隐藏层大小等)
├── weights.safetensors  # 量化后的权重(BF16/INT8)
├── tokenizer.json       # 分词器配置
└── mlx_manifest.json    # MLX 特定元数据
python
# MLX 模型加载示例
import mlx.core as mx
from mlx import nn

# 加载量化模型
model, tokenizer = nn.load("mlx-model-llama-2-7b-4bit")

# 推理
prompt = "Hello, world!"
tokens = mx.array(tokenizer.encode(prompt))
output = model(tokens)

主流部署格式对比

格式生态图谱

格式详细对比

格式主要用途优势劣势支持框架
safetensors原始存储安全、快速、格式清晰文件体积大HuggingFace Transformers
GGUFCPU 推理跨平台、低显存占用速度较慢llama.cpp, Ollama
GGMLCPU 推理(旧版)成熟稳定已弃用llama.cpp (legacy)
AWQGPU 优化速度快、精度损失小仅支持 NVIDIAvLLM, AutoAWQ
GPTQGPU 优化通用性强量化时间长AutoGPTQ, vLLM
MLXApple Silicon原生优化仅限 AppleMLX, LM Studio
ONNX跨平台部署工业标准框架支持有限ONNX Runtime

格式转换的技术原理

格式转换本质是序列化和反序列化过程:

python
# 伪代码:格式转换流程
def convert_format(source_model, target_format):
    # 1. 加载原始模型
    model = load_model(source_model)
    
    # 2. 提取权重和配置
    weights = extract_weights(model)
    config = extract_config(model)
    
    # 3. 应用目标格式的优化
    if target_format == "GGUF":
        weights = pack_4bit(weights)  # 4-bit 打包
        metadata = build_gguf_metadata(config)
    elif target_format == "MLX":
        weights = optimize_for_metal(weights)  # Metal 优化
        metadata = build_mlx_manifest(config)
    
    # 4. 序列化写入文件
    write_model_file(weights, metadata, target_format)
    
    return target_model

为什么需要多种格式

硬件适配

  • NVIDIA GPU:AWQ、GPTQ 优化 Tensor Core
  • Apple Silicon:MLX 优化 Metal Performance Shaders
  • CPU 推理:GGUF 优化缓存友好性

应用场景

  • 边缘设备:GGUF 的低内存占用
  • 高吞吐量:AWQ 的快速推理
  • 研究开发:safetensors 的原始精度

生态系统

  • Ollama:使用 GGUF 格式
  • LM Studio:原生支持 MLX 和 GGUF
  • vLLM:优化 AWQ 和 GPTQ 格式