

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon EKS 上管理 NVIDIA GPU 裝置
<a name="device-management-nvidia"></a>

NVIDIA GPUs 廣泛用於機器學習訓練、推論和高效能運算工作負載。Amazon EKS 支援兩種在 EKS 叢集中管理 NVIDIA GPU 裝置的機制：*GPUs 的 NVIDIA DRA 驅動程式*和 *NVIDIA Kubernetes 裝置外掛程式*。

建議在執行 Kubernetes 1.34 版或更新版本的叢集上使用 NVIDIA DRA 驅動程式，搭配 EKS 受管節點群組或自我管理節點群組進行新部署。NVIDIA DRA 驅動程式可在容器之間啟用靈活的 GPU 配置和 GPU 共用。

Karpenter 或 EKS Auto Mode 不支援 NVIDIA DRA 驅動程式。使用 [NVIDIA 裝置外掛程式](#nvidia-device-plugin)搭配 Karpenter 和 EKS Auto 模式。NVIDIA 裝置外掛程式仍然支援 EKS 受管節點群組和自我管理節點。

## NVIDIA DRA 驅動程式與 NVIDIA 裝置外掛程式
<a name="_nvidia_dra_driver_vs_nvidia_device_plugin"></a>


| 功能 | NVIDIA DRA 驅動程式 | NVIDIA 裝置外掛程式 | 
| --- | --- | --- | 
| 最低 Kubernetes 版本 | 1.34 | 所有 EKS 支援的 Kubernetes 版本 | 
| EKS 運算 | 受管節點群組、自我管理節點 | EKS Auto Mode、Karpenter、受管節點群組、自我管理節點 | 
| EKS 最佳化 AMIs | AL2023 (NVIDIA) | AL2023 (NVIDIA)、 Bottlerocket | 
| 裝置廣告 | 透過 GPU 模型、記憶體、驅動程式版本和拓撲等`ResourceSlice`物件的豐富屬性 | `nvidia.com/gpu` 延伸資源的整數計數 | 
| GPU 共用 | 相同 Pod 中的多個容器可以透過共用`ResourceClaim`參考共用 GPU | 不支援。每個 GPU 只會配置給一個容器。 | 
| ComputeDomains | 透過 `ComputeDomain` 資源管理多節點 NVLink (MNNVL)，以進行安全的多節點 GPU 通訊 | 不支援 | 
| 以屬性為基礎的選擇 | 使用 CEL 表達式，依模型、記憶體或其他屬性篩選 GPUs  | 不支援 | 
| 拓撲感知 EFA 配置 | DRA 原生拓撲感知 | 自動拓撲感知 （僅限 EKS 最佳化 AL2023 AMIs) | 

## 安裝 NVIDIA DRA 驅動程式
<a name="nvidia-dra-driver"></a>

適用於 GPUs 的 NVIDIA DRA 驅動程式可管理兩種類型的資源：GPUs 和 ComputeDomains。它執行兩個 DRA kubelet 外掛程式： `gpu-kubelet-plugin`和 `compute-domain-kubelet-plugin`。每個 都可以在安裝期間分別啟用或停用。本指南著重於 GPU 配置。如需使用 ComputeDomains 的詳細資訊，請參閱 [搭配 Amazon EKS 使用 P6e-GB200 UltraServers](ml-eks-nvidia-ultraserver.md)。

