Amazon SageMaker 模型部署疑难解答 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon SageMaker 模型部署疑难解答

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

活动 CPU 计数中的检测错误

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

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

要查看这一误检测的示例,请在为配置的容器(它是使用基于 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 返回的输出。