作者:冯浩 辽宁科技大学 研究生
1. 引言
1.1 OpenVINO™ 简介
图 1.1.1 OpenVINO™
OpenVINO™(Open Visual Inference & Neural Network Optimization)是由英特尔开发的一个开源计算机视觉和深度学习工具套件。它旨在帮助开发者和研究人员优化他们的计算机视觉和深度学习模型,以便在英特尔的硬件平台上获得更高的性能。
OpenVINO™ 提供了一系列的工具和库,包括 OpenVINO SDK、OpenVINO API、OpenVINO Tools 等,以支持开发者和研究人员在英特尔的处理器、GPU、FPGA 等硬件平台上进行模型的推理和优化。OpenVINO™ 还提供了对各种深度学习框架的支持,如 TensorFlow、PyTorch、Keras 等,使得开发者可以轻松地将自己的模型部署到英特尔的硬件平台上。
OpenVINO™ 的设计目标是提供高性能、高效率和低延迟的视觉智能推理,使得计算机视觉和深度学习模型可以在各种设备和场景中得到广泛应用,包括智能城市、智能交通、智能医疗、智能安防等领域。
OpenVINO™ 是一个活跃的开源项目,吸引了众多的开发者和研究人员参与其中,不断地优化和完善其功能和性能。
1.2Resnet50 简介
图 1.2.1 Resnet
ResNet-50 是一种深度学习模型,属于卷积神经网络(CNN)的一种。它是微软研究院的研究人员于 2015 年提出的一种模型,是 ResNet(残差网络)的一种变体。ResNet-50 被广泛应用于计算机视觉任务中,如图像分类、目标检测和语义分割等。
ResNet-50 模型具有 50 层,其中包括 49 个卷积层和 4 个池化层。它采用了残差学习的思想,即在每一层中添加一个或多个残差块,使得模型可以更好地学习图像的特征。这种设计使得 ResNet-50 模型可以有效地提取图像的特征,提高了模型的性能和准确度。
ResNet-50 模型在一些公开的图像识别数据集上取得了很好的成绩,如 ImageNet 数据集。它也经常被用作其他深度学习模型的预训练模型,用于提取图像的特征。由于其深度和性能,ResNet-50 模型在计算机视觉领域中被广泛使用,并且已经成为了一种标准的模型之一。
1.3 ffmpeg libraries 简介
FFmpeg Libraries 是一组强大的开源库,用于处理视频和音频数据。它们是 FFmpeg 项目的一部分,提供了一系列的功能,包括音视频编解码、格式转换、过滤和播放等。这些库是用 C 语言编写的,具有高度的可移植性和效率,可以在多种操作系统和硬件平台上使用。
FFmpeg Libraries 由于其强大的功能和灵活性,被广泛应用于视频播放器、视频编辑软件、流媒体服务器、视频分析工具等项目中。它们是多媒体处理领域的重要工具,对于开发高质量的音视频应用程序至关重要。
1.4 文章目的与结构安排
本篇文章将详细阐述如何使用 Resnet50 模型进行部署,并展示如何利用 OpenVINO™ 框架结合异步推理及零拷贝技术,从而提高 Resnet50 模型的推理速度。此外,为了让读者更好地理解和掌握相关知识,文章还将提供一个典型示例供读者参考,以便更好地掌握 Resnet50 模型的推理部署方法。
2. 异步推理与零拷贝技术概述
2.1异步推理的概念与优势
异步推理 (Asynchronous Inference) 顾名思义,也就是在调用执行推理的这个代码块的时候并不会等待模型推理的结束并且阻塞当前的线程,而是直接越过当前需要的等待代码(类似于 I/O 操作)块继续执行下面的代码。
图 2.1 异步推理伪代码图
一般的 AI 视觉模型推理一般存在三个步骤。其一是预处理,将原始数据图像数据进行 resize、letterbox、颜色通道转换(BGR->RGB、RGBA->RGB)、padding 等各种预处理操作以符合模型输入要求;其二是将预处理好的数据传入后调用底层的框架进行模型推理;其三是将模型输出的结果进行一个后处理(例如解析 raw 数据、进行 NMS 等操作)。在多次的对比实验中我们发现前面的三个步骤只有第二个耗时最多并且阻塞线程,故我们考虑采用异步推理的模式。
2.2零拷贝技术的概念与优势
图 2.2.1 零拷贝原理图
传统意义上的零拷贝技术是指在数据传输过程中,避免不必要的数据复制操作,以提高数据传输的效率。在计算机系统中,数据通常存储在内存中,而在进行输入输出(I/O)操作时,数据需要在应用程序的地址空间和操作系统内核的地址空间之间进行传递。零拷贝技术的目标是尽可能减少或消除这些数据拷贝的开销。
常见的零拷贝应用技术:
1. 用户空间和内核空间的数据传递:
传统的 I/O 操作通常涉及将数据从用户空间复制到内核空间,或者反之。零拷贝技术通过直接在用户空间和内核空间之间传递指针或描述符,而不是复制数据,来避免数据的多余拷贝。
2. 文件映射(Memory-mapped files):
零拷贝技术可以通过内存映射文件的方式,将文件直接映射到应用程序的地址空间中。这样,应用程序可以直接在内存中访问文件数据,而无需进行额外的数据复制。
3. 直接内存访问(DMA):
零拷贝技术可以利用直接内存访问来避免 CPU 的介入,直接在设备和内存之间传输数据。这减少了 CPU 的拷贝操作,提高了数据传输的效率。
4. 数据发送和接收缓冲区的优化:
通过优化数据发送和接收缓冲区的管理,可以减少或避免数据的复制。例如,通过使用环形缓冲区或共享内存,可以实现零拷贝。
5. 网络数据传输的零拷贝:
在网络编程中,零拷贝技术还可以通过在应用层和传输层之间减少或消除数据的拷贝来提高性能。这通常涉及使用零拷贝套接字操作或使用专门的网络协议栈。
图 2.2.2 OpenVINO™ With Zero-Copy
首先要理解 OpenVINO™ 中的零拷贝技术就需要介绍一下他的背景应用通常流程。在实际应用的场景中数据来源一般是编码压缩后的视频,或者视频流。
1、首先需要将视频传入到 GPU 中的 Video Decoder 单元进行解码,得到的是每一帧的三通道或者四通道图像(RGB 、BGRA等);
2、之后再将解码后的图像从显存拷贝到内存中;
3、在内存中执行预处理;
4、再将预处理后的数据拷贝到 GPU 显存中;
5、通知 AI 推理模块 OpenVINO™ 进行模型推理;
6、将推理后的输出数据拷贝回内存中;
7、最后对内存中的输出数据执行后处理。
OpenVINO™ 中的零拷贝技术,实质上是指省略了第 ② 和 ④ 步的操作,并将第 ③ 步的操作集中在 GPU 设备中进行,从而减少了两次不必要的数据复制过程。此举可在一定程度上提升推理速度。
2.3零拷贝技术在 OpenVINO™ 中的实现
2.3.1 零拷贝
首先经过 ffmpeg 解码之后会拿到一个 AVFrame 类型的指针数据他保存了解码之后的一帧图像的原始数据,我们可以使用这个指针并且利用 OpenVINO™ 的接口获取创建一个 NVTensor,即是 NV 格式的图像数据,这个图像数据就可以直接放入 OpenVINO™ 进行推理。
auto id = (VASurfaceID)(std::size_t)frame->data[3];
auto va_context = ov_compiled_model.get_context().as<ov::intel_gpu::ocl::VAContext>();
auto Nvtensor = va_context.create_tensor_nv12(iHeight, iWidth, id);
Infer_request.set_input_tensor(0, nvTensor.first); // Y plane
Infer_request.set_input_tensor(1, nvTensor.second); // UV plane
这样就完成了数据由解码端传输到 OpenVINO™ 推理端。详细代码可以参考:https://github.com/wxxz975/ZeroCopyWithOpenVINO
如欲了解更多 OpenVINO™ 开发资料,请扫描下方二维码,我们会把最新资料及时推送给您。