Deepstream 并行模型推理 - Python

Deepstream 并行模型推理 - Python

之前的应用都是一个管道一个app,就算有多个模型推理的应用需求也是采用的串行方式。然而一个pipeline一个应用还是太过于死板。正好看到英伟达官方退出了单pipeline并行模型推理的例子(不是因为公司任务)。网上python相关的代码基本没有(谷歌也搜不到),就提前踩了一下坑。

References

问题

  1. 官方示例是C写的,用python实现会有很多未知的问题。
  2. C代码中很多函数是闭源的,无法深入去看实现细节。
  3. 官方的nvgstmetamux插件直接丢了一个so动态链接库给你,C还好,makefile里面写一写就行了,python要用pybind注册转一堆操作,反正就算把这个包丢到lib路径下,用python是不能make这个gstreamer插件的。

实现过程

先看官方

在这里插入图片描述
图片来源
官方的做饭是首先在主pipeline中使用了一个streammux,之后接了一个tee。重点来了,官方是分了N个branch,每个branch都有一组streamdemux和streammux来分离/拼接需要的视频源,具体实现代码可以参考官方代码中的create_parallel_infer_bin函数。
然而在用python复现这个操作的时候,却出现了意料之外的问题:除了第一个branch,其他剩余的branch都没有数据。
具体来说,在其他branch的sink(统一为fakesink)如果设置async为false,那么整个pipeline就会卡在第一帧,因为其他branch在无休止的等待数据到来。async设置为true,则只有第一个branch有数据。在其他branch的任意位置放置探针来打印FPS,则全为0。
随着进一步实验,在移除掉其他路的streammux和streamdemux,tee出来直接接PGIE-n之后,则恢复正常。所以应该是哪儿设置不对,然后试了很久也不清楚(这俩插件的代码都是闭源的)。

另一种方法

因为业务需求,必须要根据不同的源来进行模型的选择,还需要同一个源多个模型推理。所以想了想,也不一定需要按照官方的做法来。其实tee和demuxer的作用是差不多的,那么我们主管道中使用一个streamdemux和streammux配对,对于主管道的demuxer分出来的N个视频源,每个视频源接一个tee,对于任意branch的子streammux,只需要修改原来的streamdemux-streammux配对为tee-streammux即可。
事实证明这种方法是可行的。所以最后的罪魁祸首应该就是demux没配置对,然而官方关于demux的文档实在是太少了,根本无从下手,只能暂时用这个方法代替了。
最后的管道长这样
在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值