AI模型压缩

  • 前言:让训练好的AI模型“轻装上阵”
  • 第一章:回顾与挑战:训练后量化(PTQ)的必要性
    • 1.1 量化原理与精度类型回顾:FP32到INT4/INT8
    • 1.2 PTQ(Post-Training Quantization):无须重训的“一步瘦身法”
    • 1.3 PTQ的挑战:如何最小化精度损失?
  • 第二章:核心量化工具一:bitsandbytes——PyTorch的“原生”量化伴侣
    • 2.1 bitsandbytes是什么?——GPU上的“低精度算子库”
    • 2.2 核心原理:Linear8bitLt与混合精度量化
    • 2.3 使用bitsandbytes对模型进行8比特量化
  • 第三章:核心量化工具二:GPTQ——离线量化的“精度王者”
    • 3.1 GPTQ是什么?—— 最小化量化误差的“贪心”算法
    • 3.2 核心原理:逐层、迭代地量化并补偿误差
    • 3.3 优劣势:精度高,但需要校准数据
  • 第四章:核心量化工具三:AWQ——激活值感知的“高效量化”
    • 4.1 AWQ是什么?—— 关注“激活值”的量化策略
    • 4.2 核心原理:跳过不重要权重,保护重要激活值
    • 4.3 优劣势:推理速度快,对校准数据依赖低
    • 4.4 使用AWQ对LLM进行4比特量化
  • 第五章:综合对比与应用场景
    • 5.1 GPTQ vs AWQ vs bitsandbytes:性能与易用性的权衡
    • 5.2 总结:哪种量化工具最适合你?
  • GPTQ, AWQ, bitsandbytes量化流程对比
  • 量化后的性能测试:如何客观评估模型瘦身效果?
  • 总结与展望:你已成为AI模型“瘦身”领域的真正大师

前言:让训练好的AI模型“轻装上阵”

我们深入理解了模型量化的基本原理,知道它是AI模型“瘦身”的关键。它能让模型体积大幅缩小,推理速度显著提升。

但理论终归是理论。在实际应用中,我们如何才能将一个已经训练好的、动辄数十GB的FP16/FP32大模型,安全、高效、且尽可能无损地转化为INT8/INT4的“精简版”,从而在你的消费级显卡、甚至CPU上流畅运行呢?

这就是本章的核心:我们将聚焦于训练后量化(PTQ,Post-Training Quantization)。
训练后量化

我们将深度解密并实战GPTQ、AWQ和bitsandbytes这三大主流量化工具。它们就像是为AI模型量身定制的“压缩大师”,能在不重新训练的前提下,让你的LLM和Diffusion模型“极速瘦身”。

第一章:回顾与挑战:训练后量化(PTQ)的必要性

快速回顾量化原理,并深入分析PTQ的特点、优势和核心挑战。

1.1 量化原理与精度类型回顾:FP32到INT4/INT8

上一个章节已经讲过了fp32 (4字节), fp16 (2字节), int8 (1字节), int4 (0.5字节) 的内存占用,以及通过Scale和Zero Point实现的线性映射原理

1.2 PTQ(Post-Training Quantization):无须重训的“一步瘦身法”

原理:模型在训练完成后,权重参数已经固定。PTQ在此基础上,直接将浮点数权重转换为低精度整数。

优势:

  1. 极简流程:无需重新训练模型,对现有模型即插即用,开发周期短。
  2. 资源友好:不需要训练时的GPU资源,只需要少量CPU/GPU资源进行转换。
  3. 广泛适用:适用于各种已经训练好的模型。

1.3 PTQ的挑战:如何最小化精度损失?

PTQ的核心挑战在于:如何在信息有损压缩的前提下,最大程度地保持模型的性能?

模型在训练时是基于高精度浮点数运算的,它对量化引入的“误差”一无所知。

直接粗暴的量化可能导致精度大幅下降,甚至模型失效。

不同的PTQ算法,就在于它们有不同的策略来“聪明地”选择Scale和Zero Point,以及如何补偿量化过程中引入的误差。

第二章:核心量化工具一:bitsandbytes——PyTorch的“原生”量化伴侣

深入bitsandbytes库的原理,特别是其Linear8bitLt和NF4量化,并提供代码实战。
bitsandbytes

