用盡每一寸GPU,阿里雲cGPU容器技術白皮書重磅發佈!

背景

雲原生已經成爲業內雲服務的一個趨勢。在雲原生上支持異構計算,這個功能在標準的Docker上已經可以很好的支持了。爲了進一步提高GPU的利用率、避免算力浪費,需要在單個GPU上可以運行多個容器,並且在多個容器間隔離GPU應用,這在標準的Docker上是無法做到的。爲了滿足這一需求,業界也做了很多探索。NVIDIA vGPU, NVIDIA MPS, 基於rCUDA的方案等,都爲用戶更小顆粒度的使用GPU提供了可能。

近日,阿里雲異構計算推出的cGPU(container GPU)容器技術,創新地提出了一種不同於以往的GPU容器方案,克服了業內主流方案的一些常見的缺陷,在保證性能的前提下,做到了容器之間的GPU顯存隔離和任務隔離,爲客戶充分利用GPU硬件資源進行訓練和推理提供的有效保障。

業內常用方案簡介

在介紹阿里雲異構計算cGPU計算技術前,我們先看看業內有哪些GPU共享方案吧:

NVIDIA MPS

NVIDIA MPS (NVIDIA Multi-Process Service)是NVIDIA公司爲了進行GPU共享而推出的一套方案,由多個CUDA程序共享同一個GPU context,從而達到多個CUDA程序共享GPU的目的。同時,在Volta GPU上,用戶也可以通過CUDA_MPS_ACTIVE_THREAD_PERCENTAGE變量設定每個CUDA程序佔用的GPU算力的比例。

然而由於多個CUDA程序共享了同一個GPU context,這樣引入的問題就是:當一個CUDA程序崩潰或者是觸發GPU錯誤的時候,其他所有CUDA程序的任務都無法繼續執行下去了,而這對於容器服務是災難性的問題。

NVIDIA vGPU

NVIDIA vGPU方案是GPU虛擬化的方案,可以對多用戶的強GPU隔離方案。它主要應用於虛擬化平臺中,每個vGPU的顯存和算力都是固定的,無法靈活配置;另外vGPU的使用需要額外從NVIDIA公司購買license,這裏我們就不再詳細討論。

rCUDA類似方案

業內還有一種常用方案是通過替換CUDA庫實現API層面的轉發,然後通過修改顯存分配,任務提交等API函數來達到多個容器共享GPU的目的。這種方案的缺點是需要對靜態鏈接的程序重新編譯,同時在CUDA庫升級的時候也需要進行修改來適配新版本。

阿里雲cGPU容器技術

阿里雲異構計算GPU團隊推出了cGPU方案,相比其他方案,這是一個顛覆性的創新:通過一個內核驅動,爲容器提供了虛擬的GPU設備,從而實現了顯存和算力的隔離;通過用戶態輕量的運行庫,來對容器內的虛擬GPU設備進行配置。阿里雲異構計算cGPU在做到算力調度與顯存隔離的同時,也做到了無需替換CUDA靜態庫或動態庫;無需重新編譯CUDA應用;CUDA,cuDNN等版本隨時升級無需適配等特性。

image

圖1. cGPU容器架構圖

cGPU內核驅動爲一個自主研發的宿主機內核驅動。它的優點在於:

  • 適配開源標準的Kubernetes和NVIDIA Docker方案;
  • 用戶側透明。AI應用無需重編譯,執行無需CUDA庫替換;
  • 針對NVIDIA GPU設備的底層操作更加穩定和收斂;
  • 同時支持GPU的顯存和算力隔離。

使用方式

1 利用阿里雲容器服務

阿里雲容器服務已經支持cGPU容器組件了,通過登錄容器服務 Kubernetes 版控制檯,只需要簡單的點擊幾下,爲容器節點打標,就可以利用cGPU容器隔離,最大化的利用GPU的硬件能力了。同時,還可以通過Prometheus的監控能力查看每個cGPU容器內的顯存用量,在享受低成本的同時,保障了應用的可靠性。

image

快速部署和使用的方式,可以參見阿里雲開發者社區的文章:
https://developer.aliyun.com/article/762973
更詳細的使用文檔,可以參考阿里雲的幫助文檔:
https://help.aliyun.com/document_detail/163994.html

2 在阿里雲GPU實例上使用cGPU容器

爲了更靈活的支持各種客戶的需要,我們也開放了阿里雲GPU實例上使用cGPU容器的能力。cGPU依賴 Docker 和 NVIDIA Docker,在使用cGPU前,請確保環境可以正常創建帶GPU的容器服務。

安裝:
下載cGPU 安裝包:
wget http://cgpu.oss-cn-hangzhou.aliyuncs.com/cgpu-0.8.tar.gz

解壓後執行 sh install.sh 命令安裝。
安裝後使用lsmod | grep cgpu 命令驗證是否按照成功:
lsmod | grep cgpu
cgpu_km 71355 0

配置:
cGPU組件會檢測以下docker的環境變量,進行相應操作:
• ALIYUN_COM_GPU_MEM_DEV:爲正整數,表示爲host上每張卡的總顯存大小。
• ALIYUN_COM_GPU_MEM_CONTAINER: 爲正整數,指定容器內可見的顯存容量。此參數同

