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

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

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

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

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

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

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

●      一臺 Master 節(jié)點

○      k8s-m

○      n1-standard-1

○      Ubuntu LTS 16.04

●      一臺 Node 節(jié)點

○      k8s-t4-node

○      n1-standard-1

○      Ubuntu LTS 16.04

○      T4 GPU

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

搭建 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 密鑰對,并將公鑰配置為 Node 的允許密鑰。注意要將私鑰配置為其它用戶不可訪問。

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

驗證 Ansible 配置

啟動 Ansible 來安裝 K8S 集群

安裝完成后,用下面命令來驗證集群運行正常

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

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

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

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

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

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

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

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

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

查看 nvidia-loop 的日志

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

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

命令完成后 1 小時,節(jié)點會進(jìn)行重啟( 1 小時延遲因為需要完成一個重啟前一小時的通知消息)。重啟后node虛機(jī)應(yīng)該會遷移到另一臺宿主機(jī)并配置不同 ID 的顯卡。此時可以登錄到 Node來查看 GPU Device ID。

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

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

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

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

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

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

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

確認(rèn)安裝成功

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

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

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

等一小時后維護(hù)重啟完成后,查看 nvidia-loop 容器狀態(tài),應(yīng)該是 Running,而不會再因為維護(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

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