### 先決條件
<a name="_prerequisites"></a>
+ 使用 EKS 受管節點群組或自我管理節點群組執行 Kubernetes 1.34 版或更新版本的 Amazon EKS 叢集。
+ 具有 NVIDIA GPU 執行個體類型的節點 （例如 `P`或 `G`執行個體）。
+ 針對 NVIDIA GPUs 安裝主機層級元件的節點。使用 EKS 最佳化 AL2023 或 Bottlerocket NVIDIA AMIs 時，會預先安裝主機層級 NVIDIA 驅動程式、CUDA 使用者模式驅動程式和容器工具組。
+ 已在命令列環境中安裝 Helm，如需詳細資訊，請參閱[安裝 Helm 說明](helm.md)。
+  `kubectl` 設定為與您的叢集通訊，[安裝或更新 `kubectl`](install-kubectl.md#kubectl-install-update)如需詳細資訊，請參閱 。

### 程序
<a name="_procedure"></a>

**重要**  
使用 NVIDIA DRA 驅動程式進行 GPU 裝置管理時，無法與相同節點上的 NVIDIA 裝置外掛程式一起部署。如需更新，請參閱上游 Kubernetes [KEP-5004](https://github.com/kubernetes/enhancements/issues/5004)。

**重要**  
目前不支援搭配 Bottlerocket 使用 NVIDIA DRA 驅動程式。

1. 新增 NVIDIA DRA 驅動程式 Helm Chart 儲存庫。

   ```
   helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
   ```

1. 更新本機 Helm 儲存庫。

   ```
   helm repo update
   ```

1. 取得最新版本的 NVIDIA DRA 驅動程式。

   ```
   helm search repo nvidia/nvidia-dra
   ```

1. 安裝 NVIDIA DRA 驅動程式。

   ```
   helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
       --create-namespace \
       --namespace nvidia-dra-driver-gpu \
       --set resources.computeDomains.enabled=false \
       --set 'gpuResourcesEnabledOverride=true'
   ```

   如需進階組態選項，請參閱 [NVIDIA DRA 驅動程式 Helm Chart](https://github.com/kubernetes-sigs/nvidia-dra-driver-gpu/blob/main/deployments/helm/nvidia-dra-driver-gpu/values.yaml)。

1. 確認 DRA 驅動程式 Pod 正在執行。

   ```
   kubectl get pods -n nvidia-dra-driver-gpu
   ```

1. 確認`DeviceClass`物件已建立。

   ```
   kubectl get deviceclass
   ```

   ```
   NAME            AGE
   gpu.nvidia.com  60s
   ```

1. 確認已為您的 GPU 節點發佈`ResourceSlice`物件。

   ```
   kubectl get resourceslice
   ```

   若要使用 DRA 驅動程式請求 NVIDIA GPUs，請建立參考 `ResourceClaimTemplate`的 ，`gpu.nvidia.com``DeviceClass`並在 Pod 規格中參考它。下列範例會請求單一 GPU。[拓撲感知 EFA 和 GPU/Neuron 裝置配置](device-management-efa.md#efa-dra-topology-aware) 如需使用拓撲對齊 EFA 介面配置 NVIDIA GPUs 的步驟，請參閱 。

   ```
   apiVersion: resource.k8s.io/v1
   kind: ResourceClaimTemplate
   metadata:
     name: single-gpu
   spec:
     spec:
       devices:
         requests:
         - name: gpu
           exactly:
             deviceClassName: gpu.nvidia.com
             count: 1
   ---
   apiVersion: v1
   kind: Pod
   metadata:
     name: gpu-workload
   spec:
     containers:
     - name: app
       ...
       resources:
         claims:
         - name: gpu
     resourceClaims:
     - name: gpu
       resourceClaimTemplateName: single-gpu
     tolerations:
     - key: "nvidia.com/gpu"
       operator: "Exists"
       effect: "NoSchedule"
   ```

## 安裝 NVIDIA Kubernetes 裝置外掛程式
<a name="nvidia-device-plugin"></a>

NVIDIA Kubernetes 裝置外掛程式會將 NVIDIA GPUs 公告為`nvidia.com/gpu`延伸資源。您可以在容器資源請求和限制中請求 GPUs。

### 先決條件
<a name="_prerequisites_2"></a>
+ Amazon EKS 叢集。
+ 使用 EKS 最佳化 AL2023 NVIDIA AMI 搭配 NVIDIA GPU 執行個體類型的節點。EKS 最佳化 Bottlerocket AMIs 包含 NVIDIA 裝置外掛程式，不需要個別安裝。
+ 已在命令列環境中安裝 Helm，如需詳細資訊，請參閱[安裝 Helm 說明](helm.md)。
+  `kubectl` 設定為與您的叢集通訊，[安裝或更新 `kubectl`](install-kubectl.md#kubectl-install-update)如需詳細資訊，請參閱 。

### 程序
<a name="_procedure_2"></a>

1. 新增 NVIDIA 裝置外掛程式 Helm Chart 儲存庫。

   ```
   helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
   ```

1. 更新本機 Helm 儲存庫。

   ```
   helm repo update
   ```

1. 安裝 NVIDIA Kubernetes 裝置外掛程式。

   ```
   helm install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true
   ```
**在具有 EFA 裝置的節點上停用 MOFED**  
從 `k8s-device-plugin` v0.19.0 開始， `--mofed-enabled`旗標預設為 `true`。這會導致 NVIDIA 裝置外掛程式將所有`/dev/infiniband/uverbs*`裝置掛載到請求 GPUs 的容器 (`nvidia.com/gpu`)。這與 AWS EFA 裝置外掛程式衝突，它會管理`uverbs`裝置的掛載。節點上請求少於所有 EFA 裝置的工作負載會受到影響，因為 NVIDIA 裝置外掛程式預設會宣告所有`uverbs`裝置。  
如果您的節點有 EFA 裝置，請在安裝 NVIDIA 裝置外掛程式時明確停用 MOFED：  

   ```
   helm upgrade --install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true \
       --set mofedEnabled=false
   ```
如果您透過 NVIDIA [GPU Operator](https://github.com/NVIDIA/gpu-operator) 管理 NVIDIA 裝置外掛程式，請使用 `devicePlugin.env` 欄位停用 MOFED：  

   ```
   helm upgrade --install gpu-operator nvidia/gpu-operator \
       --namespace gpu-operator \
       --set 'devicePlugin.env[0].name=MOFED_ENABLED' \
       --set 'devicePlugin.env[0].value=false'
   ```
如需詳細資訊，請參閱 [NVIDIA k8s-device-plugin 問題 \#1692](https://github.com/NVIDIA/k8s-device-plugin/issues/1692)。
**注意**  
您也可以使用 NVIDIA [GPU Operator](https://github.com/NVIDIA/gpu-operator) 安裝和管理 NVIDIA Kubernetes 裝置外掛程式，這會自動管理佈建 GPUs 所需的所有 NVIDIA 軟體元件。

1. 驗證 NVIDIA 裝置外掛程式 DaemonSet 正在執行。

   ```
   kubectl get ds -n nvidia nvdp-nvidia-device-plugin
   ```

   ```
   NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   nvdp-nvidia-device-plugin   2         2         2       2            2           <none>          60s
   ```

1. 確認您的節點具有可配置的 GPUs。

   ```
   kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
   ```

   範例輸出如下。

   ```
   NAME                                           GPU
   ip-192-168-11-225.us-west-2.compute.internal   1
   ip-192-168-24-96.us-west-2.compute.internal    1
   ```

### 在 Pod 中請求 NVIDIA GPUs
<a name="_request_nvidia_gpus_in_a_pod"></a>

若要使用裝置外掛程式請求 NVIDIA GPUs，請在容器`nvidia.com/gpu`資源請求和限制中指定資源。

```
apiVersion: v1
kind: Pod
metadata:
  name: nvidia-smi
spec:
  restartPolicy: OnFailure
  containers:
  - name: gpu-demo
    image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
    command: ["/bin/sh", "-c"]
    args: ["nvidia-smi && tail -f /dev/null"]
    resources:
      limits:
        nvidia.com/gpu: 1
      requests:
        nvidia.com/gpu: 1
  tolerations:
  - key: "nvidia.com/gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"
```

若要執行此測試，請套用資訊清單並檢視日誌：

```
kubectl apply -f nvidia-smi.yaml
kubectl logs nvidia-smi
```

範例輸出如下。

```
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI XXX.XXX.XX            Driver Version: XXX.XXX.XX     CUDA Version: XX.X      |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA L4                      On  |   00000000:31:00.0 Off |                    0 |
| N/A   27C    P8             11W /   72W |       0MiB /  23034MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

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