VMware Bitfusion GPU共享技術的應用場景

亨利筆記發表於2020-10-10

1. 背景


GPU作為一種加速器晶片,在機器學習,特別是深度學習中得到廣泛的應用。但是,無論是企業、學校、醫院或者政府單位,決定在人工智慧領域進行投入時,領導卻發現:

  • 投入了100萬,光買裝置就花了80萬,工程師還經常抱怨GPU資源不夠用
  • 當工程師雄心勃勃打算開始幹活,卻發現花了一個多星期,IT環境還沒有搞好

究其原因,大致有以下三個:

  1. GPU採購成本比較高,而且由於技術發展的限制,在實際使用中,比較難於共享,從而導致浪費和不足的情況並存。
  2. GPU的使用場景比較複雜,訓練需要大量資源且需要長時間使用,線上推理需要及時響應,而開發和培訓/課程實訓場景的併發使用者數會很多。
  3. 機器學習的環境配置複雜,且通常情況下資料工程師不擅長。
  • 通常,環境涉及到GPU驅動、CUDA、程式設計語言編譯器/直譯器(比如python)、機器學習平臺(比如TensorFlow、PyTorch)等。而且這些軟體對版本都有一定的匹配要求。
  • 根據不同人員的使用習慣,有人喜歡用docker,有人喜歡直接執行命令,可能還涉及到Jupyter notebook工具的使用。
  • 很多的安裝程式都需要連線到國外伺服器,下載速度很慢。

VMware基於Bitfusion技術的方案正是來應對這樣的場景和需求。

2. 場景與需求


最近我們針對於高校的使用場景做了一個驗證,和大家分享一下。當然,雖然這是高校場景,但對於其他行業,依然具有參考價值。

在高校中,遇到的場景主要包含上課和科研。

  1. 在上課場景中,通常情況下,任課老師會根據課程需要事先安裝相應的軟體和工具;在實際課程中,學生每人獲得一個這樣的環境,使用課程中相關的演算法進行模型的開發和訓練。在整個過程中,學生關注於機器學習的方法和演算法,而不是環境的安裝、配置和故障處理。
  2. 在科研場景中,科研人員(包括老師和研究生)根據科研任務和場景,開發相應的模型、演算法和引數,並且利用GPU進行訓練和調整。


3. 解決方案架構


針對於以上需求,我們構建了以下架構的IT基礎設施服務:

VMware Bitfusion GPU共享技術的應用場景

圖1:整體架構圖

首先構建基於Bitfusion的GPU共享池。我們透過建立4臺虛擬機器,每臺虛擬機器透過vSphere的直通技術使用2塊GPU V100(32GB視訊記憶體)的GPU卡。

課程場景的資源,透過Horizon虛擬桌面提供。具體流程如下:

  1. 老師透過在虛擬機器中安裝課程所需的軟體,製作課程模板。課程使用機器學習常用的Ubuntu16.04和Ubuntu18.04作業系統,並且虛擬機器已經安裝了Bitfusion客戶端,可以將任務傳送到遠端的Bitfusion伺服器端進行計算。
  2. IT管理員透過映象模板在上課之前釋出虛擬桌面,桌面數量與學生數量保持一致,或者略多一些。
  3. 學生在上課時,透過實訓教室現有的PC,或者瘦客戶機,或者學生自己的膝上型電腦,透過瀏覽器或者Horizon客戶端登入到虛擬桌面,根據課程指定的任務。當需要GPU資源時,Bitfusion客戶端會將任務傳送到遠端Bitfusion伺服器端執行;當資源不足時,系統會進行排隊。
  4. 課程結束後,資源自動回收。

在科研場景中,科研人員如果是進行模型開發,依然可以在Horizon虛擬桌面中進行;如果是長時間執行的訓練的任務,則建議透過vRealize Automation雲管理平臺申請已經安裝並enable bitfusion的虛擬伺服器。科研人員在虛擬伺服器中執行相關的python程式碼,執行在虛擬伺服器中的Bitfusion客戶端會將相關的程式傳送到Bitfusion伺服器端執行。當然,如果科研人員希望在虛擬伺服器中使用docker或者Jupyter notebook,也是沒有問題的。

透過Bitfusion的Quota機制,可以給到不同的使用者和場景,不同的最大可使用資源份額,以避免資源的濫用。Bitfusion也可以透過設定,斷開佔用GPU資源但是卻沒有真正使用的客戶端。

4. 測試用例


在本次測試中,我們驗證了以下用例:

  1. 使用編輯器編寫python程式碼,透過python命令直接執行
  2. 執行python之後進入到互動命令列,執行相關命令
  3. 使用Jupyter Notebook開啟ipynb檔案,並執行相關notebook
  4. 使用Docker啟動Nvidia提供的容器映象,並進入容器內執行相應的python指令碼

具體測試過程和結果如下:

4.1 使用編輯器編寫python程式碼,透過python命令直接執行

我們使用TensorFlow官方的benchmark工具tf_cnn_benchmarks. 使用cifar10資料集~kriz/cifar.html,模型採用resnet110,batch_size為64

原生的指令碼命令命令如下:

