返回博客2025年1月29日

Quantization:机器学习中的量化

AILLM量化

机器学习中的量化

量化是一种强大的技术,可以显著提高机器学习模型的效率和性能,尤其是在将它们部署到资源受限的设备上时。本文提供了对量化的全面概述,涵盖了其目的、原理以及具体实施方法。

简介

在资源受限的设备(如手机和嵌入式系统)上部署复杂的机器学习模型是一个重大挑战。量化已经成为解决这一挑战的关键方案,它通过将模型参数(权重和激活值)从高精度浮点数(通常是32位)转换为较低精度的表示形式(如8位整数)来实现。这种精度的降低带来了多项好处,包括减少内存占用、加快推理速度、降低功耗和提高兼容性。

机器学习模型的权重通常使用以下精度之一:

  • FP32:32位浮点数,称为"全精度"
  • FP16:16位浮点数,称为"半精度"
  • FP8:在L4和H100 GPU上支持的8位浮点数
  • INT8:8位整数格式
  • INT4:4位整数格式

量化涉及降低模型权重的精度,比如从FP16降至INT8。这反过来降低了运行模型对计算和内存的需求,提高了推理性能。

理解这个过程的一种方式是将其视为压缩的一种形式,类似于创建JPEG图像。在处理图像时,需要在图像大小和质量之间找到平衡。FP16就像高质量的JPEG:尺寸较大但合理,几乎没有压缩损失。

需要注意的是,量化并不是一个统一的过程。不同的库和框架存在不同的算法、方法和实现。

目的

量化的主要目的是优化机器学习模型,使其能够在资源受限的环境中部署。这包括边缘设备、实时应用和云成本降低。

量化的应用

虽然在深度学习中广泛使用,但量化在其他领域也有应用,包括:

  • 信号处理:量化有助于减少表示信号所需的数据量,实现高效存储和传输。但会引入量化噪声,可能影响信号质量。
  • 无线通信:量化用于将模拟信号数字化以通过数字信道传输。量化级别的选择影响信噪比和整体通信质量。
  • 控制系统:在控制系统中,量化可能影响控制信号的精度和系统稳定性。需要仔细分析以确保量化误差不会导致不良行为。
  • FPGA/ASIC设计:量化在使用FPGA或ASIC设计数字电路时至关重要。它涉及用有限位数表示连续值,这会影响电路性能和功耗。

原理

量化的核心原理是用较低精度的表示来近似浮点数。这可以比作将数字四舍五入到特定的小数位数。例如,不用3.14159来表示一个值,我们可能将其近似为3.14。这降低了精度,但也减少了存储空间和计算复杂度。

最常见的量化方案涉及将一系列浮点值映射到较小的整数集。这种映射由缩放因子(scaling factor)和零点(zero point)确定。缩放因子决定了可以表示的值的范围,而零点允许精确表示值0。

不同的量化技术采用各种策略来确定最佳映射并最小化由于精度降低导致的准确性损失。

如何实现量化

现在我们已经理解了量化的基本原理,让我们探讨它在实践中是如何实现的。

量化类型

量化主要有两种类型:

  • 训练后量化(Post-Training Quantization, PTQ):这种方法应用于已经训练好的模型。它涉及将模型的权重从浮点数转换为较低精度,而无需重新训练。PTQ实现相对简单,但可能导致一些准确性下降。

  • 量化感知训练(Quantization-Aware Training, QAT):这种方法在训练过程本身中就包含了量化。模型使用模拟量化进行训练,使其能够适应较低精度并最小化准确性损失。QAT通常比PTQ获得更好的准确性,但需要更多的计算资源。

量化技术

