CV-CUDA

CV-CUDA(Computer Vision – Compute Unified Device Architecture)是NVIDIA開發的專用於構建加速型端到端計算機視覺和圖像處理管道的一個開源項目,可在AI成像和計算機視覺 (CV) 流程中實現GPU加速的預處理和後處理步驟,前期由NVIDIA 和位元組跳動的機器學習團隊聯合開發。

CV-CUDA為開發者提供了 50 多種高性能計算機視覺算法,能帶來更高的吞吐量,以及更低的雲計算成本,其流處理量相當於基於單個 GPU 的流處理量的 10 倍。能幫助開發者加速處理視頻內容創作、3D 世界、基於圖像的推薦系統、圖像識別和視頻會議。

基本介紹

  • 外文名:CV-CUDA
  • 類別:開源項目 
簡介,背景,套用,特徵,優勢,場景,模型訓練,模型推理,

簡介

CV-CUDA通過手動最佳化的CUDA核心加速預處理和後處理製作流程,並原生集成於 C/C++、Python 和常見的深度學習框架(例如 PyTorch)中。
CV-CUDA將成為 NVIDIA Omniverse(專用於 3D 工作流的虛擬世界仿真和協作平台)中加速 AI 工作流的核心技術之一。
2022年12月開始,開發者搶先體驗代碼。
微軟、騰訊和百度採用 CV-CUDA 開發計算機視覺 AI。 微軟將 CV-CUDA 整合到必應視覺搜尋中,以支持用戶使用圖像而非文本來搜尋,尋找類似的圖像、產品或網頁。騰訊部署 CV-CUDA 來加速其廣告創作和內容理解流程,該流程每天處理30多萬個視頻。相比之前經過 GPU 最佳化的工作流,在使用CV-CUDA後,騰訊在圖像處理方面的能耗和成本均降低了20%。而百度正在將 CV-CUDA 整合到 FastDeploy中。FastDeploy 是百度飛槳深度學習框架的開源部署工具包之一,可以為開源社區的開發者提供無縫的計算機視覺加速。

背景

  • AI算法圖像背景模糊化:圖像背景模糊化通常被套用於視頻會議,美圖修圖等場景。在這些場景中通常希望AI算法可以把主體之外的背景部分模糊化,保護用戶隱私,美化圖像等。傳統的圖像處理流程中,前處理和後處理部分通常都是使用CPU進行操作,導致整個流程中有90%的工作時間消耗在前後處理部分。若能把前後處理妥善利用GPU加速,把前後處理部分都放到GPU上後,就可以對整個 pipeline 進行端到端的GPU加速。
  • AI 算法圖像分類:圖像分類是最常見的 AI 圖像算法之一,通常可以用於物體識別,以圖搜圖等場景,幾乎是所有AI 圖像算法的基礎。圖像分類的 pipeline 大體可以分為 2 個部分:前處理部分和 DNN 部分。其中前處理部分,在訓練和推理過程中最常見的 4 種操作包括:圖片解碼、Resize、Padding、Normalize。DNN 部分已經有了 GPU 的加速,而前處理部分通常都會使用 CPU 上的庫函式進行處理。如果能夠把前處理部分也移植到 GPU 上,那么一方面可以釋放 CPU 資源,另一方面也可以進一步提升 GPU 利用率,從而可以對整個 pipeline 進行加速。

套用

  • 對於構建 3D 世界或元宇宙應用程式的人而言,CV-CUDA支持為其構建或擴展 3D 世界及其組件的任務提供助力。
  • 在圖像理解和識別方面,CV-CUDA可以顯著加速以超大規模運行的流水線,讓移動用戶能夠暢享回響靈敏的精密圖像識別套用。
  • 在視頻會議領域,CV-CUDA 可以支持基於增強現實的複雜功能。這些功能可能涉及到需要無數預處理和後處理步驟的複雜 AI 工作流。

特徵

  • 一組統一的、專業的高性能 CV 核心
  • 支持批處理,並提供可變形狀圖像
  • PyTorch 和 TensorFlow 的零複製接口
  • 多語言接口C/C++/Python

優勢

