

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

# 故障診斷
<a name="async-inference-troubleshooting"></a>

下列常見問答集可協助您進行 Amazon SageMaker 非同步推論端點問題疑難排解。

## 問：我已啟用自動擴展。如何找到任何特定時間點端點後面的執行個體計數？
<a name="async-troubleshooting-q1"></a>

您可以使用下列方法，找到端點後面的執行個體計數：
+ 您可以使用 SageMaker AI [DescribeEndpoint](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeEndpoint.html) API，描述在任何特定時間點端點後面的執行個體數量。
+ 檢視 Amazon CloudWatch 指標即可找到執行個體計數。檢視[端點執行個體的指標](https://docs.aws.amazon.com/sagemaker/latest/dg/monitoring-cloudwatch.html#cloudwatch-metrics-jobs)，例如 `CPUUtilization` 或 `MemoryUtilization`，並且查看 1 分鐘期間的樣本計數統計資料。計數應等於作用中執行個體的數量。下列螢幕擷取畫面顯示 CloudWatch 主控台繪製的 `CPUUtilization` 指標，其中**統計資料**設定為 `Sample count`、**期間**設定為 `1 minute`，得出的計數為 5。

![CloudWatch 主控台，顯示端點的作用中執行個體計數的圖表。](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/cloudwatch-sample-count.png)


## 問：SageMaker AI 容器的常見可調整環境變數是什麼？
<a name="async-troubleshooting-q2"></a>

下表依架構類型分類概述 SageMaker AI 容器的常見可調整環境變數。

**TensorFlow**


| 環境變數 | 描述 | 
| --- | --- | 
| `SAGEMAKER_TFS_INSTANCE_COUNT` | 若為以 TensorFlow 為基礎的模型，`tensorflow_model_server` 二進位是負責在記憶體載入模型、針對模型圖表執行輸入，以及衍生輸出的操作要素。通常會啟動此二進位的單一執行個體，為端點中的模型提供服務。此二進位內部為多執行緒，會繁衍多個執行緒，回應推論請求。在某些情況下，如果您發現 CPU 使用率率尚可 (使用率超過 30%)，但記憶體使用率過低 (使用率低於 10%)，不妨提高此參數。增加可服務的 `tensorflow_model_servers` 數量，通常會提高端點的輸送量。 | 
| `SAGEMAKER_TFS_FRACTIONAL_GPU_MEM_MARGIN` | 此參數控管可用 GPU 記憶體的一部分，以初始化 CUDA/CUDNN 和其他 GPU 程式庫。`0.2` 表示 20% 的可用 GPU 記憶體保留用於初始化 CUDA/CUDNN 和其他 GPU 程式庫，而 80% 的可用 GPU 記憶體在 TF 處理程序平均分配。除非啟用此 `allow_growth` 選項，否則會預先配置 GPU 記憶體。 | 
| `SAGEMAKER_TFS_INTER_OP_PARALLELISM` | 這樣一來便會與 `inter_op_parallelism_threads` 變數建立關聯。此變數會決定獨立非封鎖操作所使用的執行緒數量。`0` 代表系統會選取適當的號碼。 | 
| `SAGEMAKER_TFS_INTRA_OP_PARALLELISM` | 這樣一來便會與 `intra_op_parallelism_threads` 變數建立關聯。可用於某些操作的執行緒數量隨即決定，例如矩陣乘法和加速減少。`0` 的值表示系統會選取適當的數字。 | 
| `SAGEMAKER_GUNICORN_WORKERS` | 這個值控管要求 Gunicorn 為處理請求產生的工作者程序數量。此值可與其他參數搭配使用，衍生最大化推論輸送量的集合。除此之外，`SAGEMAKER_GUNICORN_WORKER_CLASS` 也控管產生的工作者的類型，通常是 `async` 或 `gevent`。 | 
| `SAGEMAKER_GUNICORN_WORKER_CLASS` | 這個值控管要求 Gunicorn 為處理請求產生的工作者程序數量。此值可與其他參數搭配使用，衍生最大化推論輸送量的集合。除此之外，`SAGEMAKER_GUNICORN_WORKER_CLASS` 也控管產生的工作者的類型，通常是 `async` 或 `gevent`。 | 
| `OMP_NUM_THREADS` | Python 內部使用 OpenMP 在程序中實作多執行緒。通常會產生相當於 CPU 核心數量的執行緒。然而，在 Intel 的 HypeThreading 這類 Simultaneous Multi Threading (SMT) 實作時，若干程序可能會產生實際 CPU 核心數兩倍數量的執行緒，超額訂閱特定核心。在某些情況下，Python 二進位最終可能產生的執行緒數，會是可用處理器核心的四倍。因此，如果您使用工作者執行緒超額訂閱可用核心，則此參數的理想設定為 `1`，或是開啟 SMT 之 CPU 上 CPU 核心數量的一半。 | 
| `TF_DISABLE_MKL`<br />`TF_DISABLE_POOL_ALLOCATOR` | 在某些情況下，如果將 `TF_DISABLE_MKL` 與 `TF_DISABLE_POOL_ALLOCATOR` 設定為 `1`，則關閉 MKL 可加快推論速度。 | 

**PyTorch**


| 環境變數 | 描述 | 
| --- | --- | 
| `SAGEMAKER_TS_MAX_BATCH_DELAY` | 這是 TorchServe 等待接收的批次延遲時間上限。 | 
| `SAGEMAKER_TS_BATCH_SIZE` | 如果計時器時間到之前，TorchServe 未收到 `batch_size` 中指定的請求數量，則會將收到的請求傳送至模型處理常式。 | 
| `SAGEMAKER_TS_MIN_WORKERS` | TorchServe 允許縮減的工作者數量下限。 | 
| `SAGEMAKER_TS_MAX_WORKERS` | TorchServe 允許擴展的工作者數量上限。 | 
| `SAGEMAKER_TS_RESPONSE_TIMEOUT` | 時間延遲，亦即推論未得到回應時，經過這段時間便會逾時。 | 
| `SAGEMAKER_TS_MAX_REQUEST_SIZE` | TorchServe 的承載大小上限。 | 
| `SAGEMAKER_TS_MAX_RESPONSE_SIZE` | TorchServe 的回應大小上限。 | 

**多模型伺服器 (MMS)**


| 環境變數 | 描述 | 
| --- | --- | 
| `job_queue_size` | 針對推論請求承載類型龐大的情況，以及由於承載較大，因此 JVM 堆積記憶體使用量可能較高時，不妨調整這個參數。理想中，不妨降低 JVM 的堆積記憶體要求，並允許 Python 工作者為實際的模型服務分配更多記憶體。JVM 僅用於接收 HTTP 請求、將請求排入佇列，以及將請求分派給 Python 型工作者進行推論。如果增加 `job_queue_size`，到頭來可能會增加 JVM 的堆記憶體使用量，最終從 Python 工作者可能使用的主機移除記憶體。因此，調整此參數時請務必小心。 | 
| `default_workers_per_model` | 此參數用於後端模型服務，調整可能獲得不錯的效果，因為這個參數是整個模型服務的關鍵要素，也是 Python 為每個模型生成執行緒的基礎。如果此元素速度較慢 (或調整不當)，則前端調整可能無效。 | 

## 問：我要如何確保容器支援非同步推論？
<a name="async-troubleshooting-q3"></a>

您可以讓非同步推論使用與即時推論或批次轉換相同的容器。請確認容器的逾時和承載大小限制，已設定為處理較大的承載和更長的逾時。

## 問：非同步推論有哪些專屬限制，是否可以調整？
<a name="async-troubleshooting-q4"></a>

請參閱下列非同步推論限制：
+ 承載大小限制：1 GB
+ 逾時限制：請求最多可能需要 60 分鐘。
+ 佇列訊息 TimeToLive (TTL)：6 小時
+ 可以放置在 Amazon SQS 內的訊息數量：無限制。然而，標準佇列的執行中訊息數量配額為 120,000，FIFO 佇列配額為 20,000。

## 問：哪些指標最適合在非同步推論定義自動擴展？ 可以有多個擴展政策嗎？
<a name="async-troubleshooting-q5"></a>

非同步推論一般可根據調用或執行個體橫向擴展。若為調用指標，不妨查看 `ApproximateBacklogSize` 這個定義佇列中尚未處理之項目數量的指標。您可以利用此指標或 `InvocationsPerInstance` 指標，了解哪些 TPS 可能受節制。在執行個體層級，請檢查執行個體類型及其 CPU/GPU 使用率，定義何時橫向擴展。如果單一執行個體的容量超過 60-70% 通常是好事，代表硬體正在飽和。

不建議使用多個擴展政策，因為這些政策可能會發生衝突，導致硬體層級混淆，在橫向擴展時導致延遲。

## 問：為什麼我的非同步端點終止執行個體作為 `Unhealthy`，而且自動擴展的更新請求失敗？
<a name="async-troubleshooting-q6"></a>

請檢查您的容器是否能夠同時處理 ping 並調用請求。SageMaker AI 調用請求大約需要 3 分鐘，過程中多個 ping 請求通常會因逾時而失敗，導致 SageMaker AI 將容器偵測為 `Unhealthy`。

## 問：使用 ningx/gunicorn/flask 設定時，BYOC 模型容器的 `MaxConcurrentInvocationsPerInstance` 是否能運作？
<a name="async-troubleshooting-q7"></a>

是。`MaxConcurrentInvocationsPerInstance` 是非同步端點的功能。這個功能不需要自訂容器實作。`MaxConcurrentInvocationsPerInstance` 控制調用請求傳送至客戶容器的速率。如果此值設為 `1`，則無論客戶容器有多少工作者，一次都只會將 1 個請求傳送至容器。

## 問：如何在非同步端點偵錯模型伺服器錯誤 (500)？
<a name="async-troubleshooting-q8"></a>

這個錯誤意味著客戶容器傳回錯誤。SageMaker AI 不會控制客戶容器的行為。SageMaker AI 只會傳回 `ModelContainer` 的回應，而且不會重試。如果需要，您可以將調用設定為失敗時重試。建議您開啟容器記錄，並檢查容器日誌，找出模型 500 錯誤的根本原因。此外，也請在失敗點檢查相應的 `CPUUtilization` 和 `MemoryUtilization` 指標。您也可以將 [S3FailurePath](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_AsyncInferenceOutputConfig.html#sagemaker-Type-AsyncInferenceOutputConfig-S3FailurePath) 設定為 Amazon SNS 中的模型回應，做為非同步錯誤通知的一部分，調查失敗的原因。

## 問：我如何確知 `MaxConcurrentInvocationsPerInstance=1` 是否生效？ 是否有任何我可以查看的指標？
<a name="async-troubleshooting-q9"></a>

您可以查看指標 `InvocationsProcesssed`；該指標應與您希望根據單一並行在一分鐘內處理的調用次數一致。

## 問：如何追蹤調用請求的成功和失敗記錄？ 最佳實務為何？
<a name="async-troubleshooting-q10"></a>

最佳實務是啟用 Amazon SNS 這個訊息導向的應用程式通知服務，讓多個訂閱者利用各種傳輸通訊協定 (包括 HTTP、Amazon SQS 和電子郵件) 請求和接收時間關鍵訊息的 “推送” 通知。使用 `CreateEndpointConfig` 並指定 Amazon SNS 主題建立端點時，非同步推論會發布通知。

要使用 Amazon SNS 檢查異步終端節點的預測結果，首先需要建立一個主題、訂閱主題、確認您對主題的訂閱，並記下該主題的 Amazon Resource Name (ARN)。有關如何建立、訂閱和尋找 Amazon SNS 主題 Amazon ARN 的詳細資訊，請參閱 *Amazon SNS 開發人員指南*的[配置 Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-configuring.html)。如需如何搭配非同步推論使用 Amazon SNS 的更多資訊，請參閱[查看預測結果](https://docs.aws.amazon.com/sagemaker/latest/dg/async-inference-check-predictions.html)。

## 問：是否可以定義收到新請求後從零執行個體橫向擴展的擴展政策？
<a name="async-troubleshooting-q11"></a>

是。非同步推論提供一種機制，可在沒有請求時將執行個體縮減為零。如果您的端點在這些期間縮減為零執行個體，則在佇列中的請求數量超過擴展政策指定的目標之前，端點將不會再次橫向擴展。這樣一來，佇列中請求的等待時間可能很長。在這種情況下，如果您想針對小於指定佇列目標的新請求，從零執行個體縱向擴展，可以使用稱為 `HasBacklogWithoutCapacity` 的其他擴展政策。如需如何定義此擴展政策的更多資訊，請參閱[自動擴展非同步端點](https://docs.aws.amazon.com/sagemaker/latest/dg/async-inference-autoscale.html#async-inference-autoscale-scale-up)。

## 問：我收到非同步推論不支援執行個體類型的錯誤訊息。非同步推論支援哪些執行個體類型？
<a name="async-troubleshooting-q12"></a>

如需各區域非同步推論支援的執行個體詳盡清單，請參閱 [SageMaker 定價](https://aws.amazon.com/sagemaker/pricing/)。繼續之前，請檢查您所在區域是否提供所需的執行個體。