计算机视觉也有类似的进步,现在被用于安全、安保和智慧城市应用。与语音识别一样,如果在边缘设备上进行深度学习推理,应用程序的响应速度会更快。与数据中心的网络连接会带来不可避免的延迟。
但是,边缘设备的资源有限,因此需要优化深度学习模型以获得最佳性能。
一种方法是量化,将用于参数信息的 32 位浮点数 (FP32) 转换为 8 位整数 (INT8)。对于准确性的小幅损失,可以显着节省内存和计算需求。
使用较低精度的数字,可以同时处理更多数字,从而提高应用程序性能。从 FP32 量化到 INT8 时,理论上的最大性能提升是 4 倍。
当前和最新的英特尔® CPU 和英特尔® 集成 GPU 支持 INT8,但旧硬件不支持。
克服量化的挑战
量化有两个挑战:
- 如何轻松做到。在过去,这是一个耗时的过程。
- 如何保持准确性。
神经网络压缩框架 (NNCF) 解决了这两个挑战。NNCF 是一套高级算法,用于优化英特尔® Distribution of OpenVINO ™工具包中的机器学习和深度学习模型以进行推理。NNCF 使用来自 PyTorch 和 TensorFlow 的模型。
NNCF的主要特点之一 是 8 位统一量化,利用最近的学术研究来创建准确和快速的模型。我们将在本文中介绍的技术称为量化感知训练 (QAT)。该方法在训练模型时模拟权重和激活的量化,因此模型中的操作在推理时可以被视为 8 位操作。微调用于恢复量化造成的精度下降。QAT 比模型训练后进行量化具有更好的准确性和可靠性。
与其他优化工具不同,NNCF 不需要用户手动更改模型或了解量化的工作原理。它是高度自动化的。您只需要使用 NNCF 特定调用来包装模型,并对原始训练数据集进行通常的微调。
如何使用 NNCF 进行统一的 8 位量化
对于这个分步示例,我们将使用来自 Torchvision 库的 PyTorch 的 ResNet-18 图像分类模型。它已经使用 ImageNet 进行了预训练,可用于广泛的应用。除了分类任务(例如分类狗的种类),它还可以作为对象检测、人员识别或图像分割管道的一部分。
您可以在此处下载包含以下步骤的 Jupyter Notebook。
第 1 步:安装先决条件
创建一个单独的 Python 虚拟环境并在其中安装以下先决条件:
Python
第 2 步:从 Python 代码中导入 NNCF
通过将以下 Python 指令添加到您的训练程序来导入 NNCF:
Python
第三步:准备模型和数据
我们假设用户有自己的原始 FP32 模型的训练管道,包括模型加载、数据准备和训练循环的步骤。
Python
OpenVINO TM推理引擎使用在训练期间插入模型的量化规则在推理期间将模型转换为 INT8。
调用create_compressed_model
插入操作模拟训练期间的 8 位量化。这种模拟有助于微调过程来调整模型,以恢复由量化过程引起的精度偏差。
第 4 步:像往常一样微调模型
接下来,使用常规微调过程来提高准确性。通常,需要以较小的学习率进行多次调整,这与通常在原始模型训练结束时使用的相同。这是我们训练程序中微调代码的简单示例。我们没有更改此代码。
不需要对训练管道进行其他更改。
第 5 步:将模型导出到 ONNX
要在 OpenVINO 推理引擎中使用 PyTorch 模型,我们首先需要将模型转换为 ONNX。
我们将使用 NNCF 辅助函数将量化模型导出为 ONNX 格式。对于图像分类模型,API 很简单。对于其他一些模型,您可能需要为导出添加额外的功能,例如,虚拟前向功能。
微调完成后,我们调用此代码将微调后的模型导出为 ONNX 格式:
第 6 步:将 ONNX 模型导出到 OpenVINO™ 中间表示 (IR)
OpenVINO 中间表示 (IR) 是 OpenVINO 推理引擎使用的文件格式。我们现在可以通过调用 OpenVINO TM模型优化器工具将 ONNX 模型转换为 OpenVINO IR 格式。
代表模型的两个文件保存到当前目录。我们将平均值添加到模型中,并使用 --mean_values 和 --scale_values 参数使用标准偏差缩放输出。这些值用于在训练期间对输入进行归一化,并表示所有训练图像的颜色强度的平均值和标准差。
使用这些模型优化器选项,无需在部署时规范化输入数据。预处理将成为模型的一部分。
使用 OpenVINO 工具包测量性能
现在我们已经创建了一个优化模型,它将在 OpenVINO 推理引擎中以 8 位精度运行。
作为最后一步,我们将测量原始 FP32 和新 INT8 模型的推理性能。为此,我们使用了基准工具,这是 OpenVINO 工具包中的推理性能测量工具。它使用随机生成的数据测量推理性能,因此不会因数据加载而引入开销。默认情况下,Benchmark Tool 在 CPU 上以异步模式运行推理 60 秒。它以延迟(每张图像的毫秒数)和吞吐量(每秒的帧数)值的形式返回推理速度。