ML Web サービス エンドポイントからのデータを監視および収集する

適用対象:Python SDK azureml v1

この記事では、Azure Kubernetes Service (AKS) または Azure Container Instances (ACI) で Web サービス エンドポイントにデプロイされたモデルからデータを収集する方法について説明します。 Azure Application Insights を使用して、エンドポイントから次のデータを収集します。

  • 出力データ
  • 応答
  • 要求率、応答時間、失敗率
  • 依存率、応答時間、失敗率
  • 例外

enable-app-insights-in-production-service.ipynb ノートブックは、この記事の概念を示しています。

ノートブックの実行方法については、Jupyter Notebook を使用してこのサービスを探索する方法に関するページを参照してください。

重要

この記事の情報は、ワークスペースで作成された Azure Application Insights インスタンスに依存しています。 この Application Insights インスタンスを削除した場合、ワークスペースを削除して再作成する以外に、再作成する方法はありません。

ヒント

代わりにオンライン エンドポイントを使用している場合は、代わりにオンライン エンドポイントの監視に関する記事の情報を使用してください。

前提条件

Python SDK を使用してログを構成する

このセクションでは、Python SDK を使用して Application Insights のログを有効にする方法について説明します。

デプロイされたサービスを更新する

既存の Web サービスを更新するには、次の手順に従います。

  1. ワークスペースで、サービスを特定します。 ws の値はワークスペースの名前です。

    from azureml.core.webservice import Webservice
    aks_service= Webservice(ws, "my-service-name")
    
  2. サービスを更新し、Azure Application Insights を有効にします。

    aks_service.update(enable_app_insights=True)
    

サービスのカスタム トレースをログに記録する

重要

Azure Application Insights では、最大 64 KB のペイロードのみがログに記録されます。 この制限に達すると、メモリ不足などのエラーが発生したり、情報がログに記録されないことがあります。 ログに記録するデータが 64 kb より大きい場合は、「実稼働環境でモデルのデータを収集する」の情報を使用して、Blob ストレージに格納する必要があります。

AKS デプロイ内でのモデル追跡などのより複雑な状況では、OpenCensus のようなサードパーティ製のライブラリを使用することをお勧めします。

カスタム トレースをログするには、デプロイする方法と場所のドキュメントにある AKS または ACI のための標準のデプロイ プロセスに従います。 次に、次の手順を使用します。

  1. 推論中に Application Insights にデータを送信するには、print ステートメントを追加してスコアリング ファイルを更新します。 要求データや応答などのより複雑な情報に対しては、JSON 構造体を使用してください。

    次の例では、score.py ファイルに、モデルが初期化された時刻、推論時の入力と出力、およびエラーが発生した時刻がログされます。

    import pickle
    import json
    import numpy 
    from sklearn.externals import joblib
    from sklearn.linear_model import Ridge
    from azureml.core.model import Model
    import time
    
    def init():
        global model
        #Print statement for appinsights custom traces:
        print ("model initialized" + time.strftime("%H:%M:%S"))
    
        # note here "sklearn_regression_model.pkl" is the name of the model registered under the workspace
        # this call should return the path to the model.pkl file on the local disk.
        model_path = Model.get_model_path(model_name = 'sklearn_regression_model.pkl')
    
        # deserialize the model file back into a sklearn model
        model = joblib.load(model_path)
    
    
    # note you can pass in multiple rows for scoring
    def run(raw_data):
        try:
            data = json.loads(raw_data)['data']
            data = numpy.array(data)
            result = model.predict(data)
            # Log the input and output data to appinsights:
            info = {
                "input": raw_data,
                "output": result.tolist()
                }
            print(json.dumps(info))
            # you can return any datatype as long as it is JSON-serializable
            return result.tolist()
        except Exception as e:
            error = str(e)
            print (error + time.strftime("%H:%M:%S"))
            return error
    
  2. サービス構成を更新し、Application Insights を有効にします。

    config = Webservice.deploy_configuration(enable_app_insights=True)
    
  3. イメージをビルドし、AKS または ACI にデプロイします。 詳しくは、デプロイする方法と場所に関するページをご覧ください。

