英偉達(dá) CV-CUDA 高性能圖像處理加速庫 Alpha 版本發(fā)布 ,并在 GitHub 上開源
IT之家 12 月 21 日消息,英偉達(dá)宣布,CV-CUDA (Computer Vision – Compute Unified Device Architecture)高性能圖像處理加速庫,近日發(fā)布 Alpha 版本,正式向全球開發(fā)者開源。用戶可在 GitHub 下載和試用。
CV-CUDA 是一個(gè)開源項(xiàng)目,可在 AI 成像和計(jì)算機(jī)視覺 (CV) 流程中通過 GPU 加速構(gòu)建高效的預(yù)處理和后處理步驟。CV-CUDA 前期由 NVIDIA 和字節(jié)跳動的機(jī)器學(xué)習(xí)團(tuán)隊(duì)聯(lián)合開發(fā)。
隨著短視頻 App、視頻會議平臺以及 VR / AR 等技術(shù)的發(fā)展,視頻與圖像已逐漸成為全球互聯(lián)網(wǎng)流量的主要組成部分。包含我們平時(shí)接觸到的這些視頻圖像,也有很多是被 AI 和計(jì)算機(jī)視覺(CV)算法處理并增強(qiáng)過的。然而,隨著社交媒體和視頻分享服務(wù)的快速增長,作為 AI 圖像算法基礎(chǔ)的視頻圖像處理部分,也早已成為計(jì)算流程中不可忽視的成本和瓶頸。回顧一下圖像處理的一些常見的例子,以更好地理解 CV-CUDA 的應(yīng)用場景。
(相關(guān)資料圖)
(1)AI 算法圖像背景模糊化
圖像背景模糊化通常會被應(yīng)用于視頻會議,美圖修圖等場景。在這些場景中,我們通常希望 AI 算法可以把主體之外的背景部分模糊化,這樣可以保護(hù)用戶隱私,美化圖像等。圖像背景模糊化的流程大體可以分為 3 個(gè)過程:前處理,DNN 網(wǎng)絡(luò)以及后處理過程。前處理過程,通常包含了對圖像做 Resize、Padding、Image2Tensor 等操作;DNN 網(wǎng)絡(luò)可以是一些常見 segmentation network,比如 Unet 等;后處理過程,通常包括 Tensor2Mask、Crop、Resize、Denoise 等操作。
在傳統(tǒng)的圖像處理流程中,前處理和后處理部分通常都是使用 CPU 進(jìn)行操作,這導(dǎo)致整個(gè)圖像背景模糊化流程中,有 90% 的工作時(shí)間消耗在前后處理部分,因而成為了整個(gè)算法流水線的瓶頸。若能把前后處理妥善利用 GPU 加速,這將能大幅提升整體的計(jì)算性能。
當(dāng)把前后處理部分都放到 GPU 上后,就可以對整個(gè) pipeline 進(jìn)行端到端的 GPU 加速。經(jīng)過測試,在單個(gè) GPU 上,相比于傳統(tǒng)圖像處理方式,把整個(gè) pipeline 移植到 GPU 后,可以獲得 20 倍以上的吞吐率提升。這無疑會大大的節(jié)省計(jì)算成本。
(2)AI 算法圖像分類
圖像分類是最常見的 AI 圖像算法之一,通常可以用于物體識別,以圖搜圖等場景,幾乎是所有 AI 圖像算法的基礎(chǔ)。圖像分類的 pipeline 大體可以分為 2 個(gè)部分:前處理部分和 DNN 部分。其中前處理部分,在訓(xùn)練和推理過程中最常見的 4 種操作包括:圖片解碼、Resize、Padding、Normalize。DNN 部分已經(jīng)有了 GPU 的加速,而前處理部分通常都會使用 CPU 上的庫函數(shù)進(jìn)行處理。如果能夠把前處理部分也移植到 GPU 上,那么一方面可以釋放 CPU 資源,另一方面也可以進(jìn)一步提升 GPU 利用率,從而可以對整個(gè) pipeline 進(jìn)行加速。
針對前后處理部分,目前已有的一些主流應(yīng)用方案:圖像處理庫是 OpenCV、使用 PyTorch 框架進(jìn)行模型訓(xùn)練引入的 torchvision 圖像處理庫等。
如上所述,傳統(tǒng)的圖像預(yù)處理操作一般在 CPU 上進(jìn)行,一方面會占用大量的 CPU 資源,使得 CPU 和 GPU 的負(fù)載不均衡;另一方面由于基于 CPU 的圖像加速庫不支持 batch 操作,導(dǎo)致預(yù)處理的效率低下。為了解決當(dāng)前主流的圖像處理庫所存在的一些問題,NVIDIA 和字節(jié)跳動的機(jī)器學(xué)習(xí)團(tuán)隊(duì)聯(lián)合開發(fā)了基于 GPU 的圖像處理加速庫 CV-CUDA,并擁有以下特點(diǎn):
(1)Batch
支持 batch 操作,可以充分利用 GPU 高并發(fā)、高吞吐的并行加速特性,提升計(jì)算效率和吞吐率。
(2)Variable Shape
支持同一 batch 中圖片尺寸各不相同,保證了使用上的靈活性。此外,在對圖片進(jìn)行處理時(shí),可以對每張圖片指定不同的參數(shù)。例如調(diào)用 RotateVarShape 算子時(shí),可以對 batch 中每張圖片指定不同的旋轉(zhuǎn)角度。
(3)C / C++/Python 接口
在部署機(jī)器學(xué)習(xí)算法時(shí)需要對齊訓(xùn)練和推理流程。一般來說,訓(xùn)練時(shí)利用 python 進(jìn)行快速驗(yàn)證,推理時(shí)利用 C++ 進(jìn)行高性能部署,然而一些圖像處理庫僅支持 python,這給部署帶來了極大的不便。如果在訓(xùn)練和推理采用不同的圖像處理庫,則又需要在推理端重新實(shí)現(xiàn)一遍邏輯,過程會非常繁瑣。
CV-CUDA 提供了 C、C++ 和 Python 接口,可以同時(shí)服務(wù)于訓(xùn)練和推理場景。從訓(xùn)練遷移到推理場景時(shí),也可免去繁瑣的對齊流程,提高部署效率。
(4)獨(dú)立算子設(shè)計(jì)
CV-CUDA 作為基礎(chǔ)圖像處理庫,采用了獨(dú)立算子設(shè)計(jì),不需要預(yù)先定義流水線。獨(dú)立算子的設(shè)計(jì)具有更高的靈活性,使調(diào)試變得更加的容易,而且可以使其與其他的圖像處理交互,或者將其集成在用戶自己的圖像處理上層框架中。
(5)結(jié)果對齊 OpenCV
不同的圖像處理庫由于對一些算子的實(shí)現(xiàn)方式不一致導(dǎo)致計(jì)算結(jié)果難以對齊。例如常見的 Resize 操作,OpenCV、OpenCV-gpu 以及 torchvision 的實(shí)現(xiàn)方式都不一樣,計(jì)算結(jié)果存在差異。因此如果在訓(xùn)練時(shí)用 OpenCV CPU 版本而推理時(shí)若要采用 GPU 版本或其他圖像處理庫,就會面臨結(jié)果存在誤差的問題。
在設(shè)計(jì)之初,我們考慮到當(dāng)前圖像處理庫中,很多用戶習(xí)慣使用 OpenCV 的 CPU 版本,因此在設(shè)計(jì)算子時(shí),不管是函數(shù)參數(shù)還是圖像處理結(jié)果上,盡可能對齊 OpenCV CPU 版本的算子。當(dāng)用戶從 OpenCV 遷移到 CV-CUDA 時(shí),只需做少許改動便可使用,且圖片處理結(jié)果和 OpenCV 一致,不需要重新訓(xùn)練模型。
(6)易用性
CV-CUDA 提供了 Image、ImageBatchVarShape 等結(jié)構(gòu)體,方便用戶的使用。同時(shí)還提供了 Allocator 類,用戶可以自定義顯存分配策略(例如用戶可以設(shè)計(jì)顯存池分配策略來提高顯存分配速度),方便上層框架集成和管理資源。目前 CV-CUDA 提供了 PyTorch、OpenCV 和 Pillow 的數(shù)據(jù)轉(zhuǎn)化接口,方便用戶進(jìn)行算子替換和進(jìn)行不同圖像庫之間的混用。
(7)針對不同 GPU 架構(gòu)的性能高度優(yōu)化
CV-CUDA 可以支持 Volta、Turing、Ampere 等 GPU 架構(gòu),并針對不同架構(gòu) GPU 的特點(diǎn),在 CUDA kernel 層面進(jìn)行了性能上的高度優(yōu)化,可在云服務(wù)場景中規(guī)?;渴?。
IT之家獲悉,CV-CUDA Beta 版預(yù)計(jì)將在 2023 年 3 月發(fā)布,6 月份發(fā)布 v1.0 正式版。
CV-CUDA 更多內(nèi)容查看:點(diǎn)此鏈接。
標(biāo)簽: 圖像處理