

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 最大限度减少 GPU 驱动程序升级期间中断的最佳实践
<a name="inference-gpu-drivers"></a>

SageMaker 随着时间的推移，AI Model Deployment 会升级 ML 实例上的 GPU 驱动程序，以实现实时、批处理和异步推理选项，让客户可以从驱动程序提供商那里获得改进。您可以在下面看到每个推理选项支持的 GPU 版本。不同的驱动程序版本可能会改变您的模型与的交互方式。 GPUs以下这些策略可帮助您了解应用程序在不同驱动程序版本下是如何工作的。

## 当前版本和支持的实例系列
<a name="inference-gpu-drivers-versions"></a>

Amazon SageMaker AI 推理支持以下驱动程序和实例系列：

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sagemaker/latest/dg/inference-gpu-drivers.html)

## 使用 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 实例使用与 Docker 容器中的 CUDA 版本不兼容的 NVIDIA 驱动程序版本，部署端点将失败，并显示以下错误消息：

```
 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 Compatibility Package。请参阅 NVIDIA 文档中的 [CUDA Compatibility Package](https://docs.nvidia.com/deploy/cuda-compatibility/index.html)。

**重要**  
CUDA Compatibility Package 不向后兼容，因此，如果实例上的驱动程序版本高于 CUDA Compatibility Package 版本，则需将其禁用。

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

确保映像中没有捆绑 NVIDIA 驱动程序包，这可能会导致与主机上的 NVIDIA 驱动程序版本发生冲突。

### 如果您使用 CUDA 兼容层
<a name="collapsible-cuda-compat"></a>

要验证平台 NVIDIA 驱动程序版本是否支持模型容器中安装的 CUDA Compatibility Package 版本，请参阅 [CUDA 文档](https://docs.nvidia.com/deploy/cuda-compatibility/index.html#use-the-right-compat-package)。如果平台 NVIDIA 驱动程序版本不支持 CUDA Compatibility Package 版本，则可以在模型容器映像中禁用或删除 CUDA Compatibility Package。如果最新的 NVIDIA 驱动程序版本支持 CUDA 兼容库版本，我们建议您根据检测到的 NVIDIA 驱动程序版本启用 CUDA Compatibility Package，以便将来实现兼容，方法是将以下代码片段添加到容器启动 Shell 脚本（位于脚本 `ENTRYPOINT` 中）中。

该脚本演示了如何根据模型容器的已部署主机上检测到的 NVIDIA 驱动程序版本动态切换 CUDA Compatibility Package 的使用。在 SageMaker 发布较新的 Nvidia 驱动程序版本时，如果新驱动程序本机支持 CUDA 应用程序，则可以自动关闭已安装的 CUDA Compational 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
```