2.1 bitsandbytes是什么?——GPU上的“低精度算子库”

bitsandbytes是一个专门为PyTorch(特别是GPU)设计的低精度优化库。它提供了一系列高效的低精度CUDA算子,使得PyTorch模型可以直接在8比特、4比特精度下进行计算。

优势:深度集成PyTorch,对LLM的优化尤为突出。它负责底层的低精度矩阵乘法,让你无需深入CUDA编程。

2.2 核心原理:Linear8bitLt与混合精度量化

Linear8bitLt:这是bitsandbytes中最常用的量化层。它将原始的nn.Linear层替换为8比特的实现。

  • 混合精度:Linear8bitLt通常在前向传播时使用8比特整数进行矩阵乘法,但在反向传播和更新梯度时,仍然使用高精度(fp16或fp32)来保证训练稳定性。这被称为**“混合精度量化”**。

NF4 (NormalFloat 4-bit):bitsandbytes还支持NF4这种先进的4比特量化格式。它通过构建一个理论上最优的非对称量化方案,能够在4比特下,最大限度地保留模型的性能。LLaMA-int4量化常用的就是NF4。

2.3 使用bitsandbytes对模型进行8比特量化

目标:加载一个LLM模型(例如GPT-2),使用bitsandbytes将其线性层转换为8比特,并观察其内存占用和推理速度。

前置:pip install bitsandbytes accelerate transformers。

# bnb_quantization_demo.pyimport torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
import time
import os# --- 0. 定义模型和设备 ---
MODEL_NAME = "gpt2" # 或 "facebook/opt-125m" 等小型LLM,方便演示
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")# --- 1. 加载全精度模型 (FP32/FP16) ---
print(f"--- 案例#001:使用bitsandbytes对模型进行8比特量化 ---")
print(f"\n1. 加载全精度模型 ({MODEL_NAME})...")
model_fp16 = AutoModelForCausalLM.from_pretrained(MODEL_NAME, torch_dtype=torch.float16).to(DEVICE)
model_fp16.eval()
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)# 计算并打印模型大小和显存占用
def print_model_info(model, name="Model"):num_params = sum(p.numel() for p in model.parameters() if p.requires_grad)model_size_mb = model.get_memory_footprint() / (1024 * 1024) if hasattr(model, 'get_memory_footprint') else None# 粗略估计参数占用的显存,fp16是2字节/参数rough_vram_mb = num_params * 2 / (1024 * 1024)print(f"  {name} 参数数量: {num_params:,}")if model_size_mb:print(f"  {name} PyTorch内存占用: {model_size_mb:.2f} MB")else:print(f"  {name} 粗略显存占用 (FP16): {rough_vram_mb:.2f} MB")if DEVICE.type == 'cuda':print(f"  当前GPU显存占用: {torch.cuda.memory_allocated() / (1024 * 1024):.2f} MB")print_model_info(model_fp16, "全精度FP16模型")# --- 2. 配置BitsAndBytes量化 ---
# BitsAndBytesConfig 用于配置量化参数
# load_in_8bit=True: 将线性层加载为8比特
# (也可以 load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16 等用于4比特)
quant_config_8bit = BitsAndBytesConfig(load_in_8bit=True
)# --- 3. 加载8比特量化模型 ---
print(f"\n2. 加载8比特量化模型 ({MODEL_NAME})...")
model_8bit = AutoModelForCausalLM.from_pretrained(MODEL_NAME, quantization_config=quant_config_8bit,torch_dtype=torch.float16 # 即使量化,模型计算仍然在fp16进行
).to(DEVICE) # 加载到GPUmodel_8bit.eval()
print_model_info(model_8bit, "量化8比特模型")# --- 4. 性能对比 (推理速度和内存) ---
prompt = "Explain machine learning in simple terms."
inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE)# 4.1 FP16模型推理
print("\n--- 3. FP16模型推理性能 ---")
start_time_fp16 = time.time()
with torch.no_grad():_ = model_fp16.generate(**inputs, max_new_tokens=50)
end_time_fp16 = time.time()
print(f"  FP16模型推理时间: {(end_time_fp16 - start_time_fp16):.4f} 秒")# 4.2 8比特量化模型推理
print("\n--- 4. 8比特量化模型推理性能 ---")
start_time_8bit = time.time()
with torch.no_grad():_ = model_8bit.generate(**inputs, max_new_tokens=50)
end_time_8bit = time.time()
print(f"  8比特量化模型推理时间: {(end_time_8bit - start_time_8bit):.4f} 秒")print("\n✅ BitsAndBytes量化演示完成!")
print("可以看到8比特模型占用显存更少,推理速度更快 (特别是在大模型和长文本上效果更显著)。")

