vSphere Bitfusion執行TensorFlow深度學習任務

亨利筆記發表於2020-07-27

vSphere Bitfusion執行TensorFlow深度學習任務

題圖攝於北京奧林匹克公園


本文介紹vSphere 7內建的Bitfusion功能如何在Kubernetes中使用,讓應用使用遠端GPU資源。


(本文作者系VMware雲原生實驗室工程師,首發於VMware中國研發中心)


背景介紹

隨著 AI 技術的快速發展,越來越多的企業開始將 AI 技術應用到自身業務之中。目前,雲端 AI 算力主要由三類 AI 加速器來提供:GPU,FPGA 和 AI ASIC 晶片。這些加速器的優點是效能非常高,缺點是 成本高昂,缺少異構加速管理和排程。大部分企業因無法構建高效的加速器資源池,而不得不獨佔式地使用這些昂貴的加速器資源,導致 資源利用率低,成本高。


以 GPU 為例,透過創新的 Bitfusion GPU 虛擬化技術,能夠幫助使用者無需任務修改就能透明地共享和使用資料中心內任何伺服器之上的 AI 加速器,不但能夠幫助使用者提高資源利用率,而且可以 極大便利 AI 應用的部署,構建資料中心級的 AI 加速器資源池。


Bitfusion透過提供遠端GPU池來幫助解決這些問題。Bitfusion使GPU成為頭等公民,可以像傳統的計算資源一樣抽象、分割槽、自動化和共享。另一方面,Kubernetes已經成為部署和管理機器學習負載的平臺。


本文透過介紹使用最新開發的Bitfusion Device Plugin,如何快捷在Kubernetes上使用Bitfusion提供的GPU資源池進TensorFlow行流行的TensorFlow深度學習開發。


概念理解
先來簡要介紹一下kubernetes這兩個模組:

  • Extended Resource: 一種自定義資源擴充套件的方式,將資源的名稱和總數量上報給API server,而Scheduler則根據使用該資源pod的建立和刪除,做資源可用量的加減法,進而在排程時刻判斷是否有滿足資源條件的節點。目前這裡的Extended Resource的增加和減少單元必須是整數,比如你可以分配1個GPU,但是不能分配0.5個GPU。該功能由於只是替代了Opaque integer resources,做了些更名的工作,所以在1.8已經是穩定的狀態了。


  • Device Plugin:透過提供通用裝置外掛機制和標準的裝置API介面。這樣裝置廠商只需要實現相應的API介面,無需修改Kubelet主幹程式碼,就可以實現支援GPU、FPGA、高效能 NIC、InfiniBand 等各種裝置的擴充套件。該能力在Kubernetes 1.8和1.9版本處於Alpha版本,在1.10會進入Beta版本。需要透過feature gate開啟, 即配置 --feature-gates=DevicePlugins=true


如圖所示,目前我們的處理層在透過device plugin控制單反方面做pod的資源控制,然後由pod內的Bitfusion Client 和 Bitfusion Server 在CUDA driver級別進行互動,在BitfusionClient的軟體堆疊中有一個CUDA driver的代理,透過它截獲Client上的所有CUDA服務訪問,透過網路將資料和服務請求傳送給BitfusionServer進行處理。

vSphere Bitfusion執行TensorFlow深度學習任務


Bitfusion Device Plugin安裝及使用步驟
以下例子以Kubernetes v1.17.5和Ubuntu 18.04作為安裝環境,闡述Bitfusion Device Plugin搭建TensorFlow環境進行Benchmarks測試。目前專案及容器映象託管在研發內部伺服器。如無法訪問,可透過VMware客戶代表聯絡我們。

首先我們下載Bitfusion Device Plugin專案 

目前專案的程式碼以及bitfusion-base暫時未公開,可透過聯絡我們或者客戶代表獲得。獲得後,可繼續執行下面操作。

我們需要先構建 Device Plugin 的docker image 由於想知道該平臺的一個整體效能,所以想要跑些Benchmarks,可以從我們提供的 Dockerfile  中構建Docker image:

docker build -f bitfusion-device-plugin/Dockerfile -t bitfusion_device_plugin/bitfusion-device:v0.1

FROM bitfusion-base:v0.1

RUN apt install curl -y
RUN \
 mkdir -p /goroot && \
 curl .9.linux-amd64.tar.gz | tar xvzf - -C /goroot --strip-components=1
# Set environment variables.
ENV GOROOT /goroot
ENV GOPATH /gopath
ENV PATH $GOROOT/bin:$GOPATH/bin:$PATH

# Define working directory.
WORKDIR /gopath/src/bitfusion-device-plugin

COPY . .
RUN go build -o bitfusion-device-plugin
RUN cp bitfusion-device-plugin /usr/bin/bitfusion-device-plugin \
&& cp *.sh /usr/bin

