使用XNNPack实现更快的动态量化推理
内容提要
XNNPack的全连接和卷积2D运算符现在支持动态范围量化,在TensorFlow Lite中提高了CPU推理性能。动态范围量化允许在旧的和低端设备上部署更多的AI功能。它通过根据观察到的激活范围动态计算量化参数来最大化量化过程的准确性。动态范围量化提供了与完全量化相似的性能提升,并具有更高的整体准确性。XNNPack的优化运算符可用于各种架构上的动态范围量化模型。与完全整数量化相比,动态范围量化对非专家用户更加易于使用。混合精度推理,结合半精度推理和动态范围量化,可以进一步提高CPU推理性能。基准测试显示,与使用TFLite的内核的原始float32模型相比,速度提升。
延伸解读
动态范围量化的原理与优势
动态范围量化在模型转换时将全连接和卷积算子的权重量化为8位整数,但激活值保持浮点。推理时,根据激活值的实际范围动态计算量化参数(零点和缩放因子),使8位量化充分利用,提高准确性。与完全整数量化相比,动态范围量化无需代表性数据集,且输出为浮点,整体准确性更高,同时能获得大部分性能提升。
使用条件与兼容性
使用动态范围量化只需在模型转换时启用converter.optimizations = [tf.lite.Optimize.DEFAULT]标志,无需代表性数据集,且不支持的算子不会导致转换失败,对非专家用户更友好。从TensorFlow 2.17开始,预构建二进制文件默认启用XNNPack的动态量化推理。XNNPack的优化算子支持ARM、ARM64、x86 SSE/AVX/AVX512和WebAssembly等多种架构。
混合精度推理的潜力
动态范围量化可与半精度(fp16)推理结合,在支持fp16硬件的设备上进一步提升CPU推理性能。全连接和卷积2D算子可输出fp16数据,减少浮点运算成本。对于计算密集的浮点算子如Batch Matrix Multiply和Softmax,fp16也能带来收益。但并非所有模型都支持fp16,需根据模型情况选择。
性能提升与适用场景
基准测试显示,在EfficientNetV2、Inception-v3、Deeplab-v3和Stable Diffusion等模型上,动态范围量化相比原始float32模型有显著速度提升。对于无法进行完全整数量化的模型(如Stable Diffusion),动态范围量化提供了可行的加速方案。这使得更多AI功能可以部署到旧款和低端设备上。
Q&A
动态范围量化是什么?
动态范围量化是一种在模型推理时根据观察到的激活范围动态计算量化参数的技术,旨在提高量化过程的准确性。
使用XNNPack的动态范围量化有什么优势?
使用XNNPack的动态范围量化可以在旧设备上部署更多AI功能,并提供与完全量化相似的性能提升,同时整体准确性更高。
如何在TensorFlow中启用动态范围量化?
在TensorFlow中启用动态范围量化需要在模型转换时设置converter.optimizations = [tf.lite.Optimize.DEFAULT],且不需要代表性数据集。
动态范围量化与完全量化有什么区别?
动态范围量化在推理时动态计算量化参数,而完全量化在模型转换时固定这些参数,动态范围量化的输出为32位浮点格式。
动态范围量化如何提高CPU推理性能?
动态范围量化通过优化全连接和卷积运算符,使得推理速度显著提升,尤其是在低端设备上。
混合精度推理是什么?
混合精度推理是结合半精度推理和动态范围量化的一种技术,旨在进一步提高设备上的CPU推理性能。