【代码解读与见证奇迹】

这个案例核心在于BitsAndBytesConfig和AutoModelForCausalLM.from_pretrained(…, quantization_config=…)。

BitsAndBytesConfig(load_in_8bit=True):这是告诉Hugging Face的from_pretrained函数,在加载模型时,将模型中所有nn.Linear层替换为bnb.nn.Linear8bitLt。

内存占用对比:运行后,你会看到model_8bit的粗略显存占用和实际GPU显存占用会显著低于model_fp16。这证明了量化对内存的节省。

推理速度对比:虽然对于GPT-2这样的小模型,差距可能不明显,但对于LLaMA-7B等大模型,你会看到量化后的推理速度有显著提升。

第三章:核心量化工具二:GPTQ——离线量化的“精度王者”

深入GPTQ的原理,理解其如何通过“一步法”实现高效量化并最小化精度损失,并提供代码实战。

3.1 GPTQ是什么?—— 最小化量化误差的“贪心”算法

GPTQ (General-Purpose Quantization) 是一个离线量化算法(PTQ的一种),由AutoGPTQ团队在2023年推出。它专注于将大型语言模型(LLM)量化到4比特,且精度损失极小。

核心思想:它不只是简单地进行线性映射。GPTQ会逐层地、迭代地量化模型权重。在量化每一层的权重时,它会同时考虑这一层量化对下一层输出的影响,并尽可能补偿量化引入的误差,从而最小化全局精度损失。这是一种“贪心算法”。

3.2 核心原理:逐层、迭代地量化并补偿误差

分层处理:GPTQ一次只处理模型中的一层权重(通常是线性层)。

“校准数据集”(Calibration Data):GPTQ需要一小部分无标签的“校准数据”(通常是几百条LLM的输入文本),用于统计模型在量化前后的激活值分布。

迭代优化:在量化某一层时,GPTQ会迭代地调整量化后的权重,使得这一层量化后的输出,尽可能

接近量化前的输出。它通过优化一个二次规划问题来找到最优的量化值。

误差补偿:量化完当前层后,GPTQ会计算量化带来的误差,并将这个误差传递并补偿到后续尚未量化的层中。

3.3 优劣势:精度高,但需要校准数据

特性 优势 劣势

量化精度 极高,尤其是在4比特下,性能损失极小

推理速度 显著提升

内存占用 大幅减少

依赖 需要少量校准数据(无标签) 量化过程相对较慢,计算成本较高

