一文搞懂大模型量化和大模型微调

目录

  • 一、模型量化
    • 1. 量化的类型
    • 2. 量化的常见位数
    • 3. 量化的优点和缺点
      • 3.1 优点
      • 3.2 缺点
    • 4. 量化的常见工具
      • 4.1 TensorFlow Lite
      • 4.2 PyTorch Quantization
      • 4.3 Hugging Face + `bitsandbytes` 量化
  • 二、模型微调
    • 1. 为什么需要微调?
      • 1.1 增强模型对任务的适应性
      • 1.2 减少训练成本
      • 1.3 提升特定领域表现
      • 1.4 保持模型性能的同时优化推理效率
    • 2. 微调的方法
      • 2.1 全模型微调
      • 2.2 冻结底层微调(Partial Fine-tuning)
      • 2.3 增加任务头部
      • 2.4 基于少量参数调整的微调(如 LoRA, Prefix Tuning)
    • 3. 微调的流程
      • 3.1 数据准备
      • 3.2 模型选择
      • 3.3 定义微调策略
      • 3.4 微调训练
      • 3.5 模型评估与调优
      • 3.6 模型保存与推理
    • 4. 微调的常见工具和框架
  • 三、量化与微调的关系

模型量化(Model Quantization)模型微调(Model Fine-tuning)是使用大模型非常重要的两种技术 (注意普通模型也可以量化和微调,本文只专注于大模型的量化和微调) ,它们分别侧重于提高模型的运行效率和适应性。详细了解和区分这两种技术,有助于在不同的应用场景中更好地使用大模型,特别是在资源有限的硬件环境和任务特定的应用中。

在刚开始学大模型时,笔者搞不清两者间的关系,比如:量化模型能不能微调?那么看完对两者的介绍就清楚了。

一、模型量化

模型量化是一种通过降低模型参数和激活值的精度来减少存储和计算需求的技术。通常,深度学习模型使用32位或16位浮点数表示参数,而量化通过使用更低的位数(如8位或4位整数)来表示这些参数,从而达到减少模型大小和提升推理效率的目的。

1. 量化的类型

  • 训练后量化(Post-Training Quantization, PTQ):在模型训练完成后,对其进行量化。在不改变模型权重的情况下,将浮点数权重和激活值转换为低精度整数。此方法简单且应用广泛,尤其适合推理加速。
  • 量化感知训练(Quantization-Aware Training, QAT):在训练过程中对模型进行量化仿真。这种方法不仅量化权重,还在前向传播时量化激活值,并在反向传播时仍使用高精度梯度。QAT 能在量化后的模型上保持更高的精度,尤其适用于对精度要求较高的任务。

两者区别如下表所示:

特性训练后量化 (PTQ)量化感知训练 (QAT)
训练期间引入量化否,模型训练完毕后再进行量化是的,前向传播时模拟低精度运算
模型精度对于简单任务可能保持高精度,但复杂任务(如NLP)中可能损失较多精度保持较高精度,特别是对于复杂任务
计算开销较低,不影响训练时间,直接量化已有模型较高,训练时需要仿真量化并进行更多计算
使用场景适用于对精度要求较低的场景,如小型模型或简单任务的推理适用于高精度要求的量化场景,适应性强

笔者理解两者区别就是:PTQ是训练得到非量化的模型,然后对其量化;QAT是训练直接得到量化模型。因此在相同结果的情况下,QAT得到的量化模型效果会更好,因为训练过程适应了量化模型。

2. 量化的常见位数

  • 8-bit 量化(int8):最常用的量化格式,能在大多数任务中取得不错的精度与推理效率平衡。适用于 CPU、GPU 及 TPU 推理。
  • 4-bit 量化(int4):进一步压缩模型,适用于极端内存受限的环境。通常伴随一定的精度损失,但可以显著减少内存占用。
  • 混合精度(Mixed Precision):将部分权重和激活值量化(如量化感知训练时),保留某些关键层(如嵌入层、归一化层)为高精度,以减少量化带来的精度损失。

3. 量化的优点和缺点

3.1 优点

  • 内存和存储空间减少:量化可以显著减少模型的大小。例如,将32位浮点权重量化为8位整数可以减少模型的内存占用至原来的四分之一。
  • 推理速度提升:低位计算(如8位或4位)可以加速推理过程,特别是在专用硬件(如TPU、NPU)或量化支持良好的硬件(如特定的CPU或GPU)上。
  • 能效提升:低精度计算相比高精度计算更省电,适合移动设备和嵌入式设备。

