最大限度减少 GPU 驱动程序升级期间中断的最佳实践 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

最大限度减少 GPU 驱动程序升级期间中断的最佳实践

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

当前版本和支持的实例系列

Amazon SageMaker Inference 支持以下驱动程序和实例系列:

服务 GPU 驱动程序版本 实例类型
实时 NVIDIA 470.57.02 ml.p2.*,ml.p3.*,ml.p4d.*,ml.p4de.*,ml.g4dn.*,ml.g5.*
535.54.03 ml.p5.*
Batch NVIDIA 470.57.02 ml.p2.*,ml.p3.*,ml.p4d.*,ml.p4de.*,ml.g4dn.*,ml.g5*
535.54.03 ml.p5.*

使用 GPU 功能排查模型容器的问题

如果您在运行 GPU 工作负载时遇到问题,请参阅以下指南:

在 Docker 容器中运行 nvidia-smi(NVIDIA 系统管理接口)命令。如果 NVIDIA 系统管理接口检测到 GPU 检测错误或 NVIDIA 初始化错误,它将返回以下错误消息:

Failed to initialize NVML: Driver/library version mismatch

根据您的使用案例,请遵循以下最佳实践来解决故障或错误:

有关更多信息,请参阅 NVIDIA 网站上的 NVIDIA 系统管理接口页面

如果您的 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'

根据您的使用案例,请遵循以下最佳实践来解决故障或错误:

使用不匹配驱动程序版本的最佳实践

以下内容提供有关如何更新 GPU 驱动程序的信息:

无需采取行动。NVIDIA 提供向后兼容性。

如果版本差异较小,则无需执行任何操作。NVIDIA 提供次要版本向前兼容性。

如果是主要版本差异,则需安装 CUDA Compatibility Package。请参阅 NVIDIA 文档中的 CUDA Compatibility Package

重要

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

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

要验证平台 NVIDIA 驱动程序版本是否支持模型容器中安装的 CUDA Compatibility Package 版本,请参阅 CUDA 文档。如果平台 NVIDIA 驱动程序版本不支持 CUDA Compatibility Package 版本,则可以在模型容器映像中禁用或删除 CUDA Compatibility Package。如果最新的 NVIDIA 驱动程序版本支持 CUDA 兼容库版本,我们建议您根据检测到的 NVIDIA 驱动程序版本启用 CUDA Compatibility Package,以便将来实现兼容,方法是将以下代码片段添加到容器启动 Shell 脚本(位于脚本 ENTRYPOINT 中)中。

该脚本演示了如何根据模型容器的已部署主机上检测到的 NVIDIA 驱动程序版本动态切换 CUDA Compatibility Package 的使用。当 SageMaker 发布较新的 NVIDIA 驱动程序版本时,如果新驱动程序原生支持 CUDA 应用程序,则可以自动关闭已安装的 CUDA Compatibility Package。

#!/bin/bash verlte() { [ "$1" = "$2" ] && return 1 || [ "$2" = "`echo -e "$1\n$2" | sort -V | head -n1`" ] } if [ -f /usr/local/cuda/compat/libcuda.so.1 ]; then cat /usr/local/cuda/version.txt CUDA_COMPAT_MAX_DRIVER_VERSION=$(readlink /usr/local/cuda/compat/libcuda.so.1 |cut -d'.' -f 3-) echo "CUDA compat package requires Nvidia driver ⩽${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 [ $(verlte $CUDA_COMPAT_MAX_DRIVER_VERSION $NVIDIA_DRIVER_VERSION) ]; then echo "Setup CUDA compatibility libs path to LD_LIBRARY_PATH" export LD_LIBRARY_PATH=/usr/local/cuda/compat:$LD_LIBRARY_PATH echo $LD_LIBRARY_PATH else echo "Skip CUDA compat libs setup as newer Nvidia driver is installed" fi else echo "Skip CUDA compat libs setup as package not found" fi