python3  ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py  --data_format=NCHW  --batch_size=64  --model=resnet110  --variable_update=replicated  --local_parameter_device=gpu  --nodistortions --num_gpus=1  --num_batches=100  --data_dir=./benchmarks/data/cifar-10-batches-py  --data_name=cifar10  --use_fp16=False

本測試中,我們使用Bitfusion來執行。Bitfusion的具體使用方法可以參看官方文件 《在vSphere Bitfusion上執行TensorFlow的示例指南》 。

我們嘗試以下GPU份額:完整的V100GPU、1/10個GPU、1/20個GPU. 實際使用的視訊記憶體分別為:32GB、3.2GB、1.6GB。本項測試的關注點在於我們究竟需要多少GPU,才可以正常執行這個TensorFlow benchmark。

我們使用如下命令調整GPU的份額:

bitfusion run -n 1 -p 1 -- python3  ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py  --data_format=NCHW  --batch_size=64  --model=resnet110  --variable_update=replicated  --local_parameter_device=gpu  --nodistortions --num_gpus=1  --num_batches=100  --data_dir=./benchmarks/data/cifar-10-batches-py  --data_name=cifar10  --use_fp16=False
bitfusion run -n 1 -p 0.1 -- python3  ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py  --data_format=NCHW  --batch_size=64  --model=resnet110  --variable_update=replicated  --local_parameter_device=gpu  --nodistortions --num_gpus=1  --num_batches=100  --data_dir=./benchmarks/data/cifar-10-batches-py  --data_name=cifar10  --use_fp16=False
bitfusion run -n 1 -p 0.05 -- python3  ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py  --data_format=NCHW  --batch_size=64  --model=resnet110  --variable_update=replicated  --local_parameter_device=gpu  --nodistortions --num_gpus=1  --num_batches=100  --data_dir=./benchmarks/data/cifar-10-batches-py  --data_name=cifar10  --use_fp16=False

以上所有的配置中,tf_cnn_banchmarks處理的結果均大致為:1200 images/second。當然,這個效能資料和直接使用本地的GPU還是有一些差距,主要原因是本次測試,由於條件的限制,並沒有做最佳化。具體的最佳化可以參看:《VMware vSphere Bitfusion Performance Best Practices Guide》

如果採用0.05個GPU支援單個任務,則一塊V100 GPU(32GB視訊記憶體)則可以同時支援20個併發tf_cnn_benchmarks任務。如果使用者希望增加更多的併發任務,則需要調整batch_size引數。在實際應用中,由於系統提供排隊機制,當單個任務執行時間不是很長的情況下,可以有更多的學生同時使用。

4.2 執行Python,並進入到互動命令列,執行相關命令

此類情形,我們需要首先申請遠端GPU資源,然後再執行相關的命令和指令碼,最後需要釋放遠端的GPU資源。相關的命令可以參考Bitfusion官方文件 - 《VMware vSphere Bitfusion 使用者指南》

在下面這個示例中,我們首先申請單塊GPU,2048M的視訊記憶體;然後進入Python互動式命令列,執行tensorflow的程式碼獲得GPU資訊;最後釋放GPU。

$ bitfusion request_gpus -n 1 -m 2048
Requested resources:
Server List: 192.168.131.36:56001
Client idle timeout: 0 min

$ bitfusion client -- python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help""copyright""credits" or "license" for more information.
>>> import tensorflow as tf
...
>>> print(tf.test.gpu_device_name())
...
2020-09-27 18:08:42.584300: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: Tesla V100-PCIE-32GB major: 7 minor: 0 memoryClockRate(GHz): 1.38
pciBusID: 0000:00:00.0
totalMemory: 2.00GiB freeMemory: 1.41GiB
...
2020-09-27 18:08:42.592493: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/device:GPU:0 with 1217 MB memory) -> physical GPU (device: 0, name: Tesla V100-PCIE-32GB, pci bus id: 0000:00:00.0, compute capability: 7.0)

/device:GPU:0
...

>>> quit();

$ bitfusion release_gpus

從以上驗證結果我們可以看到Bitfusion支援互動式Python執行方式。

4.3 使用Jupyter Notebook開啟ipynb檔案,並執行相關notebook

Jupyter Notebook 作為一個程式碼、輸出、文件、多媒體資源整合在一起的多功能科學運算平臺,深受資料科學工作者的喜愛,被廣泛的應用在機器學習的各個教程中。

Jupyter Notebook 支援自定義kernel來執行程式碼,所以我們有機會構建基於Bitfusion的python kernel。如下圖所示:

VMware Bitfusion GPU共享技術的應用場景

圖2:使用Bitfusion kernel執行Jupyter Notebook

具體的做法可以參看《Bitfusion Jupyter Integration—It’s Full of Stars》 https://blogs.vmware.com/vsphere/2020/08/bitfusion-jupyter-integration-its-full-of-stars.html

需要指出的是,kernel在定義的時候,就需要指定所用的GPU資源。所以,如果在課程中,需要使用不同大小的GPU資源,則可能需要定義多個kernel。

本次測試使用TensorFlow官方的標準教程(tutorial)中的穿戴用品的影像識別 -