3.2 缺点

  • 精度损失:量化过程中,特别是在低位数(如4位)下,模型可能会丧失部分精度,尤其是在处理某些复杂任务时。
  • 硬件支持限制:并不是所有硬件都支持低精度运算或优化得当的低位推理。需要确保模型部署环境支持量化计算(如int8计算)。
  • 量化范围的问题:对激活值进行量化时,如果量化范围选择不当(例如激活值的动态范围过大或过小),会导致信息丢失。

4. 量化的常见工具

4.1 TensorFlow Lite

TensorFlow Lite 主要支持的是 8-bit 整数量化以及更高级的混合量化方案(如 float16 量化)。对于 4-bit 量化,原生的 TensorFlow Lite 尚未正式支持,但在某些特定的硬件或实验性框架中,可能有额外的支持。要实现 4-bit 量化,通常需要依赖一些第三方库或自定义实现,例如 NVIDIA TensorRTHugging Face 的 bitsandbytes 库等。

所以,TensorFlow Lite支持模型的8位量化以及浮点量化,适合在移动设备和嵌入式设备上部署。

训练后量化(Post-Training Quantization)示例:

import tensorflow as tf# 加载预训练模型
model = tf.keras.applications.MobileNetV2(weights="imagenet")# 保存为 TensorFlow 格式
model.save('mobilenet_v2.h5')# 将模型转换为 TensorFlow Lite 格式并进行量化
converter = tf.lite.TFLiteConverter.from_keras_model(model)# 设置量化为8-bit
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_model = converter.convert()# 保存量化后的模型
with open('quantized_mobilenet_v2.tflite', 'wb') as f:f.write(quantized_model)

4.2 PyTorch Quantization

提供了训练后量化和量化感知训练工具,可以方便地在PyTorch模型中实现量化。

PyTorch 提供了内置的量化工具,可以在模型训练后进行量化(PTQ),也可以通过量化感知训练(QAT)来量化模型。PyTorch 支持静态和动态量化。

Post-Training Quantization (PTQ) 动态量化示例如下,动态量化只对部分层(如 torch.nn.Linear)进行量化,适合推理场景。

import torch
import torch.quantization# 假设你已经有一个预训练模型
model = torch.load('model.pth')# 使用动态量化方法,将全连接层(如 torch.nn.Linear)量化为 8-bit
quantized_model = torch.quantization.quantize_dynamic(model,  # 模型{torch.nn.Linear},  # 需要量化的层dtype=torch.qint8  # 使用的量化类型
)# 保存量化后的模型
torch.save(quantized_model, 'quantized_model.pth')# 推理
input_data = torch.randn(1, 3, 224, 224)  # 假设输入大小
output = quantized_model(input_data)
print(output)

Quantization-Aware Training (QAT) 量化感知训练示例如下,在训练时进行量化仿真,通过QAT可以在量化时保持较高的精度。

import torch
import torch.quantization
import torch.nn as nn
import torch.optim as optim# 定义模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc1 = nn.Linear(784, 128)self.relu = nn.ReLU()self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return x# 初始化模型
model = SimpleModel()# 准备量化感知训练的模型
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')# 准备模型
torch.quantization.prepare_qat(model, inplace=True)# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练模型
model.train()
for epoch in range(3):  # 假设3个epochoptimizer.zero_grad()input_data = torch.randn(16, 784)  # 假设输入数据大小output = model(input_data)loss = output.sum()  # 假设简单的损失函数loss.backward()optimizer.step()# 转换为量化模型
model.eval()
quantized_model = torch.quantization.convert(model)# 推理
input_data = torch.randn(1, 784)
output = quantized_model(input_data)
print(output)

4.3 Hugging Face + bitsandbytes 量化

Hugging Face bitsandbytes支持混合精度和 k-bit 量化,用于训练大规模语言模型的低精度训练和推理。下面是使用4-bit量化推理的例子:

from transformers import AutoModelForCausalLM, AutoTokenizer
from bitsandbytes import prepare_model_for_kbit_training# 加载预训练模型
model = AutoModelForCausalLM.from_pretrained('gpt2')# 准备模型进行 4-bit 量化训练
model = prepare_model_for_kbit_training(model, use_4bit=True)  # 指定使用4-bit量化# 加载分词器
tokenizer = AutoTokenizer.from_pretrained('gpt2')# 推理测试
input_ids = tokenizer("Hello, how are you?", return_tensors="pt").input_ids# 使用量化后的模型进行生成任务
output = model.generate(input_ids)# 打印结果
print(tokenizer.decode(output[0], skip_special_tokens=True))