实现量化使用了几种技术:

  • 均匀量化(Uniform Quantization):将浮点值的范围划分为相等的区间,每个区间由一个量化值表示。这是最简单的量化形式,通常应用于权重和激活值。

  • 非均匀量化(Non-Uniform Quantization):不同区间分配不同的大小,允许在关键范围内具有更高的精度。这种方法对于具有非均匀分布的参数可能更有效,可能在关键范围内保留更多信息。

  • 权重共享(Weight Sharing):相似的权重被聚类并共享相同的量化值,进一步减少模型大小。这种技术减少了唯一权重的数量,导致进一步压缩。

  • 激活感知权重量化(Activation-Aware Weight Quantization, AWQ):该技术旨在平衡效率提升和精度。AWQ保护模型中最重要的权重不被改变。

  • 混合量化(Hybrid Quantization):对权重和激活值都进行量化,带来显著的内存和速度改进。这种技术通过对权重(模型的参数)和激活值(中间输出)应用量化来减少大小并加速神经网络。

  • 纯整数量化(Integer-Only Quantization):所有计算都使用整数运算,使模型与针对整数运算优化的硬件兼容。这种技术特别适用于针对整数运算优化的硬件加速器。

  • LLM.int8():这种方法动态调整计算精度以保持大型语言模型(LLM)中的关键信息和准确性。它通过将其他值量化为8位的同时保持较高精度来有效处理异常值。

量化工具

有各种工具和库可用于实现量化:

工具描述主要特性
TensorFlow LiteGoogle开发的用于移动和嵌入式设备的开源深度学习框架提供TensorFlow模型量化工具,包括PTQ和QAT;支持不同量化技术和优化选项
PyTorchMeta开发的开源机器学习框架提供内置量化功能,支持各种量化技术;提供灵活性和对量化过程的控制
AIMETQualcomm开发的用于优化AI模型高效推理的工具包提供高级量化技术,如AdaRound,以保持低精度下的准确性;支持各种模型架构和硬件平台
TensorRT-LLMNVIDIA用于优化和部署大型语言模型的框架包含用于大型语言模型的内置量化算法;为LLM推理提供高性能和效率
bitsandbytes提供快速高效的8位和4位机器学习模型量化的库消除了用输入数据校准量化模型的需求;支持各种量化技术,包括动态量化和分块量化,以优化内存使用和性能

学习资源

几个在线课程和讲座提供了关于机器学习中量化的深入知识:

  • 深入理解量化:这个中级课程涵盖线性量化的各个方面,包括对称与非对称模式,以及每张量、每通道和每组量化等不同粒度。它还包括在PyTorch中构建通用量化器的实践练习。

  • 使用Hugging Face的量化基础:这个初级课程介绍量化的基本概念,并提供使用Hugging Face Transformers库和Quanto库量化开源模型的实践示例。

代码示例和实现

提供了几个量化的代码示例和实现:

  • IBM Granite:IBM提供了使用llama.cpp量化的四种规模(3B、8B、20B、34B)的代码模型。这些模型展示了量化在高效代码生成中的应用。

  • Hugging Face Optimum:这个库提供了使用不同工具针对不同目标执行量化的API,包括ONNX RuntimeIntel Neural CompressorPyTorch FX Graph Mode量化。

  • Zama Concrete ML:这个库提供了用于全同态加密(FHE)的机器学习模型量化工具。它支持不同的量化技术,并提供量化输入和反量化输出的API。

  • TensorFlow模型优化工具包:这个工具包提供了使用PTQ和QAT量化TensorFlow模型的API。它包括如何量化图像分类和目标检测等不同类型模型的示例。

指标和数据

用于评估量化方法的几个指标:

  • 准确性:测量量化模型与原始模型相比的性能
  • 推理速度:评估量化模型进行预测所需的时间
  • 模型大小:测量量化模型的内存占用
  • 功耗:评估量化模型的能源效率

在研究论文和基准测试中可以找到展示量化改进或差异的数据。例如,论文《用于高效纯整数推理的神经网络量化和训练》展示了在最小化准确性损失的同时实现显著的加速和内存减少。

