链载Ai

标题: 如何理解模型的蒸馏和量化 [打印本页]

作者: 链载Ai    时间: 昨天 12:47
标题: 如何理解模型的蒸馏和量化
在LLM领域内,经常会听到两个名词:蒸馏和量化。这代表了LLM两种不同的技术,它们之间有什么区别呢?本次我们就来详细聊一下。
一、模型蒸馏
1.1 什么是模型蒸馏
模型蒸馏是一种知识迁移技术,通过将一个大规模、预训练的教师模型(Teacher Model)所蕴含的知识传递给一个规模较小的学生模型(Student Model),使学生模型在性能上接近教师模型,同时显著降低计算资源消耗。
以一种更为通俗的方式来解释:

假设你有一个特别聪明的学霸朋友(大模型),他考试能考100分,但做题速度慢(计算量大),没法帮你考场作弊。

于是你想:能不能让学霸把他的“解题思路”教给你,让你变成一个小号的学霸(小模型),做题又快又准?

这就是模型蒸馏的思想。
1.2 蒸馏的核心原理
学霸的“秘密武器”不是答案本身,而是他的“思考过程”!
小模型通过学霸的“思考细节”,能学得更深,甚至发现学霸自己都没总结出的规律。
1.3 蒸馏的工作原理
1.4 举个例子
比如有这样一个任务:需要识别不同动物的图片。
1.5 为什么蒸馏有效?

通过硬标签向软标签的转换,让笨徒弟(小模型)偷师学霸(大模型)的“内功心法”,而不是只抄答案。

1.6 模型蒸馏的具体实现

1.6.1 准备教师模型和学生模型

教师模型:通常是一个预训练好的复杂模型(如ResNet-50、BERT等)。

学生模型:结构更简单的小模型(如MobileNet、TinyBERT等),参数少但需要与教师模型兼容。

1.6.2 定义损失函数

蒸馏损失(Distillation Loss):学生模型模仿教师模型的输出分布。

可以使用KL散度或交叉熵衡量两者的输出差异。

学生损失(Student Loss):学生模型预测结果与真实标签的交叉熵。
总损失:加权结合两种损失:
1.6.3 训练过程
importtorchimporttorch.nnasnnimporttorch.optimasoptim
# 定义教师模型和学生模型teacher_model = ... # 预训练好的复杂模型student_model = ... # 待训练的小模型
# 定义损失函数criterion_hard = nn.CrossEntropyLoss() # 学生损失(硬标签)criterion_soft = nn.KLDivLoss(reduction='batchmean') # 蒸馏损失(软标签)
# 温度参数和权重temperature =5alpha =0.7
# 优化器optimizer = optim.Adam(student_model.parameters(), lr=1e-4)
# 训练循环forinputs, labelsindataloader: # 教师模型推理(不计算梯度) withtorch.no_grad(): teacher_logits = teacher_model(inputs)
# 学生模型推理 student_logits = student_model(inputs)
# 计算损失 loss_student = criterion_hard(student_logits, labels)
# 软化教师和学生输出 soft_teacher = torch.softmax(teacher_logits / temperature, dim=-1) soft_student = torch.log_softmax(student_logits / temperature, dim=-1)
loss_distill = criterion_soft(soft_student, soft_teacher) * (temperature**2)
# 总损失 total_loss = alpha * loss_distill + (1- alpha) * loss_student
# 反向传播 optimizer.zero_grad() total_loss.backward() optimizer.step()
二、模型量化
2.1 什么是模型量化
模型量化(Model Quantization)是一种通过降低模型参数的数值精度(如将32位浮点数转换为8位整数)来压缩模型大小、提升推理速度并降低功耗的技术。
举个具体例子:

假设模型记住了一群人的体重:

误差就像体重秤的±0.5kg,不影响判断「是否超重」

2.2 为什么要模型量化?

1、体积暴减

2、速度起飞

NVIDIA显卡上推理速度提升2-4倍

3、省电耐耗

2.3 如何进行模型量化?

1、划定范围

2、标刻度

3、压缩存储

2.4 常用量化方式
1、事后减肥法(训练后量化)
importtorch
# 准备模型(插入量化模块)model.eval() # 确保模型处于评估模式model.qconfig = torch.quantization.default_qconfig # 设置默认量化配置quantized_model = torch.quantization.prepare(model) # 插入观察器
# 收集校准数据fordata, _incalibration_data: quantized_model(data.to('cpu')) # 在 CPU 上运行,避免对模型结构的影响
quantized_model = torch.quantization.convert(quantized_model) # 转换为量化模型
2、健康瘦身法(量化感知训练)
#PyTorch示例(训练时插伪量化节点)model.qconfig=torch.ao.quantization.get_default_qat_qconfig('fbgemm')model=torch.ao.quantization.prepare_qat(model)#正常训练...model=torch.ao.quantization.convert(model)
3、混合套餐法(混合精度量化)

例如:

人脸识别:眼睛区域用FP16,背景用INT8

语音识别:关键词用16bit,静音段用4bit

虽然说量化后模型不如原模型精度效果好,但是推理性能的提升相较性能损失在可控范围内,性价比上量化是更优的。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5