二、模型微调

大模型(LLM,如 BERT、GPT 系列)的微调是将一个预训练的模型应用于特定任务或数据集上,以适应该任务的需求。大模型通常在大量的无监督数据上预训练,学习到语言的广泛结构和规律,但为了使这些模型在特定任务(如情感分析、翻译、文本分类等)上表现更好,需要进行微调。

1. 为什么需要微调?

大语言模型的预训练阶段通常在通用的文本数据上进行,比如维基百科、书籍语料库、新闻等。这些数据使模型学习了语言的普遍模式和知识结构,但为了让模型在特定的任务或领域上表现出色,必须进行微调。微调能够使模型具备以下优势:

1.1 增强模型对任务的适应性

特定任务需求:预训练模型具有广泛的知识,但不具备解决特定任务的能力。通过微调,模型可以适应特定任务的需求,如情感分类、命名实体识别(NER)、机器翻译等。

1.2 减少训练成本

节省计算资源:微调是在预训练模型的基础上进行的,因此相比从头训练模型,微调大大节省了时间和计算资源。大语言模型通常已经捕获了大量的语言特征,只需在特定任务数据上进行细调即可。

1.3 提升特定领域表现

领域适应性:通过微调,模型能够适应某些领域的专业语言或术语。例如,在医学、法律等领域,通过微调可以提升模型在这些领域的理解能力。

1.4 保持模型性能的同时优化推理效率

通过微调,模型可以在特定任务上更高效地生成更优质的结果,避免使用通用模型时的过度泛化问题。

2. 微调的方法

大语言模型的微调方法有多种,以下是几种常见的微调策略:

2.1 全模型微调

在这种方法中,所有的模型参数都在微调过程中更新。全模型微调适合当任务的数据量足够大,并且任务与预训练的目标相差较大时使用。这种方式下,模型能够最大化地适应新的任务需求。

2.2 冻结底层微调(Partial Fine-tuning)

冻结部分层:对于小数据集或当任务与预训练目标差异不大时,通常只微调模型的顶层(如分类头)或最后几层,而冻结底层参数。这种方法能大幅减少计算量并避免过拟合。

2.3 增加任务头部

任务特定头部(Task-specific Head):在模型的顶层增加一个特定任务的头部(如全连接层或分类器),只训练头部参数,而保留底层预训练模型的参数不变。这种方法特别适用于分类、序列标注等任务。

2.4 基于少量参数调整的微调(如 LoRA, Prefix Tuning)

LoRA(Low-Rank Adaptation):这是一个非常轻量的微调方法,模型的绝大部分参数保持冻结,只微调小部分的低秩矩阵。这种方法能够大幅降低微调所需的计算资源和内存占用。

Prefix Tuning:在模型输入前添加一段可学习的前缀向量,而不是修改模型参数。这种方式只需微调少量参数,通常适用于生成式模型的微调。

3. 微调的流程

3.1 数据准备

微调的第一步是准备任务相关的数据集。对于分类任务,数据需要包括标签,对于生成任务,需要有文本的输入-输出对。

  • 数据集格式:数据集通常为 JSON、CSV 或其他常见格式,内容包括输入文本、标签(对于分类任务)、目标文本(对于生成任务)等。
  • 数据预处理:通常需要将数据进行预处理,如分词、去除停用词、数据清洗等操作,以便模型更好地理解数据。

3.2 模型选择

选择合适的大语言模型,如 BERT、GPT-2、GPT-3、T5 等。不同的任务适合不同的预训练模型:

  • BERT:适合分类、序列标注等任务。
  • GPT 系列:适合生成式任务,如对话生成、文本补全等。
  • T5:适合多任务学习,能够处理文本生成、翻译、问答等任务。

3.3 定义微调策略

根据任务和资源的不同,选择适合的微调策略:

  • 全模型微调:在较大的数据集上进行所有参数的微调。
  • 部分微调:仅微调顶层或者特定的层。
  • 冻结底层参数:对于小数据集,仅微调模型的顶层。
  • 轻量微调(LoRA/Prefix Tuning):通过微调小量参数完成任务,节省资源。

3.4 微调训练

使用任务数据集进行模型训练,并通过验证集评估微调效果。

  • 损失函数:分类任务通常使用交叉熵损失函数(Cross-Entropy Loss),生成任务使用序列生成的损失函数(如CrossEntropyLoss)。
  • 优化器:常用的优化器有 AdamW,它适合大型语言模型的微调。
  • 学习率调度:微调中通常使用较小的学习率,避免对预训练的知识进行大幅修改。

