Amazon SageMaker エンドポイントの作成または更新が失敗した理由をトラブルシューティングしたいと考えています。
解決方法
SageMaker エンドポイントの作成または更新が失敗すると、SageMaker は失敗の理由を表示します。この理由を確認するには、次のいずれかのオプションを使用します。
- SageMaker コンソールでエンドポイントを確認します。失敗の理由はコンソールでレポートされます。
- AWS コマンドラインインターフェイス (AWS CLI) コマンド describe-endpoint を実行します。[FailureReason] フィールドで失敗の理由を確認します。
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
失敗の理由とその解決方法をいくつか次に示します。
エラーのため、リクエストされた ML コンピューティングキャパシティをプロビジョニングできません
エンドポイントを作成しようとすると、次のエラーが表示されることがあります。
Unable to provision requested ML compute capacity due to InsufficientInstanceCapacity error
このエラーは、エンドポイントのためにリクエストされたインスタンスをプロビジョニングするための十分なキャパシティが AWS にない場合に発生します。
このエラーは、次の 1 つ以上の方法を試すことで解決できます。
- キャパシティは頻繁に変化する場合があるため、数分待ってから再試行します。
- エンドポイントのために複数のインスタンスを使用している場合は、インスタンス数を少なくしてエンドポイントを作成してみてください。Auto Scaling が設定されている場合、SageMaker は必要に応じてキャパシティが許す限りスケールアップまたはスケールダウンできます。
- ワークロードをサポートする別のインスタンスタイプを試します。エンドポイントを作成したら、そのエンドポイントを希望するインスタンスタイプに更新します。SageMaker は可用性を最大化するためにブルー/グリーンデプロイメソッドを使用するため、現在の本番稼働環境のワークロードに影響を及ぼすことなく新しいインスタンスタイプに移行できます。
本番稼働用バリアント <variant> のコンテナが ping ヘルスチェックに合格しませんでした。このエンドポイントの CloudWatch ログを確認してください。
SageMaker エンドポイントに使用されるコンテナは、/invocations エンドポイントと /ping エンドポイントに応答するウェブサーバーを実装する必要があります。エンドポイントを作成すると、SageMaker はコンテナの起動後に /ping エンドポイントに定期的に GET リクエストを送信し始めます。
少なくとも、コンテナは HTTP 200 OK ステータスコードと空の本文で応答して、コンテナが推論リクエストを受け入れる準備ができていることを示す必要があります。このエラーは、SageMaker がコンテナの起動後 4 分以内にコンテナから一貫したレスポンスを得られない場合に発生します。エンドポイントがヘルスチェックに応答しないため、SageMaker はエンドポイントが正常であるとはみなしません。そのため、エンドポイントは [Failed] (失敗) とマークされます。
AWS Deep Learning Containers イメージのいずれかを使用すると、ヘルスチェックが失敗することもあります。これらのイメージは、TorchServe または Multi Model Server のいずれかを使用して、推論とヘルスチェック用の HTTP エンドポイントを実装するモデルを提供します。これらのフレームワークは、SageMaker に「200 OK」レスポンスで応答する前にモデルがロードされているかどうかを確認します。モデルがロードされたことをサーバーが認識できない場合、ヘルスチェックは失敗します。メモリの使用状況など、さまざまな理由でモデルがロードされない場合があります。対応するエラーメッセージは、エンドポイントの Amazon CloudWatch ログにログ記録されます。エンドポイントにロードされたコードが失敗の原因となった場合 (例えば、PyTorch の場合は model_fn)、エラーは AWS CloudTrail にログ記録されます。これらのログの詳細度を高めるには、モデルの SAGEMAKER_CONTAINER_LOG_LEVEL 環境変数を Python ログ記録のログレベルで更新します。
ヘルスチェックリクエストが成功するには、2 秒以内にレスポンスを受け取る必要があります。必ずモデルコンテナをローカルで起動し、コンテナに GET リクエストを送信してレスポンスを確認することによって、レスポンスをテストしてください。
コンテナのモデルデータアーカイブを抽出できませんでした
SageMaker は、モデルデータを含む TAR ファイルがエンドポイントで使用されることを想定しています。SageMaker が TAR ファイルをダウンロードすると、データアーカイブが抽出されます。このエラーは、SageMaker がこのデータアーカイブを抽出できない場合に発生する可能性があります。例えば、TAR ファイルにあるファイルへのシンボリックリンクがモデルアーティファクトに含まれている場合、SageMaker はデータアーカイブを抽出できません。
エンドポイントを作成するときは、モデルアーティファクトが TAR ファイル内にシンボリックリンクを含んでいないことを確認してください。TAR ファイルにシンボリックリンクが含まれているかどうかを確認するには、モデルデータを抽出し、アーティファクト内で以下のコマンドを実行します。
find . -type l -ls
このコマンドは、現在のディレクトリとそのサブディレクトリの検索を通じて見つけたすべてのシンボリックリンクを返します。返されたリンクをファイルの実際のコピーに置き換えます。
CannotStartContainerError
このエラーは、SageMaker が推論用に準備するためにコンテナを起動できなかった場合に発生します。
SageMaker がエンドポイントを起動すると、コンテナは次のコマンドで起動します。
docker run <image-id> serve
このコマンドが実行された場合、コンテナは処理プロセスを開始する必要があります。
このエラーを解決するには、SageMaker Python SDK のローカルモードを使用します。または、docker run コマンドを使用して推論イメージを実行してみてください。SageMaker Python SDK は、SageMaker エンドポイントと同様にモデルをロードします。ただし、モデルをロードするようにコマンドまたはコンテナを設定しない限り、Docker はモデルをロードしません。次のようなコマンドを使用して、モデルをローカルにロードできます。
docker run -v $(pwd)/test_dir:/opt/ml -p 8080:8080 --rm ${image} serve