1. 程式人生 > 其它 >在 Kubernetes 叢集中啟動 GPU 節點

在 Kubernetes 叢集中啟動 GPU 節點

參考文章:

本文目的是執行在叢集中的POD使用節點上的GPU資源。Kubernetes 實現了裝置外掛(Device Plugins) 以允許 Pod 訪問類似 GPU 這類特殊的硬體功能特性。我們需要在 GPU 節點上安裝來自對應硬體廠商的 GPU 驅動程式,並執行來自 GPU 廠商的對應的裝置外掛。

實驗環境

                          ./+o+-       ubuntu@netlab-529-GPU1
                  yyyyy- -yyyyyy+      OS: Ubuntu 18.04 bionic
               ://+//////-yyyyyyo      Kernel: x86_64 Linux 5.4.0-81-generic
           .++ .:/++++++/-.+sss/`      Uptime: 1d 18h 16m
         .:++o:  /++++++++/:--:/-      Packages: 1655
        o:+o+:++.`..```.-/oo+++++/     Shell: bash 4.4.20
       .:+o:+o/.          `+sssoo+/    Resolution: 1536x864
  .++/+:+oo+o:`             /sssooo.   DE: GNOME
 /+++//+:`oo+o               /::--:.   WM: Not Found
 \+/+o+++`o++o               ++////.   GTK Theme: Adwaita [GTK2/3]
  .++.o+++oo+:`             /dddhhh.   Icon Theme: Adwaita
       .+.o+oo:.          `oddhhhh+    Font: Cantarell 11
        \+.++o+o``-````.:ohdhhhhh+     CPU: 11th Gen Intel Core i7-11700KF @ 16x 4.9GHz [27.8°C]
         `:o+++ `ohhhhhhhhyo++os:      GPU: NVIDIA GeForce RTX 3080 Ti
           .o:`.syhhhhhhh/.oo++o`      RAM: 2143MiB / 47934MiB
               /osyyyyyyo++ooo+++/
                   ````` +oo+++o\:
                          `oo++.
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+

安裝裝置外掛

目前 kubernetes 叢集支援 Nvidia 和 AMD 兩個廠商的顯示卡。本文環境使用的是 Nvidia 顯示卡,所以在此介紹安裝 Nvidia 裝置外掛。

安裝 Nvidia 裝置外掛的前提條件

官方的 NVIDIA GPU 裝置外掛 有以下要求:

  • Kubernetes 的節點必須預先安裝了 NVIDIA 驅動
  • Kubernetes 的節點必須預先安裝 nvidia-docker 2.0
  • Docker 的預設執行時必須設定為 nvidia-container-runtime,而不是 runc
  • NVIDIA 驅動版本 ~= 384.81

Docker 的預設執行時設定示例, 確保在docker配置檔案中(/etc/docker/daemon.json

)中存在以下片段:

{
   "default-runtime": "nvidia",
   "runtimes": {
       "nvidia": {
           "path": "/usr/bin/nvidia-container-runtime",
           "runtimeArgs": []
       }
   }
}

如果叢集已經啟動並且滿足上述要求,則可以部署 NVIDIA 裝置外掛,部署命令如下:

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml

安裝完成後的變化

安裝裝置外掛後,Kubernetes 將暴露 nvidia.com/gpu 為可排程的資源。

可以通過請求 nvidia.com/gpu 資源來使用 GPU 裝置,就像申請 CPU 和記憶體資源一樣。 不過,申請 GPU 資源還是有一些限制:

  • GPUs 只能設定在 limits 部分
    • 可以指定 GPU 的 limits 而不能指定 requests,Kubernetes 將使用限制值作為預設的請求值
    • 可以同時指定 limits 和 requests,不過這兩個值必須相等
    • 不可以僅指定 requests 而不指定 limits
  • 容器(以及 Pod)之間是不共享 GPU 的。GPU 也不可以過量分配(Overcommitting)。
  • 每個容器可以請求一個或者多個 GPU,但是用小數值來請求部分 GPU 是不允許的

部署示例

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU

注意

目前k8s只支援卡級別的排程,並且顯示卡資源是獨佔,無法在多個容器之間分享,這一點在使用過程中需要特別注意。