

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

# 將 GPU 驅動程式升級期間中斷的最佳做法降至最低
<a name="inference-gpu-drivers"></a>

SageMaker AI 模型部署會隨著時間的推移升級機器學習 (ML) 執行個體上的 GPU 驅動程式，以提供即時、Batch 和非同步推論選項，讓客戶能夠存取驅動程式提供者的改進功能。您可以在下方看到每個推論選項支援的 GPU 版本。不同的驅動程式版本可能會變更模型與 GPU 互動的方式。以下是一些策略，可協助您瞭解應用程式如何搭配不同的驅動程式版本運作。

## 目前版本和支援的執行個體系列
<a name="inference-gpu-drivers-versions"></a>

Amazon SageMaker AI 推論支援下列驅動程式和執行個體系列：



- **Real-time**
  - **GPU:** NVIDIA
  - **驅動程式版本:** 470 / **CUDA 版本:** CUDA 11.4 / **執行個體類型:** ml.p2.\*, ml.p3.\*, ml.p4d.\*, ml.p4de.\*, ml.g4dn.\*, ml.g5.\*
  - **驅動程式版本:** 535 / **CUDA 版本:** CUDA 12.2 / **執行個體類型:** ml.p5.\*, ml.g6.\*
  - **驅動程式版本:** 550 / **CUDA 版本:** CUDA 12.4 / **執行個體類型:** ml.p5e.\*, ml.p5en.\*
  - **驅動程式版本:** 580 / **CUDA 版本:** CUDA 13.0 / **執行個體類型:** ml.p6.\*、ml.g7e.\*

- **非同步推論**
  - **GPU:** NVIDIA
  - **驅動程式版本:** 470 / **CUDA 版本:** CUDA 11.4 / **執行個體類型:** ml.p2.\*, ml.p3.\*, ml.p4d.\*, ml.p4de.\*, ml.g4dn.\*, ml.g5\*
  - **驅動程式版本:** 470 / **CUDA 版本:** CUDA 12.2 / **執行個體類型:** ml.p5.\*, ml.g6.\*
  - **驅動程式版本:** 550 / **CUDA 版本:** CUDA 12.4 / **執行個體類型:** ml.p5e.\*, ml.p5en.\*
  - **驅動程式版本:** 580 / **CUDA 版本:** CUDA 13.0 / **執行個體類型:** ml.p6.\*、ml.g7e.\*

- **批次**
  - **GPU:** NVIDIA
  - **驅動程式版本:** 470
  - **CUDA 版本:** CUDA 11.4
  - **執行個體類型:** ml.p2.\*, ml.p3.\*, ml.p4d.\*, ml.p4de.\*, ml.g4dn.\*, ml.g5\*



## 使用 GPU 功能疑難排解模型容器
<a name="inference-gpu-drivers-troubleshoot"></a>

如果您在執行 GPU 工作負載時遇到問題，請參閱下列指引：

### GPU 卡檢測失敗或 NVIDIA 初始化錯誤
<a name="collapsible-section-0"></a>

從 Docker 容器中執行 `nvidia-smi` (NVIDIA 系統管理介面) 命令。如果 NVIDIA 系統管理介面偵測到 GPU 偵測錯誤或 NVIDIA 初始化錯誤，它會傳回下列錯誤訊息：

```
Failed to initialize NVML: Driver/library version mismatch
```

