最大限度减少 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
根据您的使用案例,请遵循以下最佳实践来解决故障或错误:
按照如果您自带 (BYO) 模型容器下拉列表中描述的最佳实践建议进行操作。
按照如果您使用 CUDA 兼容层下拉列表中描述的最佳实践建议进行操作。
有关更多信息,请参阅 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'
根据您的使用案例,请遵循以下最佳实践来解决故障或错误:
按照我的容器所依赖的驱动程序版本高于 ML GPU 实例上的版本下拉列表中描述的最佳实践建议进行操作。
按照如果您使用 CUDA 兼容层下拉列表中描述的最佳实践建议进行操作。
使用不匹配驱动程序版本的最佳实践
以下内容提供有关如何更新 GPU 驱动程序的信息:
无需采取行动。NVIDIA 提供向后兼容性。
如果版本差异较小,则无需执行任何操作。NVIDIA 提供次要版本向前兼容性。
如果是主要版本差异,则需安装 CUDA Compatibility Package。请参阅 NVIDIA 文档中的 CUDA Compatibility Package
重要
CUDA Compatibility Package 不向后兼容,因此,如果实例上的驱动程序版本高于 CUDA Compatibility Package 版本,则需将其禁用。
确保映像中没有捆绑 NVIDIA 驱动程序包,这可能会导致与主机上的 NVIDIA 驱动程序版本发生冲突。
要验证平台 NVIDIA 驱动程序版本是否支持模型容器中安装的 CUDA Compatibility Package 版本,请参阅 CUDA 文档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