在Docker和MicroK8s中嘗試使用多實例GPU(Multi-Instance GPU)

產品開發


NVIDIA 的 GPU 中,H100、A100 和 A30 都實現了稱為「多實例 GPU」(以下簡稱 MIG)的功能。以往,您需要使用專用軟體將一個 GPU 顯示為多個 GPU,以便在相應的應用程式中使用。但是在前述的這些 GPU 中,您無需額外的軟體,即可在多個實例中使用 GPU。

MIG 在 Docker 中的使用 環境設置 要在 Docker 中使用 MIG,首先需要在作業系統上安裝 Docker Engine。對於 Ubuntu,可以按照以下頁面中的步驟進行操作:

https://docs.docker.com/engine/install/ubuntu/ 之後,安裝 NVIDIA 驅動程序和 NVIDIA Container Toolkit。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html 當前版本的 NVIDIA Container Toolkit 不僅適用於 Docker,還支持 containerd 和 Podman 等。按照步驟導入 NVIDIA Container Toolkit 軟體包存儲庫和 GPG 金鑰後,執行安裝:

bash
$ sudo apt-get update $ sudo apt-get install -y nvidia-container-toolkit 

接下來,執行以下命令進行配置,以在運行時使用 NVIDIA GPU:

bash
$ sudo nvidia-ctk runtime configure --runtime=docker $ sudo systemctl restart docker 

這樣,通常情況下,您就可以在容器中使用 GPU 了:

bash
$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.0.0-base-ubuntu20.04 nvidia-smi 

啟用 MIG 在支援 MIG 的 GPU 上,執行以下命令,即可在該環境中啟用 MIG:

bash
$ sudo nvidia-smi -i 0 -mig 1 Enabled MIG Mode for GPU 00000000:C1:00.0 All done

然後,根據 MIG 的配置文件將 GPU 資源分割開來。您可以使用命令nvidia-smi mig -lgip來查看可用的配置文件和剩餘資源。根據目前的環境,似乎最多可以切分成 7 個實例。此次的環境中只有一張 NVIDIA A100 GPU,所以只輸出了 GPU 0 的信息。如果有多張卡的話,會顯示所有卡的信息。

接下來,根據配置文件分割 GPU 資源。配置文件的指定方式如下:

  • Profile ID(例如 9、14、5)
  • 配置文件的短名稱(例如 3g.20gb)
  • 實例的完整配置文件名稱(例如 MIG 3g.20gb)

例如,執行以下命令,即可創建 3 個 MIG。根據此配置文件,最多可以分割成 3 個實例:

bash
sudo nvidia-smi mig -cgi 2g.20gb -C 

創建的 MIG 可以通過以下命令全部刪除:

bash
$ sudo nvidia-smi mig -dci && sudo nvidia-smi mig -dgi 

分割後的 GPU 可以通過以下方式查看設備:

bash
$ nvidia-smi -L GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-69198b81-f419-f843-4449-eeb123f2912f) MIG 3g.40gb Device 0: (UUID: MIG-ea2c8e7c-5712-570e-9416-bf0eda652588) MIG 3g.40gb Device 1: (UUID: MIG-0f0e3e49-8f71-5345-8a33-7c2ef0ff6bf5) 

然後,只需在執行 Docker run 命令時指定 UUID:

bash
sudo docker run --runtime=nvidia \ -e NVIDIA_VISIBLE_DEVICES=MIG-ea2c8e7c-5712-570e-9416-bf0eda652588 \ nvidia/cuda:12.0.0-base-ubuntu20.04 nvidia-smi 

MIG 在 MicroK8s 中的使用 在 MicroK8s 中使用 MIG 相當簡單。首先,按照以下步驟安裝 MicroK8s:

bash
$ sudo snap install microk8s --classic --channel=1.26/stable $ sudo microk8s.start $ sudo usermod -a -G microk8s $USER $ sudo snap alias microk8s.kubectl kubectl 

然後,根據需要安裝 GPU 插件和其他必要的插件:

bash
$ sudo microk8s enable gpu registry hostpath-storage 

如果安裝了 nvidia-mig-manager,您可以通過 Kubernetes API 對 MIG 進行配置:

bash
$ kubectl get pod -A -lapp=nvidia-mig-manager NAMESPACE NAME READY STATUS RESTARTS AGE gpu-operator-resources nvidia-mig-manager-wxbh2 1/1 Running 0 20s 

例如,執行以下命令,即可使用 kubectl 對 MIG 進行配置:

bash
$ kubectl label nodes shachi nvidia.com/mig.config=all-3g.40gb --overwrite node/shachi labeled 

接下來,使用如下清單創建 Pod。雖然可以通過 nvidia.com/gpu 指定 GPU 數量,但由於啟用了 MIG,因此分割

的數目將成為最大值。在此示例中,我們將其分割成 2 個實例:

yaml
apiVersion: v1 kind: Pod metadаta: name: cuda-vector-add spec: restartPolicy: OnFailure containers: - name: cuda-vector-add image: "k8s.gcr.io/cuda-vector-add:v0.1" resources: limits: nvidia.com/gpu: 2 

執行該命令後,將創建 Pod 並進行處理。檢查日誌,您可以確認應用程式是否已成功執行:

bash
$ kubectl logs cuda-vector-add [Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done 

將 nvidia.com/gpu 設定為 3,然後執行時,由於環境不滿足 GPU 要求,將會處於待命狀態(Pending),並記錄以下類型的事件:

text
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 11s default-scheduler 0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.. 

與 CPU 不同,GPU 具有許多核心。關於內存,由於將 GPU 上的內存均等分割,因此分配給分割後資源的內存取決於晶片上的內存大小。

在應用程式開發等方面,MIG 能夠在多個應用程式中使用 GPU,這是一個非常實用的功能。


從 GT-ONE 到 Dshot 更新的賽車方向盤支架到 PS5
從 GT-ONE 到 Dshot 更新的賽車方向盤支架到 PS5