在 GCP 搭建使用 NVIDIA GPU 做機(jī)器學(xué)習(xí)的 K8S 集群

來(lái)源:Google Cloud
作者:Google Cloud
時(shí)間:2021-04-12
4152
本文介紹如何使用 NVIDIA 官方推薦工具和 K8S 插件,在谷歌云 GCP 的虛機(jī)上搭建用于機(jī)器學(xué)習(xí)任務(wù)的帶顯卡 K8S 集群。

本文介紹如何使用 NVIDIA 官方推薦工具和 K8S 插件,在谷歌云 GCP 的虛機(jī)上搭建用于機(jī)器學(xué)習(xí)任務(wù)的帶顯卡 K8S 集群。

另外,也介紹了如何更新 K8S 插件,來(lái)解決當(dāng)帶顯卡 Node 維護(hù)重啟時(shí),由于 GPU ID 發(fā)生變化而導(dǎo)致訓(xùn)練任務(wù)無(wú)法繼續(xù)的問(wèn)題。該問(wèn)題的描述可以參考在線記錄。注意,該問(wèn)題在使用各公有云虛機(jī)時(shí)都可能發(fā)生,觸發(fā)原因是虛機(jī)維護(hù)重啟后,從一臺(tái)宿主機(jī)遷移到另一臺(tái)宿主機(jī),所配置的顯卡實(shí)例也隨之改變,顯卡 ID 變化,而 NVIDIA K8S 插件在 0.9.0 版本之前不能容忍這個(gè)變化,而導(dǎo)致上層 Tensorflow 等應(yīng)用無(wú)法在重啟后獲取到顯卡。此問(wèn)題在谷歌云 GKE 環(huán)境中不會(huì)發(fā)生,因?yàn)楣雀柙?GKE 使用的是定制版插件。

本文搭建一個(gè)包含一臺(tái) Master 和一臺(tái) Node 的 K8S 集群,其中 Node 上配置一塊 NVIDIA T4 顯卡。之后復(fù)現(xiàn)顯卡 ID 問(wèn)題,并介紹升級(jí)環(huán)境解決問(wèn)題的步驟。

創(chuàng)建虛機(jī)實(shí)例

在谷歌云控制臺(tái)創(chuàng)建以下配置的虛機(jī)。注意確認(rèn)使用的項(xiàng)目和區(qū)域有充足的 CPU 和 GPU quota。

●      一臺(tái) Master 節(jié)點(diǎn)

○      k8s-m

○      n1-standard-1

○      Ubuntu LTS 16.04

●      一臺(tái) Node 節(jié)點(diǎn)

○      k8s-t4-node

○      n1-standard-1

○      Ubuntu LTS 16.04

○      T4 GPU

創(chuàng)建完后確認(rèn) master 和 node 都運(yùn)行正常。

搭建 K8S 集群

參考 NVIDIA 官方文檔

https://docs.nvidia.com/datacenter/cloud-native/kubernetes/install-k8s.html#option-1-installing-kubernetes-using-deepops

以及 DeepOps 文檔

https://github.com/NVIDIA/deepops/tree/master/docs/k8s-cluster

首先,登錄到 k8s-m,執(zhí)行以下命令安裝 Ansible 工具

下載并初始化 DeepOps 腳本

創(chuàng)建 SSH 密鑰對(duì),并將公鑰配置為 Node 的允許密鑰。注意要將私鑰配置為其它用戶不可訪問(wèn)。

參照下面截圖更改 Ansible 配置文件,指定 K8S 的 master 和 node 信息,以及密鑰對(duì)信息

驗(yàn)證 Ansible 配置

啟動(dòng) Ansible 來(lái)安裝 K8S 集群

安裝完成后,用下面命令來(lái)驗(yàn)證集群運(yùn)行正常

在 gpu01 節(jié)點(diǎn)上運(yùn)行以下命令確認(rèn)容器環(huán)境可以識(shí)別到顯卡。

注意:Image 版本需要參考官方文檔

至此,K8S 集群安裝完畢?,F(xiàn)在可以部署機(jī)器學(xué)習(xí)訓(xùn)練或預(yù)測(cè)任務(wù)在此集群。

復(fù)現(xiàn)節(jié)點(diǎn)重啟后 GPU Device ID 變化問(wèn)題

在剛搭建好的 K8S 集群 master 上查看 NVIDIA K8S Plugin 的版本

根據(jù)輸出,此集群上使用的 NVIDIA K8S 插件為 0.7.0 版本。此版本會(huì)產(chǎn)生重啟后顯卡 Device ID 變化而找不到顯卡的問(wèn)題。

查看當(dāng)前顯卡 Device ID 。

用下面命令用序號(hào)查看顯卡設(shè)備。

安裝并運(yùn)行測(cè)試程序容器 nvidia-loop 。其功能是持續(xù)占用顯卡并不斷打印 GPU Device ID 。

查看 nvidia-loop 的日志

以上命令都應(yīng)該成功無(wú)錯(cuò)。到此都不會(huì)出現(xiàn)任何問(wèn)題。

使用以下命令模擬 GCP 虛機(jī)維護(hù)事件。

命令完成后 1 小時(shí),節(jié)點(diǎn)會(huì)進(jìn)行重啟( 1 小時(shí)延遲因?yàn)樾枰瓿梢粋€(gè)重啟前一小時(shí)的通知消息)。重啟后node虛機(jī)應(yīng)該會(huì)遷移到另一臺(tái)宿主機(jī)并配置不同 ID 的顯卡。此時(shí)可以登錄到 Node來(lái)查看 GPU Device ID。

也可以使用 cuda 鏡像來(lái)測(cè)試在容器內(nèi)獲取 GPU Device ID,也一樣發(fā)生了變化

可以看到 Device ID 發(fā)生了變化。

此時(shí)查看 nvidia-loop 容器的狀態(tài),由于 Device UUID 發(fā)生了變化,導(dǎo)致不斷 crash。

查看 pod 描述,可以看到具體錯(cuò)誤為 UUID 變化。

修復(fù)節(jié)點(diǎn)重啟后 GPU Device ID 變化問(wèn)題

下面步驟驗(yàn)證 NVIDIA K8S Plugin release 0.9.0 修復(fù)了節(jié)點(diǎn)重啟后 Device ID 變化的問(wèn)題。

首先安裝 NVIDIA K8S Plugin 的 0.9.0 版本,并刪除之前版本。

確認(rèn)安裝成功

更新 Node上nvidia-runtime 的配置文件,允許 volume mount (否則測(cè)試容器 nvidia-loop 會(huì)運(yùn)行失敗)。

現(xiàn)在 K8S 插件更新完畢??梢则?yàn)證問(wèn)題修復(fù)。

再次使用以下命令模擬 GCP 虛機(jī)維護(hù)事件。

等一小時(shí)后維護(hù)重啟完成后,查看 nvidia-loop 容器狀態(tài),應(yīng)該是 Running,而不會(huì)再因?yàn)榫S護(hù)重啟而導(dǎo)致崩潰。

也可以查看 nvidia-loop 的日志,確保輸出 ID 正常。

kubectl logs nvidia-loop --tail=5

參考文檔

[1] Using the GPU id instead of uuid in the NVIDIA device plugin

原文鏈接:點(diǎn)擊前往 >
文章來(lái)源:Google Cloud
版權(quán)說(shuō)明:本文內(nèi)容來(lái)自于Google Cloud,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家