Python で追跡を無効にする

Azure Application Insights を無効にするには、次のコードを使用します。

## replace <service_name> with the name of the web service
<service_name>.update(enable_app_insights=False)

Azure Machine Learning Studio を使用してログを構成する

Azure Machine Learning Studio から Azure Application Insights を有効にすることもできます。 モデルを Web サービスとしてデプロイする準備ができたら、次の手順に従って Application Insights を有効にします。

  1. https://ml.azure.com でスタジオにサインインします。

  2. [モデル] に移動し、デプロイするモデルを選択します。

  3. [+ デプロイ] を選択します。

  4. [モデルのデプロイ] フォームに入力します。

  5. [詳細設定] メニューを展開します。

    デプロイ フォーム

  6. [Application Insights の診断とデータ収集を有効にする] を選択します。

    App Insights を有効にする

メトリックとログを表示する

デプロイ済みモデルのログのクエリを実行する

オンライン エンドポイントのログは顧客データです。 get_logs() 関数を使用して、以前にデプロイした Web サービスからログを取得できます。 ログには、デプロイ中に発生したエラーに関する詳細情報が含まれている場合があります。

from azureml.core import Workspace
from azureml.core.webservice import Webservice

ws = Workspace.from_config()

# load existing web service
service = Webservice(name="service-name", workspace=ws)
logs = service.get_logs()

複数のテナントがある場合は、ws = Workspace.from_config() の前に次の認証コードを追加する必要が生じることがあります

from azureml.core.authentication import InteractiveLoginAuthentication
interactive_auth = InteractiveLoginAuthentication(tenant_id="the tenant_id in which your workspace resides")

スタジオでログを表示する

Azure Application Insights では、Azure Machine Learning ワークスペースと同じリソース グループにサービス ログが格納されます。 スタジオを使用してデータを表示するには、次の手順に従います。

  1. Studio の Azure Machine Learning ワークスペースに移動します。

  2. [エンドポイント] を選択します。

  3. デプロイされたサービスを選択します。

  4. Application Insights URL リンクを選択します。

    Application Insights URL を見つける

  5. Application Insights で、 [概要] タブまたは [監視] セクションから、 [ログ] を選択します。

    監視の [概要] タブ

  6. score.py ファイルからログに記録された情報を表示するには、traces テーブルを参照してください。 次のクエリは、input 値が記録されたログを検索しています。

    traces
    | where customDimensions contains "input"
    | limit 10
    

    トレース データ

Azure Application Insights の使用方法の詳細については、「Application Insights とは何か?」を参照してください。

Web サービスのメタデータと応答データ

重要

Azure Application Insights では、最大 64 KB のペイロードのみがログに記録されます。 この制限に達すると、メモリ不足などのエラーが発生したり、情報がログに記録されないことがあります。

Web サービスの要求情報をログするには、print ステートメントを score.py ファイルに追加します。 各 print ステートメントによって、メッセージ STDOUT の下の Application Insights トレース テーブルの 1 つのエントリになります。 Application Insights により、print ステートメントの出力が customDimensions および Contents トレース テーブルに格納されます。 JSON 文字列を出力すると、Contents の下のトレース出力に階層データ構造が生成されます。

保持と処理のためにデータをエクスポートする

重要

Azure Application Insights では、BLOB ストレージへのエクスポートのみがサポートされています。 この実装の制限の詳細については、App Insights からのテレメトリのエクスポートに関するページを参照してください。

Application Insights の連続エクスポートを使用して、保有期間の設定を定義できる BLOB ストレージ アカウントにデータをエクスポートします。 Application Insights では、データは JSON 形式でエクスポートされます。

連続エクスポート

次のステップ

この記事では、Web サービス エンドポイントのログを有効にし、ログを表示する方法について説明しました。 次のステップのために、以下の記事をご覧ください。