3.5 模型评估与调优

使用验证集对微调后的模型进行评估,并根据性能调整超参数(如学习率、批次大小等)。

  • 指标选择:根据任务选择合适的评估指标,如准确率、精确率-召回率(PR曲线)、F1 分数等。
  • 过拟合处理:微调过程中,需要监控模型是否出现过拟合情况。可以通过验证集的性能监控来避免这种情况。

3.6 模型保存与推理

训练结束后,将微调好的模型保存,并通过推理或应用于实际任务中。

4. 微调的常见工具和框架

大模型微调是当前研究的一个热点,有很多开源工具,感兴趣的朋友可以自行搜索。笔者也在学习阶段,了解还不全面,而且此处篇幅有限,就不详细展开了。

笔者理解:对于全量微调,其实就是一种训练。对于大模型而言,还是LoRA系列的微调方法比较常见,详细也可参考大模型LoRA微调过程_大模型 lora。


三、量化与微调的关系

量化和微调是两种独立的优化技术,但它们可以结合使用,尤其是在处理大规模预训练模型时,量化能够减少模型的存储和计算需求,而微调则能让模型更好地适应特定任务。例如,在大模型上进行微调后,再对模型进行量化,以减少推理的内存占用和加速推理过程。或者在量化感知训练(QAT)中,可以将微调和量化同时进行,确保量化模型在训练过程中的精度不损失太多。

读到这里,开篇的问题便应有了答案,量化模型是可以进行微调的。

模型微调后可以进行量化,模型量化后也可以进行微调。

但是,对于已经量化的模型,特别是通过 8-bit 或 4-bit 后量化(Post-Training Quantization, PTQ)后的模型,直接在该模型上进行微调通常是不建议的,因为量化模型的权重和激活值已经被限制为低精度表示。在这种情况下,微调会遇到以下几个挑战:

  • 梯度计算的精度不足:在量化后的模型中,权重和激活值是低精度的,因此梯度计算的精度也会降低。这会影响模型的收敛性,甚至可能导致训练不稳定。
  • 无法进行精确的反向传播:量化后的模型在推理过程中可以高效运行,但在微调过程中需要浮点数运算支持,否则梯度更新的精度会受到限制,进而影响模型的性能。

为了在量化模型上进行微调,量化感知训练(QAT) 是更常见和推荐的策略。QAT 在训练过程中模拟低精度计算,确保模型在训练过程中“感知”量化,从而能够更好地适应低精度推理。

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

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

相关文章

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问:当网站遇到突发的高流量情况,如热门产品促销活动、新闻热点事件导致网站访问量激增时,服务器可能会因承受过多请求而无法及时响应。例如,电商平台在 “双十一” 等购物节期间,大量用户同时…

[分享] SQL在线编辑工具(好用)

在线SQL编写工具(无广告) - 在线SQL编写工具 - Web SQL - SQL在线编辑格式化 - WGCLOUD

AI修图太牛了! | 换模特、换服装、换背景都如此简单!

前言 推荐一款我最近发现的AI工具,它就是最懂电商的千鹿AI,专门用来做电商产品图、场景图的,除此外还有AI修图、线稿上色、批量抠图等等超多图片处理工具。 本人也从事过电商行业,包括跨境电商,非常知道电商人的疾苦…

Java 多线程(七)—— 定时器

