天天看點

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

介紹

在GTC 2020(5月14日)大會上英偉達新一代架構“Ampere”(安培)正式亮相。繼資料中心Volta GPU推出三年後終于亮劍。Ampere以資料中心GPU A100的形式首次亮相,專為科學計算,雲圖形和資料分析而建構。

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

TensorCore

A100 GPU 包括19.5 teraflops的FP32計算力,6912個FP32 CUDA Core,評價每個SM上64個,40GB記憶體。在性能上相比V100有較大的提升,裝載了第三代TensorCore,在HPC和深度學習場景的稀疏矩陣,吞吐是V100的2倍。

  • 第三代TensorCore 加速支援 FP16, BF16, TF32, FP64, INT8, INT4, 和 Binary 等資料類型
  • 支援更多精度的選擇,TF32 計算可以加速深度學習和HPC 應用中的FP32的輸入和輸出,速度是V100的FP32 FMA 10倍, 稀疏矩陣下20倍。
  • FP16 / FP32 混合精度的深度學習任務, 速度是V100的2.5倍, 稀疏矩陣下5倍
  • INT8 比 V100 INT8 快20倍
  • HPC FP64處理比V100 快2.5倍
如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化
如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

MIG

第二個重要特性就是Mig(Multi-Instance GPU)虛拟化技術和GPU分區能力。無需額外費用即可提供多達7倍的GPU執行個體。

MIG 特性可以将每個 A100 劃分為多達 7 個 GPU 執行個體以實作最佳使用率,有效地擴充了對每個使用者和應用程式的通路。

新 MIG 功能可以将單個 GPU 劃分為多個GPU分區,每個GPU執行個體分區的SMs在整個記憶體系統中都有獨立的獨立路徑—— 片上交叉條端口、二級緩存庫、記憶體控制器和 DRAM 位址總線都是唯一配置設定給單個執行個體的。這確定了單個使用者的工作負載,即時執行個體的二級緩存和DRAM負載非常高,也不會對其他分區造成影響,為每個GPU分區執行個體提供了QOS(服務保證),提供故障隔離。

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

加速的 GPU 執行個體隻能在完全實體 GPU 粒度下用于不同組織的使用者,即使使用者應用程式不需要完整的 GPU 。

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

具有 MIG 圖的 CSP 多使用者。來自同一個或不同組織的多個獨立使用者可以在一個實體 GPU 内配置設定他們自己的專用、受保護和隔離的 GPU 執行個體。

Kubernetes 上使用MIG

容器服務ACK提供納管MIG GPU執行個體的功能,在控制台上可以一鍵購買或者添加帶有A100 的GPU執行個體, 并納管到Kubernetes中。

建立執行個體

在控制台上建立一個ACK叢集,選擇建立節點池,在節點池配置中選擇

ecs.ebmgn7.26xlarge

  規格,設定節點數量,并确認。

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

建立完成後,可以在節點池清單檢視到節點池中的執行個體。

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

配置MIG

檢視GPU 資訊

登陸上ECS 執行個體,檢視GPU 資訊。 可以檢視到執行個體上有8個A100 GPU執行個體,每個GPU是獨立完整運作,未開啟MIG。

如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

檢視支援Mig的規格

執行指令可以指定一個A100 執行個體檢視可分區的規格

nvidia-smi mig -i 0 -lgip           
如何通過ACK 納管Nvidia A100 GPU執行個體,實作資源池化

可以看到,節點上id 為0 的這個A100 GPU執行個體,支援5個分區規格,分别是

1g.5gb

 /

2g.10gb

3g.20gb

4g.20gb

7g.40gb

  ,分别代表不同的顯存大小,由于大小不同,一個GPU能支援的分區數量也不同。

根據第二列的id 可以知道每個規格的辨別,在執行分區時會用到。

執行MIG 分區

我們指定上圖中的執行指令

# nvidia-smi mig -i 0 -cgi 9,14,19,19
Successfully created GPU instance ID  2 on GPU  0 using profile MIG 3g.20gb (ID  9)
Successfully created GPU instance ID  3 on GPU  0 using profile MIG 2g.10gb (ID 14)
Successfully created GPU instance ID  9 on GPU  0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 10 on GPU  0 using profile MIG 1g.5gb (ID 19)

