前言

Multi-Instance GPU(MIG)功能使 NVIDIA A100 GPU 可以安全地切割為多達七個用於 CUDA 應用的獨立 GPU 實例,從而為多個用戶提供獨立的 GPU 資源,以優化 GPU 的利用率。此功能對於 GPU 工作負載利用率低的特別有用,因此使用 MIG 技術,可在單張 GPU 上並行運行不同的工作負載以最大化利用率。

目前只有 NVIDIA Tesla A100 及 A30 擁有這個功能。


名詞解釋

  • GPU Engine : GPU Engine 是 GPU 上的工作引擎,如 copy engine (CE)、DMAs、NVDEC、NVENC 等等。
  • GPU Memory Slice : GPU Memory Slice 是 GPU 內存的最小單位,一張 GPU 的內存總共由 8 個 GPU Memory Slice 所組成。
  • GPU SM Slice : GPU SM Slice 是 GPU SM 的最小單位,一張 GPU 的 SM 總共由 7 個 GPU SM Slice 所組成。
  • GPU Slice : GPU Slice 是 GPU 的最小單位,它是由一個 GPU Memory Slice 和一個 GPU SM Slice 所組成。
  • GPU Instance (GI) : GPU Instance 是 GPU slices 和 GPU engine 的組合,GPU Instance 中會共享所有 GPU slices 和 GPU engine。其中每個 GPU Instance 可再進一步細分為 Compute Instance。
  • Compute Instance (CI) : Compute Instance 是其父類別 GPU Instance 的子集。

注意事項

  • MIG 模式只能在 CUDA 11 / R450 的 Linux 系統使用,目前驅動版本為 450.80.02
  • 在設定 MIG 時,使用者須擁有超級用戶的權限。
  • 一旦 GPU 為 MIG 模式,即可動態的設置 GPU,無須重啟。
  • 當 GPU 為 MIG 模式,不支援 graphics APIs,如 OpenGL, Vulkan 等等。
  • 當 GPU 為 MIG 模式,不支援 GPU to GPU P2P。
  • 當 GPU 為 MIG 模式,CUDA 應用程式會將 GPU Instance 中的 Compute Instance 視為單個 CUDA 設備。

安裝步驟

GPU 驅動安裝可參考此文章,請下載 450.80.02 或更新的版本。


MIG 設定

建立流程

啟用 MIG 模式

通常預設 MIG 模式是未啟用的狀態,首先要先指定 GPU 來啟用 MIG。

1
sudo nvidia-smi -i 0 -mig 1

查看 GI 可用組合

總共有五種模式可以選擇,其中 Instances 可查詢剩餘可切割的數量。

1
sudo nvidia-smi mig -i 0 -lgip

以 NVIDIA A100 40G 為例,最大利用率的排列組合如下圖,可根據需求做選擇。

在建立 GI 的順序很重要,建議由大建到小(如上圖須由左到右),以免發生記憶體破碎的問題。

建立 GI

假設我要建立兩個 3g.20gb 的 GI,建立指令可以用 NameID

1
2
3
4
# ID
sudo nvidia-smi mig -i 0 -cgi 9
# Name
sudo nvidia-smi mig -i 0 -cgi 3g.20gb

查詢已經建立的 GI

1
sudo nvidia-smi mig -i 0 -lgi

查看 CI 可用組合

指定 GI (GI Instance ID),來查詢其 CI 可用的組合,*為預設 CI。

1
sudo nvidia-smi mig -i 0 -gi 1 -lcip

建立 CI

假設我要建立兩個 1c.3g.20gb 的 GI,建立指令可以用 NameID

1
2
3
4
# ID
sudo nvidia-smi mig -i 0 -gi 0 -cci 1
# Name
sudo nvidia-smi mig -i 0 -gi 1 -cci 1c.3g.20gb

查詢已經建立的 CI (指定 GI)

1
sudo nvidia-smi mig -i 0 -gi 1 -lci

如果在建 GI 時,想要用預設的 CI,在建GI時加入 -C 參數即可。
GPU Driver > 450.80.02 才有此功能。

範例:

1
sudo nvidia-smi mig -i 0 -cgi 9 -C

移除流程

移除 CI

指定 GI 及 CI 來移除 CI。

1
sudo nvidia-smi mig -i 0 -gi 1 -ci 0,1 -dci

移除 GI

指定 GI 來移除 GI。

1
sudo nvidia-smi mig -i 0 -gi 1 -dgi

關閉 MIG 模式

1
sudo nvidia-smi -i 0 -mig 0

使用 MIG

假設目前 GPU MIG 切法如下,一個 2g.10gb、三個 1c.3g.20gb

可以用 GPU ID + MIG DEV IDUUID 來指派 MIG GPU

用 ID 來指派 GPU

ID 查詢如下圖,假設我要指派 GPU 0 上的 MIG DEV 1MIG DEV 3

1
sudo docker run -it --rm --gpus '"device=0:1,0:3"' nvcr.io/nvidia/tensorflow:20.11-tf2-py3 bash

查詢可用的 MIG GPU

用 UUID 來指派 GPU

UUID 查詢如下圖,假設我要指派 MIG-GPU-bc104fe1-14dd-ddc0-dae2-f13f99547443/2/2

1
nvidia-smi -L
1
sudo docker run -it --rm --gpus '"device=MIG-GPU-bc104fe1-14dd-ddc0-dae2-f13f99547443/2/2"' nvcr.io/nvidia/tensorflow:20.11-tf2-py3 bash

查詢可用的 MIG GPU

其他文章