本篇文章為大家展示了如何在Kubernetes上使用Bitfusion進(jìn)行TensorFlow深度學(xué)習(xí),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站的開(kāi)發(fā),更需要了解用戶,從用戶角度來(lái)建設(shè)網(wǎng)站,獲得較好的用戶體驗(yàn)。成都創(chuàng)新互聯(lián)公司多年互聯(lián)網(wǎng)經(jīng)驗(yàn),見(jiàn)的多,溝通容易、能幫助客戶提出的運(yùn)營(yíng)建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇成都創(chuàng)新互聯(lián)公司,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來(lái)訪用戶感受到浩方產(chǎn)品的價(jià)值服務(wù)。
背景介紹
隨著 AI 技術(shù)的快速發(fā)展,越來(lái)越多的企業(yè)開(kāi)始將 AI 技術(shù)應(yīng)用到自身業(yè)務(wù)之中。目前,云端 AI 算力主要由三類 AI 加速器來(lái)提供:GPU,F(xiàn)PGA 和 AI ASIC 芯片。這些加速器的優(yōu)點(diǎn)是性能非常高,缺點(diǎn)是 成本高昂,缺少異構(gòu)加速管理和調(diào)度。大部分企業(yè)因無(wú)法構(gòu)建高效的加速器資源池,而不得不獨(dú)占式地使用這些昂貴的加速器資源,導(dǎo)致 資源利用率低,成本高。
以 GPU 為例,通過(guò)創(chuàng)新的 Bitfusion GPU 虛擬化技術(shù),能夠幫助用戶無(wú)需任務(wù)修改就能透明地共享和使用數(shù)據(jù)中心內(nèi)任何服務(wù)器之上的 AI 加速器,不但能夠幫助用戶提高資源利用率,而且可以 極大便利 AI 應(yīng)用的部署,構(gòu)建數(shù)據(jù)中心級(jí)的 AI 加速器資源池。
Bitfusion通過(guò)提供遠(yuǎn)程GPU池來(lái)幫助解決這些問(wèn)題。Bitfusion使GPU成為頭等公民,可以像傳統(tǒng)的計(jì)算資源一樣抽象、分區(qū)、自動(dòng)化和共享。另一方面,Kubernetes已經(jīng)成為部署和管理機(jī)器學(xué)習(xí)負(fù)載的平臺(tái)。
下面通過(guò)介紹使用最新開(kāi)發(fā)的Bitfusion Device Plugin,如何快捷在Kubernetes上使用Bitfusion提供的GPU資源池進(jìn)TensorFlow行流行的TensorFlow深度學(xué)習(xí)開(kāi)發(fā)。
概念理解
先來(lái)簡(jiǎn)要介紹一下kubernetes這兩個(gè)模塊:
Extended Resource: 一種自定義資源擴(kuò)展的方式,將資源的名稱和總數(shù)量上報(bào)給API server,而Scheduler則根據(jù)使用該資源pod的創(chuàng)建和刪除,做資源可用量的加減法,進(jìn)而在調(diào)度時(shí)刻判斷是否有滿足資源條件的節(jié)點(diǎn)。目前這里的Extended Resource的增加和減少單元必須是整數(shù),比如你可以分配1個(gè)GPU,但是不能分配0.5個(gè)GPU。該功能由于只是替代了Opaque integer resources,做了些更名的工作,所以在1.8已經(jīng)是穩(wěn)定的狀態(tài)了。
Device Plugin:通過(guò)提供通用設(shè)備插件機(jī)制和標(biāo)準(zhǔn)的設(shè)備API接口。這樣設(shè)備廠商只需要實(shí)現(xiàn)相應(yīng)的API接口,無(wú)需修改Kubelet主干代碼,就可以實(shí)現(xiàn)支持GPU、FPGA、高性能 NIC、InfiniBand 等各種設(shè)備的擴(kuò)展。該能力在Kubernetes 1.8和1.9版本處于Alpha版本,在1.10會(huì)進(jìn)入Beta版本。需要通過(guò)feature gate打開(kāi), 即配置 --feature-gates=DevicePlugins=true
如圖所示,目前我們的處理層在通過(guò)device plugin控制單反方面做pod的資源控制,然后由pod內(nèi)的Bitfusion Client 和 Bitfusion Server 在CUDA driver級(jí)別進(jìn)行交互,在BitfusionClient的軟件堆棧中有一個(gè)CUDA driver的代理,通過(guò)它截獲Client上的所有CUDA服務(wù)訪問(wèn),通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)和服務(wù)請(qǐng)求發(fā)送給BitfusionServer進(jìn)行處理。
Bitfusion Device Plugin安裝及使用步驟
以下例子以Kubernetes v1.17.5和Ubuntu 18.04作為安裝環(huán)境,闡述Bitfusion Device Plugin搭建TensorFlow環(huán)境進(jìn)行Benchmarks測(cè)試。目前項(xiàng)目及容器鏡像托管在研發(fā)內(nèi)部服務(wù)器。如無(wú)法訪問(wèn),可通過(guò)VMware客戶代表聯(lián)系我們。
首先我們下載Bitfusion Device Plugin項(xiàng)目
目前項(xiàng)目的代碼以及bitfusion-base暫時(shí)未公開(kāi),可通過(guò)聯(lián)系我們或者客戶代表獲得。獲得后,可繼續(xù)執(zhí)行下面操作。
我們需要先構(gòu)建 Device Plugin 的docker image 由于想知道該平臺(tái)的一個(gè)整體性能,所以想要跑些Benchmarks,可以從我們提供的 Dockerfile 中構(gòu)建Docker image:
然后配置Bitfusion Device Plugin的yaml文件
Bitfusion Device Plugin 是符合 Kubernetes device plugin 接口規(guī)范的設(shè)備擴(kuò)展插件。可以無(wú)縫地在一個(gè) Kubernetes 集群里添加 bitfusion.io/gpu 資源,從而在部署應(yīng)用的時(shí)候,在容器中使用 bitfusion。
修改如下,更新 device_plugin.yml 文件中的 image ,Device Plugin 將以 DaemonSet 安裝在Kubernetes 節(jié)點(diǎn)上。
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
然后使用以下命令進(jìn)行部署
kubeclt apply -f bitfusion-device-plugin/device_plugin.yml
執(zhí)行完成后,等待一段時(shí)間,如果成功部署,可以看到Bitfusion Device Plugin 的狀態(tài)為Running,日志打印出當(dāng)前device-plugin的狀態(tài)
構(gòu)建TensorFlow image進(jìn)行Benchmarks測(cè)試
我們已經(jīng)提供了bitfusion-base鏡像,以及構(gòu)建好的bitfusion-tfl-cli鏡像,可以直接拉取使用,或者按照需求自行構(gòu)建。
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 中添加標(biāo)簽,并且參考如下修改 參數(shù):
resource limit:可以設(shè)置應(yīng)用能使用的 bitfusion.io/gpu 的數(shù)目;
配置 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進(jìn)行測(cè)試
TensorFlow有自己的官方Benchmarks:tensorflow/benchmarks,里面的tf_cnn_benchmarks包含了resnet50, resnet152, inception3, vgg16, googlenet, alexnet等模型,只需要簡(jiǎn)單地提供一些參數(shù),便可開(kāi)始測(cè)試。
這里我們選擇inception3模型來(lái)做基準(zhǔn)測(cè)試,觀察pod內(nèi)的bitfusion client 是否成功和bitfusion server打通
kubeclt apply -f bitfusion-device-plugin/example/pod/pod.yaml
執(zhí)行完之后,等待一段時(shí)間,default 項(xiàng)目中可以看到 bfs-demo 的 Pod。
如果部署成功, Pod的log顯示:
上述內(nèi)容就是如何在Kubernetes上使用Bitfusion進(jìn)行TensorFlow深度學(xué)習(xí),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。