CMD ["./start.sh"]

然後配置Bitfusion Device Plugin的yaml檔案

Bitfusion Device Plugin 是符合 Kubernetes device plugin 介面規範的裝置擴充套件外掛。可以無縫地在一個 Kubernetes 叢集裡新增  bitfusion.io/gpu 資源,從而在部署應用的時候,在容器中使用 bitfusion。


修改如下,更新 device_plugin.yml 檔案中的 image ,Device Plugin 將以 DaemonSet 安裝在Kubernetes 節點上。


apiVersion: apps/v1
kind: DaemonSet
metadata:
 name: bitfusion-cli-device-plugin
 namespace: kube-system
 labels:
 tier: node
spec:
 hostNetwork: true
 containers:
 - name: device-plugin-ctr
 image: bitfusion_device_plugin/bitfusion-device:v0.1
 securityContext:
 privileged: true
 command: ["./start.sh"]
 env:
 - name: REG_EXP_SFC
 valueFrom:
 configMapKeyRef:
 name: configmap
 key: reg-exp
 - name: SOCKET_NAME
 valueFrom:
 configMapKeyRef:
 name: configmap
 key: socket-name
 - name: RESOURCE_NAME
 valueFrom:
 configMapKeyRef:
 name: configmap
 key: resource-name
 volumeMounts:
 - mountPath: "/root/.bitfusion"
 name: bitfusion-cli
 - mountPath: /gopath/run
 name: docker
 - mountPath: /gopath/proc
 name: proc
 - mountPath: "/root/.ssh/id_rsa"
 name: ssh-key
 - mountPath: "/var/lib/kubelet"
 name: kubelet-socket
 - mountPath: "/etc/kubernetes/pki"
 name: pki
 volumes:
 - name: bitfusion-cli
 hostPath:
 path"/root/.bitfusion"
 - name: docker
 hostPath:
 path: /var/run
 - name: proc
 hostPath:
 path: /proc
 - hostPath:
 path"/root/.ssh/id_rsa"
 name: ssh-key
 - hostPath:
 path"/var/lib/kubelet"
 name: kubelet-socket
 - hostPath:
 path"/etc/kubernetes/pki"
 name: pki

然後使用以下命令進行部署:

kubeclt apply -f bitfusion-device-plugin/device_plugin.yml

執行完成後,等待一段時間,如果成功部署,可以看到Bitfusion Device Plugin 的狀態為Running,日誌列印出當前device-plugin的狀態

vSphere Bitfusion執行TensorFlow深度學習任務
vSphere Bitfusion執行TensorFlow深度學習任務

構建TensorFlow image進行Benchmarks測試
我們已經提供了bitfusion-base映象,以及構建好的bitfusion-tfl-cli映象,可以直接拉取使用,或者按照需求自行構建。

docker build -f bitfusion-device-plugin/docker/bitfusion-tfl-cli/Dockerfile -t bitfusion-tfl-cli:v0.1

FROM bitfusion-base:v0.1
RUN conda install tensorflow-gpu==1.13.1

在 pod.yaml 中新增標籤,並且參考如下修改 引數:

  • resource limit:可以設定應用能使用的  bitfusion.io/gpu 的數目;


配置 pod  bitfusion-device-plugin/example/pod/pod.yaml

---
apiVersion: v1
kind: ConfigMap
metadata:
 name: bfs-pod-configmap
---

apiVersion: v1
kind: Pod
metadata:
 name: bfs-demo
 labels:
 purpose: device-demo
spec:
 hostNetwork: true
 containers:
 - name: demo
 image: bitfusion-tfl-cli:v0.1
 imagePullPolicy: Always
 workingDir: /root
 securityContext:
 privileged: true
 command: ["/bin/bash""-c""--"]
 args: ["python /benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py
 --local_parameter_device=gpu
 --batch_size=32
 --model=inception3 "
]
 volumeMounts:
 - mountPath: "/root/.bitfusion"
 name: config-volume
 resources:
 limits:
 bitfusion.io/gpu: 1
 volumes:
 - name: config-volume
 hostPath:
 path: "/root/.bitfusion"

Kubernetes上跑TensorFlow的benchmark進行測試

TensorFlow有自己的官方Benchmarks:tensorflow/benchmarks,裡面的tf_cnn_benchmarks包含了resnet50, resnet152, inception3, vgg16, googlenet, alexnet等模型,只需要簡單地提供一些引數,便可開始測試。


這裡我們選擇inception3模型來做基準測試,觀察pod內的bitfusion client 是否成功和bitfusion server打通


kubeclt apply -f bitfusion-device-plugin/example/pod/pod.yaml


執行完之後,等待一段時間,default 專案中可以看到 bfs-demo 的 Pod。

如果部署成功, Pod的log顯示:


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

相關文章