在測試中,我們發現只需要配置0.02個V100 GPU資源就可以順利執行basic_classification的應用;也就是說,一塊V100的GPU卡可以同時給到50個學生使用。

與互動式python類似,當使用者在Jupyter Notebook的網頁中,選定一個kernel開始執行的時候,這個kernel就佔據了GPU資源,直到kernel被停止。也就是說,如同4.1中的超配(overcommit)之後的排隊,在使用Jupyter Notebook時候,不能使用。

4.4 使用Docker啟動Nvidia提供的容器映象,並進入容器內執行相應的python指令碼

隨著Docker的流行,很多資料科學家也開始使用Docker。Docker的優勢在於docker image中已經安裝好了執行環境,使用者省去了很多繁瑣的安裝配置工作。使用者透過切換docker images也可以很容易的切換執行環境。不管是Nvidia,還是framework的供應商(比如TensorFlow),也都提供了docker images給到大家使用。當然,使用docker也帶來的一些麻煩,就是使用者必須要了解docker的使用。

在bitfusion結合docker的場景中,docker image 管理員需要基於官方的映象,透過 docker build 構建基於bitfusion的docker image。比如如下的Dockerfile就是在nvcr.io/nvidia/tensorflow:19.03-py3中加入bitfusion的支援,生成新的docker image。

$ cat Dockerfile
FROM nvcr.io/nvidia/tensorflow:19.03-py3 
MAINTAINER XXX University Bitfusion

#  Set initial working directory
WORKDIR /home/bitfusion/downloads/
 
# Update package list
RUN apt-get update
 
# Install Bitfusion. Assumes deb for Ubuntu16.04
# resides in mounted directory, /pkgs
COPY bitfusion-client-ubuntu1604_2.0.0beta5-11_amd64.deb .
RUN apt-get install -y ./bitfusion-client-ubuntu1604_2.0.0beta5-11_amd64.deb
# Must run list_gpus to pull in env and tokens
RUN bitfusion list_gpus

製作新的docker image,然後透過執行docker run進入到docker程式的shell,下面使用者就可以執行相關的Python程式碼了。

sudo docker build -t tensorflow:19.03-py3-bitfusion .
 
sudo docker run --rm --privileged --pid=host --ipc=host \
   --net=host -it \
   -v /data:/data \
   -v /dev/log:/dev/log \
   tensorflow:19.03-py3-bitfusion

具體的方式可以參看這份文件。《AI/ML, vSphere Bitfusion, and Docker Containers—A Sparkling Refreshment for Modern Apps》 https://blogs.vmware.com/vsphere/2020/06/ai-ml-vsphere-bitfusion-and-docker-containers-a-sparkling-refreshment-for-modern-apps.html

從以上驗證結果我們可以看到Bitfusion支援在容器環境中使用。

5. 方案主要優勢


  1. 使用Bitfusion統一管理所有的GPU資源,按需使用,用完自動歸還,儘可能減少idle的情況,大大提升了GPU資源的使用效率
  2. Bitfusion GPU共享機制對使用者使用透明,使用者不需要改變任何程式碼
  3. 使用Horizon虛擬桌面和即時克隆技術,可以提供統一的環境給到學生,讓學生可以專注在課程本身,而不是環境的安裝和配置
  4. 科研人員可以利用到更多的GPU資源,更快的完成訓練任務得到反饋,提高了科研的效率

6. 擴充套件討論


本方案主要解決的是學習、開發和訓練的場景,依然適合於其他行業的類似場景。針對於推理場景,特別是線上推理,本架構很容易擴充套件支援。

VMware Bitfusion GPU共享技術的應用場景

圖3:支援開發、訓練和推理的架構

7. 總結


GPU最為一種加速器資源,在資料科學特別是機器學習場景中,被廣泛採用。當前的GPU使用方式,無論是資源使用效率,還是執行環境的運維上,都存在很大的挑戰。VMware的Bitfusion技術應運而生,使得GPU資源可以在多個客戶端分時共享,並且可以根據應用需求靈活動態的切割視訊記憶體。本文基於高校的教學和科研場景,結合VMware Horizon虛擬桌面產品和vRealize雲管理平臺產品,設計解決方案,並進行了相關驗證,驗證基本覆蓋了常用的使用場景和工具。透過擴充套件,該解決方案架構依然適用於其他行業。


正文完


參考文獻:

  1. vSphere Bitfusion 2.0.0 安裝指南
  2. VMware vSphere Bitfusion 使用者指南:
  3. 在 vSphere Bitfusion 上執行 TensorFlow 的示例指南:
  4. Bitfusion Jupyter Integration—It’s Full of Stars: https://blogs.vmware.com/vsphere/2020/08/bitfusion-jupyter-integration-its-full-of-stars.html
  5. AI/ML, vSphere Bitfusion, and Docker Containers—A Sparkling Refreshment for Modern Apps: https://blogs.vmware.com/vsphere/2020/06/ai-ml-vsphere-bitfusion-and-docker-containers-a-sparkling-refreshment-for-modern-apps.html



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557890/viewspace-2725928/,如需轉載,請註明出處,否則將追究法律責任。

相關文章