天天看點

用盡每一寸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等版本随時更新無需适配等特性。

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

圖1. cGPU容器架構圖

cGPU核心驅動為一個自主研發的主控端核心驅動。它的優點在于:

• 适配開源标準的Kubernetes和NVIDIA Docker方案;

• 使用者側透明。AI應用無需重編譯,執行無需CUDA庫替換;

• 針對NVIDIA GPU裝置的底層操作更加穩定和收斂;

• 同時支援GPU的顯存和算力隔離。

使用方式

1 利用阿裡雲容器服務

阿裡雲容器服務已經支援cGPU容器元件了,通過登入

容器服務 Kubernetes 版控制台

,隻需要簡單的點選幾下,為容器節點打标,就可以利用cGPU容器隔離,最大化的利用GPU的硬體能力了。同時,還可以通過Prometheus的監控能力檢視每個cGPU容器内的顯存用量,在享受低成本的同時,保障了應用的可靠性。

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

快速部署和使用的方式,可以參見阿裡雲開發者社群的文章:

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的容器服務。

  1. 安裝:

    下載下傳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

  1. 配置:

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

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

如下圖,進入Docker(gpu_test2) 後,執行nvidia-smi 指令,可以看到T4顯示卡的總記憶體為8618M。

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

之後,就可以在每個容器内運作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容器執行個體都幾乎沒有性能損失。

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

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

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

用盡每一寸GPU,阿裡雲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容器。

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

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

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

用盡每一寸GPU,阿裡雲cGPU容器技術白皮書重磅釋出!背景業内常用方案簡介性能分析總結

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

總結

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

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

産品詳情:

https://yqh.aliyun.com/live/cgpu_release

繼續閱讀