GPU作為一種加速器晶片,在機器學習,特別是深度學習中得到廣泛的應用。但是,無論是企業、學校、醫院或者政府單位,決定在人工智慧領域進行投入時,領導卻發現:
投入了100萬,光買設備就花了80萬,工程師還經常抱怨GPU資源不夠用當工程師雄心勃勃打算開始幹活,卻發現花了一個多星期,IT環境還沒有搞好究其原因,大致有以下三個:
GPU採購成本比較高,而且由於技術發展的限制,在實際使用中,比較難於共享,從而導致浪費和不足的情況並存。GPU的使用場景比較複雜,訓練需要大量資源且需要長時間使用,在線推理需要及時響應,而開發和培訓/課程實訓場景的並發用戶數會很多。機器學習的環境配置複雜,且通常情況下數據工程師不擅長。通常,環境涉及到GPU驅動、CUDA、程序設計語言編譯器/解釋器(比如python)、機器學習平臺(比如TensorFlow、PyTorch)等。而且這些軟體對版本都有一定的匹配要求。根據不同人員的使用習慣,有人喜歡用docker,有人喜歡直接運行命令,可能還涉及到Jupyter notebook工具的使用。很多的安裝程序都需要連接到國外伺服器,下載速度很慢。VMware基於Bitfusion技術的方案正是來應對這樣的場景和需求。
2. 場景與需求
最近我們針對於高校的使用場景做了一個驗證,和大家分享一下。當然,雖然這是高校場景,但對於其他行業,依然具有參考價值。
在高校中,遇到的場景主要包含上課和科研。
在上課場景中,通常情況下,任課老師會根據課程需要事先安裝相應的軟體和工具;在實際課程中,學生每人獲得一個這樣的環境,使用課程中相關的算法進行模型的開發和訓練。在整個過程中,學生關注於機器學習的方法和算法,而不是環境的安裝、配置和故障處理。在科研場景中,科研人員(包括老師和研究生)根據科研任務和場景,開發相應的模型、算法和參數,並且利用GPU進行訓練和調整。
3. 解決方案架構
針對於以上需求,我們構建了以下架構的IT基礎設施服務:
圖1:整體架構圖
首先構建基於Bitfusion的GPU共享池。我們通過創建4臺虛擬機,每臺虛擬機通過vSphere的直通技術使用2塊GPU V100(32GB顯存)的GPU卡。
課程場景的資源,通過Horizon虛擬桌面提供。具體流程如下:
老師通過在虛擬機中安裝課程所需的軟體,製作課程模板。課程使用機器學習常用的Ubuntu16.04和Ubuntu18.04作業系統,並且虛擬機已經安裝了Bitfusion客戶端,可以將任務發送到遠程的Bitfusion伺服器端進行計算。IT管理員通過鏡像模板在上課之前發布虛擬桌面,桌面數量與學生數量保持一致,或者略多一些。學生在上課時,通過實訓教室現有的PC,或者瘦客戶機,或者學生自己的筆記本電腦,通過瀏覽器或者Horizon客戶端登錄到虛擬桌面,根據課程指定的任務。當需要GPU資源時,Bitfusion客戶端會將任務發送到遠程Bitfusion伺服器端執行;當資源不足時,系統會進行排隊。在科研場景中,科研人員如果是進行模型開發,依然可以在Horizon虛擬桌面中進行;如果是長時間執行的訓練的任務,則建議通過vRealize Automation雲管理平臺申請已經安裝並enable bitfusion的虛擬伺服器。科研人員在虛擬伺服器中執行相關的python代碼,運行在虛擬伺服器中的Bitfusion客戶端會將相關的程序發送到Bitfusion伺服器端執行。當然,如果科研人員希望在虛擬伺服器中使用docker或者Jupyter notebook,也是沒有問題的。
通過Bitfusion的Quota機制,可以給到不同的用戶和場景,不同的最大可使用資源份額,以避免資源的濫用。Bitfusion也可以通過設定,斷開佔用GPU資源但是卻沒有真正使用的客戶端。
在本次測試中,我們驗證了以下用例:
使用編輯器編寫python代碼,通過python命令直接運行運行python之後進入到交互命令行,運行相關命令使用Jupyter Notebook打開ipynb文件,並運行相關notebook使用Docker啟動Nvidia提供的容器鏡像,並進入容器內執行相應的python腳本具體測試過程和結果如下:
4.1 使用編輯器編寫python代碼,通過python命令直接運行我們使用TensorFlow官方的benchmark工具tf_cnn_benchmarks.https://github.com/tensorflow/benchmarks/tree/master/scripts/tf_cnn_benchmarks使用cifar10數據集https://www.cs.toronto.edu/~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的示例指南》 https://docs.vmware.com/cn/VMware-vSphere-Bitfusion/2.0/vmware-vsphere-bitfusion-20-tensorflow-example-guide.pdf。
我們嘗試以下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=Falsebitfusion 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=Falsebitfusion 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 BitfusionPerformance Best Practices Guide》https://www.vmware.com/content/dam/digitalmarketing/vmware/en/pdf/techpaper/performance/bitfusion-perf-best-practices.pdf
如果採用0.05個GPU支持單個任務,則一塊V100 GPU(32GB顯存)則可以同時支持20個並發tf_cnn_benchmarks任務。如果用戶希望增加更多的並發任務,則需要調整batch_size參數。在實際應用中,由於系統提供排隊機制,當單個任務執行時間不是很長的情況下,可以有更多的學生同時使用。
4.2 運行Python,並進入到交互命令行,運行相關命令此類情形,我們需要首先申請遠程GPU資源,然後再運行相關的命令和腳本,最後需要釋放遠程的GPU資源。相關的命令可以參考Bitfusion官方文檔 - 《VMware vSphere Bitfusion 用戶指南》 https://docs.vmware.com/cn/VMware-vSphere-Bitfusion/2.0/vmware-vsphere-bitfusion-20-user-guide.pdf
在下面這個示例中,我們首先申請單塊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文件,並運行相關notebookJupyter Notebook 作為一個代碼、輸出、文檔、多媒體資源整合在一起的多功能科學運算平臺,深受數據科學工作者的喜愛,被廣泛的應用在機器學習的各個教程中。
Jupyter Notebook 支持自定義kernel來運行代碼,所以我們有機會構建基於Bitfusion的python kernel。如下圖所示:
圖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)中的穿戴用品的圖像識別 - https://github.com/tensorflow/docs/blob/master/site/en/r1/tutorials/keras/basic_classification.ipynb
在測試中,我們發現只需要配置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. 方案主要優勢使用Bitfusion統一管理所有的GPU資源,按需使用,用完自動歸還,儘可能減少idle的情況,大大提升了GPU資源的使用效率Bitfusion GPU共享機制對用戶使用透明,用戶不需要改變任何代碼使用Horizon虛擬桌面和即時克隆技術,可以提供統一的環境給到學生,讓學生可以專注在課程本身,而不是環境的安裝和配置科研人員可以利用到更多的GPU資源,更快的完成訓練任務得到反饋,提高了科研的效率6. 擴展討論本方案主要解決的是學習、開發和訓練的場景,依然適合於其他行業的類似場景。針對於推理場景,特別是在線推理,本架構很容易擴展支持。
圖3:支持開發、訓練和推理的架構
7. 總結GPU最為一種加速器資源,在數據科學特別是機器學習場景中,被廣泛採用。當前的GPU使用方式,無論是資源使用效率,還是運行環境的運維上,都存在很大的挑戰。VMware的Bitfusion技術應運而生,使得GPU資源可以在多個客戶端分時共享,並且可以根據應用需求靈活動態的切割顯存。本文基於高校的教學和科研場景,結合VMware Horizon虛擬桌面產品和vRealize雲管理平臺產品,設計解決方案,並進行了相關驗證,驗證基本覆蓋了常用的使用場景和工具。通過擴展,該解決方案架構依然適用於其他行業。
正文完參考文獻:
vSphere Bitfusion 2.0.0 安裝指南:https://docs.vmware.com/cn/VMware-vSphere-Bitfusion/2.0/vmware-vsphere-bitfusion-20-installation-guide.pdfVMware vSphere Bitfusion 用戶指南: https://docs.vmware.com/cn/VMware-vSphere-Bitfusion/2.0/vmware-vsphere-bitfusion-20-user-guide.pdf在 vSphere Bitfusion 上運行 TensorFlow 的示例指南: https://docs.vmware.com/cn/VMware-vSphere-Bitfusion/2.0/vmware-vsphere-bitfusion-20-tensorflow-example-guide.pdfBitfusion Jupyter Integration—It’s Full of Stars: https://blogs.vmware.com/vsphere/2020/08/bitfusion-jupyter-integration-its-full-of-stars.htmlAI/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