本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon 故障排除 SageMaker 模型部署
如果您在 Amazon SageMaker 中部署机器学习模型时遇到问题,请参阅以下指南。
活动 CPU 计数中的检测错误
如果你部署 SageMaker 使用 Linux 虚拟机 (JVM) 模型,您可能会遇到检测错误,导致无法使用可用的 CPU 资源。此问题会影响支持 Java 8 和 Java 9 的某些 JVM 以及支持 Java 10 和 Java 11 的多数 JVM。这些 JVM 实施一种机制,可检测和处理在 Docker 容器(更普遍的是,在 Linux 中运行模型时的可用 CPU 计数和最大可用内存)。taskset
命令或控制组 (cgroup)。SageMaker 部署利用了 JVM 用于管理这些资源的一些设置。目前,这会导致容器错误地检测可用 CPU 数。
SageMaker 不限制对实例上 CPU 的访问。但是,当有更多 CPU 可供容器使用时,JVM 可能会将 CPU 计数检测为 1
。因此,JVM 会将其所有内部设置调整为像只有 1
个 CPU 内核可用时运行一样。这些设置会影响垃圾回收、锁定、编译器线程及其他 JVM 内部组件,从而对容器的并发性、吞吐量和延迟产生负面影响。
有关错误检测的示例,在配置的容器中 SageMaker 运行以下命令以启动 JVM(它是使用基于 Java8_191 的 JVM 进行部署的,运行以下命令以启动 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 的访问权限。
在中间接使用 JVM 时,您可能还会遇到此问题。 SageMaker 容器。例如,使用 JVM 支持 SparkML Scala 时。-XX:-UseContainerSupport
参数也会影响 Java Runtime.getRuntime().availableProcessors()
API 返回的输出。