## 3.4 使用GPTQ对LLM进行4比特量化目标:加载一个LLM模型,使用auto-gptq库对其进行4比特量化,并观察其内存占用和推理速度。
前置:pip install auto-gptq accelerate transformers。# gptq_quantization_demo.pyfrom transformers import AutoTokenizer, AutoModelForCausalLM
from auto_gptq import GPTQQuantizer, BaseQuantizeConfig
import torch
import time
import os# --- 0. 定义模型和设备 ---
# 选择一个适合量化的LLM模型,例如opt-125m,方便演示
MODEL_NAME = "facebook/opt-125m" 
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # GPTQ通常在GPU上执行量化过程# --- 1. 加载全精度模型 ---
print(f"--- 案例#003:使用GPTQ对LLM进行4比特量化 ---")
print(f"\n1. 加载全精度模型 ({MODEL_NAME})...")
model_fp16 = AutoModelForCausalLM.from_pretrained(MODEL_NAME, torch_dtype=torch.float16, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model_fp16.eval()# 打印模型信息
def print_model_info_gptq(model, name="Model"):num_params = sum(p.numel() for p in model.parameters() if p.requires_grad)model_size_mb = sum(p.numel() * p.element_size() for p in model.parameters()) / (1024 * 1024)print(f"  {name} 参数数量: {num_params:,}")print(f"  {name} 显存占用: {model_size_mb:.2f} MB (估算)")if DEVICE.type == 'cuda':print(f"  当前GPU显存占用: {torch.cuda.memory_allocated() / (1024 * 1024):.2f} MB")print_model_info_gptq(model_fp16, "全精度FP16模型")# --- 2. 准备校准数据集 ---
# GPTQ需要少量校准数据来确定量化参数
print("\n2. 准备校准数据集 (用于GPTQ)...")
calibration_texts = ["Hello, how are you today? I am fine, thank you.","The quick brown fox jumps over the lazy dog.","Machine learning is a fascinating field.","Artificial intelligence is rapidly advancing.","This is a test sentence for GPTQ calibration.","Another example sentence for the quantization process.","Quantization is very important for efficient model deployment."
]
# 将文本编码为模型输入格式
calibration_inputs = []
for text in calibration_texts:input_ids = tokenizer(text, return_tensors="pt").input_ids.to(DEVICE)calibration_inputs.append({'input_ids': input_ids})
print(f"  准备了 {len(calibration_inputs)} 条校准数据。")# --- 3. 配置GPTQ量化器 ---
quantize_config = BaseQuantizeConfig(bits=4,              # 4比特量化group_size=128,      # 分组大小desc_act=False,      # 是否按激活值描述顺序量化true_sequential=True # 是否按真实模型层序量化
)# 实例化GPTQ量化器
quantizer = GPTQQuantizer(model_fp16, quantize_config)# --- 4. 执行量化 ---
print("\n3. 开始执行GPTQ量化 (这可能需要几分钟)...")
quantized_model = quantizer.quantize(examples=calibration_inputs,# use_fast_tokenizer=True,# batch_size=1 # 量化过程的batch_size
)
print("GPTQ量化完成!")# --- 5. 性能对比 ---
print_model_info_gptq(quantized_model, "GPTQ 4比特量化模型")prompt_gen = "Tell me a short story about a brave knight and a dragon."
inputs_gen = tokenizer(prompt_gen, return_tensors="pt").to(DEVICE)# FP16模型推理 (再次运行,方便对比)
print("\n--- FP16模型推理性能 (对比) ---")
start_time_fp16_gen = time.time()
with torch.no_grad():_ = model_fp16.generate(**inputs_gen, max_new_tokens=100)
end_time_fp16_gen = time.time()
print(f"  FP16模型推理时间: {(end_time_fp16_gen - start_time_fp16_gen):.4f} 秒")# GPTQ 4比特量化模型推理
print("\n--- GPTQ 4比特量化模型推理性能 ---")
start_time_gptq_gen = time.time()
with torch.no_grad():_ = quantized_model.generate(**inputs_gen, max_new_tokens=100)
end_time_gptq_gen = time.time()
print(f"  GPTQ 4比特量化模型推理时间: {(end_time_gptq_gen - start_time_gptq_gen):.4f} 秒")# --- 6. (可选) 保存量化模型 ---
# output_quant_dir = "./quantized_models"
# quantized_model.save_pretrained(output_quant_dir)
# tokenizer.save_pretrained(output_quant_dir)
# print(f"\n量化模型已保存到: {output_quant_dir}")print("\n✅ GPTQ量化演示完成!")
print("可以看到GPTQ在4比特下显存占用大幅减少,推理速度接近甚至超过FP16,且精度损失极小。")

【代码解读与见证奇迹】

这个案例核心在于GPTQQuantizer。

quantize_config = BaseQuantizeConfig(…):定义量化参数,如bits=4。

quantizer.quantize(examples=…):这是核心!它会启动GPTQ量化过程。examples是无标签的校准数据,用于量化过程中的误差补偿。

内存与速度对比:运行后,你会看到量化模型的显存占用显著减少(理论上是FP16的1/4)。推理速度通常会接近甚至超过FP16(因为低精度计算的硬件加速)。

重要提示:GPTQ量化过程本身是计算密集型的,需要GPU。GPTQ量化后的模型文件大小会大幅缩小,且精度几乎无损。

第四章:核心量化工具三:AWQ——激活值感知的“高效量化”

高效量化

深入AWQ的原理,理解其如何通过“激活值感知”策略实现高效量化,并提供代码实战。

4.1 AWQ是什么?—— 关注“激活值”的量化策略

AWQ (Activation-aware Weight Quantization) 是一种激活值感知量化算法,由ISTUDIO团队在2023年提出。它发现,LLM中只有少量(约1%)的权重对模型的性能至关重要。这些“重要权重”在推理时会产生较大的激活值。

核心思想:AWQ在量化时,会跳过或以更高精度量化这些对模型性能影响最大的“重要权重”,而对其他不那么重要的权重进行更激进的量化。它通过分析激活值的分布来识别这些“重要权重”。

4.2 核心原理:跳过不重要权重,保护重要激活值

激活值分析:AWQ首先对模型进行一次前向推理,统计每个权重量化后可能产生的激活值的最大值。
“重要权重”识别:根据激活值的大小,识别出那些导致激活值较大的权重(这些权重通常是“重要权重”)。

权重选择性量化:对“重要权重”进行特殊处理(例如不量化或以更高精度量化),对“不重要权重”进行普通量化。

效果:在极高的量化率下(如INT4),能够显著减少推理延迟,同时保持更高的精度。

4.3 优劣势:推理速度快,对校准数据依赖低

特性 优势 劣势
量化精度 高,尤其是在4比特下,对性能影响小
推理速度 显著提升,且对长文本效果更明显
内存占用 大幅减少
依赖 对校准数据不敏感,甚至不需要校准数据 量化过程相对较慢,但比GPTQ快

4.4 使用AWQ对LLM进行4比特量化

目标:加载一个LLM模型,使用AutoAWQ库对其进行4比特量化,并观察其内存占用和推理速度。

前置:pip install autoawq accelerate transformers。

# awq_quantization_demo.pyfrom transformers import AutoTokenizer, AutoModelForCausalLM
from awq import AutoAWQQuantizer # 导入AWQ量化器
import torch
import time
import os# --- 0. 定义模型和设备 ---
# 选择一个适合量化的LLM模型,例如opt-125m,方便演示
MODEL_NAME = "facebook/opt-125m" 
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")# --- 1. 加载全精度模型 ---
print(f"--- 案例#004:使用AWQ对LLM进行4比特量化 ---")
print(f"\n1. 加载全精度模型 ({MODEL_NAME})...")
model_fp16 = AutoModelForCausalLM.from_pretrained(MODEL_NAME, torch_dtype=torch.float16, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model_fp16.eval()# 打印模型信息 (同GPTQ)
def print_model_info_awq(model, name="Model"):num_params = sum(p.numel() for p in model.parameters() if p.requires_grad)model_size_mb = sum(p.numel() * p.element_size() for p in model.parameters()) / (1024 * 1024)print(f"  {name} 参数数量: {num_params:,}")print(f"  {name} 显存占用: {model_size_mb:.2f} MB (估算)")if DEVICE.type == 'cuda':print(f"  当前GPU显存占用: {torch.cuda.memory_allocated() / (1024 * 1024):.2f} MB")print_model_info_awq(model_fp16, "全精度FP16模型")# --- 2. 配置AWQ量化 ---
quant_config_awq = {"zero_point": True,  # 是否使用零点"q_group_size": 128, # 量化分组大小"w_bit": 4,          # 4比特量化"version": "GEMM",   # GEMM 或 EXLLAMA
}# --- 3. 执行量化 ---
print("\n2. 开始执行AWQ量化 (这可能需要几分钟)...")
# AWQ量化器
quantizer = AutoAWQQuantizer(model_fp16, quant_config_awq)# AWQ不需要校准数据,或只需要极少量
quantizer.quantize(tokenizer=tokenizer, quant_config=quant_config_awq)print("AWQ量化完成!")# --- 4. 性能对比 ---
print_model_info_awq(model_fp16, "AWQ 4比特量化模型") # model_fp16 现在已被量化prompt_gen_awq = "Tell me a short story about a brave knight and a talking dragon."
inputs_gen_awq = tokenizer(prompt_gen_awq, return_tensors="pt").to(DEVICE)# FP16模型推理 (再次运行,方便对比)
print("\n--- FP16模型推理性能 (对比) ---")
start_time_fp16_gen_awq = time.time()
with torch.no_grad():_ = model_fp16.generate(**inputs_gen_awq, max_new_tokens=100)
end_time_fp16_gen_awq = time.time()
print(f"  FP16模型推理时间: {(end_time_fp16_gen_awq - start_time_fp16_gen_awq):.4f} 秒")# AWQ 4比特量化模型推理
print("\n--- AWQ 4比特量化模型推理性能 ---")
start_time_awq_gen = time.time()
with torch.no_grad():_ = model_fp16.generate(**inputs_gen_awq, max_new_tokens=100)
end_time_awq_gen = time.time()
print(f"  AWQ 4比特量化模型推理时间: {(end_time_awq_gen - start_time_awq_gen):.4f} 秒")# --- 5. (可选) 保存量化模型 ---
# output_quant_dir_awq = "./quantized_models_awq"
# quantizer.save_quantized_model(output_quant_dir_awq)
# tokenizer.save_pretrained(output_quant_dir_awq)print("\n✅ AWQ量化演示完成!")
print("可以看到AWQ在4比特下显存占用大幅减少,推理速度显著提升,且对校准数据依赖低。")

【代码解读与见证奇迹】

这个案例核心在于AutoAWQQuantizer。

quantizer = AutoAWQQuantizer(model_fp16, quant_config_awq):实例化AWQ量化器。

quantizer.quantize(tokenizer=tokenizer, quant_config=quant_config_awq):执行AWQ量化。它只需要tokenizer来处理文本输入,校准数据不再是强制要求。

内存与速度对比:与GPTQ类似,AWQ也能显著减少内存占用并提升推理速度。

第五章:综合对比与应用场景

系统对比GPTQ、AWQ和bitsandbytes这三大工具在核心特性、性能、精度和易用性上的权衡,并给出选型建议。

5.1 GPTQ vs AWQ vs bitsandbytes:性能与易用性的权衡

特性 bitsandbytes (bnb) GPTQ AWQ

量化位数 8比特 (4比特NF4) 4比特 4比特

量化时机 运行时加载即量化 离线量化 (训练后一次性转换) 离线量化 (训练后一次性转换)

校准数据 不需要 需要少量 不强制需要 (对少数数据不敏感)

精度损失 8比特接近无损,NF4良好 4比特下极小损失 4比特下低损失,

推理速度 较FP16快,特定CPU/GPU优化 显著提升 显著提升

内存占用 显著降低 大幅降低 大幅降低

实现方式 替换nn.Linear, 逐层优化, 逐层优化

易用性 极高 中等 (需要校准数据,量化过程耗时) 中等 (量化过程耗时)

典型用途 推理的默认方案 发布量化模型 适合部署

GGUF格式 不直接生成GGUF,通常与GGUF转换结合 (例如AutoGPTQ可导出GGUF) 通常与
GGUF转换结合 (例如AutoAWQ可导出GGUF)

5.2 总结:哪种量化工具最适合你?

初学者快速上手/调试:bitsandbytes。因为它最简单,一行代码即可实现8比特量化,无需校准数据。

追求极致4比特精度/发布模型:GPTQ。如果你需要最高质量的4比特量化模型,GPTQ是首选,其误差补偿机制非常强大。

追求极致4比特推理速度/长文本:AWQ。如果你发现GPTQ在你的特定场景下速度不够快,或者对长文本的性能有更高要求,AWQ可能带来更好的推理延迟。

LLaMA.cpp生态:其内部的K-Quant系列 融合了多种先进量化思想,是LLaMA.cpp在CPU上实现高性能的核心。

GPTQ, AWQ, bitsandbytes量化流程对比

量化流程对比

量化后的性能测试:如何客观评估模型瘦身效果?

提供量化后模型评估的关键指标和方法。

仅仅看文件大小和推理时间是不够的,你还需要客观评估量化后的模型性能:
Perplexity (困惑度):对于LLM,在测试集上计算困惑度,评估生成文本的流畅度和概率分布拟合程度。困惑度越低越好。

下游任务指标:对于LLM,评估其在问答、摘要、翻译等具体任务上的准确率(例如F1 Score, Rouge Score)。

生成质量:对于图像生成模型,评估其生成图像的FID(Frechet Inception Distance)、CLIPScore等指标。

实际体验:对于聊天机器人,进行长时间对话,感受其连贯性、幻觉率、回答质量是否下降。
这些指标能帮你全面判断量化带来的“副作用”,选择最适合你需求的量化类型。

总结与展望:你已成为AI模型“瘦身”领域的真正大师

总结与展望:你已成为AI模型“瘦身”领域的真正大师
恭喜你!今天你已经深入解剖并实战了GPTQ、AWQ和bitsandbytes这三大主流量化工具。
✨ 本章惊喜概括 ✨

你掌握了什么?对应的核心概念/技术
PTQ核心挑战✅ 无须重训,但需最小化精度损失
bitsandbytes✅ PyTorch GPU原生量化,Linear8bitLt与NF4
GPTQ✅ 离线量化,逐层优化,精度王者
AWQ✅ 激活值感知,跳过重要权重,高性能
代码实战✅ 亲手实现使用bnb、GPTQ、AWQ进行模型量化
选型策略✅ 根据需求在精度、速度、易用性上权衡
性能评估✅ 了解量化后模型性能测试的关键指标

你现在不仅能理解量化,更能亲手操作并洞悉其背后的算法与硬件优化。你手中掌握的,是AI模型从“臃肿”走向“精炼”,从而走向更广阔部署场景的**“瘦身魔法”**!

🔮 敬请期待! 在下一章中,我们将继续深入**《模型压缩与量化技术》,探索LLM高效微调的另一个关键技术——《LoRA微调原理与合并技巧》**,为你揭示如何在消费级显卡上,低成本地训练出LLM的“专属能力”!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92983.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92983.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92983.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Word和WPS文字一页中实现一栏与多栏混排

在Word和WPS文字的一页中如何实现分栏和不分栏的内容混排?只需要使用分栏功能。把光标放在要分栏的位置,插入分栏即可,最关键的点是分栏应用于“插入点之后”。如果不需要分栏,则栏数选择为1即可。一、Word和WPS文字的分栏设置路径…

Python调用C/C++函数库的多种方法与实践指南

Python作为一门高级编程语言,以其简洁的语法和丰富的库生态赢得了开发者的青睐。然而,在计算密集型任务中,Python的性能往往无法满足要求。Python调用C/C函数库成为提升应用性能的关键技术路径,通过将底层计算逻辑用C/C实现&#…

【21】OpenCV C++实战篇——OpenCV C++案例实战二十七《角度测量》

OpenCV C案例实战二十七《角度测量》 利用opencv获取三点所形成直线的角度

程序在计算机中的运行方式

程序在计算机中的运行是一个涉及硬件、操作系统和软件协同工作的复杂过程。我们可以将其分解为几个关键阶段来理解:1. 程序的诞生:从源代码到可执行文件 编写代码:程序员使用高级编程语言(如C、Python、Java)编写源代码…

虚拟卡券管理平台详细设计文档

文章目录**1. 文档概述**1.1 目标1.2 核心能力**2. 业务场景分析**2.1 用户场景2.2 关键业务流程卡券核销流程:**3. 整体架构设计**3.1 技术栈3.2 微服务拆分**4. 功能模块详细设计**▶ 4.1 卡券生命周期管理**4.1.1 卡券类型设计****4.1.2 关键状态机**▶ 4.2 卡券…

Oracle参数Process

RDBMS: 19.28 参考文档: IF:How to determine an optimum value for PROCESSES parameter (Doc ID 2012693.1) All About the Initialization Parameter PROCESSES and the Related Issues (Doc ID 2673195.1) How to calculate the proper value from …

【数据结构入门】树

目录 1.树的概念 父子结点 根节点|叶节点 结点的度 叶子结点或终端结点 兄弟结点 树的度 结点的层次 树的高度或深度 结点的祖先 堂兄弟结点 子孙 森林 2. 树的结构定义 2.1 左孩子右兄弟结构 2.2 数组表示法 3.树&非树 1.树的概念 树是一种非线性的数据结…

手把手教你用 Flink + CDC 实现 MySQL 数据实时导入 StarRocks(干货)

手把手教你用 Flink CDC 实现 MySQL 数据实时导入 StarRocks(干货) 如何利用 Apache Flink 结合 CDC(Change Data Capture,变更数据捕获)技术,将 MySQL 的数据实时导入 StarRocks,打造高效的实…

Rust:anyhow 高效错误处理库核心用法详解

以下是 anyhow 库在 Rust 中的核心用法详解(结合最佳实践和示例): 🔰 一、anyhow 的核心价值 用于简化错误处理,尤其适合: 需要快速原型开发的应用需要丰富错误上下文(Context)的场…

阿里云服务linux安装单机版

一、单机安装Redis 阿里教程 下载地址:redis下载地址 1、首先需要安装Redis所需要的依赖: yum install -y gcc tcl 2、下载Redis 注:也可以自己下好然后上传到云服务 wget https://gitcode.net/weixin_44624117/software/-/raw/master/software/Li…

python之uv使用

文章目录安装与更新standalonepip 安装创建以及初始化项目依赖管理uv run直接在命令行运行python代码片段直接运行项目中可执行脚本文件运行python包中快捷指令uv项目本地运行调试细节vscode 中运行调试uv项目命令行运行深入理解 uv lock, uv sync, uv lockuv lock 行为解析:uv…

【CV 目标检测】①——目标检测概述

一、目标检测概述 1.目标检测 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的类别(分类任务)和位置(回归任务) 目标检测中能检测出来的物体取决于当前任务&…

C#图形库SciChart与ScottPlot及LiveCharts2对比

一.概述 1.SciChart SciChart 是一个专为企业级应用设计的高性能数据可视化库,提供跨平台的图表解决方案,支持 .NET、JavaScript、iOS 和 Android 等多个平台。它以卓越的渲染性能、丰富的专业图表类型和强大的交互功能著称, 广泛应用于金…

Win10电脑密码忘记如何进入操作系统

http://xq128.com/zj.htmlhttps://share.feijipan.com/s/LbFdbUKl下载后,准备一个空的U盘,大于4G。将U盘制作为PE盘。之后将制作好的PE盘插入到电脑中,启动待去除密码的电脑台式机,启动后一直按住F12,进入BIOS。选择下…

[免费]基于Python的网易云音乐热门歌单可视化大屏项目(flask+pandas+echarts+request库)【论文+源码+SQL脚本】

大家好,我是python222_小锋老师,看到一个不错的基于Python的网易云音乐热门歌单可视化大屏项目(flaskpandasechartsrequest库),分享下哈。 项目视频演示 【免费】基于Python的网易云音乐热门歌单可视化大屏项目(flaskpandasecharts爬虫) Py…

AR 智能眼镜:从入门到未来

从零看懂 AR 智能眼镜:未来 10 年技术演进与新手入门指南 在这个数字技术飞速迭代的时代,AR 智能眼镜正从科幻电影走进现实。从 2025 年重量不足 35 克的消费级产品,到 2030 年成为 “第二大脑” 的生活刚需,再到 2040 年进化为神经接口终端,AR 智能眼镜的发展将重塑人类…

初识Vue2及MVVM理解

1、什么是Vue Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,可以高效地开发用户界面。 Vue.js是一套构建用户界面的渐进式框架,采用自底向上增量开发的设计&…

Rust:专业级错误处理工具 thiserror 详解

Rust:专业级错误处理工具 thiserror 详解 thiserror 是 Rust 中用于高效定义自定义错误类型的库,特别适合库开发。相比 anyhow 的应用级错误处理,thiserror 提供更精确的错误控制,让库用户能模式匹配具体错误。 📦 基…

Python网络爬虫(一) - 爬取静态网页

文章目录一、静态网页概述1. 静态网页介绍2. 静态网页爬取技术Requests介绍二、安装 Requests 库三、发送请求并获取响应1. 发送 GET 请求1.1 get() 方法介绍1.2 get() 方法签名介绍1.3 get() 方法参数介绍1.4 示例:发送get请求2. 发送 POST 请求2.1 post() 方法介绍…

.NET/C# webapi框架下给swagger的api文档中显示注释(可下载源码)

bg&#xff1a;.NET/C#真的是越来越凉了。用的是.net9&#xff0c;创建完自带一个天气预报api拿来测试就行 1、在Controllers中弄多几个&#xff0c;并写上注释 /// <summary> /// Post注释 /// </summary> /// <returns></returns> [HttpPost] publ…