Amazon SageMaker 模型部署问题排查 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon SageMaker 模型部署问题排查

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

活动 CPU 计数中的检测错误

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

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

有关误检测的示例,请在为 SageMaker 配置的容器中(该容器使用基于 Java8_191 的 JVM 进行部署,并且实例上有四个可用的 CPUs),请运行以下命令以启动 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)

受此问题影响的许多JVMs可以选择禁用此行为,并重新建立对实例上所有CPUs的完全访问权限。通过在启动 Java 应用程序时包含 CPUs 参数,禁用这一不需要的行为并建立对所有实例 -XX:-UseContainerSupport 的完全访问权限。例如,按如下所示运行 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 时,始终会传递该参数。这将提供对实例中所有 CPUs 的访问。

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