ローカルでのモデル デプロイを使用したトラブルシューティング
Azure Container Instances (ACI) または Azure Kubernetes Service (AKS) へのデプロイのトラブルシューティングの最初の手順として、ローカルでのモデル デプロイを試してください。 ローカルの Web サービスを使用すると、Azure Machine Learning の一般的な Docker Web サービスのデプロイ エラーを見つけて修正することがより簡単にできます。
前提条件
- Azure サブスクリプション。 無料版または有料版の Azure Machine Learning をお試しください。
- オプション A (推奨) - Azure Machine Learning コンピューティング インスタンスでローカルにデバッグする
- コンピューティング インスタンスが実行されている Azure Machine Learning ワークスペース
- オプション B - お使いのコンピューティングでローカルにデバッグする
- Azure Machine Learning SDK。
- Azure CLI。
- Azure Machine Learning 用 CLI 拡張機能。
- ローカル システムで動作する Docker インストールを使用します。
- Docker のインストールを確認するには、ターミナルまたはコマンド プロンプトからコマンド
docker run hello-world
を使用します。 Docker のインストール、または Docker のエラーのトラブルシューティングについては、Docker のドキュメントを参照してください。
- オプション C - Azure Machine Learning 推論 HTTP サーバーを使用したローカル デバッグを有効にします。
- Azure Machine Learning 推論 HTTP サーバーは、ローカルの開発環境で入力スクリプト (
score.py
) を簡単に検証できる Python パッケージです。 スコアリング スクリプトに問題がある場合、サーバーからエラーが返されます。 また、エラーが発生した場所も返されます。 - サーバーは、継続的インテグレーションとデプロイ パイプラインで検証ゲートを作成するときにも使用できます。 たとえば、候補のスクリプトでサーバーを起動し、ローカル エンドポイントに対してテスト スイートを実行します。
- Azure Machine Learning 推論 HTTP サーバーは、ローカルの開発環境で入力スクリプト (
Azure Machine Learning 推論 HTTP サーバー
ローカル推論サーバーを使用すると、エントリ スクリプト (score.py
) をすばやくデバッグできます。 基になるスコア スクリプトにバグがある場合、サーバーはモデルの初期化やサービスの提供に失敗します。 代わりに、例外と、問題が発生した場所がスローされます。 Azure Machine Learning 推論 HTTP サーバーの詳細
Pypi フィードから
azureml-inference-server-http
パッケージをインストールします。python -m pip install azureml-inference-server-http
サーバーを起動し、エントリ スクリプトとして
score.py
を設定します。azmlinfsrv --entry_script score.py
curl
を使用して、スコアリング要求をサーバーに送信します。curl -p 127.0.0.1:5001/score
注意
Azure machine learning 推論 HTTP サーバーに関する「よく寄せられる質問」をご覧ください。
ローカル デバッグ
MachineLearningNotebooks リポジトリにあるサンプルのローカル展開ノートブックから、実行可能な例を探索します。
警告
ローカル Web サービスのデプロイは、運用シナリオではサポートされていません。
ローカルにデプロイするには、LocalWebservice.deploy_configuration()
を使用してデプロイ構成を作成するようにコードを変更します。 次に、Model.deploy()
を使用して、サービスをデプロイします。 次の例では、モデル (モデル変数に含まれる) をローカル Web サービスとしてデプロイします。
適用対象: Python SDK azureml v1
from azureml.core.environment import Environment
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import LocalWebservice
# Create inference configuration based on the environment definition and the entry script
myenv = Environment.from_conda_specification(name="env", file_path="myenv.yml")
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)
# Create a local deployment, using port 8890 for the web service endpoint
deployment_config = LocalWebservice.deploy_configuration(port=8890)
# Deploy the service
service = Model.deploy(
ws, "mymodel", [model], inference_config, deployment_config)
# Wait for the deployment to complete
service.wait_for_deployment(True)
# Display the port that the web service is available on
print(service.port)
独自の conda 仕様 YAML を定義する場合、pip の依存関係として 1.0.45 以降のバージョンの azureml-defaults を列挙します。 このパッケージは、Web サービスとしてモデルをホストするために必要です。
この時点で、通常どおりにサービスを操作できます。 次のコードは、サービスにデータを送信する方法を示しています。
import json
test_sample = json.dumps({'data': [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
]})
test_sample = bytes(test_sample, encoding='utf8')
prediction = service.run(input_data=test_sample)
print(prediction)
Python 環境のカスタマイズの詳細については、トレーニングとデプロイのための環境の作成と管理に関するページを参照してください。
サービスの更新
ローカル テスト中に、ログ記録を追加したり、発見した問題の解決を試みるために、score.py
ファイルを更新する必要がある場合があります。 変更を score.py
ファイルに再度読み込むには、reload()
を使用します。 たとえば、次のコードは、サービスのスクリプトを再度読み込み、サービスにデータを送信します。 データは、更新された score.py
ファイルを使用してスコア付けされます。
重要
reload
メソッドは、ローカル デプロイでのみ使用できます。 デプロイを別のコンピューティング先に更新する方法については、Web サービスを更新する方法に関する記事を参照してください。
service.reload()
print(service.run(input_data=test_sample))
Note
スクリプトは、サービスによって使用される InferenceConfig
オブジェクトによって指定された場所から再度読み込まれます。
モデル、Conda の依存関係、またはデプロイ構成を変更するには、update() を使用します。 次の例では、サービスで使用されるモデルを更新します。
service.update([different_model], inference_config, deployment_config)
サービスの削除
サービスを削除するには、delete() を使用します。
Docker ログを確認する
サービス オブジェクトから詳細な Docker エンジン ログ メッセージを出力できます。 ACI、AKS、およびローカル デプロイのログを表示できます。 次の例は、ログを出力する方法を示しています。
# if you already have the service object handy
print(service.get_logs())
# if you only know the name of the service (note there might be multiple services with the same name but different version number)
print(ws.webservices['mysvc'].get_logs())
ログに Booting worker with pid: <pid>
の行が何度も表示されている場合、これはワーカーを起動するのに十分なメモリがないことを意味します。
このエラーを解決するには、deployment_config
にある memory_gb
の値を増やします
次のステップ
デプロイの詳細については、以下を参照してください。