如何使用Kubernetes GPU集群自動化深度學習訓練?

2021-02-20 架構頭條

該指南能幫助同行研究者和愛好者們輕鬆地使用 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 感到職業發展迷茫、為技能提升焦慮,於是開了一個免費公開課,希望幫助大家。

長按下方圖中二維碼,趕快添加小助手,獲取免費聽課地址吧!

相關焦點

  • 基於 Kubernetes 的 GPU 類型調度實現
    作者: angao來源: 才雲 Caicloud(ID:Caicloud2015)現如今,隨著企業紛紛在機器學習和深度學習上加大投入,他們開始發現從頭構建一個 AI 系統並非易事。以深度學習為例。對於深度學習來說,算力是一切的根本。
  • 如何使用keras,python和深度學習進行多GPU訓練
    我已經使用並測試了這個多GPU功能近一年,我非常高興能將它視為官方keras發行版的一部分。在今天文章的其他部分中,我將演示如何使用keras,python和深度學習訓練圖像分類的CNN。MiniGoogLeNet 深度學習框架
  • 如何使用 Keras,Python 和深度學習進行多 GPU 訓練
    然而,它非常強大,能夠實施和訓練最先進的深度神經網絡。然而,我們對keras最感到受挫的一個原因,是在多GPU環境下使用,因為這是非常重要的。如果你使用Theano,請忽略它——多GPU訓練,這並不會發生。
  • JupyterHub on Kubernetes: 如何打造 Tubi 數據科學平臺
    另外,我們也將揭示 Tubi 在以下幾個高級特性上的嘗試:深度學習、節點親和性和 Kubernetes 集群自動伸縮等。帶上基本特性後的 TDR 架構深度學習GPU除之前描述的基本特性外,我們仍需要一些專有工具用於支持 Tubi 內部深度學習應用
  • 【經驗】深度學習如何挑選GPU?
    閱讀大概需要9分鐘跟隨小博主,每天進步一丟丟編輯:Sophia計算機視覺聯盟  報導  | 公眾號 CVLianMeng轉載於 :極市平臺深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。因此,選擇購買合適的GPU是一項非常重要的決策。
  • 使用Argo CD自動化Kubernetes多集群配置
    你可以設置一個Git repo,並將各種集群連接到它,它們將以GitOps的方式標準化配置,並防止漂移。這對於在不同託管位置管理成百上千個集群的大型企業尤其重要。使用Argo CD自動化Kubernetes多集群配置受到ACM的啟發,我想知道是否可以使用另一種GitOps解決方案,Argo CD,重新創建這種類型的功能。
  • 使用Kubelet API攻擊Kubernetes集群
    本文稍後將在PoC中使用其中兩個:不要驚慌關於身份驗證/授權默認配置,有一些警告。使用自動化工具安裝Kubernetes集群時,可能已對這些默認配置進行了調整以提高安全性。也許…搜索未認證的公共API即使大多數人使用自動化工具來配置Kubernetes集群(甚至使用託管的Kubernetes服務,例如EKS,GKE,AKS等),找到公開可用的不安全的API也不難。
  • 踢掉 Docker 後,Kubernetes 還能歡快地跑 GPU?
    集群中 Docker 如何使用 GPU 早就被說爛了,那麼以 Containerd 作為容器運行時的集群是如何使用 GPU的,有人知道嗎?目前 Kubernetes 不僅支持容器請求 GPU 資源,還支持請求幾塊顯卡的 GPU 資源,這使得 Kubernetes 在深度學習和區塊鏈等場景下也有了用武之地。關於 Kubernetes 集群中 Docker 如何使用 GPU,Kubernetes 的官方文檔已經說的很清楚了,網上也有鋪天蓋地的博客手把手教你怎麼做。
  • 我到底應該使用哪個 CRI 替換 kubernetes 集群的 Docker?
    測試環境我這裡的測試環境是一個 1.19.4 版本的 kubernetes 集群,使用 ansible 進行創建(https://gitlab.com/incubateur-pe)。集群運行在 kvm 上,配置如下:master:Centos/7, 2vcpus/2G內存。
  • 教程 | 如何使用 Kubernetes 輕鬆部署深度學習模型
    Python、Keras、Flask 和 Docker 在 Kubernetes 上部署深度學習模型。本文展示了如何用 Keras 構建深度學習模型的簡單示例,將其作為一個用 Flask 實現的 REST API,並使用 Docker 和 Kubernetes 進行部署。本文給出的並不是一個魯棒性很好的能夠用於生產的示例,它只是為那些聽說過 Kubernetes 但沒有動手嘗試過的人編寫的快速上手指南。
  • 2020年深度學習如何挑選 GPU?這篇 GPU 最全攻略請查收
    深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。
  • 如何在 Kubernetes 集群中玩轉 Fluid + JuiceFS
    📖 作者簡介:呂冬冬,雲知聲超算平臺架構師, 負責大規模分布式機器學習平臺架構設計與功能研發,負責深度學習算法應用的優化與
  • 2020 年深度學習如何挑選 GPU?這篇 GPU 最全攻略請查收
    的選擇將從根本上決定深度學習的體驗。> 16-bit capability > Tensor Cores > FLOPs2 如何選擇NVIDIA/AMD/GoogleNVIDIA的標準庫使在CUDA中建立第一個深度學習庫變得非常容易。
  • 在 Windows 下使用 WSL2 搭建 Kubernetes 集群
    本文我們將介紹如何在 Windows10 下使用 WSL2 和 KinD 來搭建一套 Kubernetes 集群。
  • 免費使用谷歌GPU資源訓練自己的深度模型
    source=email-f77a373d92e1-1520378825396-digest.reader-0-36&sectionName=top深度學習的小夥伴們,你們是否在為沒有GPU,網絡訓練耗時而苦惱。眾所周知,想要入門深度學習,首先要有一塊或者N塊顯卡,這樣才能享受開著法拉利在深度學習的道路上策馬奔騰的感覺。
  • 2020年深度學習如何挑選GPU?這篇 GPU 最全攻略請查收
    關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。因此,選擇購買合適的GPU是一項非常重要的決策。那麼2020年,如何選擇合適的GPU呢?
  • 使用kubeadm安裝基於虛擬主機的Kubernetes集群
    我們當中絕大多數人應該都知道如何安裝和使用Kubernetes,典型的Kubernetes架構如下圖:用戶可以使用Minikube,Kind和Microk8s在單機的電腦上部署一個單點Kubernetes集群。Katakoda也是一個不錯的選擇。這些都是一些很容易上手的部署工具。
  • 從深度學習gpu選擇來談談gpu的硬體架構
    ####1.選擇怎樣的GPU型號這幾年主要有AMD和NVIDIA在做顯卡,到目前為止,NVIDIA公司推出過的GeForce系列卡就有幾百張[1],雖然不少都已經被淘汰了,但如何選擇適合的卡來做算法也是一個值得思考的問題,Tim Dettmers[2]的文章給出了很多有用的建議,根據自己的理解和使用經歷(其實只用過GTX 970…)我也給出一些建議。
  • 使用Minikube安裝Kubernetes集群
    ,對於沒有使用過Kubernetes的人來說,需要花費一定的時間去理解各組件的概念和功能,再做大量的安裝配置工作才能運行一個kubernetes集群。從Kubernetes 1.3開始提供了一個叫Minikube的強大測試工具,可以在任意主機上運行單節點的小型集群,這個工具默認安裝和配置了一個Linux  VM,Docker和Kubernetes的相關組件,並且提供Dashboard。目前支持在Linux, OS X及Windows上安裝,今天我們介紹的是在OS X上如何安裝Minitube。
  • 基於Hadoop集群的大規模分布式深度學習
    目前,Hadoop集群已成為Yahoo大規模機器學習的首選平臺。深度學習(Deep Learning, DL)是雅虎很多產品的核心技術需求。在2015 RE.WORK深度學習峰會上,Yahoo Flickr團隊(Simon Osindero和Pierre Garrigues)闡述了深度學習如何被應用於場景檢測、物體識別和計算美學。