OpenVINO 2021r2 - Remote Blob API of GPU Plugin 示例复现(二) Inference within User-Supplied Shared Contex

本文主要是介绍OpenVINO 2021r2 - Remote Blob API of GPU Plugin 示例复现(二) Inference within User-Supplied Shared Contex,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天再试试官方文档Remote Blob API of GPU Plugin里面的另一个例子Running GPU Plugin Inference within User-Supplied Shared Context,大概的意思就是由用户提供自己的OpenCL context,OpenVINO的clDNN利用用户共享的context来跑inference (对应的场景应该是用户已经有了自己的OpenCL实现的应用,然后要把OpenVINO GPU推理功能集成进自己应用的场景)。

 

官网的例子只给出了一部分代码片段,看的云山雾罩的,但是有了前一次的经验,感觉实现起来并不难,大致就是利用用户OCL对象的context来转换成remote context,创建ExecuableNetwork的时候把remote context传进去,这样clDNN里面所有OCL的操作都会基于用户提供这个context, 而不会创建自己独立的context. 另外输入输出的数据共享可以通过shared blob把OV推理网络的输入和输出层的数据指向用户自己创建的cl_mem内存对象即可。

 

GPU RemoteBlob API推理代码的实现

		/********************* Init OpenCL Device ***************************************///模拟3个用户从外面传进来的OpenCL对象(user_context,user_device,user_queue) 后面的//OpenVINO的IE clDNN都基于这个用户提供的OpenCL context来创建cl::Context user_context;cl::Device user_device;cl::CommandQueue user_queue;// get Intel iGPU OCL device, create context and queue{const unsigned int refVendorID = 0x8086;cl_uint n = 0;cl_int err = clGetPlatformIDs(0, NULL, &n);// Get platform liststd::vector<cl_platform_id> platform_ids(n);err = clGetPlatformIDs(n, platform_ids.data(), NULL);for (auto& id : platform_ids) {cl::Platform platform = cl::Platform(id);std::vector<cl::Device> devices;platform.getDevices(CL_DEVICE_TYPE_GPU, &devices);for (auto& d : devices) {if (refVendorID == d.getInfo<CL_DEVICE_VENDOR_ID>()) {user_device = d;user_context = cl::Context(user_device);break;}}}cl_command_queue_properties props = CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE;user_queue = cl::CommandQueue(user_context, user_device, props);}.../*********** 开始演示OpenVINO Shared GPU context的用法 *******************//* 使用这种方法 IE/clDNN初始化时不会自己创建新的OpenCL ctx, 而是基于用户提供的OCL ctx来创建 *///create remote context, 先基于用户的OCL ctx创建remote contextauto remote_context = gpu::make_shared_context(ie, FLAGS_d, user_context.get());//创建shared execute network时, clDNN基于remote OCL context来初始化auto exec_net_shared = ie.LoadNetwork(network, remote_context);// inference using remote blobauto inf_req_shared = exec_net_shared.CreateInferRequest();auto dims = network.getInputsInfo().begin()->second->getTensorDesc().getDims();size_t imSize = dims[1] * dims[2] * dims[3];cout << "imSize = " << imSize << " dims[1]=" << dims[1] << " dims[2]=" << dims[2] << " dims[3]=" << dims[3] << endl << endl;size_t num_channels = dims[1];size_t image_size = dims[3] * dims[2];//prepare input image data/** Iterate over all pixel in image (b,g,r) **/unsigned char *ImageBuffer;ImageBuffer = (unsigned char *)malloc(imSize);unsigned char* pixels = (unsigned char*)(jpg.data);for (size_t pid = 0; pid < image_size; pid++) {/** Iterate over all channels **/for (size_t ch = 0; ch < num_channels; ++ch) {/**          [images stride + channels stride + pixel id ] all in bytes            **/ImageBuffer[ch * image_size + pid] = pixels[pid*num_channels + ch];//set input data to 0//ImageBuffer[ch * image_size + pid] = 0;}}//这里模拟用户自己的OCL ctx创建的一个cl::Buffer, 用来放推理的输入数据cl_int err;cl::Buffer shared_buffer(user_context, CL_MEM_READ_WRITE, imSize, NULL, &err);{void *buffer = ImageBuffer;user_queue.enqueueWriteBuffer(shared_buffer, true, 0, imSize, buffer);}//将这个cl::Buffer转成shared blobBlob::Ptr shared_blob = gpu::make_shared_blob(network.getInputsInfo().begin()->second->getTensorDesc(), remote_context,shared_buffer);//将推理网络的输入部分指向这个shared blob, 推理时会从这个blob里读数据inf_req_shared.SetBlob(network.getInputsInfo().begin()->first, shared_blob);//这里是已知用的是squeezenet, 输出是1000个FP32的数据,所以创建2个FP32 [1000]的数组size_t outputSize = 1000 * 4;float *C = new float[1000];float *D = new float[1000];for (int i = 0; i < 1000; i++){C[i] = 0;D[i] = 0;}//这里模拟用户自己的OCL ctx创建的一个cl::Buffer, 用来放推理输出的数据cl::Buffer shared_output_buffer(user_context, CL_MEM_READ_WRITE, outputSize, NULL, &err);{void *buffer = ImageBuffer;//将输出Buffer清零user_queue.enqueueWriteBuffer(shared_output_buffer, true, 0, sizeof(float)*1000, C);}//将输出的cl::Buffer转成shared blobBlob::Ptr shared_output_blob = gpu::make_shared_blob(network.getOutputsInfo().begin()->second->getTensorDesc(), remote_context,shared_output_buffer);//将推理网络输出数据层替换成这个shared blob, 这样推理输出的数据就会放到shared_output_buffer里inf_req_shared.SetBlob(network.getOutputsInfo().begin()->first, shared_output_blob);inf_req_shared.Infer();// Copy the output data back to the host//从shared_output_buffer里读出推理结果,放到数组D里user_queue.enqueueReadBuffer(shared_output_buffer, CL_TRUE, 0, sizeof(float) * 1000, D);for (int i = 0; i < 1000; i++){//如果D数组的值大于0.0001, 则输出D数组的数据,数组的index对应1000组分类的indexif (D[i] > 0.0001){cout << "C[" << i << "] = " << C[i] << " - D[" << i << "] = " << D[i] << endl;}//可以看到输出分类信息和普通infernece输出结果一致,但是输出数据放在用户的cl::Buffer里}

 

