該指南能幫助同行研究者和愛好者們輕鬆地使用 Kubernetex GPU 集群來自動化和加速他們的深度學習訓練。因此,我將解釋如何輕鬆地在多個 Ubuntu 16.04 裸機伺服器上搭建一個 GPU 集群,並提供一些有用的腳本和.yaml 文件來完成這些工作。
另外,如果你需要把 Kubernetes GPU 集群用於其他地方,該指南可能對你也有幫助。
我一直在創業公司 understand.ai 實習,在那裡我留意到了一個麻煩:首先得在本地設計一個機器學習算法,然後將其放到雲上用不同的參數和數據集來訓練模型。這第二步,將算法放到雲上進行全面的訓練,所耗費的時間要比想像的更長,通常讓人很沮喪而且涉及到很多陷阱。
因此,我決定解決這個問題,讓第二步變得容易、簡單和快捷。
我寫了這篇很有用的指南,描述了每個人如何設置他們自己的 Kubernetes GPU 集群來加速他們的工作。
用 Kubernetes GPU 集群進行自動化的深度學習訓練,它能極大地改進在雲上訓練模型的過程。
(點擊放大圖像)
下面的章節可能有些武斷。Kubernetes 是一個進化的、快節奏的環境,這就意味著這個指南很可能會在某個時間過時,這取決於作者的空餘時間和個人貢獻。因此,非常感謝對此的貢獻。
如果你需要重溫下 Kubernetes 知識,下面這些文章很有用。
DigitalOcean 的 Kubernetes 引論 (https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes)
Kubernetes 概念 (https://kubernetes.io/docs/concepts/)
Kubernetes 示例 (http://kubernetesbyexample.com/)
Kubernetes 基礎 - 交互式指導 (https://kubernetes.io/docs/tutorials/kubernetes-basics/)
核心想法是用一個很小的只有 CPU 的 master 節點來控制一組 GPU worker 節點。
(點擊放大圖像)
在我們使用集群之前,要先對其初始化,這一點很重要。因此,要手動地初始化每個節點,隨後將它加入集群中。
該配置非常適合這裡所描述的用例。對其他用例、作業系統等,需要進一步地調整配置。
Master
Ubuntu 16.04 帶 root 權限
SSH 權限
停用 ufw
可用埠(udp 和 tcp)
6443,443,8080
30000-32767(僅在需要時激活)
這些將被用於獲取集群外部的服務
Worker
Ubuntu 16.04 帶 root 權限
SSH 權限
停用 ufw
可用埠(udp 和 tcp)
關於安全:當然,如果你想在產品中使用,就應該啟用某些防火牆;這裡出於簡單考慮我停用了 ufw。設置 Kubernetes 以用於實際的產品中,理所當然應該啟用某些防火牆如 ufw、iptables 或者你的雲提供商的防火牆。在雲上設置集群會更加複雜。通常雲提供商的防火牆與主機級別的防火牆是分開的。你可能需要停用 ufw、並開啟雲提供商防火牆的規則來讓這篇文檔裡的步驟生效。
這些指南涵蓋了我在 Ubuntu 16.04 的經驗,對其他作業系統可能適用,也可能不適用。
我創建了兩個腳本對 master 和 worker 節點完全初始化。腳本如下所示。如果你想用快速通道,可以直接使用這些腳本。否則,我建議你閱讀一步一步的指南。
將下面相應的腳本拷貝到你的 master 和 worker 上。
(https://github.com/Langhalsdino/Kubernetes-GPU-Guide/blob/master/scripts/init-master.sh)
(https://github.com/Langhalsdino/Kubernetes-GPU-Guide/blob/master/scripts/init-worker.sh)
MASTER 節點
運行初始化腳本 (https://github.com/Langhalsdino/Kubernetes-GPU-Guide/blob/master/scripts/init-master.sh),記下 token。
Token 的格式類似於 --token f38242.e7f3XXXXXXXXe231e。
WORKER 節點
運行初始化腳本 (https://github.com/Langhalsdino/Kubernetes-GPU-Guide/blob/master/scripts/init-worker.sh),使用正確的 token 和 master IP。
埠通常是 6443。
MASTER 節點
(1). 將 Kubernetes Repository 加入 packagemanager
(2). 安裝 docker-engine、kubeadm、kubectl 和 kubernetes-cni
(3). 由於我們想創建一個使用 GPU 的集群,我們要在 master 節點上啟用 GPU 加速功能。記住,在 Kubernetes 之後的版本中,這一步可能被淘汰了或者完全更改了。
(3.I) 在集群初始化之前,添加 GPU 支持到 Kubeadm 配置。
這一步必須對集群中的每一個節點進行,即使某些節點沒有 GPU。
因此,在 ExecStart 後追加上標籤 --feature-gates="Accelerators=true",最終格式如下:
(3.II) 重啟 kubelet
(4). 現在初始化 master 節點。
你需要 master 節點的 IP。而且,這一步會向你提供認證信息,用於添加 worker 節點,因為要記住你的 token。
Token 的格式類似於 --token f38242.e7f3XXXXXXXXe231e 130.211.XXX.XXX:6443。
(5). 由於 Kubernetes 1.6 從 ABAC 卷管理變成了 RBAC 式,因此我們需要向用戶公布認證信息。每一次登錄機器,都需要執行這一步。
(6). 安裝網絡插件讓節點能相互通信。Kubernetes 1.6 對網絡插件有一些要求,如:
這篇 GoogleSheet 文檔包含很多合適的網絡插件。連結: GoogleSheet Network Add-on comparison。
出於個人的偏好,我會使用 wave-works。
(7). 現在都設置好了。檢查所有的 pod 都在線上,確認一切運轉順利。
(N). 如果你想撤掉 master 節點,你需要重置它。
WORKER NODE
前面幾步對你而言應該很熟悉了,能讓進程加快一些。
(1). 將 Kubernetes Repository 加入 packagemanager
(2). 安裝 docker-engine、kubeadm、kubectl 和 kubernetes-cni
(3). 由於我們想創建一個使用 GPU 的集群,我們要在 master 節點上啟用 GPU 加速功能。記住,在 Kubernetes 之後的版本中,這一步可能被淘汰了或者完全更改了。
(3.I) 在集群初始化之前,添加 GPU 支持到 Kubeadm 配置。
這一步必須對集群中的每一個節點進行,即使某些節點沒有 GPU。
因此,在 ExecStart 後追加上標籤 --feature-gates="Accelerators=true",最終格式如下:
(3.II) 重啟 kubelet
(4). 現在我們將 worker 加入到集群中。
你需要記住 master 節點的 token,所以查看下節點。
(5). 完成。在 master 上檢查節點,看看是否一切運轉順利。
(N). 如果你想撤掉 worker 節點,你需要將該節點從集群中移除,然後重置該節點。從集群中移除 worker 節點是很有幫助的。
在 master 節點上:
在 worker 節點上
客戶端
為了控制你的集群,如從客戶端控制 master,你需要對客戶端的正確用戶進行認證。該指南中並沒有為客戶端創建一個單獨的用戶,我們只是從 master 節點複製用戶。相信我,這樣做會更簡單。
[會在將來加入如何添加用戶的指導]
(1). 在客戶端安裝 kubectl。我只在 mac 上測試過,但應該也適用 linux。我不知道是否適用於 windows,但又有誰關心 windows 呢。
Mac
Ubuntu 你要麼遵循官方指南 https://kubernetes.io/docs/tasks/tools/install-kubectl/,要麼從上面的 worker 指南中提取需要的步驟(可能只在 Ubuntu 上可行)。
(2). 將 master 的 admin 認證拷貝到客戶端。
(3). 將 admin.conf 配置和認證信息添加到 Kubernetes 配置中。你需要對每個代理都執行該步驟。
你可以在本地的客戶端上使用 kubectl 了。
(4). 你可以測試列出所有的 pod
Kubernetes dashboard 非常的漂亮,它向那些跟我一樣喜歡擺弄腳本的人提供了很多功能。要使用 dashboard 的話,你需要讓客戶端運行,RBAC 會確保這一點。
你可以直接在 master 節點上或者從客戶端運行下面的步驟。
(1). 檢查已經安裝了 dashboard:
(2). 如果沒有安裝,則安裝它
如果不成功,檢查.yaml 中定義的容器 git.io/kube-dashboard 是否存在。(這個軟體故障曾讓我花費了很多時間)
為了能訪問你的 dashboard,你需要在客戶端進行認證。
(3). 添加 dashboard 代理到客戶端。
在客戶端運行:
(4). 用瀏覽器訪問 dashboard,訪問 127.0.0.1:8001/ui。
這裡幫助你運行一個需要 GPU 權限的 Docker 容器。
在該指南中,我選擇創建一個 Docker 容器的例子,它用 TensorFlow GPU 二進位文件,並能在 Jupyter 筆記本中運行 TensorFlow 程序。
請記住,該指南適用於 Kubernetes 1.6,因此可能不適用於今後的變化。
為了能夠讓你的帶 CUDA 的 Nvidia GPU 運行,你需要將 Nvidia 驅動和 CUDA 庫文件傳給容器。因此,我們將使用 hostPath,讓 Kubernetes pod 能訪問它們。實際的路徑因機器而異,因為它們是由 Nvidia 驅動和 CUDA 安裝程序來設置的。
將包含有驅動和 CUDA 的卷加載到容器中的正確目錄下。根據你的容器的具體要求,這些設置可能有所不同。
因為你要告訴 Kubernetes 你需要 n 個 GPU,所以你可以在這裡定義這些需求。
這就是你需要創建 Kuberntes 1.6 容器的所有東西。
這是我的所有經驗:
Kubernetes + Docker + Machine Learning + GPUs = 頂呱呱
文件 example-gpu-deployment.yaml 描述了兩部分,部署和服務,因為我想讓 juptyer 筆記本能被外部訪問。
運行 kubectl 來讓其對外可見。
文件 deployment.yaml 內容如下:
為了驗證這些設置是正確的,你可以訪問 JupyterNotebook 實例,連結是 http://:30061。
現在我們要驗證你的 JupyterNotebook 實例可以訪問 GPU。因此,在一個 新的筆記本 中運行下面的程序。它將列出 tensorflow 可用的所有服務。
輸出結果應該類似於 [u'/cpu:0', u'/gpu:0']。
Get 命令,輸出基本信息
Describe 命令,輸出冗長的信息
刪除資源
進入某個 pod 的 bash 控制臺:
有很多指南、github 倉庫、問題和幫助過我的人們。
我想感謝每一個人的幫助。
特別感謝創業公司 understand.ai 的支持。
該項目採用 MIT 許可,具體細節請查看 LICENSE.md 文件。
本文作者 Frederic Tausch 最初發布於 GitHub,How to automate deep learning training with Kubernetes GPU-cluster(https://github.com/Langhalsdino/Kubernetes-GPU-Guide),經原作者授權由 InfoQ 中文站翻譯並分享。
【想提高資料庫技能的,速度看過來!】
他是 @楊建榮,搜狐暢遊 DBA,DBAplus 社群聯合發創始人,近 10 年資料庫經驗老兵!Oracle 10g OCM,MySQL OCP 認證專家,曾從 2012 年開始每天堅持撰寫技術文章,現已堅持 1100 多天!看到很多人,總是因為 DBA 感到職業發展迷茫、為技能提升焦慮,於是開了一個免費公開課,希望幫助大家。
長按下方圖中二維碼,趕快添加小助手,獲取免費聽課地址吧!