点击上方
“
小白学视觉
”,选择加"
星标
"或“
置顶
”
重磅干货,第一时间送达
作者:Edison_G当 CPU 图像预处理成为视觉任务的瓶颈,最新开源的CV-CUDA,将为图像预处理算子提速百倍。
以图像背景模糊算法为例,将
CV-CUDA
替换
OpenCV
作为图像预
/
后处理的后端,整个推理过程吞吐量能加
20
多倍。
如果小伙伴们想试试更快、更好用的视觉预处理库,可以试试这一开源工具。
开源地址:https://github.com/CVCUDA/CV-CUDA
图像预
/
后处理已成为
CV
瓶颈
以图像背景模糊算法为例,常规的图像处理流程中预\后处理主要在 CPU 完成,占据整体 90% 的工作负载,其已经成为该任务的瓶颈。
-
部分算子的
CPU
和
GPU
结果精度无法对齐;
-
部分算子
GPU
性能比
CPU
性能还弱;
-
同时存在各种
CPU
算子与各种
GPU
算子,当处理流程需要同时使用两种,就额外增加了内存与显存中的空间申请与数据迁移
/
数据拷贝;
完全在 GPU 上进行预处理与后处理,将大大降低图像处理部分的CPU 瓶颈。
正如前文的背景模糊吞吐量加速比图,如果采用
CV-CUDA
替代
OpenCV
和
TorchVision
的前后处理后,整个推理流程的吞吐率提升
20
多倍。其中预处理对图像做
Resize
、
Padding
、
Image2Tensor
等操作,后处理对预测结果做的
Tensor2Mask
、
Crop
、
Resize
、
Denoise
等操作。
在同一个计算节点上(
2x Intel Xeon
Platinum 8168 CPUs
,
1x NVIDIA A100 GPU
),以
30fps
的帧率处理
1080p
视频,采用不同
CV
库所能支持的最大的并行流数。测试采用了
4
个进程,每个进程
batchSize
为
64
。
对于单个算子的性能,
NVIDIA
和字节跳动的小伙伴也做了性能测试,很多算子在
GPU
上的吞吐量能达到
CPU
的百倍。
图片大小为 480*360,CPU 选择为 Intel(R) Core(TM)
i9-7900X,BatchSize 大小为 1,进程数为 1
此外,因为
CV-CUDA
同时拥有
C++
接口与
Python
接口,它能同时用于训练与服务部署场景,在训练时用
Python
接口跟快速地验证模型能力,在部署时利用
C++
接口进行更高效地预测。
CV-CUDA
免于繁琐的预处理结果对齐过程,提高了整体流程的效率。
CV-CUDA
进行
Resize
的
C++
接口
实战,
CV-CUDA
怎么用
常规图像识别的预处理流程,使用
CV-CUDA
将会把预处理过程与模型计算都统一放在
GPU
上运行。
如下在使用
torchvision
的
API
加载图片到
GPU
之后,
Torch Tensor
类型能直接通过
as_tensor
转化为
CV-CUDA
对象
nvcvInputTensor
,这样就能直接调用
CV-CUDA
预处理操作的
API
,在
GPU
中完成对图像的各种变换。
如下几行代码将借助
CV-CUDA
在
GPU
中完成图像识别的预处理过程:裁剪图像并对像素进行归一化。其中
resize()
将图像张量转化为模型的输入张量尺寸;
convertto()
将像素值转化为单精度浮点值;
normalize()
将归一化像素值,以令取值范围更适合模型进行训练。
CV-CUDA
各种预处理操作的使用与
OpenCV
或
Torchvision
中的不会有太大区别,只不过简单调个方法,其背后就已经在
GPU
上完成运算了。
现在借助借助
CV-CUDA
的各种
API
,图像分类任务的预处理已经都做完了,其能高效地在
GPU
上完成并行计算,并很方便地融合到
PyTorch
这类主流深度学习框架的建模流程中。剩下的,只需要将
CV-CUDA
对象
nvcvPreprocessedTensor
转化为
Torch Tensor
类型就能馈送到模型了,这一步同样很简单,转换只需一行代码:
通过这个简单的例子,很容易发现
CV-CUDA
确实很容易就嵌入到正常的模型训练逻辑中。如果读者希望了解更多的使用细节,还是可以查阅前文
CV-CUDA
的开源地址。
CV-CUDA
对实际业务的提升
CV-CUDA
实际上已经经过了实际业务上的检验。在视觉任务,尤其是图像有比较复杂的预处理过程的任务,利用
GPU
庞大的算力进行预处理,能有效提神模型训练与推理的效率。
CV-CUDA
目前在抖音集团内部的多个线上线下场景得到了应用,比如搜索多模态,图片分类等。
字节跳动机器学习团队表示,
CV-CUDA
在内部的使用能显著提升训练与推理的性能。例如在训练方面,字节跳动一个视频相关的多模态任务,其预处理部分既有多帧视频的解码,也有很多的数据增强,导致这部分逻辑很复杂。复杂的预处理逻辑导致
CPU
多核性能在训练时仍然跟不上,因此采用
CV-CUDA
将所有
CPU