定时器介绍与使用 先简单介绍一下什么是定时器:定时器类似生活中的闹钟,当时间一到,我们就会去做某些事情。 在代码层面理解就是,当我们设置的时间一到,程序就会执行我们固定的代码片段(也就是任务&#x…

谷歌新安装包文件形式 .aab 在UE4中的打包原理

摘要 本文学习了aab的基本概念以及UE4中产生aab的构建原理。 从官网了解基本概念 官网:Android Developers 1、什么是aab? .aab包形如: 2021年7月,在Google Play应用程序中,已经有数千个应用程序率先跟进了AAB格式。…

OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 K-最近邻(K-nearest neighbours, KNN)基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…

Zypher Network Layer3 主网上线,“宝藏方舟”活动是亮点

前言 随着 Zytron Layer3 主网的上线,Zypher Network联合Linea共同推出了“宝藏方舟”活动,用户可通过参与活动,获得包括代币、积分、SBT等系列奖励。 Zypher Network 是一个以ZK方案为核心的游戏底层堆栈,其提供了一个具备主权…

C++20中头文件span的使用

<span>是C20中新增加的头文件&#xff0c;此头文件是containers库的一部分。包括&#xff1a; 1.模板类std::span&#xff1a;连续对象序列的非拥有视图(view)。std::span可以具有static extent&#xff0c;在这种情况下&#xff0c;序列中的元素数量在编译时已知并以typ…

探寻医疗行业人力资源管理系统优选方案

医疗机构管理日益重要&#xff0c;ZohoPeople HRMS助力医疗行业优化人力管理&#xff0c;提升效率。其涵盖智能排班、培训发展、合规保障、绩效管理等功能&#xff0c;支持全球化及远程协作&#xff0c;是医疗行业人力资源管理的有效工具。 一、医疗行业人力资源管理的复杂性 …

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

15.正则化——防止过拟合的有效手段

引言 在人工智能(AI)领域&#xff0c;尤其是在机器学习和深度学习中&#xff0c;正则化(regularization)具有非常重要的地位。它不仅是训练模型过程中不可或缺的一部分&#xff0c;也是提高模型性能的关键因素之一。此外&#xff0c;正则化还可以提升模型的泛化能力&#xff0…

产品如何实现3D展示?具体步骤如下

产品实现3D展示主要依赖于先进的3D建模与展示技术。以下是产品实现3D展示的具体步骤和方法&#xff1a; 一、3D建模 使用专业的3D建模软件&#xff0c;如Blender、Maya、3ds Max等&#xff0c;这些软件提供了丰富的建模工具和材质编辑器&#xff0c;能够创建出高精度的3D模型…

Flutter 12 实现双击屏幕显示点赞爱心多种动画(AnimationIcon)效果

本文主要是使用Flutter封装一个双击屏幕显示点赞爱心UI效果&#xff0c;并实现了爱心Icon 透明度、缩放、旋转、渐变等动画效果。 实现效果&#xff1a; 实现逻辑&#xff1a; 1、封装FavoriteGesture&#xff08;爱心手势&#xff09;实现双击屏幕显示爱心Icon&#xff1b; …

文件摆渡系统选型指南:如何找到最适合您的数据安全解决方案?

在当今数字化时代&#xff0c;数据的安全传输与共享已成为企业运营中不可或缺的一环。文件摆渡系统&#xff0c;作为实现数据在不同安全域之间高效、安全传输的重要工具&#xff0c;其选型直接关系到企业数据的安全性与业务效率。本文将为您详细介绍如何挑选最适合您企业的文件…

视频网站系统的设计与实现(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;视频网站系统 摘 要 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在视频信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#…

为什么k8s不支持docker-kubernetes

为什么Kubernetes不再支持Docker&#xff1f; 在Kubernetes 1.20版本之后&#xff0c;Kubernetes宣布逐步停止对Docker作为容器运行时的支持。这一改变在容器管理领域引起了广泛关注。许多人不禁疑惑&#xff1a;Kubernetes与Docker一向密切合作&#xff0c;为何会做出这样的决…

骨传导耳机哪个品牌好?2024年五大热门精选骨传导耳机推荐

在当今快节奏的生活中&#xff0c;人们对于个人音频设备的需求不仅限于优质的音质体验&#xff0c;还越来越注重健康与舒适。骨传导耳机作为一种新兴的技术产品&#xff0c;以其独特的听觉传递方式——通过颞骨而非耳道传递声音——赢得了众多用户的青睐。这种技术不仅可以提供…

Webserver(1)Linux开发环境搭建

目录 配置软件虚拟机中安装ubuntu安装ubuntu18的操作系统 安装VM tools安装XshellVscode远程连接到虚拟机 配置软件 VMwareVScodeg安装ubuntu 18.04.iso 或者镜像版本 XShellXFTP 虚拟机中安装ubuntu 安装ubuntu18的操作系统 开启虚拟机 选择中文简体 安装VM tools 打开v…

炸了!改进Transformer!Transformer-BiGRU多变量回归预测(Matlab)

炸了&#xff01;改进Transformer&#xff01;Transformer-BiGRU多变量回归预测&#xff08;Matlab&#xff09; 目录 炸了&#xff01;改进Transformer&#xff01;Transformer-BiGRU多变量回归预测&#xff08;Matlab&#xff09;分类效果基本介绍程序设计参考资料 分类效果 …

python离线安装依赖

以pymsql依赖为例操作如下: Python Package Index&#xff08;PyPI&#xff09;的官方网址是&#xff1a; PyPI The Python Package Index 在这个网站上&#xff0c;你可以搜索、浏览和下载Python包。 tar -xvzf pymysql2-1.3.3.tar.gz cd pymysql2-1.3.3 python setup.p…