标签:大模型,模型量化,PTQ,Post Training Quantization,模型优化,深度学习 时间:2024-03-18T19:45:21
大模型量化技术PTQ(Post Training Quantization)是一种对已经训练好的大规模机器学习模型进行量化的技术,可以在不需要重新训练模型的情况下,将模型的权重和激活值从较高精度(如FP32)量化为较低精度的定点数(如INT8),从而显著减小模型体积,加快推理速度,同时模型精度不会有明显下降。
与需要在训练过程中引入量化(QAT,Quantization Aware Training)的方法相比,PTQ最大的优势在于不需要重新训练模型,可以直接对现有的模型进行量化优化,大大节省了时间和算力成本。这对于像BERT、GPT等动辄数百上千亿参数的超大规模预训练语言模型尤为重要。
PTQ的核心思想是找到一种最优的量化方式,在保证量化前后数值分布相似的情况下,将原始浮点数(FP32)映射到定点整数(INT8)。具体来说,主要分为以下几个步骤:
确定量化范围:根据待量化张量的数值分布,确定一个合适的量化范围[a,b],使得尽可能多的数值落在此区间内。常见的方法包括最小最大值量化、KL散度等。
计算比例因子(scale)和零点(zero point):将量化范围线性映射到定点整数范围(如INT8的-128~127),得到比例因子S和零点Z。量化后的整数值q与原始浮点值r的关系为:r = S * (q - Z)
量化权重:利用得到的比例因子和零点,将权重矩阵的每个元素量化为定点整数。
量化激活值:对于模型的输入输出以及每一层的激活函数输出,也需要进行量化。由于激活值是在推理时动态生成的,无法提前统计分布,因此常见的做法是利用少量校准数据,统计激活值的分布情况,并据此确定量化范围。
调整计算细节:由于量化后的权重和激活都是定点整数,因此原始的浮点矩阵乘操作需要替换为定点的乘加操作,并在最后一步将结果反量化为浮点数。
下面是一个INT8量化的简单示例:
import numpy as np # 假设待量化的权重矩阵 weights = np.random.rand(3, 3) # 计算量化范围 a = np.min(weights) b = np.max(weights) # 计算比例因子和零点 scale = (b - a) / 255 zero_point = -round(a / scale) # 量化权重 weights_quant = np.round(weights / scale + zero_point).astype(np.int8) # 反量化得到近似值 weights_dequant = (weights_quant - zero_point) * scale
相比于其他量化方法,PTQ具有以下优势:
目前主流的深度学习框架如PyTorch、TensorFlow等都提供了完善的PTQ工具。以PyTorch为例,其提供的torch.quantization模块支持一键量化感知训练和PTQ量化,并与ONNX Runtime等推理引擎无缝连接,可以方便地将量化后的模型部署到生产环境中。
torch.quantization
以下是一个利用PyTorch进行PTQ量化的简单示例:
import torch import torchvision from torch.quantization import get_default_qconfig, quantize_jit # 加载预训练好的ResNet18模型 model = torchvision.models.resnet18(pretrained=True) # 定义量化配置 qconfig = get_default_qconfig('fbgemm') # 将模型设置为量化模式 model.qconfig = qconfig model.eval() # 使用少量校准数据来确定激活值范围 calib_data = torch.rand(16, 3, 224, 224) model(calib_data) # 执行量化 quantized_model = quantize_jit(model) # 保存量化后的模型 torch.jit.save(quantized_model, "resnet18_int8.pt")
上面的代码首先加载了一个预训练好的ResNet18模型,然后设置量化配置,将模型设置为评估模式。接着,使用少量随机数据对模型进行校准以确定激活值范围。最后,调用quantize_jit函数执行量化,并将量化后的模型保存为resnet18_int8.pt。量化后的模型可以直接用于推理加速。
quantize_jit
resnet18_int8.pt
PTQ(Post Training Quantization)是一种简单易用、高效通用的模型量化方法,可以显著压缩模型体积,加速推理速度,同时保持模型精度基本不变。它不需要重新训练模型,可以直接应用于各种已训练好的大模型,因此非常适合用于将大模型部署到资源受限的生产环境中,如移动设备、IoT等。
随着深度学习模型的规模不断增大,模型量化技术也在不断发展,RTN量化、混合精度量化等新方法不断涌现。但无论技术如何演进,高效、易用、通用始终是衡量量化技术优劣的关键标准。PTQ量化凭借其在这些方面的出色表现,已经成为业界最常用的模型量化方法之一。相信未来PTQ量化技术还将不断完善,为深度学习模型的工业级应用提供更加有力的支持。
导致Sam离职风波背后的OpenAI最近的技术突破——Q*项目信息汇总
DataLearnerAI发布中国国产开源大模型生态概览统计:国产开源大模型都有哪些?现状如何?
大模型泛化能力详解:大模型泛化能力分类、泛化能力来源和泛化研究的方向
大模型如何使用长上下文信息?斯坦福大学最新论文证明,你需要将重要的信息放在输入的开始或者结尾处!
需要多少GPU显存才能运行预训练大语言模型?大语言模型参数规模与显存大小的关系估算方法~
又一个国产开源大模型发布:前腾讯创始人创业公司元象发布XVERSE-13B,超过Baichuan-13B,与ChatGLM2-12B齐平!但免费商用授权!
国产开源大模型再添重要玩家:BAAI发布开源可商用大模型Aquila
目前业界支持中文大语言模型开源和商用许可协议总结
百度文心一言发布,功能尝鲜概览
能否用85000美元从头开始训练一个打败ChatGPT的模型,并在浏览器中运行?
Batch Normalization应该在激活函数之前使用还是激活函数之后使用?
Saleforce发布最新的开源语言-视觉处理深度学习库LAVIS
深度学习模型训练将训练批次(batch)设置为2的指数是否有实际价值?
指标函数(Metrics Function)和损失函数(Loss Function)的区别是什么?
亚马逊近线性大规模模型训练加速库MiCS来了!
Hugging Face发布最新的深度学习模型评估库Evaluate!
XLNet基本思想简介以及为什么它优于BERT
开源版本的GPT-3来临!Meta发布OPT大语言模型!
超越Cross-Entropy Loss(交叉熵损失)的新损失函数——PolyLoss简介
强烈推荐斯坦福大学的深度学习示意图网站
Dirichlet Distribution(狄利克雷分布)与Dirichlet Process(狄利克雷过程)
回归模型中的交互项简介(Interactions in Regression)
贝塔分布(Beta Distribution)简介及其应用
矩母函数简介(Moment-generating function)
使用R语言进行K-means聚类并分析结果
普通最小二乘法(Ordinary Least Squares,OLS)的详细推导过程
H5文件简介和使用
深度学习技巧之Early Stopping(早停法)
手把手教你本地部署清华大学的ChatGLM-6B模型——Windows+6GB显卡本地部署
Wishart分布简介