对亚马逊 SageMaker 模型部署进行故障排除 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

对亚马逊 SageMaker 模型部署进行故障排除

如果您在 Amazon 中部署机器学习模型时遇到问题 SageMaker,请参阅以下指南。

活动 CPU 计数中的检测错误

如果使用 Linux Java 虚拟机 (JVM) 部署 SageMaker 模型,则可能会遇到检测错误,导致无法使用可用 CPU 资源。此问题会影响支持 Java 8 和 Java 9 的某些 JVM 以及支持 Java 10 和 Java 11 的多数 JVM。这些 JVM 实现了一种机制,用于检测和处理 CPU 计数和在 Docker 容器中运行模型时的最大可用内存,更笼统地说,在 Linux taskset 命令或控制组 (cgroups) 中运行模型。 SageMaker部署利用了 JVM 用于管理这些资源的某些设置。目前,这会导致容器错误地检测可用 CPU 数。

SageMaker 不限制对实例上 CPU 的访问权限。但是,当有更多 CPU 可供容器使用时,JVM 可能会将 CPU 计数检测为 1。因此,JVM 会将其所有内部设置调整为像只有 1 个 CPU 内核可用时运行一样。这些设置会影响垃圾回收、锁定、编译器线程及其他 JVM 内部组件,从而对容器的并发性、吞吐量和延迟产生负面影响。

有关错误检测的示例,在为 SageMaker 其配置的容器中部署了基于 Java8_191 的 JVM,并且该实例上有四个可用 CPU,运行以下命令来启动 JVM:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintActiveCpus -version

这会生成以下输出:

active_processor_count: sched_getaffinity processor count: 4 active_processor_count: determined by OSContainer: 1 active_processor_count: sched_getaffinity processor count: 4 active_processor_count: determined by OSContainer: 1 active_processor_count: sched_getaffinity processor count: 4 active_processor_count: determined by OSContainer: 1 active_processor_count: sched_getaffinity processor count: 4 active_processor_count: determined by OSContainer: 1 openjdk version "1.8.0_191" OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12) OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

受此问题影响的许多 JVM 选择禁用此行为,并重新建立对实例上所有 CPU 的完全访问权限。通过在启动 Java 应用程序时包含 -XX:-UseContainerSupport 参数,禁用这一不需要的行为并建立对所有实例 CPU 的完全访问权限。例如,按如下所示运行 java 命令以启动 JVM:

java -XX:-UseContainerSupport -XX:+UnlockDiagnosticVMOptions -XX:+PrintActiveCpus -version

这会生成以下输出:

active_processor_count: sched_getaffinity processor count: 4 active_processor_count: sched_getaffinity processor count: 4 active_processor_count: sched_getaffinity processor count: 4 active_processor_count: sched_getaffinity processor count: 4 openjdk version "1.8.0_191" OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12) OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

检查容器中使用的 JVM 是否支持 -XX:-UseContainerSupport 参数。如果支持,则在您启动 JVM 时,始终会传递该参数。这会提供对实例中所有 CPU 的访问权限。

在 SageMaker 容器中间接使用 JVM 时,也可能会遇到此问题。例如,使用 JVM 支持 SparkML Scala 时。-XX:-UseContainerSupport 参数也会影响 Java Runtime.getRuntime().availableProcessors() API 返回的输出。

部署 model.tar.gz 文件时出现问题

使用 model.tar.gz 文件部署模型时,模型 tarball 不应包含任何符号链接。符号链接会导致模型创建失败。此外,我们建议您不要在 tarball 中包含任何不必要的文件。

主容器未通过 ping 运行状况检查

如果您的主容器未通过 ping 运行状况检查并显示以下错误消息,则表明您的容器或脚本存在问题:

The primary container for production variant beta did not pass the ping health check. Please check CloudWatch Logs logs for this endpoint.

要解决此问题,您应查看相关终端节点的 CloudWatch 日志日志,以查看是否存在任何导致容器无法响应或的错误/ping或问题/invocations。日志可能会提供一条可能指出问题的错误消息。确定错误和失败原因后,应解决错误。

在创建端点之前,最好在本地测试模型部署。

  • 在 SageMaker SDK 中使用本地模式通过将模型部署到本地端点来模仿托管环境。有关更多信息,请参阅本地模式

  • 使用 vanilla docker 命令来测试容器对 /ping 和 /invocations 的响应。有关更多信息,请参阅 local_test