模型量化是将神经网络模型中的参数(如权重和激活值)从一个大的数值范围(通常是连续的数值范围)映射到一个较小的有限数值范围的过程。这项技术可以减少模型的大小和计算复杂度,并提高模型在资源受限环境(如移动设备或嵌入式系统)中的运行效率。模型量化通过降低参数的精度来实现压缩,但也会引入一定的精度损失。因此,在量化过程中,需要平衡模型大小、计算复杂度和精度。常见的量化方法包括定点量化、浮点量化等。你可以根据具体场景和需求选择合适的量化策略。
我们希望将 GenAI 模型部署到边缘设备,并允许更多设备进入 GenAI 场景,如移动设备、AI PC/Copilot+PC 和传统的物联网设备。通过量化模型,我们可以基于不同设备将其部署到不同的边缘设备。结合硬件制造商提供的模型加速框架和量化模型,我们可以构建更好的 SLM 应用场景。
在量化场景中,我们有不同的精度(INT4、INT8、FP16、FP32)。以下是常用量化精度的解释
INT4 量化是一种激进的量化方法,将模型的权重和激活值量化为 4 位整数。由于表示范围较小且精度较低,INT4 量化通常会导致较大的精度损失。然而,与 INT8 量化相比,INT4 量化可以进一步减少模型的存储需求和计算复杂度。需要注意的是,INT4 量化在实际应用中相对较少,因为过低的精度可能导致模型性能显著下降。此外,并非所有硬件都支持 INT4 操作,因此在选择量化方法时需要考虑硬件兼容性。
INT8 量化是将模型的权重和激活值从浮点数转换为 8 位整数的过程。尽管 INT8 整数表示的数值范围较小且精度较低,但它可以显著减少存储和计算需求。在 INT8 量化中,模型的权重和激活值会经过一个量化过程,包括缩放和偏移,以尽可能保留原始浮点信息。在推理过程中,这些量化值会被反量化回浮点数进行计算,然后再量化回 INT8 进行下一步操作。这种方法在大多数应用中可以提供足够的精度,同时保持较高的计算效率。
FP16 格式,即 16 位浮点数(float16),相比于 32 位浮点数(float32)减少了一半的内存占用,在大规模深度学习应用中具有显著优势。FP16 格式允许在相同的 GPU 内存限制内加载更大的模型或处理更多的数据。随着现代 GPU 硬件不断支持 FP16 操作,使用 FP16 格式还可能带来计算速度的提升。然而,FP16 格式也有其固有的缺点,即较低的精度,这可能在某些情况下导致数值不稳定或精度损失。
FP32 格式提供了更高的精度,可以精确表示更广泛的数值范围。在执行复杂数学运算或需要高精度结果的场景中,FP32 格式是首选。然而,高精度也意味着更多的内存使用和更长的计算时间。对于大规模深度学习模型,尤其是当模型参数众多且数据量巨大时,FP32 格式可能导致 GPU 内存不足或推理速度下降。
在移动设备或物联网设备上,我们可以将 Phi-3.x 模型转换为 INT4,而 AI PC / Copilot PC 可以使用更高的精度,如 INT8、FP16、FP32。
目前,不同的硬件制造商有不同的框架来支持生成模型,如 Intel 的 OpenVINO、Qualcomm 的 QNN、Apple 的 MLX 和 Nvidia 的 CUDA 等,结合模型量化完成本地部署。
在技术方面,我们在量化后有不同的格式支持,如 PyTorch / Tensorflow 格式、GGUF 和 ONNX。我做了 GGUF 和 ONNX 之间的格式比较和应用场景。在这里,我推荐 ONNX 量化格式,从模型框架到硬件都有很好的支持。在本章中,我们将重点介绍使用 ONNX Runtime for GenAI、OpenVINO 和 Apple MLX 进行模型量化(如果你有更好的方法,也可以通过提交 PR 给我们)
本章内容包括
免责声明: 本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。应将原始语言的文档视为权威来源。对于关键信息,建议使用专业的人类翻译。对于因使用本翻译而引起的任何误解或误读,我们不承担任何责任。