

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

# 对 Amazon A SageMaker I 模型部署进行故障排除
<a name="deploy-model-troubleshoot"></a>

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

**Topics**
+ [活动 CPU 计数中的检测错误](#deploy-model-troubleshoot-jvms)
+ [部署 model.tar.gz 文件时出现问题](#deploy-model-troubleshoot-tarballs)
+ [主容器未通过 ping 运行状况检查](#deploy-model-troubleshoot-ping)

## 活动 CPU 计数中的检测错误
<a name="deploy-model-troubleshoot-jvms"></a>

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

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

举例来说，在为 SageMaker AI 配置的容器中，如果该容器部署了基于 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 AI 容器中间接使用 JVM 时，也可能会遇到此问题。例如，使用 JVM 支持 SparkML Scala 时。`-XX:-UseContainerSupport` 参数也会影响 Java `Runtime.getRuntime().availableProcessors()` API `` 返回的输出。

## 部署 model.tar.gz 文件时出现问题
<a name="deploy-model-troubleshoot-tarballs"></a>

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

## 主容器未通过 ping 运行状况检查
<a name="deploy-model-troubleshoot-ping"></a>

 如果您的主容器未通过 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 中使用本地模式通过将模型部署到本地端点来模仿托管环境。有关更多信息，请参阅[本地模式](https://sagemaker.readthedocs.io/en/stable/overview.html#local-mode)。
+  使用 vanilla docker 命令来测试容器对 /ping 和 /invocations 的响应。有关更多信息，请参阅 [local\_test](https://github.com/aws/amazon-sagemaker-examples/tree/main/advanced_functionality/scikit_bring_your_own/container/local_test)。