

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 疑難排解 Amazon SageMaker AI 型部署
<a name="deploy-model-troubleshoot"></a>

如果您在 Amazon SageMaker AI 部署機器學習模型時遇到問題，請參閱以下指引。

**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) 部署 SageMaker AI 模型，您可能會遇到防止您使用可用 CPU 資源的偵測錯誤。這個問題影響支援 Java 8 和 Java 9 的一些 JVM，以及支援 Java 10 和 Java 11 的大多數 JVM。這些 JVM 實作的機制可在 Docker 容器中 (更常見的是在 Linux `taskset` 命令或控制群組 (cgroups)) 中執行模型時偵測和處理 CPU 計數和最大可用記憶體。SageMaker AI 部署會利用 JVM 用來管理這些資源的一些設定。目前，這會導致容器無法正確偵測可用 CPU 數量。

SageMaker AI 不會限制對執行個體上的 CPU 存取。不過，在更多 CPU 可供容器使用時，JVM 可能會偵測到 CPU 計數為 `1`。因此，JVM 會將所有內部設定的執行方式調整為如同僅有 `1` 個 CPU 核心可供使用的情況。這些設定會影響廢棄項目收集、鎖定、編譯器執行緒和其他 JVM 內部函式，而對容器的並行、輸送量和延遲產生負面影響。

如需偵測錯誤的範例，在為使用基於 Java8\$1191 的 JVM 部署之 SageMaker AI 設定的容器中，且該容器在執行個體上擁有四個可用的 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 的完整存取權。停用不需要的行為，並建立與所有執行個體 CPU 的完整存取權，方法是在啟動 Java 應用程式時納入 `-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 時一律傳遞此參數。這可讓您存取執行個體中的所有 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 中包含任何不必要的檔案。

## 主要容器未通過 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 Logs 記錄，以查看是否有任何錯誤或問題阻止容器回應 `/ping` 或 `/invocations`。記錄檔可能會提供可能指向問題的錯誤訊息。確定錯誤和失敗原因後，您應該解決錯誤。

 在建立端點之前，最好先在本機測試模型部署。
+  使用 SageMaker SDK 中的本機模式，透過將模型部署到本機端點來模擬託管環境。如需詳細資訊，請參閱[本機模式](https://sagemaker.readthedocs.io/en/stable/overview.html#local-mode)。
+  使用普通 docker 命令來測試容器對 /ping 和 /invocations 的回應。如需詳細資訊，請參閱 [local\$1test](https://github.com/aws/amazon-sagemaker-examples/tree/main/advanced_functionality/scikit_bring_your_own/container/local_test)。