本文介紹如何使用 NVIDIA 官方推薦工具和 K8S 插件,在谷歌云 GCP 的虛機上搭建用于機器學習任務的帶顯卡 K8S 集群。
另外,也介紹了如何更新 K8S 插件,來解決當帶顯卡 Node 維護重啟時,由于 GPU ID 發(fā)生變化而導致訓練任務無法繼續(xù)的問題。該問題的描述可以參考在線記錄。注意,該問題在使用各公有云虛機時都可能發(fā)生,觸發(fā)原因是虛機維護重啟后,從一臺宿主機遷移到另一臺宿主機,所配置的顯卡實例也隨之改變,顯卡 ID 變化,而 NVIDIA K8S 插件在 0.9.0 版本之前不能容忍這個變化,而導致上層 Tensorflow 等應用無法在重啟后獲取到顯卡。此問題在谷歌云 GKE 環(huán)境中不會發(fā)生,因為谷歌云 GKE 使用的是定制版插件。
本文搭建一個包含一臺 Master 和一臺 Node 的 K8S 集群,其中 Node 上配置一塊 NVIDIA T4 顯卡。之后復現(xiàn)顯卡 ID 問題,并介紹升級環(huán)境解決問題的步驟。
創(chuàng)建虛機實例
在谷歌云控制臺創(chuàng)建以下配置的虛機。注意確認使用的項目和區(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)建完后確認 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é)點上運行以下命令確認容器環(huán)境可以識別到顯卡。
注意:Image 版本需要參考官方文檔
至此,K8S 集群安裝完畢。現(xiàn)在可以部署機器學習訓練或預測任務在此集群。
復現(xiàn)節(jié)點重啟后 GPU Device ID 變化問題
在剛搭建好的 K8S 集群 master 上查看 NVIDIA K8S Plugin 的版本
根據(jù)輸出,此集群上使用的 NVIDIA K8S 插件為 0.7.0 版本。此版本會產(chǎn)生重啟后顯卡 Device ID 變化而找不到顯卡的問題。
查看當前顯卡 Device ID 。
用下面命令用序號查看顯卡設備。
安裝并運行測試程序容器 nvidia-loop 。其功能是持續(xù)占用顯卡并不斷打印 GPU Device ID 。
查看 nvidia-loop 的日志
以上命令都應該成功無錯。到此都不會出現(xiàn)任何問題。
使用以下命令模擬 GCP 虛機維護事件。
命令完成后 1 小時,節(jié)點會進行重啟( 1 小時延遲因為需要完成一個重啟前一小時的通知消息)。重啟后node虛機應該會遷移到另一臺宿主機并配置不同 ID 的顯卡。此時可以登錄到 Node來查看 GPU Device ID。
也可以使用 cuda 鏡像來測試在容器內(nèi)獲取 GPU Device ID,也一樣發(fā)生了變化
可以看到 Device ID 發(fā)生了變化。
此時查看 nvidia-loop 容器的狀態(tài),由于 Device UUID 發(fā)生了變化,導致不斷 crash。
查看 pod 描述,可以看到具體錯誤為 UUID 變化。
修復節(jié)點重啟后 GPU Device ID 變化問題
下面步驟驗證 NVIDIA K8S Plugin release 0.9.0 修復了節(jié)點重啟后 Device ID 變化的問題。
首先安裝 NVIDIA K8S Plugin 的 0.9.0 版本,并刪除之前版本。
確認安裝成功
更新 Node上nvidia-runtime 的配置文件,允許 volume mount (否則測試容器 nvidia-loop 會運行失敗)。
現(xiàn)在 K8S 插件更新完畢??梢则炞C問題修復。
再次使用以下命令模擬 GCP 虛機維護事件。
等一小時后維護重啟完成后,查看 nvidia-loop 容器狀態(tài),應該是 Running,而不會再因為維護重啟而導致崩潰。
也可以查看 nvidia-loop 的日志,確保輸出 ID 正常。
kubectl logs nvidia-loop --tail=5
[1] Using the GPU id instead of uuid in the NVIDIA device plugin