在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据
在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解碼器快速加載數(shù)據(jù)
如今,最流行的拍照設(shè)備智能手機可以捕獲高達(dá)4K UHD的圖像(3840×2160圖像),原始數(shù)據(jù)超過25 MB。即使考慮到令人尷尬的低HD分辨率(1280×720),原始圖像也需要超過2.5 MB的存儲空間。存儲少至100張UHD圖像將需要近3 GB的可用空間。
顯然,如果以這種方式存儲數(shù)據(jù),則會很快耗盡空間。這是圖像壓縮派上用場的地方。眾所周知的JPEG格式可以將圖像大小從30 MB縮小到3 MB。
對于深度學(xué)習(xí)的計算機視覺應(yīng)用程序(其中有數(shù)百萬個樣本的訓(xùn)練數(shù)據(jù)集是通用的),壓縮和有效存儲圖像數(shù)據(jù)比以往任何時候都更為重要。行業(yè)標(biāo)準(zhǔn)的數(shù)據(jù)集(例如ImageNet和COCO)使用JPEG格式存儲數(shù)據(jù)。因此,ImageNet僅占用150 GB的空間,而不是驚人的32 TB的未壓縮數(shù)據(jù)。
壓縮效果很好-它可以節(jié)省大量磁盤空間。不幸的是,它突出了另一項挑戰(zhàn),在與計算機視覺相關(guān)的深度學(xué)習(xí)應(yīng)用程序中尤為明顯:圖像解壓縮是一項計算密集型任務(wù)。實際上,這是數(shù)據(jù)處理管道中最耗時的任務(wù),直到JPEG解碼在GPU上運行的訓(xùn)練變得空缺。
面對這一問題,開發(fā)了NVIDIA數(shù)據(jù)加載庫(DALI)來加速圖像解碼,增強和管道預(yù)處理。它緩解了此CPU瓶頸。DALI通過利用nvJPEG(用于JPEG解碼的CUDA庫)來加速圖像解碼。不僅如此,還可以采用數(shù)據(jù)處理管道,從解碼到擴充再到訓(xùn)練,再到更高的性能水平。
最近,推出了基于NVIDIA Ampere架構(gòu)的A100 GPU。它添加了硬件JPEG解碼器以進(jìn)一步提高性能。它是負(fù)責(zé)解碼JPEG圖像的專用硬件模塊。
先前的架構(gòu)沒有這種硬件單元,并且JPEG解碼是使用CPU和GPU可編程SM單元的純軟件(CUDA)解決方案。利用專用的硬件單元,解碼不再與CUDA核心競爭其它計算密集型任務(wù),例如在神經(jīng)網(wǎng)絡(luò)訓(xùn)練期間進(jìn)行正向和反向饋送。
它通過CUDA工具包的一部分nvJPEG庫公開。有關(guān)更多信息,請參閱在NVIDIA A100 GPU上利用硬件JPEG解碼器和NVIDIA nvJPEG庫。作為DALI用戶,隨著DALI和NVJPEG集成的抽象化,將自動受益于硬件加速的解碼,而無需更改任何代碼。
通過將JPEG硬件解碼器與DALI配合使用,可以輕松地為深度學(xué)習(xí)應(yīng)用程序訪問此JPEG硬件解碼器功能。如果將DALI ImageDecoder與后端混合使用,則無需更改代碼。獲取CUDA 11的最新DALI版本,并享受NVIDIA Ampere架構(gòu)支持的,硬件加速的JPEG解碼。
以下代碼示例顯示了DALI管道,該管道可加載圖像并使用GPU對其進(jìn)行解碼:
class SimplePipeline(Pipeline): def init(self, batch_size, num_threads, device_id): super().init(batch_size, num_threads, device_id, seed = 12) self.input = ops.FileReader(file_root = image_dir) self.decode = ops.ImageDecoder(device = ‘mixed’, output_type = types.RGB) def define_graph(self): jpegs, labels = self.input() images = self.decode(jpegs) return images, labels
混合GPU解碼器
借助DALI,可以更進(jìn)一步,并將基于硬件,軟件和基于CUDA的方法結(jié)合起來進(jìn)行JPEG解碼,并行運行它們以獲得更高的吞吐量。圖1顯示了這樣一種管道如何工作。
圖1:采用軟件/ CUDA和硬件加速JPEG圖像解碼并行使用的DALI管線圖。
可以通過調(diào)整hw_decoder_load參數(shù)來決定工作量,以決定將多少解碼負(fù)載分配給硬件解碼器,以及通過GPU加速的CUDA方法同時完成多少負(fù)載。
結(jié)果取決于現(xiàn)有的GPU工作負(fù)載(GPU必須完成的工作量),并且可以根據(jù)經(jīng)驗進(jìn)行調(diào)整以最大程度地提高每種用例的吞吐量。
圖2提供了比例為75:25的數(shù)字。但是,當(dāng)GPU已被其它工作(例如正向傳播和反向傳播)占用時,可能會通過將較大一部分圖像解碼任務(wù)卸載到硬件解碼器(例如80%甚至更多)來找到最佳位置。
以下代碼示例顯示了將75%的圖像解碼任務(wù)卸載到硬件解碼器的管道:
class SimplePipeline(Pipeline): def init(self, batch_size, num_threads, device_id): super().init(batch_size, num_threads, device_id, seed = 12) self.input = ops.FileReader(file_root = image_dir) self.decode = ops.ImageDecoder(device = ‘mixed’, output_type = types.RGB, hw_decoder_load=0.75) def define_graph(self): jpegs, labels = self.input() images = self.decode(jpegs) return images, labels
圖2顯示了將DALI解碼從CPU切換到各種基于GPU的方法時可以期望的性能提升。針對不同的批處理大小,CPU libjpeg-turbo解決方案,Volta CUDA解碼,A100硬件JPEG解碼器以及A100雙硬件和CUDA解碼器執(zhí)行了測試。
圖2:用于ImageNet訓(xùn)練數(shù)據(jù)集的CPU,CUDA,A100硬件以及雙CUDA和硬件JPEG圖像解碼之間的解碼速度比較。批次樣品均分。
圖2和4的測試配置:
? NVIDIA V100 GPU: CPU – E5-2698 v4@2GHz 3.6GHz Turbo (Broadwell) HT On, GPU – Tesla V100-SXM2-16GB(GV100) 116160 MiB 180 SM, GPU Video Clock 1312, 4 threads used in DALI pipeline
? NVIDIA A100 GPU: CPU – Platinum 8168@2GHz 3.7GHz Turbo (Skylake) HT On, GPU – A100-SXM4-40GB(GA100) 140557 MiB 1108 SM, GPU Video Clock 1095, 4 threads used in DALI pipeline
? CPU: CPU – Platinum 8168@2GHz 3.7GHz Turbo (Skylake) HT On, Dataset – training set of ImageNet, 4 threads used in DALI pipeline
圖3顯示了典型的類似ResNet50的圖像分類管道。
圖3.類似ResNet50的圖像分類管道。
圖4顯示了ResNet-50模型的端到端數(shù)據(jù)管道加速。總體管線加速看起來與前面圖2中的解碼加速相同。
圖4:針對類似ResNet50的圖像分類模型,CPU,CUDA,A100硬件加速以及雙CUDA和硬件加速JPEG圖像解碼之間的端到端數(shù)據(jù)處理管道吞吐量比較。
以下是一些要點:
? 對于基于圖像的工作負(fù)載,解碼是數(shù)據(jù)預(yù)處理管道中計算最密集的方面。通過加快速度,整個管道都能看到好處。
? 端到端的訓(xùn)練吞吐量在很大程度上取決于可以為GPU提供數(shù)據(jù)的速度(管道的輸出)。DALI專門用于確保GPU不斷獲得數(shù)據(jù)。有關(guān)如何確定的數(shù)據(jù)管道是否受CPU瓶頸以及DALI如何提供幫助的信息,請參閱案例研究:帶有DALI的ResNet50。
總結(jié)
以上是生活随笔為你收集整理的在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在NVIDIA A100 GPU上利用硬
- 下一篇: cuSPARSELt开发NVIDIA A