

 **協助改進此頁面** 

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

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

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

# 在 Amazon EKS 上使用 NVIDIA DRA 驅動程式或裝置外掛程式
<a name="device-management-nvidia-dra-device-plugin"></a>

Amazon EKS 支援兩種在 EKS 叢集中管理 NVIDIA GPU 裝置的機制：*GPUs 的 NVIDIA DRA 驅動程式*和 *NVIDIA Kubernetes 裝置外掛程式*。

在 Karpenter、EKS 受管節點群組或自我管理節點中使用[靜態容量佈建](https://karpenter.sh/docs/concepts/nodepools/#static-nodepool)時，建議使用 NVIDIA DRA 驅動程式搭配 Kubernetes 1.34 版及更新版本進行新部署。EKS Auto Mode 目前不支援 NVIDIA DRA 驅動程式。使用動態容量佈建時，搭配 EKS Auto 模式或 Karpenter 使用 [NVIDIA 裝置外掛程式](#eks-nvidia-device-plugin)。NVIDIA 裝置外掛程式仍然支援 EKS 受管節點群組和自我管理節點。

如果您使用多執行個體 GPUs (MIG) 或時間分割等 GPU 共用功能，建議您搭配 DRA 驅動程式使用靜態組態，或使用 NVIDIA 裝置外掛程式。動態 MIG 和時間分割在 NVIDIA DRA 驅動程式中處於 Alpha 狀態。如需最新更新，請參閱 GitHub 上的 [NVIDIA DRA 驅動程式版本](https://github.com/kubernetes-sigs/dra-driver-nvidia-gpu/releases)。

## NVIDIA DRA 驅動程式與 NVIDIA 裝置外掛程式
<a name="eks-nvidia-dra-vs-plugin"></a>


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

## 安裝 NVIDIA DRA 驅動程式
<a name="eks-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>
+ 執行 Kubernetes 1.34 版或更新版本的 Amazon EKS 叢集，具有由 Karpenter、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 裝置外掛程式一起部署在同一個節點上。這樣做可能會導致基礎裝置的靜音過度訂閱到相同節點上的多個 Pod。

**在 Bottlerocket 上停用內建 NVIDIA 裝置外掛程式**  
EKS 最佳化 Bottlerocket NVIDIA 變體包含 NVIDIA 裝置外掛程式，並預設啟用它。DRA 驅動程式無法與相同節點上的裝置外掛程式一起執行。使用 DRA 驅動程式之前，請先停用 Bottlerocket GPU 節點上的內建裝置外掛程式。Bottlerocket 節點使用者資料`false`中的 `settings.kubelet-device-plugins.nvidia.enabled`設定為 。  

```
[settings.kubelet-device-plugins.nvidia]
enabled = false
```
此`settings.kubelet-device-plugins.nvidia.enabled`設定可在 Bottlerocket 1.63.0 版及更新版本中使用。在舊版上，無法停用內建 NVIDIA 裝置外掛程式。如需詳細資訊，請參閱 GitHub 上的 [bottlerocket-os/bottlerocket pull request \#4856](https://github.com/bottlerocket-os/bottlerocket/pull/4856)。

1. 直接從 Kubernetes SIG OCI 登錄檔安裝 NVIDIA DRA 驅動程式。若要尋找可用的版本，請參閱 GitHub 上的 [NVIDIA DRA 驅動程式版本](https://github.com/kubernetes-sigs/dra-driver-nvidia-gpu/releases)。

   ```
   helm install dra-driver-nvidia-gpu \
       oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu \
       --version {{0.4.1}} \
       --create-namespace \
       --namespace nvidia \
       --set resources.computeDomains.enabled=false \
       --set gpuResourcesEnabledOverride=true
   ```

   如需進階組態選項，請參閱 Kubernetes SIG 網站上的 [NVIDIA DRA 驅動程式 Helm Chart 值](https://dra-driver-nvidia-gpu.sigs.k8s.io/docs/reference/helm-values/)。若要查看特定圖表版本的可用值，請執行 `helm show values oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu --version 0.4.1`。

1. （選用） 若要透過 DRA 驅動程式使用時間分割，請在上一個步驟中將`TimeSlicingSettings`功能閘道新增至`helm install`命令。這是預設停用的 Alpha 功能。如需詳細資訊，請參閱[搭配 NVIDIA DRA 驅動程式使用 GPU 時間分割](device-management-nvidia-time-slicing.md#eks-time-slicing-dra)。

   ```
   --set featureGates.TimeSlicingSettings=true
   ```

1. （選用） 若要透過 DRA 驅動程式使用動態 MIG，請在上一個步驟中將`DynamicMIG`功能閘道新增至`helm install`命令。這是預設停用的 Alpha 功能。您無法將`DynamicMIG`功能閘道與 `PassthroughSupport`、 `NVMLDeviceHealthCheck`或`MPSSupport`功能閘道結合。如需詳細資訊，請參閱[搭配 NVIDIA DRA 驅動程式使用 MIG](device-management-nvidia-mig.md#eks-mig-dra-driver)。

   ```
   --set featureGates.DynamicMIG=true
   ```

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

   ```
   kubectl get pods -n nvidia
   ```

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: gpu-demo
       image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
       command: ["/bin/sh", "-c"]
       args: ["nvidia-smi && tail -f /dev/null"]
       resources:
         claims:
         - name: gpu
     resourceClaims:
     - name: gpu
       resourceClaimTemplateName: single-gpu
     tolerations:
     - key: "nvidia.com/gpu"
       operator: "Exists"
       effect: "NoSchedule"
   ```

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

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

### 先決條件
<a name="_prerequisites_2"></a>
+ Amazon EKS 叢集。
+ 具有 NVIDIA GPU 執行個體類型的節點 （例如 `P`或 `G`執行個體）。
+ 使用 EKS 最佳化 AL2023 NVIDIA AMI 搭配 NVIDIA GPU 執行個體類型的節點。EKS 最佳化 Bottlerocket AMIs包含 NVIDIA 裝置外掛程式。您不需要單獨安裝。
+ 針對 NVIDIA GPUs 安裝主機層級元件的節點。使用 EKS 最佳化 AL2023 或 Bottlerocket NVIDIA AMIs 時，會預先安裝主機層級 NVIDIA 驅動程式、CUDA 使用者模式驅動程式和容器工具組。
+ 已在命令列環境中安裝 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 \
       --create-namespace \
       --namespace nvidia
   ```
**選用：啟用 GPU 功能探索 (GFD)**  
裝置外掛程式會公告`nvidia.com/gpu`擴充的資源，並自行排程 GPU Pod。在 EKS 最佳化 AL2023 NVIDIA AMI 上，`nvidia.com/gpu.present=true`節點標籤已由 於開機時套用`nodeadm`，因此基本 GPU 排程不需要 GPU 功能探索 (GFD)。  
`--set gfd.enabled=true` 如果您想要以詳細 GPU 屬性標記節點，例如 `nvidia.com/gpu.product`、`nvidia.com/gpu.memory`、`nvidia.com/gpu.count`、MIG 設定檔標籤和驅動程式/CUDA 版本，請使用 啟用 GFD。透過這些標籤，您可以以具有 `nodeSelector`或 節點親和性的特定 GPU 類型為目標 （例如，僅將工作負載排程到 A10G GPUs 或特定 MIG 設定檔）。時間分割和 MIG 等 GPU 共用組態也會使用這些標籤。如果您不需要屬性型節點選擇或 GPU 共用，則可以省略 旗標。  

   ```
   helm install nvdp nvdp/nvidia-device-plugin \
       --create-namespace \
       --namespace nvidia \
       --set gfd.enabled=true
   ```
**如果您的工作負載使用 GDRCopy**  
 `k8s-device-plugin` v0.19.0 到 v0.19.2 預設啟用 GDRCopy 和 MOFED 功能。此預設啟用已在 v0`k8s-device-plugin`.19.3 中還原。由於還原，無法再使用 Pod 規格中的`NVIDIA_GDRCOPY=enabled`環境變數為每個容器啟用 GDRCopy (`gdrdrv`)，現在會忽略該變數。  
如果您的工作負載使用 GDRCopy (GPUDirect RDMA 複本），您必須在安裝時透過設定 ，在裝置外掛程式上啟用它`gdrcopyEnabled=true`：  

   ```
   helm upgrade --install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gdrcopyEnabled=true
   ```
（如果您也想要 GPU 功能探索標籤，`--set gfd.enabled=true`也請新增 ，如前所述。)  
如果您透過 GitHub 上的 NVIDIA [GPU Operator](https://github.com/NVIDIA/gpu-operator) 管理 NVIDIA 裝置外掛程式，該運算子會在`gdrdrv`核心模組載入節點`GDRCOPY_ENABLED=true`時動態設定。  
如需詳細資訊，請參閱 GitHub 上的 [NVIDIA k8s-device-plugin 問題 \#1692](https://github.com/NVIDIA/k8s-device-plugin/issues/1692)。
**注意**  
您也可以使用 GitHub 上的 [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                                                             |
+-----------------------------------------------------------------------------------------+
```