2月11日,NVIDIA做了一次线上讲座:
NVIDIA对VPI(视觉编程接口-Vision Programming Interface)做了一个比较详细的介绍,尤其讲解了为什么要用VPI:
NVIDIA提到,在很多开发场景里:
- 需要多个互不兼容的API,
- 很难做到高效的内存管理,
- 很难对代码进行实验或微调。
- 重要的是有些计算引擎不能通过公共API直接访问。
所以VPI的出现是为了解决和实现下面的功能:
- 使用所有Jetson嵌入式加速器创建有效的CV管道
- 不同加速器实现相同算法在系统级别轻松平衡CV
- 工作负载统一的API与不同的加速器接口
- 在Jetson和x86 Linux PC上实现加速
- 不同加速器之间的Zero-copy内存管理
- 与OpenCV,NVIDIA®CUDA®,EGL等实现互操作性
- 设计用于取代NVIDIA®VisionWorks™
我们的理解是:从NV本文的介绍来看, VPI从软件方面综合了CPU上的经典算法和GPU上的经典算法的加速实现,. 例如可能是OpenCV, CUDA kernel, 以及, 其他的Vulkan/EGL之类的标准, 甚至是这里没有提到过的NV的NPP(基本图像处理功能的加速库). 也就是从软件上说, 它是一个新兴的功能集大成者。
为何要弄一个新的VPI, 而不是让以前的老用户自己手写kernel,或者继续沿用OpenCV呢? NV给出的理由主要是, 这个新东西是NV充分优化的, 能充分利用各种硬件. 比单纯的上一些老库效果/性能要好。
充分利用硬件这里主要说了, 用VPI这个新库, 能自动利用CPU, 能利用GPU, 包括在Jetson平台和PC平台上; 也能利用PVA和VIC这两种特殊的专用图像处理/视频处理加速硬件(仅限Jetson)。
而后面两种硬件, 以前NV是不开放的, 现在开放了以后, 可以在Jetson上免费启用, 从而能获取性能加速。例如我们可以理解成类似以前的Xavier和NX上的DLA一类的东西, 硬件在卖出产品的时候, 功能就造好了, 但是DLA直到后期卖了很久,软件方面才开放, 才让你用起来。
PVA和VIC也是这种道理,以前在没有VPI的时候, 我们的用户买了Jetson平台后, 进行加速的图像/视频处理, 只能用CPU和集成的GPU来。现在有了VPI后, 开放了PVA和VIC这两部分硬件, 从而能让用户手中的硬件升值了, 性能更好了。
有人可能要问,什么是PVA和VIC? NVIDIA也解释了一下:
从上图可以看到PVA目前只支持Jetson AGX Xavier和Xavier NX产品;VIC目前虽然支持全系列Jetson设备,但是某些运算也只支持Jetson AGX Xavier和Xavier NX。
NVIDIA给出了一个VPI在CPU和GPU上的benchmark,以及跟Visionworks的比较:
用VPI的确看似快了15x-30x, 但是存在一个问题——
用户以前用OpenCV, 可以方便的切换到PC平台上, 甚至切换到AMD家的平台上。用了这个VPI后, 虽然暂时简单了, 方便了, 性能快了(都是NV说的), 但是以后就绑定在NV的船上了。具体说绑定了NV的PC和NV的Jetson上了。
所以你如果为了节省开发成本, 和节省产品上市时间, 就使用VPI。如果不使用, 但换取随时可以跳船到AMD之类的可能. 这是个问题。
当然, 因为我们销售Jetson, 自然是希望用户绑定为好。但这里从公平的角度, 还是要说一下的。
NVIDIA特别强调了VPI的一个重要亮点:
什么是API统一? 也就是底层无论是CPU(PC/Jetson), 还是GPU(PC/Jetson), 还是PVA和VIA(Jetson only), 上层的接口都是统一的。也就是说, NV在支持的情况下, 部分算法至少实现了4个版本, 对应4个底层的硬件。这其实减少了很大的用户的工作量。
工作量主要减少在于, 用户不需要分别为各个底层组件微调了, 直接一套API用在所有的硬件形态上了,同时VPI内部, 还提供了自动负载均衡,例如在Xavier和NX上, 当CPU满载的以后, 可能/可以自动往GPU或者PVA上offload。
注意:一个使用了VPI的应用, 将不像以前我们那样写CPU或者GPU那样那样的完全自由, 每一行都可以自由定制, VPI应用(本文有说明)不是这样的,使用了VPI的硬件将自动分成一些基本的流水线, 和流水线里的固定功能(部分参数可变)的组件, 则这些组件可以在满足一定的依赖和前后发生的关系的情况下, 自动分布到不同的底层4种硬件上。
这个就像之前NV大获成功的deepstream那样,用了deepstream就不那么自由了, 不是啥都能随便干了,而是需要将应用拆分成deepsteam和gstreamer的基本组件,然后再用这些基本组件"拼"起来,就像积木那样.
如果说我们用传统的在Jetson上的写视频/图像处理应用, 是等于在用纯水泥之类的盖房子;则用deepstream和今天的VPI这种, 就是存在基本的楼板, 楼梯, 厨房, 厕所之类的"功能块",一个房子是用这些基本的块直接拼接起来的. 不像纯用水泥那么自由, 但是好处是快, 而且每个块(例如一个厨房功能块), 都是NV自己调好的, 无BUG, 上来就能用, 性能还不错.
这也是一个取舍的问题。
以后能到忽略 opencv的地步吗?
看功能介绍是基本可以的:
这是1.0版本的VPI发布版所提供的算法实现(注意不是所有算法实现都有4个版本的,有些是特定的).
注意第2-5个.这4个是bilateral滤波, gaussian滤波, 高斯金字塔, 卷积.很多年前,我们有一个用户用了半年时间, 在A卡上实现并优化了这4个,非常非常辛苦,然而这4个已经是VPI所提供的基本功能块(算法实现)之一了。
理论上说, 这个表会不断的扩充,毕竟这是1.0版本,最终OpenCV所有的, 可能它都会有。
当年这个用户不使用OpenCV的主要原因是, OpenCV的实现太慢了,不具有生产和实用价值.而我们之前在VPI的介绍中看到, VPI比OpenCV具有显著的加速.所以以前不能用OpenCV, 必须要手工上的场合,今天可能就可以直接用VPI了,因为当前的限制因素(性能), 可能已经被VPI解决了。
NVIDIA的大局观
我们其实不能不感慨NV的布局之深, 特别是今天的VPI这里,
大家还记得Xavier是哪年出来的么?
好吧. 2018年了.但是DLA何时才开放用起来的?而PVA/VIC(今天的VPI的组成部分2/4)又是2021年才开放。既然当年在设计硬件的时候, 就将这两种硬件嵌入成里面的功能块了, 证明NV的roadmap上(我们看不到), 这是一步比较深远的谋划了. 如此深远的谋划, 而且能坚持到今天(3年都足够一些小公司倒闭了), 提供了实现。证明这应该是NV的路线上的重要东西。
实际上的确如此!
VPI将取代VisonWorks
注意:NVIDIA也说了,将来VisionWorks将停止开发,将被VPI替代.
VisionWorks是NV手写的, 调好的OpenVX的GPU加速版本了.
我们之前看到了VPI将会替代OpenCV, 现在又说了VPI会替代VisionWorks/OpenVX, 毕竟VisionWorks只是GPU加速, 而VPI能根据算法的特性和当前系统中的任务量, 自动分配给底层的4种硬件.
VPI目前还没有Python接口
注意:现在只有C接口,但是未来会有Python接口