根據您的使用案例，請遵循下列最佳作法來解決失敗或錯誤：
+ 請遵循[如果您攜帶自己的 (BYO) 模型容器](#collapsible-byoc)下拉式清單中描述的最佳作法建議。
+ 請遵循[如果您使用 CUDA 相容性層](#collapsible-cuda-compat)下拉式清單中描述的最佳作法建議。

如需詳細資訊，請參閱 [NVIDIA 網站上的 NVIDIA 系統管理介面頁面](https://developer.nvidia.com/nvidia-system-management-interface)。

### `CannotStartContainerError`
<a name="collapsible-section-cannot-start-container"></a>

 如果您的 GPU 執行個體使用的 NVIDIA 驅動程式版本與 Docker 容器中的 CUDA 版本不相容，則部署端點將會失敗，並顯示下列錯誤訊息：

```
 Failure reason CannotStartContainerError. Please ensure the model container for variant <variant_name> starts correctly when invoked with 'docker run <image> serve'
```

根據您的使用案例，請遵循下列最佳作法來解決失敗或錯誤：
+ 請遵循[我的容器依賴的驅動程序大於機器學習 (ML) GPU 執行個體上的版本](#collapsible-driver-dependency-higher)下拉式清單中描述的最佳作法建議。
+ 請遵循[如果您使用 CUDA 相容性層](#collapsible-cuda-compat)下拉式清單中描述的最佳作法建議。

## 使用不相符驅動程式版本的最佳實務
<a name="inference-gpu-drivers-cuda-toolkit-updates"></a>

以下提供如何更新 GPU 驅動程式的資訊：

### 我的容器依賴的驅動程序低於機器學習 (ML) GPU 執行個體上的版本
<a name="collapsible-driver-dependency-lower"></a>

無需採取任何動作。NVIDIA 提供向後相容性。

### 我的容器依賴的驅動程序大於機器學習 (ML) GPU 執行個體上的版本
<a name="collapsible-driver-dependency-higher"></a>

如果這是一個較小的版本差異，則不需要採取任何行動。NVIDIA 提供次要版本轉發相容性。

如果是主要版本差異，則需要安裝 CUDA 相容性 Package。請參閱 NVIDIA 說明文件中的 [CUDA 相容性](https://docs.nvidia.com/deploy/cuda-compatibility/index.html) Package 件。

**重要**  
CUDA 相容性套件無法向下相容，因此如果執行個體上的驅動程式版本大於 CUDA 相容性套件版本，則需要停用此套件。

### 如果您攜帶自己的 (BYO) 模型容器
<a name="collapsible-byoc"></a>

確保映像中沒有捆綁任何 NVIDIA 驅動程序包，這可能會導致與主機 NVIDIA 驅動程序版本發生衝突。

### 如果您使用 CUDA 相容性層
<a name="collapsible-cuda-compat"></a>

要驗證平台 Nvidia 驅動程序版本是否支援模型容器中安裝的 CUDA 相容性 Package 版本，請參閱 [CUDA](https://docs.nvidia.com/deploy/cuda-compatibility/index.html#use-the-right-compat-package) 文件。如果平台 Nvidia 驅動程式版本不支援 CUDA 相容性 Package 版本，您可以從模型容器映像中停用或移除 CUDA 相容性 Package。如果最新的 Nvidia 驅動程式版本支援 CUDA 相容性程式庫版本，我們建議您根據檢測到的 Nvidia 驅動程式版本啟用 CUDA 相容性套件，以便未來可以相容，方法為透過下面的程式碼片段新增到容器啟動 shell 指令碼中 (在 `ENTRYPOINT` 指令碼)。

該腳本示範如何根據模型容器部署的主機上檢測到的 Nvidia 驅動程序版本動態切換 CUDA 相容性 Package 的使用。當 SageMaker 發行較新的 Nvidia 驅動程式版本時，如果新驅動程式原生支援 CUDA 應用程式，則可以自動關閉已安裝的 CUDA 相容性 Package 件。

```
#!/bin/bash

verlt() {
    [ "$1" = "$2" ] && return 1 || [ "$1" = "$(echo -e "$1\n$2" | sort -V | head -n1)" ]
}

if [ -f /usr/local/cuda/compat/libcuda.so.1 ]; then
    CUDA_COMPAT_MAX_DRIVER_VERSION=$(readlink /usr/local/cuda/compat/libcuda.so.1 | cut -d'.' -f 3-)
    echo "CUDA compat package should be installed for NVIDIA driver smaller than ${CUDA_COMPAT_MAX_DRIVER_VERSION}"
    NVIDIA_DRIVER_VERSION=$(sed -n 's/^NVRM.*Kernel Module *\([0-9.]*\).*$/\1/p' /proc/driver/nvidia/version 2>/dev/null || true)
    echo "Current installed NVIDIA driver version is ${NVIDIA_DRIVER_VERSION}"
    if verlt $NVIDIA_DRIVER_VERSION $CUDA_COMPAT_MAX_DRIVER_VERSION; then
        echo "Adding CUDA compat to LD_LIBRARY_PATH"
        export LD_LIBRARY_PATH=/usr/local/cuda/compat:$LD_LIBRARY_PATH
        echo $LD_LIBRARY_PATH
    else
        echo "Skipping CUDA compat setup as newer NVIDIA driver is installed"
    fi
else
    echo "Skipping CUDA compat setup as package not found"
fi
```