引言
斯坦福传授、Tcl 言语创造者 John Ousterhout 曾写过一本书《软件设计的哲学》,零碎探讨了软件设计的通用准则和办法论,整书的中心观念是:软件设计的中心在于升高繁杂性。 实际上,这个观念也合用于波及底层硬件适配的软件设计。
以视觉模型开发为例,以往视觉模型开发过程当中,人们个别会更为关注模型自身的优化来晋升速度与成果。而关于图象前处置(预处置)和后处置阶段,人们则很少关注。 当模型计算即模型训练和推理主阶段的效力愈来愈高时,图象的先后处置阶段愈发成为图象处置工作的机能瓶颈。
详细而言,在传统的图象处置流程中,先后处置部份通常都是用 CPU 进行操作的,这会致使全部流程中 50% 到 90% 以上的任务负荷都和先后处置相干,从而它们会成为全部算法流程的机能瓶颈。 01 主流CV库的局限性
上述问题是目前市面上的主流 CV 库在运用场景上的次要局限性,也就是说,对底层硬件依赖的纷歧致性致使了繁杂性和机能瓶颈。正如 John Ousterhout 总结繁杂性缘故时所道:繁杂性源于依赖性。
主流的图象处置库 OpenCV,其运用场景十分普遍,但在实际使用的时分也会见临一些问题。
好比用 OpenCV 的 CPU 版本先做训练再做推理的时分,在推理阶段可能需求一共性能对比高的版本。
由于在训练场景里,先后处置与模型推理能够在时间上进行掩盖,从而掩盖前处置的时间。但推理流水线中,模型只包孕前向推理,且通过 Tensor RT 减速后耗时急剧减小,这时候前处置的耗时占比会十分高,难以被模型推理所掩盖。
要想增加推理场景的耗时,进步推理场景的机能,个别会用 OpenCV 的 GPU 版本进行减速。
然而OpenCV 的 CPU 版本和 GPU 版本之间可能会泛起后果纷歧致的状况。典型的例子是 resize 算子,其在 CPU 版本和 GPU 版本上关于差值的计算形式是纷歧致的。
OpenCV 在训练和推理的时分会使用不同版本的算子,在训练的时分个别用 CPU,由于其 CPU 算子掩盖度对比高,在推理的时分个别用 GPU,由于机能对比好。因此,这也会致使后果对齐的问题。也就是说,当用 CPU 做模型训练,并用 GPU 做模型推理的时分,会致使终究的输入后果无奈对齐。
其次,部份 GPU 算子的机能会有所退步。在 OpenCV 中,部份 GPU 算子自身的耗时对比大,从而致使全部算子的机能回退,乃至差于 CPU 版本。
第三,OpenCV 的 GPU 算子掩盖度是无限的,部份算子只要 CPU 版本。还有一些 GPU 算子在参数、数据类型等方面的掩盖度也没有 CPU 版本高,从而带来使用上的限度。
最初,假如在使用中将 CPU 算子和 GPU 算子交互使用,就会带来少量的 CPU 和 GPU 之间的数据拷贝和同步操作,进而致使总体的减速机能不敷高。
此外一个罕用的图象处置库是 TorchVision。
TorchVision 在做模型推理的时分,有些算子不足 C++ 接口,从而在调用的时分不足灵敏性。假如要生成 C++ 版本,必需经过 TorchScript 生成。这会致使使用上的许多未便,由于在流程两头拔出曾经其它库的算子来交互使用会带来额定开消和任务量。TorchVision 还有一个缺陷是算子的掩盖度不高。
以上就是目前的主流 CV 库的局限性。 02 一致 CV 流水线
既然先后处置的机能瓶颈次要在于使用 CPU 计算,而模型计算阶段使用 GPU 的技术曾经愈来愈成熟。
那末,一个很天然的解决计划是,用 GPU 对先后处置进行减速,对全部算法流水线将会有十分大的机能晋升。
为此,NVIDIA英伟达携手字节跳动开源了图象预处置算子库 CV-CUDA。CV-CUDA 能高效地在 GPU 上运转,算子速度能达到 OpenCV 的百倍摆布。 2023 年 1 月 15 日,9:30-十一:30,由 NVIDIA英伟达 主办的『CV-CUDA 初次地下课』,约请了来自 NVIDIA英伟达、字节跳动、新浪微博的 3 位技术专家(张毅、盛一耀、庞锋),就相干主题进行深度分享,本文汇总了三位专家的演讲精髓。
张 毅 NVIDIA GPU计算专家团队工程师 盛一耀 字节跳动 机器学习零碎工程师 庞 锋 新浪微博 资深算法工程师
采取 GPU 交换 CPU 有得多益处。首先,先后处置的算子迁徙到 GPU 上当前,能够进步算子的计算效力。 其次,因为一切的流程都是在 GPU 上进行的,能够增加 CPU 和 GPU 之间的数据拷贝。 最初,把 CPU 的负载迁徙到 GPU 上后,能够升高 CPU 的负载,将 CPU 用于处置其它需求很繁杂逻辑的工作。