

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

# 更新推理容器以符合 NVIDIA 容器工具包的要求
<a name="container-nvidia-compliance"></a>

从 1.17.4 及更高版本开始，NVIDIA 容器工具包不再自动挂载 CUDA 兼容性库。这种行为变化可能会影响您的 SageMaker AI 推理工作负载。您的 SageMaker AI 端点和批量转换作业可能使用与 NVIDIA 容器工具包最新版本不兼容的容器。为确保您的工作负载符合最新要求，您可能需要更新端点或配置批量转换作业。

## 更新 SageMaker AI 端点以实现合规性
<a name="endpoint-compliance"></a>

我们建议您更新现有的 SageMaker AI 终端节点或创建支持最新默认行为的新终端节点。

为确保您的端点与最新版本的 NVIDIA 容器工具包兼容，请按照以下步骤操作：

1. 如果您自带容器，请更新设置 CUDA 兼容性库的方式。

1. 指定支持最新 NVIDIA 容器工具包行为的推理亚马逊机器映像（AMI）。您需要在更新现有端点或创建新端点时指定 AMI。

### 如果您自带容器，请更新 CUDA 兼容性设置
<a name="cuda-compatibility"></a>

CUDA 兼容性库支持向前兼容。这种兼容性适用于比 A SageMaker I 实例提供的 NVIDIA 驱动程序更新的任何 CUDA 工具包版本。

只有当 SageMaker AI 实例使用的 NVIDIA 驱动程序的版本低于模型容器中的 CUDA 工具包时，您才必须启用 CUDA 兼容性库。如果您的模型容器不需要 CUDA 兼容性，则可跳过此步骤。例如，如果您不打算使用比 SageMaker AI 实例提供的工具包更新的 CUDA 工具包，则可以跳过此步骤。

由于 NVIDIA 容器工具包 1.17.4 版本中引入了更改，因此，如果需要，您可以通过将 CUDA 兼容库添加到容器中的 `LD_LIBRARY_PATH` 来显式启用 CUDA 兼容性库。

我们建议您根据检测到的 NVIDIA 驱动程序版本启用 CUDA 兼容性。要启用该兼容性，请将以下代码片段添加到容器启动 shell 脚本中。在 `ENTRYPOINT` 脚本中添加此代码。

以下脚本演示了如何根据模型容器的已部署主机上检测到的 NVIDIA 驱动程序版本，动态切换 CUDA 兼容性的使用。

```
#!/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
```

### 指定符合 NVIDIA 容器工具包的推理 AMI
<a name="specify-inference-ami"></a>

在`ProductionVariant`数据类型的`InferenceAmiVersion`参数中，您可以为 AI 终端节点选择 AM SageMaker I。每个支持的图像都 AMIs 是一个预配置的映像。每个映像都 AWS 使用一组软件和驱动程序版本进行配置。

默认情况下， SageMaker AI AMIs 遵循传统行为。它们会自动在容器中挂载 CUDA 兼容性库。要使端点使用新行为，您必须指定针对新行为配置的推理 AMI 版本。

以下推理 AMI 版本目前遵循新行为。它们不会自动挂载 CUDA 兼容性库。

al2--2-ami-sagemaker-inference-gpu 1  
+ NVIDIA 驱动程序版本：535.54.03
+ CUDA 版本：12.2

al2--3-ami-sagemaker-inference-gpu 1  
+ NVIDIA 驱动程序版本：550.144.01
+ CUDA 版本：12.4

### 更新现有端点
<a name="update-existing-endpoint"></a>

按照以下示例升级现有端点。该示例使用的推理 AMI 版本禁用了 CUDA 兼容库的自动挂载。

```
ENDPOINT_NAME="<endpoint name>"
INFERENCE_AMI_VERSION="al2-ami-sagemaker-inference-gpu-3-1"

# Obtaining current endpoint configuration
CURRENT_ENDPOINT_CFG_NAME=$(aws sagemaker describe-endpoint --endpoint-name "$ENDPOINT_NAME" --query "EndpointConfigName" --output text)
NEW_ENDPOINT_CFG_NAME="${CURRENT_ENDPOINT_CFG_NAME}new"

# Copying Endpoint Configuration with AMI version specified
aws sagemaker describe-endpoint-config \
    --endpoint-config-name ${CURRENT_ENDPOINT_CFG_NAME} \
    --output json | \
jq "del(.EndpointConfigArn, .CreationTime) | . + {
    EndpointConfigName: \"${NEW_ENDPOINT_CFG_NAME}\",
    ProductionVariants: (.ProductionVariants | map(.InferenceAmiVersion = \"${INFERENCE_AMI_VERSION}\"))
}" > /tmp/new_endpoint_config.json

# Make sure all fields in the new endpoint config look as expected
cat /tmp/new_endpoint_config.json

# Creating new endpoint config
aws sagemaker create-endpoint-config \
   --cli-input-json file:///tmp/new_endpoint_config.json
    
# Updating the endpoint
aws sagemaker update-endpoint \
    --endpoint-name "$ENDPOINT_NAME" \
    --endpoint-config-name "$NEW_ENDPOINT_CFG_NAME" \
    --retain-all-variant-properties
```

### 创建新端点
<a name="create-new-endpoint"></a>

使用以下示例来创建新端点。该示例使用的推理 AMI 版本禁用了 CUDA 兼容库的自动挂载。

```
INFERENCE_AMI_VERSION="al2-ami-sagemaker-inference-gpu-3-1"

aws sagemakercreate-endpoint-config \
 --endpoint-config-name "<endpoint_config>" \
 --production-variants '[{ \
    ....
    "InferenceAmiVersion":  "${INFERENCE_AMI_VERSION}", \
    ...
    "}]'

aws sagemaker create-endpoint \
--endpoint-name "<endpoint_name>" \
--endpoint-config-name "<endpoint_config>"
```

## 运行合规的批量转换作业
<a name="batch-compliance"></a>

*批量转换*是一种推理选项，非常适合离线处理大量数据的请求。要创建批量转换作业，可以使用 `CreateTransformJob` API 操作。有关更多信息，请参阅 [使用 Amazon A SageMaker I 进行批量转换以进行推理](batch-transform.md)。

NVIDIA 容器工具包行为的更改会影响批量转换作业。要运行符合 NVIDIA 容器工具包要求的批量转换，请执行以下操作：

1. 如果要使用自带容器的模型运行批量转换，请先更新容器以使其兼容 CUDA。要对其进行更新，请按照 [如果您自带容器，请更新 CUDA 兼容性设置](#cuda-compatibility)中的流程进行操作。

1. 使用 `CreateTransformJob` API 操作创建批量转换作业。在请求中，将 `SAGEMAKER_CUDA_COMPAT_DISABLED` 环境变量设置为 `true`。此参数指示容器不要自动挂载 CUDA 兼容性库。

   例如，当您使用创建批处理转换作业时 AWS CLI，可以使用以下`--environment`参数设置环境变量：

   ```
   aws sagemaker create-transform-job \
       --environment '{"SAGEMAKER_CUDA_COMPAT_DISABLED": "true"}'\
       . . .
   ```