作者:阿裡雲異構計算進階技術專家 何旻
背景
雲原生已經成為業内雲服務的一個趨勢。在雲原生上支援異構計算,這個功能在标準的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等版本随時更新無需适配等特性。

圖1. cGPU容器架構圖
cGPU核心驅動為一個自主研發的主控端核心驅動。它的優點在于:
• 适配開源标準的Kubernetes和NVIDIA Docker方案;
• 使用者側透明。AI應用無需重編譯,執行無需CUDA庫替換;
• 針對NVIDIA GPU裝置的底層操作更加穩定和收斂;
• 同時支援GPU的顯存和算力隔離。
使用方式
1 利用阿裡雲容器服務
阿裡雲容器服務已經支援cGPU容器元件了,通過登入
容器服務 Kubernetes 版控制台,隻需要簡單的點選幾下,為容器節點打标,就可以利用cGPU容器隔離,最大化的利用GPU的硬體能力了。同時,還可以通過Prometheus的監控能力檢視每個cGPU容器内的顯存用量,在享受低成本的同時,保障了應用的可靠性。
快速部署和使用的方式,可以參見阿裡雲開發者社群的文章:
https://developer.aliyun.com/article/762973更詳細的使用文檔,可以參考阿裡雲的幫助文檔:
https://help.aliyun.com/document_detail/163994.html2 在阿裡雲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
如下圖,進入Docker(gpu_test2) 後,執行nvidia-smi 指令,可以看到T4顯示卡的總記憶體為8618M。
之後,就可以在每個容器内運作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容器執行個體都幾乎沒有性能損失。
圖2. 單容器獨占GPU--Resnet50 訓練結果對比
下圖是ResNet50推理測試在不同精度和batch_size下的性能比較,同樣的在不同的情況下,cGPU容器執行個體都幾乎沒有性能損失。
圖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容器。
圖4. 多容器共享GPU--Resnet50訓練結果對比
下圖是ResNet50推理測試在不同batch_size下的性能比較,MPS容器和cGPU容器的性能差距不大,基本都在誤差範圍之内。
圖5. 多容器共享GPU--Resnet50推理結果對比
總結
阿裡雲cGPU容器技術,作為業内首創的基于核心虛拟GPU隔離的GPU共享容器方案,在保證性能的前提下,做到了容器之間的GPU顯存隔離和任務隔離,為客戶充分利用GPU硬體資源進行訓練和推理提供的有效保障。
同時, cGPU方案具有多種輸出方式:客戶既可以選擇阿裡雲GPU容器服務,簡單便捷的實作GPU容器服務的共享、排程和監控;又可以選擇在阿裡雲ECS GPU執行個體上進行手動安裝配置,靈活可控,友善的和已有GPU容器進行整合。
産品詳情:
https://yqh.aliyun.com/live/cgpu_release