傳統的圖像預處理操作一般在 CPU 上進行,一方面會占用大量的 CPU 資源,使得 CPU和 GPU 的負載不均衡。另一方面由於基於 CPU 的圖像加速庫不支持 batch 操作,導致預處理的效率低下。
為了解決當前主流的圖像處理庫所存在的一些問題,NVIDIA 和位元組跳動的機器學習團隊聯合開發了基於 GPU 的圖像處理加速庫 CV-CUDA,並擁有以下特點:
  1. Batch:支持 batch 操作,可以充分利用 GPU 高並發、高吞吐的並行加速特性,提升計算效率和吞吐率。
  2. Variable Shape:支持同一 batch 中圖片尺寸各不相同,保證了使用上的靈活性。此外,在對圖片進行處理時,可以對每張圖片指定不同的參數。例如調用 RotateVarShape 運算元時,可以對 batch 中每張圖片指定不同的旋轉角度。
  3. C/C++/Python 接口:在部署機器學習算法時需要對齊訓練和推理流程。一般來說,訓練時利用 python 進行快速驗證,推理時利用 C++ 進行高性能部署,然而一些圖像處理庫僅支持 python,這給部署帶來了極大的不便。如果在訓練和推理採用不同的圖像處理庫,則又需要在推理端重新實現一遍邏輯,過程會非常繁瑣。CV-CUDA 提供了 C、C++ 和 Python 接口,可以同時服務於訓練和推理場景。從訓練遷移到推理場景時,也可免去繁瑣的對齊流程,提高部署效率。
  4. 獨立運算元設計:CV-CUDA 作為基礎圖像處理庫,採用了獨立運算元設計,不需要預先定義流水線。獨立運算元的設計具有更高的靈活性,使調試變得更加的容易,而且可以使其與其他的圖像處理互動,或者將其集成在用戶自己的圖像處理上層框架中。
  5. 結果對齊 OpenCV:不同的圖像處理庫由於對一些運算元的實現方式不一致導致計算結果難以對齊。例如常見的 Resize 操作,OpenCV、OpenCV-gpu 以及 torchvision 的實現方式都不一樣,計算結果存在差異。因此如果在訓練時用 OpenCV CPU 版本而推理時若要採用 GPU 版本或其他圖像處理庫,就會面臨結果存在誤差的問題。在設計之初,考慮到當前圖像處理庫中,很多用戶習慣使用 OpenCV 的 CPU 版本,因此在設計運算元時,不管是函式參數還是圖像處理結果上,儘可能對齊 OpenCV CPU 版本的運算元。當用戶從 OpenCV 遷移到 CV-CUDA 時,只需做少許改動便可使用,且圖片處理結果和 OpenCV 一致,不需要重新訓練模型。
  6. 易用性:CV-CUDA 提供了 Image、ImageBatchVarShape 等結構體,方便用戶的使用。同時還提供了 Allocator 類,用戶可以自定義顯存分配策略(例如用戶可以設計顯存池分配策略來提高顯存分配速度),方便上層框架集成和管理資源。CV-CUDA 提供了 PyTorch、OpenCV 和 Pillow 的數據轉化接口,方便用戶進行運算元替換和進行不同圖像庫之間的混用。
  7. 針對不同 GPU 架構的性能高度最佳化:CV-CUDA 可以支持 Volta、Turing、Ampere 等 GPU 架構,並針對不同架構 GPU 的特點,在 CUDA kernel 層面進行了性能上的高度最佳化,可在雲服務場景中規模化部署。
  8. CV-CUDA提供了 25 種運算元,包括常用的 CvtColor、Resize、Crop、PadStack、Normalize 等。當前運算元能夠覆蓋大部分套用場景,後續將會支持更多運算元。

場景

CV-CUDA在抖音集團內部的多個線上線下場景得到了套用,比如搜尋多模態,圖片分類等,下面分模型訓練和推理分別介紹一個套用。

模型訓練

在位元組跳動機器學習團隊內部,CV-CUDA 在預處理邏輯複雜的訓練任務上加速效果明顯。在模型訓練過程中,數據準備和模型疊代是個異步的過程,數據準備只要不比模型疊代來的慢,其性能就是滿足需求的。 但隨著新一代強力 GPU 的投入使用,模型本身的計算時間被進一步縮短,因而對數據準備的性能要求越來越高。此時預處理邏輯一複雜,CPU 競爭就會變得激烈,這個時候 CV-CUDA 就能發揮很大的作用。
位元組跳動機器學習團隊某個視頻相關的多模態任務,CV-CUDA 套用後就獲得了不小的性能收益。該任務預處理部分邏輯很複雜,既有多幀視頻的解碼,也有很多的數據增強,導致在 A100 上多卡訓練時 CPU 資源競爭非常明顯,因而雖然已經充分利用了 CPU(Intel Xeon Platinum 8336C)的多核性能,但數據預處理的速度仍然滿足不了模型計算的需求。而使用了 CV-CUDA,預處理邏輯被全部遷移到了 GPU,相應的訓練瓶頸也由數據預處理轉移到了模型計算本身,從而在模型訓練的整體性能上獲得了近 90% 的收益。 另一個獲得收益的 OCR 任務也十分相似,其預處理鏈路有十幾個運算元,使用 CV-CUDA 後在V100上訓練即獲得了 80% 的加速。

模型推理

模型推理和訓練略有不同:因為模型訓練時數據讀取和模型更新是異步的,所以基本上提升模型訓練性能可以與提高 GPU 利用率劃等號。
在模型推理過程,數據讀取和模型計算是一個串列的過程,加速數據準備過程本身即會對整體性能造成直接影響。再加上模型推理時只涉及到模型前向的計算,計算量一般都較小,GPU 通常有足夠的剩餘資源來進行其他的工作。因而模型推理階段,把預處理邏輯搬到GPU上來加速性能,既合理而又有可行性。
位元組跳動機器學習團隊的某個搜尋多模態任務,在使用CV-CUDA之後,整體的上線吞吐相比於用 CPU 做預處理時有了 2 倍多的提升。這裡的基線本身即是經過CPU(Intel Xeon Platinum 8336C)多核等方式最佳化過後的結果,雖然涉及到的預處理邏輯較簡單,但使用 CV-CUDA 之後加速效果依然非常明顯。

相關詞條

熱門詞條

聯絡我們