nvidia-smi mig -i 0 -cci
Successfully created compute instance ID  0 on GPU  0 GPU instance ID  9 using profile MIG 1g.5gb (ID  0)
Successfully created compute instance ID  0 on GPU  0 GPU instance ID 10 using profile MIG 1g.5gb (ID  0)
Successfully created compute instance ID  0 on GPU  0 GPU instance ID  3 using profile MIG 2g.10gb (ID  1)
Successfully created compute instance ID  0 on GPU  0 GPU instance ID  2 using profile MIG 3g.20gb (ID  2)           

上述指令會将 0号GPU 做MIG 分區,虛為4塊GPU,分别是一個編号9 (3g.20gb), 一個14 (2g.10gb),2個19 (1g.5gb) 。

檢視分區

完成MIG分區後,執行

nvidia-smi

  即可看到MIG 執行個體。

nvidia-smi           

在MIG device 這一欄中可以看到MIG執行個體資訊:

+-----------------------------------------------------------------------------+
| MIG devices:                                                                |
+------------------+----------------------+-----------+-----------------------+
| GPU  GI  CI  MIG |         Memory-Usage |        Vol|         Shared        |
|      ID  ID  Dev |           BAR1-Usage | SM     Unc| CE  ENC  DEC  OFA  JPG|
|                  |                      |        ECC|                       |
|==================+======================+===========+=======================|
|  0    2   0   0  |     11MiB / 20096MiB | 42      0 |  3   0    2    0    0 |
|                  |      0MiB / 32767MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+
|  0    3   0   1  |      7MiB /  9984MiB | 28      0 |  2   0    1    0    0 |
|                  |      0MiB / 16383MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+
|  0    9   0   2  |      3MiB /  4864MiB | 14      0 |  1   0    0    0    0 |
|                  |      0MiB /  8191MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+
|  0   10   0   3  |      3MiB /  4864MiB | 14      0 |  1   0    0    0    0 |
|                  |      0MiB /  8191MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+           

根據這個方法,可以将機器上所有GPU 的MIG 做好劃分。

重新開機Device Plugin

當給節點上所有GPU做完MIG配置後,更新節點上的GPUDevicePlugin, 将mig政策打開

sed -i 's/"--pass-device-specs"/"--pass-device-specs", "--mig-strategy=mixed"/g' /etc/kubernetes/manifests/nvidia-device-plugin.yml           

DevicePlugin 正常運作後可以看到節點上注冊了MIG 執行個體對應的資源:

kubectl describe node <your node>

Capacity:
 cpu:                     104
 ephemeral-storage:       123722704Ki
 hugepages-1Gi:           0
 hugepages-2Mi:           0
 memory:                  791733364Ki
 nvidia.com/gpu:          0
 nvidia.com/mig-1g.5gb:   16
 nvidia.com/mig-2g.10gb:  8
 nvidia.com/mig-3g.20gb:  8           

部署應用

部署應用,聲明使用

mig-2g.10gb

 型号的GPU

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: smi
spec:
  restartPolicy: OnFailure
  containers:
  - name: nvidia-smi
    command:
    - nvidia-smi 
    - -L
    image: nvidia/cuda:9.0-base
    resources:
      limits:
        nvidia.com/mig-2g.10gb: 1
      requests:
        nvidia.com/mig-2g.10gb: 1
EOF           

檢視日志

# kubectl logs smi
GPU 0: A100-SXM4-40GB (UUID: GPU-7780f282-99a1-7024-f7a4-65a55230ed76)
  MIG 2g.10gb Device 0: (UUID: MIG-GPU-7780f282-99a1-7024-f7a4-65a55230ed76/3/0)           

總結

相比上代Volta架構的V100,A100 的INT8推理、FP32訓練性能提升20倍,FP64計算性能提升2.5倍,是曆史上進步最大的一次,是NVIDIA GPU 計算一個巨大的飛躍。 A100 中創新提出MIG 多GPU分區技術,能在保障QoS 和隔離的情況下将一塊GPU切分成不同大小的GPU執行個體,利用MIG功能能夠将我們的GPU變成一個靈活的資源池,根據使用情況動态配置設定GPU分區。

目前Kubernetes 使用MIG 的方式需要使用者在機器上手動執行MIG 分區,後續ACK團隊也會持續關注探索,緊跟使用者需求,提供使用者更友好地GPU池化能力。