隨著全球各大企業開始廣泛採用Kubernetes,我們看到Kubernetes正在向新的階段發展。一方面,Kubernetes被邊緣的工作負載所採用並提供超越資料中心的價值。另一方面,Kubernetes正在驅動機器學習(ML)和高質量、高速的資料分析效能的發展。

我們現在所瞭解到的將Kubernetes應用於機器學習的案例主要源於Kubernetes 1.10中一個的功能,當時圖形處理單元(GPUs)成為一個可排程的資源——現在這一功能處於beta版本。單獨來看,這兩個都是Kubernetes中令人興奮的發展。更令人興奮的是,可以使用Kubernetes在資料中心和邊緣採用GPU。在資料中心,GPU是一種構建ML庫的方式。那些訓練過的庫將被遷移到邊緣Kubernetes叢集作為機器學習的推理工具,在儘可能靠近資料收集的地方提供資料分析。

在早些時候,Kubernetes還是為分散式應用程式提供一個CPU和RAM資源的池。如果我們有CPU和RAM池,為什麼不能有一個GPU池呢?這當然毫無問題,但不是所有的server都有GPU。所以,如何讓我們的server在Kubernetes中可以裝配GPU呢?

在本文中,我將闡述在Kubernetes叢集中使用GPU的簡單方法。在未來的文章中,我們還將GPU推向至邊緣並向你展示如何完成這一步驟。為了真正地簡化步驟,我將用Rancher UI來操作啟用GPU的過程。Rancher UI只是Rancher RESTful APIs的一個客戶端。你可以在GitOps、DevOps和其他自動化解決方案中使用其他API的客戶端,比如Golang、Python和Terraform。不過,我們不會在此文中深入探討這些。

本質上看,步驟十分簡單:

  • 為Kubernetes叢集構建基礎架構
  • 安裝Kubernetes
  • 從Helm中安裝gpu-operator

使用Rancher和可用的GPU資源啟動和執行

Rancher是一個多叢集管理解決方案並且是上述步驟的粘合劑。你可以在NVIDIA的部落格中找到一個簡化GPU管理的純NVIDIA解決方案,以及一些關於gpu-operator與構建沒有operator的GPU驅動堆疊有何區別的重要資訊。

https://developer.nvidia.com/blog/nvidia-gpu-operator-simplifying-gpu-management-in-kubernetes/

前期準備

以下是在Rancher中啟動和執行GPU所需的材料清單(BOM):

  1. Rancher
  2. GPU Operator(https://nvidia.github.io/gpu-operator/)
  3. 基礎架構——我們將在AWS上使用GPU節點

在官方文件中,我們有專門的章節闡述如何高可用安裝Rancher,所以我們假設你已經將Rancher安裝完畢:

https://docs.rancher.cn/docs/rancher2/installation/k8s-install/_index/

流程步驟

使用GPUs安裝Kubernetes叢集

Rancher安裝之後,我們首先將構建和配置一個Kubernetes叢集(你可以使用任何帶有NVIDIA GPU的叢集)。

使用Global上下文,我們選擇Add Cluster

並在“來自雲服務商提供的主機”部分,選擇Amazon EC2。

我們是通過節點驅動來實現的—— 一組預配置的基礎設施模板,其中一些模板有GPU資源。

注意到這裡有3個節點池:一個是為master準備的,一個是為標準的worker節點準備的,另一個是為帶GPU的worker準備的。GPU的模板基於p3.2xlarge機器型別,使用Ubuntu 18.04亞馬遜機器映象或AMI(ami-0ac80df6eff0e70b5)。當然,這些選擇是根據每個基礎設施提供商和企業需求而變化的。另外,我們將 “Add Cluster”表單中的Kubernetes選項設定為預設值。

設定GPU Operator

現在,我們將使用GPU Operator庫(https://nvidia.github.io/gpu-operator)在Rancher中設定一個catalog。(也有其他的解決方案可以暴露GPU,包括使用Linux for Tegra [L4T] Linux發行版或裝置外掛)在撰寫本文時,GPU Operator已經通過NVIDIA Tesla Driver 440進行了測試和驗證。

使用Rancher Global上下文選單,我們選擇要安裝到的叢集:

然後使用Tools選單來檢視catalog列表。

點選Add Catalog按鈕並且給其命名,然後新增url:https://nvidia.github.io/gpu-operator

我們選擇了Helm v3和叢集範圍。我們點選Create以新增Catalog到Rancher。當使用自動化時,我們可以將這一步作為叢集構建的一部分。根據企業策略,我們可以新增這個Catalog到每個叢集中,即使它還沒有GPU節點或節點池。這一步為我們提供了訪問GPU Operator chart的機會,我們接下來將安裝它。

現在我們想要使用左上角的Rancher上下文選單以進入叢集的“System”專案,我們在這裡添加了GPU Operator功能。

在System專案中,選擇Apps:

然後點選右上方的Launch按鈕。

我們可以搜尋“nvidia”或者向下滾動到我們剛剛建立的catalog。

點選gpu-operator app,然後在頁面底部點選Launch。

在這種情況下,所有的預設值都應該沒問題。同樣,我們可以通過Rancher APIs將這一步驟新增到自動化中。

利用GPU

既然GPU已經可以訪問,我們現在可以部署一個GPU-capable 工作負載。同時,我們可以通過在Rancher中檢視Cluster -> Nodes的頁面驗證安裝是否成功。我們看到GPU Operator已經安裝了Node Feature Discovery (NFD)並且給我們的節點貼上了GPU使用的標籤。

總 結

之所以能夠採用如此簡單的方法就能夠讓Kubernetes與GPU一起執行,離不開這3個重要部分:

  1. NVIDIA的GPU Operator
  2. 來自Kubernetes同名SIG的Node Feature Discovery(NFD)。
  3. Rancher的叢集部署和catalog app整合

歡迎您根據本教程動手嘗試,也請繼續保持關注,在之後的教程中我們會嘗試將GPU引用至邊緣。