ALIYUN_COM_GPU_MEM_DEV一起設定cGPU內可見的顯存大小。如在一張4G顯存的顯卡上,
我們可以通 過-e ALIYUN_COM_GPU_MEM_DEV=4 -e ALIYUN_COM_GPU_MEM_CONTAINER=1
的參數爲容器分配1G顯存。如果不指定此參數,則cGPU不會啓動,此時會默認使用NVIDIA容器。
• ALIYUN_COM_GPU_VISIBLE_DEVICES:爲正整數或uuid,指定容器內可見的GPU設備。如在一個有4張顯卡的機器上,我們可以通過-e ALIYUN_COM_GPU_VISIBLE_DEVICES=0,1來爲容器分配第一和第二張顯卡。或是-e ALIYUN_COM_GPU_VISIBLE_DEVICES=uuid1,uuid2,uuid3爲容器分配uuid爲uuid1,uuid2,uuid3z的3張顯卡。
• CGPU_DISABLE:總開關,用於禁用cGPU。可以接受的參數是-e CGPU_DISABLE=true或-e CGPU_DISABLE=1,此時cGPU將會被禁用,默認使用nvidia容器。
• ALIYUN_COM_GPU_SCHD_WEIGHT 爲正整數,有效值是1 - min(max_inst, 16),用來設定容器的算力權重。

c 運行演示:
以GN6i 單卡T4 爲例,實現2個容器共享使用1個顯卡。執行如下命令,分別創建2個docker 服務,設置顯存分別爲6G和8G。
docker run -d -t --gpus all --privileged --name gpu_test1 -e ALIYUN_COM_GPU_MEM_CONTAINER=6 -e ALIYUN_COM_GPU_MEM_DEV=15 nvcr.io/nvidia/tensorflow:19.10-py3
docker run -d -t --gpus all --privileged --name gpu_test2 -e ALIYUN_COM_GPU_MEM_CONTAINER=8 -e ALIYUN_COM_GPU_MEM_DEV=15 nvcr.io/nvidia/tensorflow:19.10-py3

如下圖,進入Docker(gpu_test1) 後,執行nvidia-smi 命令,可以看到T4顯卡的總內存爲6043M

image

如下圖,進入Docker(gpu_test2) 後,執行nvidia-smi 命令,可以看到T4顯卡的總內存爲8618M。

image

之後,就可以在每個容器內運行GPU訓練或者推理的任務了。

性能分析

在使用過程中,用戶經常關心的就是性能問題,cGPU容器方案會對性能有多少影響呢?下面是我們的一組測試數據,在常用的tensorflow框架下用benchmark工具分別測試了模型推理和訓練性能。
以下數據的測試機爲阿里雲上的GPU型實例,具有8核CPU,32G內存,以及一張帶有16G顯存的NVIDIA T4顯卡。測試數據爲單次測試結果,因此可能會帶有誤差。

1 單cGPU容器 VS 單GPU直通性能比較

我們分別在cGPU容器內部以及標準的Docker容器內部跑測試,爲cGPU容器內的GPU實例分配所有的顯存和算力,來顯示在不共享GPU的情況下的cGPU是否有性能損失。

下圖是ResNet50訓練測試在不同精度和batch_size下的性能比較,綠色柱表示標準的容器性能,橙色柱表示cGPU容器內的性能,可以看到在不同的情況下,cGPU容器實例都幾乎沒有性能損失。

image

圖2. 單容器獨佔GPU--Resnet50 訓練結果對比

下圖是ResNet50推理測試在不同精度和batch_size下的性能比較,同樣的在不同的情況下,cGPU容器實例都幾乎沒有性能損失。

image

圖3. 單容器獨佔GPU--Resnet50 推理結果對比

2 cGPU容器 VS MPS容器GPU共享性能比較

如前文所述,標準的Docker容器不支持共享,爲了測試多容器共享單個GPU的性能,我們採用了MPS容器作爲基準來進行性能比較。同樣的,我們採用了ResNet50的訓練和推理benchmark作爲測試用例,分別用兩個cGPU容器和兩個MPS容器共享一個GPU硬件。

下圖是ResNet50訓練測試在不同batch_size下的性能比較,綠色柱表示兩個MPS容器性能跑分的總和,橙色柱表示兩個cGPU容器跑分的總和,可以看到,cGPU容器實例對比MPS容器幾乎沒有性能損失,在大的batch_size的情況下甚至跑分高於MPS容器。

image

圖4. 多容器共享GPU--Resnet50訓練結果對比

下圖是ResNet50推理測試在不同batch_size下的性能比較,MPS容器和cGPU容器的性能差距不大,基本都在誤差範圍之內。

image

圖5. 多容器共享GPU--Resnet50推理結果對比

總結

阿里雲cGPU容器技術,作爲業內首創的基於內核虛擬GPU隔離的GPU共享容器方案,在保證性能的前提下,做到了容器之間的GPU顯存隔離和任務隔離,爲客戶充分利用GPU硬件資源進行訓練和推理提供的有效保障。

同時, cGPU方案具有多種輸出方式:客戶既可以選擇阿里雲GPU容器服務,簡單便捷的實現GPU容器服務的共享、調度和監控;又可以選擇在阿里雲ECS GPU實例上進行手動安裝配置,靈活可控,方便的和已有GPU容器進行整合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章