五行关键代码实现的零拷贝技术

openlab_96bf3613 更新于 1月前

作者:辽宁科技大学 研究生 冯浩

指导教师:英特尔边缘计算创新大使  深圳职业技术大学 副教授 张海刚

一、引言

1.1 OpenVINO简介

图1.1.1 OpenVINO

OpenVINO(Open Visual Inference & Neural Network Optimization)是由Intel开发的一个开源计算机视觉和深度学习工具套件。它旨在帮助开发者和研究人员优化他们的计算机视觉和深度学习模型,以便在Intel的硬件平台上获得更高的性能。

OpenVINO提供了一系列的工具和库,包括OpenVINO SDK、OpenVINO API、OpenVINO Tools等,以支持开发者和研究人员在Intel的处理器、GPU、FPGA等硬件平台上进行模型的推理和优化。OpenVINO还提供了对各种深度学习框架的支持,如TensorFlow、PyTorch、Keras等,使得开发者可以轻松地将自己的模型部署到Intel的硬件平台上。

OpenVINO的设计目标是提供高性能、高效率和低延迟的视觉智能推理,使得计算机视觉和深度学习模型可以在各种设备和场景中得到广泛应用,包括智能城市、智能交通、智能医疗、智能安防等领域。

OpenVINO是一个活跃的开源项目,吸引了众多的开发者和研究人员参与其中,不断地优化和完善其功能和性能。

1.2 Resnet50简介

图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.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 file): 零拷贝技术可以通过内存映射文件的方式,将文件直接映射到应用程序的地址空间中。这样,应用程序可以直接在内存中访问文件数据,而无需进行额外的数据**。

3、直接内存访问(DMA): 零拷贝技术可以利用直接内存访问来避免CPU的介入,直接在设备和内存之间传输数据。这减少了CPU的拷贝操作,提高了数据传输的效率。

4、数据发送和接收缓冲区的优化: 通过优化数据发送和接收缓冲区的管理,可以减少或避免数据的**。例如,通过使用环形缓冲区或共享内存,可以实现零拷贝。

5、网络数据传输的零拷贝: 在网络编程中,零拷贝技术还可以通过在应用层和传输层之间减少或消除数据的拷贝来提高性能。这通常涉及使用零拷贝套接字操作或使用专门的网络协议栈。

图2.2.2OpenVINO With Zero-Copy

首先要理解OpenVINO中的零拷贝技术就需要介绍一下他的背景应用通常流程。在实际应用的场景中数据来源一般是编码压缩后的视频,或者视频流。①首先需要将视频传入到GPU中的Video Decoder单元进行解码,得到的是每一帧的三通道或者四通道图像(RGB 、BGRA等);②之后再将解码后的图像从显存拷贝到内存中;③在内存中执行预处理;④再将预处理后的数据拷贝到GPU显存中;⑤通知AI推理模块OpenVINO进行模型推理;⑥将推理后的输出数据拷贝回内存中;⑦最后对内存中的输出数据执行后处理。

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

0个评论