目录
克服量化的挑战
如何使用NNCF进行统一的8位量化
第 1 步:安装先决条件
第 2 步:从Python代码中导入NNCF
第 3 步:准备模型和数据
第 4 步:像往常一样微调模型
第 5 步:将模型导出到ONNX
第 6 步:将ONNX模型导出到OpenVINO™中间表示(IR)
使用OpenVINO工具包测量性能
结论
资源
声明和免责声明
作者: Alexander Kozlov、Yury Gorbachev、Alexander Suslov、Vasily Shamporov和Nikolay Lyalyushkin
如果你来我家,你可能会听到童话。在世界各地,有不同的语音激活助手可以做非凡的事情。我的女儿喜欢让我们阅读关于美妙世界的故事。
这几乎就像我们自己生活在一个科幻世界中。想到语音识别成为主流的速度之快,我感到很惊讶。20年前,使用能理解语音的计算机制作的电影似乎有些牵强。今天,我们经常使用语音识别来播放音乐或设置闹钟。随着硬件和软件的不断发展,我可以想象,在三年的时间里,成年人也许可以享受与语音助手的有趣对话。
计算机视觉也有类似的进步,现在被用于安全、安保和智慧城市应用。与语音识别一样,如果在边缘设备上进行深度学习推理,应用程序的响应速度会更快。与数据中心的网络连接会带来不可避免的延迟。
但是,边缘设备的资源有限,因此需要优化深度学习模型以获得最佳性能。
一种方法是量化,将用于参数信息的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虚拟环境并在其中安装以下先决条件:
$pip install nncf[torch]
$pip install openvino openvino-dev
通过将以下Python指令添加到您的训练程序来导入NNCF:
import torch
import torchvision
import nncf # Important - should be imported directly after torch
from nncf import NNCFConfig
from nncf.torch import create_compressed_model
from nncf.torch.initialization import register_default_init_args
我们假设用户有自己的原始FP32模型的训练管道,包括模型加载、数据准备和训练循环的步骤。
model = torchvision.models.resnet18(pretrained=True)
train_loader, val_loader = create_data_loaders(...) # placeholder for DataLoader
nncf_config_dict = {
"input_info": {
"sample_size": [1, 3, 64, 64]
},
"compression": {
"algorithm": "quantization", # specify the algorithm here
}
}
# Load a configuration file to specify compression
nncf_config = NNCFConfig.from_dict(nncf_config_dict)
# Provide data loaders for compression algorithm initialization, if necessary
nncf_config = register_default_init_args(nncf_config, train_loader)
# Apply the specified compression algorithms to the model
compression_ctrl, model = create_compressed_model(model, nncf_config)
OpenVINO TM推理引擎使用在训练期间插入模型的量化规则在推理期间将模型转换为INT8。
调用create_compressed_model插入操作模拟训练期间的8位量化。这种模拟有助于微调过程来调整模型,以恢复由量化过程引起的精度偏差。
第 4 步:像往常一样微调模型接下来,使用常规微调过程来提高准确性。通常,需要以较小的学习率进行多次调整,这与通常在原始模型训练结束时使用的相同。这是我们训练程序中微调代码的简单示例。我们没有更改此代码。
total_epochs = 5
for epoch in range(total_epochs):
for i, (images, target) in enumerate(train_loader):
output = model(images)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
不需要对训练管道进行其他更改。
第 5 步:将模型导出到ONNX要在OpenVINO推理引擎中使用PyTorch模型,我们首先需要将模型转换为ONNX。
我们将使用NNCF辅助函数将量化模型导出为ONNX格式。对于图像分类模型,API很简单。对于其他一些模型,您可能需要为导出添加额外的功能,例如,虚拟前向功能。
微调完成后,我们调用此代码将微调后的模型导出为ONNX格式:
compression_ctrl.export_model('resnet18_int8.onnx')
OpenVINO中间表示(IR)是OpenVINO推理引擎使用的文件格式。我们现在可以通过调用OpenVINO TM模型优化器工具将ONNX模型转换为OpenVINO IR格式。
代表模型的两个文件保存到当前目录。我们将平均值添加到模型中,并使用--mean_values和--scale_values参数使用标准偏差缩放输出。这些值用于在训练期间对输入进行归一化,并表示所有训练图像的颜色强度的平均值和标准差。
使用这些模型优化器选项,无需在部署时规范化输入数据。预处理将成为模型的一部分。
$mo \
--input_model resnet18_int8.onnx \
--input_shape "[1, 3, 64, 64]" \
--mean_values "[123.675, 116.28, 103.53]" \
--scale_values "[58.395, 57.12, 57.375]"
有关详细信息,请参阅模型优化器开发人员指南。
使用OpenVINO工具包测量性能现在我们已经创建了一个优化模型,它将在OpenVINO推理引擎中以8位精度运行。
作为最后一步,我们将测量原始FP32和新INT8模型的推理性能。为此,我们使用了基准工具,这是OpenVINO工具包中的推理性能测量工具。它使用随机生成的数据测量推理性能,因此不会因数据加载而引入开销。默认情况下,Benchmark Tool在CPU上以异步模式运行推理60秒。它以延迟(每张图像的毫秒数)和吞吐量(每秒的帧数)值的形式返回推理速度。
为了获得更准确的性能,我们建议在关闭其他应用程序后在终端中运行Benchmark Tool (benchmark_app)。利用:
$benchmark_app -m model.xml -d CPU
在CPU上对异步推理进行基准测试一分钟。
将CPU更改为GPU以在Intel GPU上进行基准测试。运行:
$benchmark_app --help
查看所有命令行选项的概述。
为了测试我们在第6步中导出的模型,我们使用:
$benchmark_app -m resnet18_int8.xml -d CPU
您可以以相同的方式对原始FP32或FP16 OpenVINO IR模型进行基准测试以比较结果。
使用英特尔®至强®铂金8280处理器和英特尔®深度学习加速技术,INT8优化实现了3.62倍的加速(见表1)。在使用具有相同指令集的第11代智能英特尔® 酷睿™ i7–1165G7处理器的本地设置中,加速比为3.63倍。这些数字是使用带有OpenVINO工具套件版本2021.4.2的OpenVINO基准测试基础设施测量的。
用于推理的硬件
FP32
INT8
加速
Intel(R) Xeon(R) Platinum 8280 CPU @ 2.70GHz
1578FPS
5714帧/秒
3.62倍
第11代 Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
97帧/秒
353帧/秒
3.63倍
表 1:使用神经网络压缩框架的INT8优化实现的加速。FPS是每秒帧数。
硬件配置:- 基于Xeon 8280的平台:1节点,英特尔参考平台上的2个 Intel Xeon 8280 CPU,总DDR4内存为384 GB(12个插槽/32GB/2934),Ubuntu 18.04.6 LTS,5.0.0-23-generic 。
- 基于酷睿i7-1165G7的平台:1节点,英特尔参考平台上的1个英特尔酷睿 i7-1165G7 CPU,总DDR4内存为8 GB(1 个插槽/1GB/3200),Microsoft Windows 10 Enterprise,10.0.19042 N/A Build 19042.图像分类推理:ResNet-18,BS=1,INT8使用 OpenVINO 2021.4.2,英特尔于2022年2月3日进行测试。
结论在本文中,我们演示了如何使用NNCF 8位量化感知训练来加速PyTorch模型的推理。正如我们所展示的,该过程很简单,不需要对训练代码进行重大更改。OpenVINO的部署流程与浮点模型的部署流程相同。
在以后的文章中,我们将展示如何在TensorFlow中使用NNCF进行模型推理优化,并将介绍更高级的优化技术,这些技术也有助于实现加速。
资源- 下载最新版本的OpenVINO工具包。
- 使用英特尔DevCloud访问最新的英特尔硬件。
性能因使用、配置和其他因素而异。访问www.Intel.com/PerformanceIndex了解更多信息。
性能结果基于截至配置中所示日期的测试,可能无法反映所有公开可用的更新。有关配置详细信息,请参阅备份。没有任何产品或组件是绝对安全的。
您的成本和结果可能会有所不同。
英特尔技术可能需要启用硬件、软件或服务激活。
英特尔否认所有明示和默示保证,包括但不限于适销性、特定用途适用性和不侵权的默示保证,以及因履行过程、交易过程或贸易使用产生的任何保证。
结果已被估计或模拟。
©英特尔公司。英特尔、英特尔标识、OpenVINO和OpenVINO标识是英特尔公司或其子公司的商标。其他名称和品牌可能会被视为他人的财产。
本文最初发布于Easily Optimize Deep Learning with 8-Bit Quantization - Intel Communities
https://www.codeproject.com/Articles/5330040/Easily-Optimize-Deep-Learning-with-8-Bit-Quantizat