

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

# 对 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 资源。此问题会影响一些 JVMs 支持 Java 8 和 Java 9 的产品，以及大多数支持 Java 10 和 Java 11 的产品。它们 JVMs 实现了一种机制，该机制可以检测和处理在 Docker 容器中运行模型时以及更笼统地说，在 Linux `taskset` 命令或控制组 (cgroups) 中运行模型时的 CPU 数量和最大可用内存。 SageMaker AI 部署利用了 JVM 用于管理这些资源的某些设置。当前，这会导致容器错误地检测到可用数量 CPUs。

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

举例来说，在为 SageMaker AI 配置的容器中，如果该容器部署了基于 Java8\$1191 的 JVM，并且该实例上有四个可用 CPUs 的 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)
```

许多受此问题 JVMs 影响的人都可以选择禁用此行为并重新建立对实例 CPUs 上所有内容的完全访问权限。通过在启动 Java 应用程序时添加`-XX:-UseContainerSupport`参数，禁用不需要 CPUs 的行为并建立对所有实例的完全访问权限。例如，按如下所示运行 `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 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\$1test](https://github.com/aws/amazon-sagemaker-examples/tree/main/advanced_functionality/scikit_bring_your_own/container/local_test)。