此外,量化研究继续在推进。论文《离散化神经网络的松弛量化》介绍了一种在训练阶段更好地为量化准备神经网络的新方法,导致准确性提高。另一篇论文《理解量化神经网络训练中的直通估计器》为直通估计器(straight-through estimator, STE)的理论理解做出了贡献,这是量化感知模型训练中使用的一种技术。

模型权重的动态范围和分布是决定量化成功的关键因素。模型权重内的大范围和均匀分布意味着从浮点值到整数的映射将清晰并导致较少的信息损失。

流行的量化模型

几个流行的模型利用量化技术来提高效率和性能:

  • GPTQ(Generalized Post-Training Quantization - 广义训练后量化):一种训练后量化技术,通过降低模型权重的精度来压缩大型语言模型(LLM)。它通过最小化量化过程中引入的误差来工作,即使对于具有数十亿参数的模型也是如此。GPTQ允许量化到非常低的精度(2-4位),而不会显著降低性能。

  • AWQ(Activation-Aware Weight Quantization - 激活感知权重量化):一种在量化过程中考虑模型激活的量化方法。它通过观察激活来保护最重要的权重,从而更好地保持准确性。AWQ在量化指令调优和多模态LLM方面表现出色。

  • QLoRA(Quantized Low-Rank Adaptation - 量化低秩适应):LoRA(Low-Rank Adaptation - 低秩适应)技术的扩展,通过量化用于微调的低秩矩阵进一步减少内存使用。QLoRA通过将预训练模型量化为4位精度,使得在单个GPU上微调大型模型成为可能。

  • LLM.int8():专门为大型语言模型设计的量化方法。它动态调整计算精度以保持关键信息和准确性。与简单的8位量化不同,LLM.int8()通过保持异常值在更高精度的同时将其他值量化为8位来有效处理异常值。

  • bitsandbytes:提供快速高效的8位和4位机器学习模型量化的库。它以易用性和与各种硬件的兼容性而闻名。bitsandbytes消除了用输入数据校准量化模型的需求。

GGUF和4位加载

GGUF(GPTQ-Generated Unified Format),代表"GPTQ生成的统一格式"。它是一种用于存储量化语言模型的文件格式,主要与llama.cpp推理引擎一起使用。

"以4位加载模型"指的是加载权重已被量化为4位精度的模型。这显著减少了模型的大小和内存占用,使您可以在性能较低的硬件上运行更大的模型。

挑战和注意事项

虽然量化提供了显著的优势,但必须注意以下挑战和考虑因素:

  • 准确性权衡:降低模型参数的精度可能导致准确性下降。这种准确性下降的程度取决于模型架构、使用的量化技术和具体任务。
  • 模型和硬件兼容性:并非所有量化技术都适用于所有模型和硬件平台。根据具体要求和约束选择适当的技术至关重要。
  • 调优和优化:量化通常需要仔细调优和优化,以在准确性和效率之间达到最佳平衡。这可能涉及尝试不同的量化参数和技术。

技术总结

量化是在资源受限设备和实时应用中高效部署机器学习模型的关键技术。通过降低模型参数的精度,量化在内存使用、推理速度和功耗方面实现了显著改进。虽然可能存在轻微的准确性权衡,但有各种技术和工具可用于最小化这种影响。随着机器学习领域的不断发展,量化将在使AI更易访问和更高效方面发挥越来越重要的作用。

量化技术的选择取决于在准确性、速度和模型大小之间所需的平衡。不同的工具提供了实现这种平衡的各种选项。例如,如果准确性至关重要,可能更倾向于选择量化感知训练。如果模型大小和速度是主要考虑因素,那么使用权重共享或混合量化的训练后量化可能更合适。

总的来说,量化是优化机器学习模型并使其能够在更广泛的应用和环境中部署的有价值技术。

准备开始了吗?

先简单说明目标,我会给出最合适的沟通方式。