GPU

Kubernetes 支持容器請求 GPU 資源(目前僅支持 NVIDIA GPU),在深度學習等場景中有大量應用。

使用方法

Kubernetes v1.8 及更新版本

從 Kubernetes v1.8 開始,GPU 開始以 DevicePlugin 的形式實現。在使用之前需要配置

  • kubelet/kube-apiserver/kube-controller-manager: --feature-gates="DevicePlugins=true"

  • 在所有的 Node 上安裝 Nvidia 驅動,包括 NVIDIA Cuda Toolkit 和 cuDNN 等

  • Kubelet 配置使用 docker 容器引擎(默認就是 docker),其他容器引擎暫不支持該特性

NVIDIA 插件

NVIDIA 需要 nvidia-docker。

安裝 nvidia-docker:

# Install docker-ce
curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker

# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container.list | \
         sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
         sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

# Test nvidia-smi with the latest official CUDA image
sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

部署 NVDIA 設備插件

GCE/GKE GPU 插件

該插件不需要 nvidia-docker,並且也支持 CRI 容器運行時。

NVIDIA GPU Operator

Nvidia GPU Operator 是一個 Kubernetes Operator,用於在 Kubernetes 集群中部署和管理 Nvidia GPU。

請求 nvidia.com/gpu 資源示例

Kubernetes v1.6 和 v1.7

alpha.kubernetes.io/nvidia-gpu 已在 v1.10 中刪除,新版本請使用 nvidia.com/gpu

在 Kubernetes v1.6 和 v1.7 中使用 GPU 需要預先配置

  • 在所有的 Node 上安裝 Nvidia 驅動,包括 NVIDIA Cuda Toolkit 和 cuDNN 等

  • 在 apiserver 和 kubelet 上開啓 --feature-gates="Accelerators=true"

  • Kubelet 配置使用 docker 容器引擎(默認就是 docker),其他容器引擎暫不支持該特性

使用資源名 alpha.kubernetes.io/nvidia-gpu 指定請求 GPU 的個數,如

注意

  • GPU 資源必須在 resources.limits 中請求,resources.requests 中無效

  • 容器可以請求 1 個或多個 GPU,不能只請求一部分

  • 多個容器之間不能共享 GPU

  • 默認假設所有 Node 安裝了相同型號的 GPU

多種型號的 GPU

如果集群 Node 中安裝了多種型號的 GPU,則可以使用 Node Affinity 來調度 Pod 到指定 GPU 型號的 Node 上。

首先,在集群初始化時,需要給 Node 打上 GPU 型號的標籤

然後,在創建 Pod 時設置 Node Affinity:

使用 CUDA 庫

NVIDIA Cuda Toolkit 和 cuDNN 等需要預先安裝在所有 Node 上。爲了訪問 /usr/lib/nvidia-375,需要將 CUDA 庫以 hostPath volume 的形式傳給容器:

附錄:CUDA 安裝方法

安裝 CUDA:

安裝 cuDNN:

首先到網站 https://developer.nvidia.com/cudnn 註冊,並下載 cuDNN v5.1,然後運行命令安裝

安裝完成後,可以運行 nvidia-smi 查看 GPU 設備的狀態

參考文檔

Last updated