编译运行程序,得到结果

 

和上一篇OpenCL Kernel Execution on a Shared Buffer例子的输出一致,收工 :)

 

个人感受:

OV的2个例子shared buffer和shared context的思路基本是一致的。因为GPU里运行的不同程序也和CPU这边的多进程程序一样,不同进程之间的数据是相互隔离的。所以要想共享GPU多个程序之间的数据,最简单的方法就是多个程序共享同一个OCL的context来创建, 也就是互相认干爹,有了同一个context爸爸,数据自然也就能互相访问了 :)

 

最后完整项目奉上,仅供参考

https://gitee.com/tisandman/cl_ov_sharing_ctx

这篇关于OpenVINO 2021r2 - Remote Blob API of GPU Plugin 示例复现(二) Inference within User-Supplied Shared Contex的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301006

相关文章

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Restful API 原理以及实现

先说说API 再说啥是RESRFUL API之前,咱先说说啥是API吧。API大家应该都知道吧,简称接口嘛。随着现在移动互联网的火爆,手机软件,也就是APP几乎快爆棚了。几乎任何一个网站或者应用都会出一款iOS或者Android APP,相比网页版的体验,APP确实各方面性能要好很多。 那么现在问题来了。比如QQ空间网站,如果我想获取一个用户发的说说列表。 QQ空间网站里面需要这个功能。