Azure Machine Learning を使用してモデルをデプロイするDeploy models with Azure Machine Learning

Web サービスとして Azure クラウドに、または Azure IoT Edge デバイスに機械学習モデルをデプロイする方法を説明します。Learn how to deploy your machine learning model as a web service in the Azure cloud or to Azure IoT Edge devices.

モデルをどこにデプロイするかに関係なく、ワークフローは同様です。The workflow is similar no matter where you deploy your model:

  1. モデルを登録します。Register the model.
  2. デプロイの準備をします。Prepare to deploy. (アセット、用途、コンピューティング ターゲットを指定する)。(Specify assets, usage, compute target.)
  3. コンピューティング ターゲットにモデルをデプロイします。Deploy the model to the compute target.
  4. デプロイしたモデル (Web サービスとも呼ばれる) をテストします。Test the deployed model, also called a web service.

デプロイ ワークフローに関連する概念の詳細については、Azure Machine Learning でのモデルの管理、デプロイ、監視に関する記事を参照してください。For more information on the concepts involved in the deployment workflow, see Manage, deploy, and monitor models with Azure Machine Learning.

前提条件Prerequisites

ワークスペースに接続するConnect to your workspace

次のコードでは、ローカル開発環境にキャッシュされた情報を使用して Azure Machine Learning ワークスペースに接続する方法を示します。The following code shows how to connect to an Azure Machine Learning workspace by using information cached to the local development environment:

  • SDK を使用するUsing the SDK

    from azureml.core import Workspace
    ws = Workspace.from_config(path=".file-path/ws_config.json")
    

    SDK を使用してワークスペースに接続する方法の詳細については、Azure Machine Learning SDK for Python のドキュメントをご覧ください。For more information on using the SDK to connect to a workspace, see the Azure Machine Learning SDK for Python documentation.

  • CLI を使用するUsing the CLI

    CLI を使用するときは、-w パラメーターまたは --workspace-name パラメーターを使用して、コマンドのワークスペースを指定します。When using the CLI, use the -w or --workspace-name parameter to specify the workspace for the command.

  • VS コードを使用するUsing VS Code

    VS コードを使用する場合は、グラフィカル インターフェイスを使用してワークスペースを選択します。When you use VS Code, you select the workspace by using a graphical interface. 詳しくは、VS Code 拡張機能のドキュメントの「モデルを展開して管理する」をご覧ください。For more information, see Deploy and manage models in the VS Code extension documentation.

モデルを登録するRegister your model

登録済みモデルは、モデルを構成する 1 つまたは複数のファイルの論理コンテナーです。A registered model is a logical container for one or more files that make up your model. たとえば、複数のファイルに格納されているモデルがある場合は、ワークスペースに単一モデルとしてそれらを登録できます。For example, if you have a model that's stored in multiple files, you can register them as a single model in the workspace. ファイルの登録後は、その登録済みモデルをダウンロードするかデプロイし、登録されたすべてのファイルを受信できます。After you register the files, you can then download or deploy the registered model and receive all the files that you registered.

ヒント

モデルを登録するときは、(トレーニングの実行から) クラウドの場所またはローカル ディレクトリのパスを指定します。When you register a model, you provide the path of either a cloud location (from a training run) or a local directory. このパスは、登録プロセスの一部としてアップロードするファイルを見つけるためだけのものです。This path is just to locate the files for upload as part of the registration process. エントリ スクリプトで使用されるパスと一致する必要はありません。It doesn't need to match the path used in the entry script. 詳細については、「エントリ スクリプトでモデル ファイルを検索する」を参照してください。For more information, see Locate model files in your entry script.

機械学習モデルをご使用の Azure Machine Learning ワークスペースに登録します。Machine learning models are registered in your Azure Machine Learning workspace. これらのモデルは、Azure Machine Learning から取得することも、どこか他の場所から取得することもできます。The model can come from Azure Machine Learning or from somewhere else. 次の例では、モデルを登録する方法を示します。The following examples demonstrate how to register a model.

実験の実行からモデルを登録するRegister a model from an experiment run

このセクションのコード スニペットでは、トレーニング実行からモデルを登録する方法が示されています。The code snippets in this section demonstrate how to register a model from a training run:

重要

これらのスニペットを使用するには、以前にトレーニング実行を行ったことがあり、Run オブジェクト (SDK の例) または実行 ID の値 (CLI の例) にアクセスできることが必要です。To use these snippets, you need to have previously performed a training run and you need to have access to the Run object (SDK example) or the run ID value (CLI example). トレーニング モデルの詳細については、モデルのトレーニング用のコンピューティング先の設定に関する記事をご覧ください。For more information on training models, see Set up compute targets for model training.

  • SDK を使用するUsing the SDK

    SDK を使用してモデルをトレーニングする場合、モデルのトレーニング方法に応じて、Run オブジェクトまたは AutoMLRun オブジェクトのいずれかを受け取ることができます。When you use the SDK to train a model, you can receive either a Run object or an AutoMLRun object, depending on how you trained the model. 各オブジェクトは、実験の実行によって作成されたモデルを登録するために使用できます。Each object can be used to register a model created by an experiment run.

    • azureml.core.Run オブジェクトからモデルを登録するRegister a model from an azureml.core.Run object:

      model = run.register_model(model_name='sklearn_mnist', model_path='outputs/sklearn_mnist_model.pkl')
      print(model.name, model.id, model.version, sep='\t')
      

      model_path パラメーターは、クラウドでのモデルの場所を示します。The model_path parameter refers to the cloud location of the model. この例では、1 つのファイルへのパスが使用されます。In this example, the path of a single file is used. モデルの登録に複数のファイルを含めるには、model_path を、それらのファイルが含まれているフォルダーのパスに設定します。To include multiple files in the model registration, set model_path to the path of a folder that contains the files. 詳細については、Run.register_model のドキュメントを参照してください。For more information, see the Run.register_model documentation.

    • azureml.train.automl.run.AutoMLRun オブジェクトからモデルを登録するRegister a model from an azureml.train.automl.run.AutoMLRun object:

          description = 'My AutoML Model'
          model = run.register_model(description = description)
      
          print(run.model_id)
      

      この例では、metric パラメーターと iteration パラメーターが指定されていません。これにより、最適なプライマリ メトリックを持つイテレーションが登録されます。In this example, the metric and iteration parameters aren't specified, so the iteration with the best primary metric will be registered. 実行から返された model_id 値がモデル名の代わりに使用されます。The model_id value returned from the run is used instead of a model name.

      詳細については、AutoMLRun.register_model のドキュメントを参照してください。For more information, see the AutoMLRun.register_model documentation.

  • CLI を使用するUsing the CLI

    az ml model register -n sklearn_mnist  --asset-path outputs/sklearn_mnist_model.pkl  --experiment-name myexperiment --run-id myrunid
    

    ヒント

    ml 拡張機能がインストールされていないというエラー メッセージを受け取った場合は、次のコマンドを使用してインストールしてください。If you get an error message stating that the ml extension isn't installed, use the following command to install it:

    az extension add -n azure-cli-ml
    

    --asset-path パラメーターは、クラウドでのモデルの場所を示します。The --asset-path parameter refers to the cloud location of the model. この例では、1 つのファイルへのパスが使用されます。In this example, the path of a single file is used. モデルの登録に複数のファイルを含めるには、--asset-path を、それらのファイルが含まれているフォルダーのパスに設定します。To include multiple files in the model registration, set --asset-path to the path of a folder that contains the files.

  • VS コードを使用するUsing VS Code

    VS コード拡張機能を使用して、任意のモデル ファイルまたはフォルダーを使用してモデルを登録します。Register models using any model files or folders by using the VS Code extension.

ローカル ファイルからモデルを登録するRegister a model from a local file

モデルのローカル パスを指定することで、モデルを登録できます。You can register a model by providing the local path of the model. フォルダーまたは 1 個のファイルのパスのいずれかを指定できます。You can provide the path of either a folder or a single file. この方法を使用すると、Azure Machine Learning でトレーニングされてからダウンロードされたモデルを登録できます。You can use this method to register models trained with Azure Machine Learning and then downloaded. この方法を使用して、Azure Machine Learning の外部でトレーニングされたモデルを登録することもできます。You can also use this method to register models trained outside of Azure Machine Learning.

重要

自分で作成したモデルまたは信頼できるソースから取得したモデルのみを使用する必要があります。You should use only models that you create or obtain from a trusted source. 多数の一般的な形式でセキュリティの脆弱性が発見されているため、シリアル化されたモデルはコードとして扱う必要があります。You should treat serialized models as code, because security vulnerabilities have been discovered in a number of popular formats. また、偏りのある出力や不正確な出力を提供するように、モデルが悪意のある目的で意図的にトレーニングされる場合もあります。Also, models might be intentionally trained with malicious intent to provide biased or inaccurate output.

  • SDK と ONNX の使用Using the SDK and ONNX

    import os
    import urllib.request
    from azureml.core.model import Model
    # Download model
    onnx_model_url = "https://www.cntk.ai/OnnxModels/mnist/opset_7/mnist.tar.gz"
    urllib.request.urlretrieve(onnx_model_url, filename="mnist.tar.gz")
    os.system('tar xvzf mnist.tar.gz')
    # Register model
    model = Model.register(workspace = ws,
                            model_path ="mnist/model.onnx",
                            model_name = "onnx_mnist",
                            tags = {"onnx": "demo"},
                            description = "MNIST image classification CNN from ONNX Model Zoo",)
    

    モデルの登録に複数のファイルを含めるには、model_path を、それらのファイルが含まれているフォルダーのパスに設定します。To include multiple files in the model registration, set model_path to the path of a folder that contains the files.

  • CLI を使用するUsing the CLI

    az ml model register -n onnx_mnist -p mnist/model.onnx
    

    モデルの登録に複数のファイルを含めるには、-p を、それらのファイルが含まれているフォルダーのパスに設定します。To include multiple files in the model registration, set -p to the path of a folder that contains the files.

推定所要時間: 約 10 秒。Time estimate: Approximately 10 seconds.

詳細については、Model クラスのドキュメントを参照してください。For more information, see the documentation for the Model class.

Azure Machine Learning 以外でトレーニングされたモデルの使用の詳細については、既存のモデルをデプロイする方法に関する記事を参照してください。For more information on working with models trained outside Azure Machine Learning, see How to deploy an existing model.

コンピューティング ターゲットを選択するChoose a compute target

次のコンピューティング ターゲット、またはコンピューティング リソースを使用して、Web サービスのデプロイをホストできます。You can use the following compute targets, or compute resources, to host your web service deployment:

コンピューティング ターゲットCompute target 使用対象Used for GPU のサポートGPU support FPGA のサポートFPGA support 説明Description
ローカル  Web  サービスLocal web service テスト/デバッグTesting/debugging     制限付きのテストとトラブルシューティングに使用。Use for limited testing and troubleshooting. ハードウェア アクセラレーションは、ローカル システムでのライブラリの使用に依存します。Hardware acceleration depends on use of libraries in the local system.
Notebook VM Web サービスNotebook VM web service テスト/デバッグTesting/debugging     制限付きのテストとトラブルシューティングに使用。Use for limited testing and troubleshooting.
Azure Kubernetes Service (AKS)Azure Kubernetes Service (AKS) リアルタイムの推論Real-time inference はい (Web サービスのデプロイ)Yes (web service deployment) はいYes 高スケールの運用デプロイに使用。Use for high-scale production deployments. 高速な応答時間と、デプロイされたサービスの自動スケールを提供します。Provides fast response time and autoscaling of the deployed service. Azure Machine Learning SDK では、クラスターの自動スケールはサポートされていません。Cluster autoscaling isn't supported through the Azure Machine Learning SDK. AKS クラスター内のノードを変更するには、Azure portal でお使いの AKS クラスター用の UI を使用します。To change the nodes in the AKS cluster, use the UI for your AKS cluster in the Azure portal. AKS は、ビジュアル インターフェイスに使用できる唯一のオプションです。AKS is the only option available for the visual interface.
Azure Container InstancesAzure Container Instances テストまたは開発Testing or development     必要な RAM が 48 GB より少ない低スケール CPU ベース ワークロードに使用。Use for low-scale CPU-based workloads that require less than 48 GB of RAM.
Azure Machine Learning コンピューティングAzure Machine Learning Compute (プレビュー) バッチ  推論(Preview) Batch inference はい (機械学習パイプライン)Yes (machine learning pipeline)   サーバーレス コンピューティングでバッチ スコアリングを実行します。Run batch scoring on serverless compute. 優先順位が中程度または低い VM をサポートします。Supports normal and low-priority VMs.
Azure IoT EdgeAzure IoT Edge (プレビュー) IoT  モジュール(Preview) IoT module     IoT デバイスに ML モデルをデプロイし、サービスを提供します。Deploy and serve ML models on IoT devices.
Azure Data Box EdgeAzure Data Box Edge IoT Edge を使用Via IoT Edge   はいYes IoT デバイスに ML モデルをデプロイし、サービスを提供します。Deploy and serve ML models on IoT devices.

注意

ローカル、Notebook VM、Azure Machine Learning コンピューティングなどのコンピューティング先はトレーニングと実験のために GPU をサポートしていますが、Web サービスとしてデプロイされるとき、推論に GPU を使用することは、Azure Kubernetes Service でのみサポートされています。Although compute targets like local, Notebook VM, and Azure Machine Learning Compute support GPU for training and experimentation, using GPU for inference when deployed as a web service is supported only on Azure Kubernetes Service.

機械学習パイプラインでスコアリングするとき、推論に GPU を使用することは、Azure Machine Learning コンピューティングでのみサポートされます。Using a GPU for inference when scoring with a machine learning pipeline is supported only on Azure Machine Learning Compute.

デプロイを準備するPrepare to deploy

モデルをデプロイするには、次のものが必要です。To deploy the model, you need the following items:

  • エントリ スクリプトAn entry script. このスクリプトは、要求を受け入れ、モデルを使用してその要求にスコアを付け、その結果を返します。This script accepts requests, scores the requests by using the model, and returns the results.

    重要

    • エントリ スクリプトは、モデルに固有のものです。The entry script is specific to your model. このスクリプトでは、受信要求データの形式、モデルで想定されるデータの形式、およびクライアントに返されるデータの形式が認識されている必要があります。It must understand the format of the incoming request data, the format of the data expected by your model, and the format of the data returned to clients.

      要求データがモデルで使用できない形式である場合、スクリプトで受け入れ可能な形式に変換できます。If the request data is in a format that's not usable by your model, the script can transform it into an acceptable format. また、応答をクライアントに返す前に変換することもできます。It can also transform the response before returning it to the client.

    • Azure Machine Learning SDK には、データストアまたはデータセットにアクセスするための Web サービスまたは IoT Edge のデプロイの手段は用意されていません。The Azure Machine Learning SDK doesn't provide a way for web services or IoT Edge deployments to access your data store or datasets. デプロイしたモデルが、デプロイの外部に格納されているデータ (Azure Storage アカウントのデータなど) にアクセスする必要がある場合、関連する SDK を使用してカスタム コード ソリューションを開発する必要があります。If your deployed model needs to access data stored outside the deployment, like data in an Azure storage account, you must develop a custom code solution by using the relevant SDK. たとえば、Azure Storage SDK for Python です。For example, the Azure Storage SDK for Python.

      シナリオに適したもう 1 つの方法としてバッチ予測があります。これにより、スコアリング時にデータストアにアクセスできます。An alternative that might work for your scenario is batch prediction, which does provide access to data stores during scoring.

  • 依存関係。エントリ スクリプトまたはモデルを実行するために必要なヘルパー スクリプトや Python/Conda パッケージなど。Dependencies, like helper scripts or Python/Conda packages required to run the entry script or model.

  • デプロイされたモデルをホストするコンピューティング先のデプロイ構成The deployment configuration for the compute target that hosts the deployed model. この構成には、モデルの実行に必要なメモリと CPU の要件などが記述されます。This configuration describes things like memory and CPU requirements needed to run the model.

これらの項目は、推論構成デプロイ構成にカプセル化されます。These items are encapsulated into an inference configuration and a deployment configuration. 推論構成では、エントリ スクリプトとその他の依存関係が参照されます。The inference configuration references the entry script and other dependencies. これらの構成は、SDK を使用してデプロイを実行するときにプログラムによって定義します。You define these configurations programmatically when you use the SDK to perform the deployment. これらは、CLI を使用するときに JSON ファイルで定義します。You define them in JSON files when you use the CLI.

1.エントリ スクリプトと依存関係を定義する1. Define your entry script and dependencies

エントリ スクリプトは、デプロイされた Web サービスに送信されたデータを受け取り、それをモデルに渡します。The entry script receives data submitted to a deployed web service and passes it to the model. 次に、モデルから返された応答を受け取り、それをクライアントに返します。It then takes the response returned by the model and returns that to the client. このスクリプトはこのモデルに固有のものですThe script is specific to your model. そのため、モデルが受け入れ、返すデータを認識する必要があります。It must understand the data that the model expects and returns.

このスクリプトにはモデルの読み込みと実行の 2 つの関数が含まれています。The script contains two functions that load and run the model:

  • init():通常は、この関数によってモデルがグローバル オブジェクトに読み込まれます。init(): Typically, this function loads the model into a global object. この関数は、Web サービスの Docker コンテナーの起動時に 1 回だけ実行されます。This function is run only once, when the Docker container for your web service is started.

  • run(input_data):この関数では、モデルを使用して、入力データに基づいて値が予測されます。run(input_data): This function uses the model to predict a value based on the input data. 実行の入力と出力は、通常、JSON を使用してシリアル化およびシリアル化解除が実行されます。Inputs and outputs of the run typically use JSON for serialization and deserialization. また、未加工のバイナリ データも使用できます。You can also work with raw binary data. モデルに送信する前、またはクライアントに返す前のデータを変換できます。You can transform the data before sending it to the model or before returning it to the client.

エントリ スクリプトでモデル ファイルを検索するLocate model files in your entry script

エントリ スクリプトでモデルを検索するには、次の 2 つの方法があります。There are two ways to locate models in your entry script:

  • AZUREML_MODEL_DIR:モデルの場所へのパスを含む環境変数。AZUREML_MODEL_DIR: An environment variable containing the path to the model location.
  • Model.get_model_path:登録されているモデル名を使用してモデル ファイルへのパスを返す API。Model.get_model_path: An API that returns the path to model file using the registered model name.
AZUREML_MODEL_DIRAZUREML_MODEL_DIR

AZUREML_MODEL_DIR は、サービスのデプロイ中に作成される環境変数です。AZUREML_MODEL_DIR is an environment variable created during service deployment. この環境変数を使用して、デプロイされたモデルの場所を見つけることができます。You can use this environment variable to find the location of the deployed model(s).

次の表では、デプロイされるモデルの数に応じて、AZUREML_MODEL_DIR の値について説明します。The following table describes the value of AZUREML_MODEL_DIR depending on the number of models deployed:

DeploymentDeployment 環境変数の値Environment variable value
単一モデルSingle model モデルを含むフォルダーへのパス。The path to the folder containing the model.
複数のモデルMultiple models すべてのモデルを含むフォルダーへのパス。The path to the folder containing all models. モデルは、このフォルダー ($MODEL_NAME/$VERSION) で名前とバージョンによって検索されますModels are located by name and version in this folder ($MODEL_NAME/$VERSION)

モデル内のファイルへのパスを取得するには、環境変数を探しているファイル名と組み合わせます。To get the path to a file in a model, combine the environment variable with the filename you're looking for. モデル ファイルのファイル名は、登録時とデプロイ時に保持されます。The filenames of the model files are preserved during registration and deployment.

単一モデルの例Single model example

model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_regression_model.pkl')

複数のモデルの例Multiple model example

model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_model/1/sklearn_regression_model.pkl')
get_model_pathget_model_path

モデルを登録するときに、レジストリ内のモデルを管理するために使用されるモデル名を指定します。When you register a model, you provide a model name that's used for managing the model in the registry. この名前は、ローカル ファイル システム上のモデル ファイルのパスを取得する Model.get_model_path() メソッドで使用します。You use this name with the Model.get_model_path() method to retrieve the path of the model file or files on the local file system. フォルダーまたはファイルのコレクションを登録した場合、この API では、これらのファイルを含むディレクトリのパスが返されます。If you register a folder or a collection of files, this API returns the path of the directory that contains those files.

モデルを登録する場合は名前を指定します。When you register a model, you give it a name. この名前は、モデルがローカルにデプロイされるか、またはサービスのデプロイ時に配置されるときの場所に対応します。The name corresponds to where the model is placed, either locally or during service deployment.

重要

自動機械学習を使用してモデルをトレーニングした場合、モデル名として model_id 値が使用されます。If you used automated machine learning to train a model, a model_id value is used as the model name. 自動機械学習でトレーニングされたモデルを登録してデプロイする例については、GitHub の「Azure/MachineLearningNotebooks」を参照してください。For an example of registering and deploying a model trained with automated machine learning, see Azure/MachineLearningNotebooks on GitHub.

下の例では (sklearn_mnist という名前で登録された) sklearn_mnist_model.pkl という名前の単一のファイルのパスが返されます。The following example will return a path to a single file called sklearn_mnist_model.pkl (which was registered with the name sklearn_mnist):

model_path = Model.get_model_path('sklearn_mnist')

(省略可能) スキーマの自動生成(Optional) Automatic schema generation

Web サービスのスキーマを自動生成するには、定義された型オブジェクトのいずれかのコンストラクターに入力や出力のサンプルを指定します。To automatically generate a schema for your web service, provide a sample of the input and/or output in the constructor for one of the defined type objects. 型とサンプルはスキーマを自動作成するために使用されます。The type and sample are used to automatically create the schema. その後、Azure Machine Learning によって、デプロイ中に、Web サービスの OpenAPI (Swagger) 仕様が作成されます。Azure Machine Learning then creates an OpenAPI (Swagger) specification for the web service during deployment.

現在サポートされている型は次のとおりです。These types are currently supported:

  • pandas
  • numpy
  • pyspark
  • 標準的な Python オブジェクトStandard Python object

スキーマ生成を使用するには、Conda 環境ファイルに inference-schema パッケージを追加します。To use schema generation, include the inference-schema package in your Conda environment file.

依存関係ファイルの例Example dependencies file

次の YAML は、推論のための Conda 依存関係ファイルの例です。The following YAML is an example of a Conda dependencies file for inference:

name: project_environment
dependencies:
  - python=3.6.2
  - pip:
    - azureml-defaults
    - scikit-learn==0.20.0
    - inference-schema[numpy-support]

自動スキーマ生成を使用する場合、エントリ スクリプトで inference-schema パッケージをインポートする必要があります。If you want to use automatic schema generation, your entry script must import the inference-schema packages.

変数 input_sampleoutput_sample で入力と出力のサンプル形式を定義します。これは Web サービスの要求と応答の形式を表します。Define the input and output sample formats in the input_sample and output_sample variables, which represent the request and response formats for the web service. これらのサンプルを、run() 関数の入力と出力の関数デコレーターで使用します。Use these samples in the input and output function decorators on the run() function. 下の scikit-learn の例では、スキーマ生成が使用されています。The following scikit-learn example uses schema generation.

エントリ スクリプトの例Example entry script

次の例では、JSON データを受け取り、返す方法が示されています。The following example demonstrates how to accept and return JSON data:

#Example: scikit-learn and Swagger
import json
import numpy as np
import os
from sklearn.externals import joblib
from sklearn.linear_model import Ridge

from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType


def init():
    global model
    # AZUREML_MODEL_DIR is an environment variable created during deployment. Join this path with the filename of the model file.
    # It holds the path to the directory that contains the deployed model (./azureml-models/$MODEL_NAME/$VERSION).
    # If there are multiple models, this value is the path to the directory containing all deployed models (./azureml-models).
    # Alternatively: model_path = Model.get_model_path('sklearn_mnist')
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_mnist_model.pkl')
    # Deserialize the model file back into a sklearn model
    model = joblib.load(model_path)


input_sample = np.array([[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]])
output_sample = np.array([3726.995])


@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

次の例では、DataFrame を使用して、<key: value> ディクショナリとして入力データを定義する方法を示しています。The following example demonstrates how to define the input data as a <key: value> dictionary by using a DataFrame. このメソッドは、Power BI からデプロイされた Web サービスを使用するためにサポートされています。This method is supported for consuming the deployed web service from Power BI. (詳細については、Power BI から Web サービスを使用する方法に関するページを参照してください。)(Learn more about how to consume the web service from Power BI.)

import json
import pickle
import numpy as np
import pandas as pd
import azureml.train.automl
from sklearn.externals import joblib
from azureml.core.model import Model

from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.parameter_types.pandas_parameter_type import PandasParameterType


def init():
    global model
    # Replace filename if needed.
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'model_file.pkl')
    # Deserialize the model file back into a sklearn model.
    model = joblib.load(model_path)


input_sample = pd.DataFrame(data=[{
    # This is a decimal type sample. Use the data type that reflects this column in your data.
    "input_name_1": 5.1,
    # This is a string type sample. Use the data type that reflects this column in your data.
    "input_name_2": "value2",
    # This is an integer type sample. Use the data type that reflects this column in your data.
    "input_name_3": 3
}])

# This is an integer type sample. Use the data type that reflects the expected result.
output_sample = np.array([0])


@input_schema('data', PandasParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

他の例については、次のスクリプトをご覧ください。For more examples, see the following scripts:

バイナリ データBinary data

モデルがバイナリ データ (画像など) を受け入れる場合は、デプロイで使用される score.py ファイルを生の HTTP 要求を受け入れるように変更する必要があります。If your model accepts binary data, like an image, you must modify the score.py file used for your deployment to accept raw HTTP requests. 生データを受け入れるには、エントリ スクリプトで AMLRequest クラスを使用して、@rawhttp デコレーターを run() 関数に追加します。To accept raw data, use the AMLRequest class in your entry script and add the @rawhttp decorator to the run() function.

バイナリ データを受け付ける score.py の例を次に示します。Here's an example of a score.py that accepts binary data:

from azureml.contrib.services.aml_request import AMLRequest, rawhttp
from azureml.contrib.services.aml_response import AMLResponse


def init():
    print("This is init()")


@rawhttp
def run(request):
    print("This is run()")
    print("Request: [{0}]".format(request))
    if request.method == 'GET':
        # For this example, just return the URL for GETs.
        respBody = str.encode(request.full_path)
        return AMLResponse(respBody, 200)
    elif request.method == 'POST':
        reqBody = request.get_data(False)
        # For a real-world solution, you would load the data from reqBody
        # and send it to the model. Then return the response.

        # For demonstration purposes, this example just returns the posted data as the response.
        return AMLResponse(reqBody, 200)
    else:
        return AMLResponse("bad request", 500)

重要

AMLRequest クラスは azureml.contrib 名前空間にあります。The AMLRequest class is in the azureml.contrib namespace. この名前空間内のエンティティは、このサービスが改善されるに従って頻繁に変更されます。Entities in this namespace change frequently as we work to improve the service. この名前空間内のものはすべて、Microsoft によって完全にはサポートされていないプレビューとして見なす必要があります。Anything in this namespace should be considered a preview that's not fully supported by Microsoft.

これをローカルの開発環境でテストする必要がある場合は、次のコマンドを使用して、コンポーネントをインストールできます。If you need to test this in your local development environment, you can install the components by using the following command:

pip install azureml-contrib-services

クロスオリジン リソース共有 (CORS)Cross-origin resource sharing (CORS)

クロスオリジン リソース共有を使用すると、Web ページ上のリソースを他のドメインから要求することができます。Cross-origin resource sharing is a way to allow resources on a web page to be requested from another domain. CORS は、クライアント要求で送信され、サービス応答で返される HTTP ヘッダーを使用して機能します。CORS works via HTTP headers sent with the client request and returned with the service response. CORS と有効なヘッダーについて詳しくは、Wikipedia のクロスオリジン リソース共有に関する説明を参照してください。For more information on CORS and valid headers, see Cross-origin resource sharing in Wikipedia.

CORS をサポートするようにモデル デプロイを構成するには、エントリ スクリプトで AMLResponse クラスを使用します。To configure your model deployment to support CORS, use the AMLResponse class in your entry script. このクラスを使用すると、応答オブジェクトにヘッダーを設定できます。This class allows you to set the headers on the response object.

次の例では、エントリ スクリプトから応答に対して Access-Control-Allow-Origin ヘッダーを設定しています。The following example sets the Access-Control-Allow-Origin header for the response from the entry script:

from azureml.contrib.services.aml_response import AMLResponse

def init():
    print("This is init()")

def run(request):
    print("This is run()")
    print("Request: [{0}]".format(request))
    if request.method == 'GET':
        # For this example, just return the URL for GETs.
        respBody = str.encode(request.full_path)
        return AMLResponse(respBody, 200)
    elif request.method == 'POST':
        reqBody = request.get_data(False)
        # For a real-world solution, you would load the data from reqBody
        # and send it to the model. Then return the response.

        # For demonstration purposes, this example
        # adds a header and returns the request body.
        resp = AMLResponse(reqBody, 200)
        resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
        return resp
    else:
        return AMLResponse("bad request", 500)

重要

AMLResponse クラスは azureml.contrib 名前空間にあります。The AMLResponse class is in the azureml.contrib namespace. この名前空間内のエンティティは、このサービスが改善されるに従って頻繁に変更されます。Entities in this namespace change frequently as we work to improve the service. この名前空間内のものはすべて、Microsoft によって完全にはサポートされていないプレビューとして見なす必要があります。Anything in this namespace should be considered a preview that's not fully supported by Microsoft.

これをローカルの開発環境でテストする必要がある場合は、次のコマンドを使用して、コンポーネントをインストールできます。If you need to test this in your local development environment, you can install the components by using the following command:

pip install azureml-contrib-services

2.InferenceConfig を定義する2. Define your InferenceConfig

推論構成では、予測するモデルを構成する方法が説明されます。The inference configuration describes how to configure the model to make predictions. この構成は、エントリ スクリプトの一部ではありません。This configuration isn't part of your entry script. これは、エントリ スクリプトを参照し、デプロイに必要なすべてのリソースを検索するために使用されます。It references your entry script and is used to locate all the resources required by the deployment. これは後でモデルをデプロイするときに使用されます。It's used later, when you deploy the model.

推論構成は Azure Machine Learning 環境を使用して、デプロイに必要なソフトウェアの依存関係を定義できます。Inference configuration can use Azure Machine Learning environments to define the software dependencies needed for your deployment. 環境では、トレーニングとデプロイに必要なソフトウェアの依存関係を作成、管理、再利用することができます。Environments allow you to create, manage, and reuse the software dependencies required for training and deployment. 次の例で、ワークスペースから環境を読み込み、推論構成でそれを使用する方法を示します。The following example demonstrates loading an environment from your workspace and then using it with the inference configuration:

from azureml.core import Environment
from azureml.core.model import InferenceConfig

deploy_env = Environment.get(workspace=ws,name="myenv",version="1")
inference_config = InferenceConfig(entry_script="x/y/score.py",
                                   environment=deploy_env)

環境の詳細については、トレーニングとデプロイのための環境の作成と管理に関する記事を参照してください。For more information on environments, see Create and manage environments for training and deployment.

環境を使用せずに、依存関係を直接指定することもできます。You can also directly specify the dependencies without using an environment. 次の例では、Conda ファイルからソフトウェアの依存関係を読み込む推論構成を作成する方法を示します。The following example demonstrates how to create an inference configuration that loads software dependencies from a Conda file:

from azureml.core.model import InferenceConfig

inference_config = InferenceConfig(runtime="python",
                                   entry_script="x/y/score.py",
                                   conda_file="env/myenv.yml")

詳細については、InferenceConfig クラスのドキュメントを参照してください。For more information, see the InferenceConfig class documentation.

推論構成を利用したカスタム Docker イメージの使用については、カスタム Docker イメージを使用してモデルをデプロイする方法に関するページを参照してください。For information on using a custom Docker image with an inference configuration, see How to deploy a model using a custom Docker image.

InferenceConfig の CLI の例CLI example of InferenceConfig

inferenceconfig.json ドキュメント内のエントリは、InferenceConfig クラスのパラメーターにマップされます。The entries in the inferenceconfig.json document map to the parameters for the InferenceConfig class. 次の表は、JSON ドキュメントのエントリとメソッド用パラメーターの間のマッピングについてまとめたものです。The following table describes the mapping between entities in the JSON document and the parameters for the method:

JSON エンティティJSON entity メソッド パラメーターMethod parameter 説明Description
entryScript entry_script イメージに対して実行するコードを含むローカル ファイルのパス。Path to a local file that contains the code to run for the image.
runtime runtime イメージに使用するランタイム。Which runtime to use for the image. 現在サポートされているランタイムは spark-pypython です。Current supported runtimes are spark-py and python.
condaFile conda_file 省略可能。Optional. イメージに使用する Conda 環境定義を含むローカル ファイルのパス。Path to a local file that contains a Conda environment definition to use for the image.
extraDockerFileSteps extra_docker_file_steps 省略可能。Optional. イメージを設定するときに実行する追加の Docker 手順を含むローカル ファイルのパス。Path to a local file that contains additional Docker steps to run when setting up the image.
sourceDirectory source_directory 省略可能。Optional. イメージを作成するためのファイルをすべて含むフォルダーのパス。Path to folders that contain all files to create the image.
enableGpu enable_gpu 省略可能。Optional. イメージで GPU サポートを有効にするかどうか。Whether to enable GPU support in the image. GPU イメージは、Azure Container Instances、Azure Machine Learning コンピューティング、Azure Virtual Machines、Azure Kubernetes Service などの Azure サービス上で使用する必要があります。The GPU image must be used on an Azure service, like Azure Container Instances, Azure Machine Learning Compute, Azure Virtual Machines, and Azure Kubernetes Service. 既定値は False です。The default is False.
baseImage base_image 省略可能。Optional. 基本イメージとして使用するカスタム イメージ。Custom image to be used as a base image. 基本イメージが指定されていない場合、イメージは指定されたランタイム パラメーターに基づきます。If no base image is provided, the image will be based on the provided runtime parameter.
baseImageRegistry base_image_registry 省略可能。Optional. 基本イメージを含むイメージ レジストリ。Image registry that contains the base image.
cudaVersion cuda_version 省略可能。Optional. GPU のサポートが必要なイメージにインストールする CUDA のバージョン。Version of CUDA to install for images that need GPU support. GPU イメージは、Azure Container Instances、Azure Machine Learning コンピューティング、Azure Virtual Machines、Azure Kubernetes Service などの Azure サービス上で使用する必要があります。The GPU image must be used on an Azure service, like Azure Container Instances, Azure Machine Learning Compute, Azure Virtual Machines, and Azure Kubernetes Service. サポートされているバージョンは 9.0、9.1、10.0 です。Supported versions are 9.0, 9.1, and 10.0. enable_gpu が設定されている場合、既定値は 9.1 です。If enable_gpu is set, the default is 9.1.
description description イメージの説明。A description for the image.

次の JSON は、CLI で使用する推論構成の例です。The following JSON is an example inference configuration for use with the CLI:

{
    "entryScript": "score.py",
    "runtime": "python",
    "condaFile": "myenv.yml",
    "extraDockerfileSteps": null,
    "sourceDirectory": null,
    "enableGpu": false,
    "baseImage": null,
    "baseImageRegistry": null
}

次のコマンドでは、CLI を使用してモデルをデプロイする方法を示します。The following command demonstrates how to deploy a model by using the CLI:

az ml model deploy -n myservice -m mymodel:1 --ic inferenceconfig.json

この例では、構成で次の設定が指定されています。In this example, the configuration specifies the following settings:

  • このモデルには Python が必要であるということ。That the model requires Python.
  • エントリ スクリプト。デプロイされたサービスに送信される Web 要求の処理に必要です。The entry script, which is used to handle web requests sent to the deployed service.
  • 推論を行うために必要な Python パッケージを記述する Conda ファイル。The Conda file that describes the Python packages needed for inference.

推論構成を利用したカスタム Docker イメージの使用については、カスタム Docker イメージを使用してモデルをデプロイする方法に関するページを参照してください。For information on using a custom Docker image with an inference configuration, see How to deploy a model using a custom Docker image.

手順 3.デプロイ構成を定義する3. Define your deployment configuration

モデルをデプロイする前にデプロイ構成を定義する必要があります。Before deploying your model, you must define the deployment configuration. デプロイ構成は、Web サービスがホストされるコンピューティング ターゲットに固有となりますThe deployment configuration is specific to the compute target that will host the web service. たとえば、モデルをローカルでデプロイするときに、サービスが要求を受け入れるポートを指定する必要があります。For example, when you deploy a model locally, you must specify the port where the service accepts requests. デプロイ構成は、エントリ スクリプトの一部ではありません。The deployment configuration isn't part of your entry script. これは、モデルとエントリ スクリプトをホストするコンピューティング先の特性を定義するために使用されます。It's used to define the characteristics of the compute target that will host the model and entry script.

また、たとえば、ワークスペースに関連付けられている Azure Kubernetes Service (AKS) インスタンスがまだない場合などにも、コンピューティング リソースを作成する必要があります。You might also need to create the compute resource, if, for example, you don't already have an Azure Kubernetes Service (AKS) instance associated with your workspace.

次の表には、コンピューティング ターゲット別にデプロイ構成を作成する例があります。The following table provides an example of creating a deployment configuration for each compute target:

コンピューティング ターゲットCompute target デプロイ構成の例Deployment configuration example
ローカルLocal deployment_config = LocalWebservice.deploy_configuration(port=8890)
Azure Container InstancesAzure Container Instances deployment_config = AciWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)
Azure Kubernetes ServiceAzure Kubernetes Service deployment_config = AksWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)

これらのローカル、Azure Container Instances、および AKS Web サービスのクラスは、azureml.core.webservice からインポートできます。The classes for local, Azure Container Instances, and AKS web services can be imported from azureml.core.webservice:

from azureml.core.webservice import AciWebservice, AksWebservice, LocalWebservice

プロファイリングProfiling

モデルをサービスとしてデプロイする前に、最適な CPU とメモリの要件を判断するためにプロファイリングを実行できます。Before you deploy your model as a service, you might want to profile it to determine optimal CPU and memory requirements. SDK または CLI を使用して、ご自分のモデルをプロファイリングできます。You can use either the SDK or the CLI to profile your model. 次の例に、SDK を使用してモデルをプロファイリングする方法を示します。The following examples show how to profile a model by using the SDK.

重要

プロファイリングを使用する場合、指定した推論構成で Azure Machine Learning 環境を参照することはできません。When you use profiling, the inference configuration that you provide can't reference an Azure Machine Learning environment. 代わりに、InferenceConfig オブジェクトの conda_file パラメーターを使用して、ソフトウェアの依存関係を定義します。Instead, define the software dependencies by using the conda_file parameter of the InferenceConfig object.

import json
test_sample = json.dumps({'data': [
    [1,2,3,4,5,6,7,8,9,10]
]})

profile = Model.profile(ws, "profilemymodel", [model], inference_config, test_data)
profile.wait_for_profiling(true)
profiling_results = profile.get_results()
print(profiling_results)

このコードでは、次の出力のような結果が表示されます。This code displays a result similar to the following output:

{'cpu': 1.0, 'memoryInGB': 0.5}

モデルのプロファイル結果は、Run オブジェクトとして出力されます。Model profiling results are emitted as a Run object.

CLI からプロファイリングを使用する方法については、「az ml モデル プロファイル」を参照してください。For information on using profiling from the CLI, see az ml model profile.

詳細については、次のドキュメントをご覧ください。For more information, see these documents:

ターゲットにデプロイするDeploy to target

デプロイでは、推論構成のデプロイ構成を使用して、モデルをデプロイします。Deployment uses the inference configuration deployment configuration to deploy the models. デプロイ プロセスは、コンピューティング ターゲットに関係なく類似しています。The deployment process is similar regardless of the compute target. AKS へのデプロイは、AKS クラスターへの参照を指定する必要があるため、少し異なります。Deploying to AKS is slightly different because you must provide a reference to the AKS cluster.

ローカル デプロイLocal deployment

モデルをローカルにデプロイするには、お使いのローカル コンピューターに Docker がインストールされている必要があります。To deploy a model locally, you need to have Docker installed on your local machine.

SDK を使用するUsing the SDK

from azureml.core.webservice import LocalWebservice, Webservice

deployment_config = LocalWebservice.deploy_configuration(port=8890)
service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config)
service.wait_for_deployment(show_output = True)
print(service.state)

詳細については、LocalWebserviceModel.deploy()、および Webservice のドキュメントを参照してください。For more information, see the documentation for LocalWebservice, Model.deploy(), and Webservice.

CLI の使用Using the CLI

CLI を使用してモデルをデプロイするには、次のコマンドを使用します。To deploy a model by using the CLI, use the following command. 登録されているモデルの名前とバージョンに mymodel:1 を置き換えます。Replace mymodel:1 with the name and version of the registered model:

az ml model deploy -m mymodel:1 --ic inferenceconfig.json --dc deploymentconfig.json

deploymentconfig.json ドキュメントのエントリは、LocalWebservice.deploy_configuration のパラメーターにマッピングされます。The entries in the deploymentconfig.json document map to the parameters for LocalWebservice.deploy_configuration. 次の表は、JSON ドキュメントのエントリとメソッド用パラメーターの間のマッピングについてまとめたものです。The following table describes the mapping between the entities in the JSON document and the parameters for the method:

JSON エンティティJSON entity メソッド パラメーターMethod parameter 説明Description
computeType NANA コンピューティング ターゲット。The compute target. ローカル ターゲットの場合、値は local である必要があります。For local targets, the value must be local.
port port サービスの HTTP エンドポイントを公開するローカル ポート。The local port on which to expose the service's HTTP endpoint.

この JSON は、CLI で使用するデプロイ構成の例です。This JSON is an example deployment configuration for use with the CLI:

{
    "computeType": "local",
    "port": 32267
}

詳細については、az ml model deploy のドキュメントを参照してください。For more information, see the az ml model deploy documentation.

ノートブック VM Web サービス (開発/テスト)Notebook VM web service (dev/test)

ノートブック VM にモデルをデプロイする」をご覧ください。See Deploy a model to Notebook VMs.

Azure Container Instances (開発/テスト)Azure Container Instances (dev/test)

Azure Container Instances へのデプロイに関する記事を参照してください。See Deploy to Azure Container Instances.

Azure Kubernetes Service (開発/テストおよび運用)Azure Kubernetes Service (dev/test and production)

Azure Kubernetes Service へのデプロイに関する記事を参照してください。See Deploy to Azure Kubernetes Service.

Web サービスを使用するConsume web services

デプロイされた Web サービスはすべて、REST API を提供します。そのため、さまざまなプログラミング言語でクライアント アプリケーションを作成できます。Every deployed web service provides a REST API, so you can create client applications in a variety of programming languages. サービスに対してキー認証を有効にしている場合、要求ヘッダーでトークンとしてサービス キーを指定する必要があります。If you've enabled key authentication for your service, you need to provide a service key as a token in your request header. サービスに対してトークン認証を有効にしている場合、要求ヘッダーでベアラー トークンとして Azure Machine Learning JWT トークンを指定する必要があります。If you've enabled token authentication for your service, you need to provide an Azure Machine Learning JWT token as a bearer token in your request header.

ヒント

サービスをデプロイした後、スキーマ JSON ドキュメントを取得できます。You can retrieve the schema JSON document after you deploy the service. ローカル Web サービスの Swagger ファイルへの URI を取得するには、デプロイされた Web サービスの swagger_uri プロパティを使用します (例: service.swagger_uri)。Use the swagger_uri property from the deployed web service (for example, service.swagger_uri) to get the URI to the local web service's Swagger file.

要求 - 応答の使用量Request-response consumption

Python でサービスを呼び出す方法の例を以下に示します。Here's an example of how to invoke your service in Python:

import requests
import json

headers = {'Content-Type': 'application/json'}

if service.auth_enabled:
    headers['Authorization'] = 'Bearer '+service.get_keys()[0]
elif service.token_auth_enabled:
    headers['Authorization'] = 'Bearer '+service.get_token()[0]

print(headers)

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]
]})

response = requests.post(
    service.scoring_uri, data=test_sample, headers=headers)
print(response.status_code)
print(response.elapsed)
print(response.json())

詳細については、Web サービスを使用するクライアント アプリケーションの作成に関するページを参照してください。For more information, see Create client applications to consume web services.

Web サービスのスキーマ (OpenAPI 仕様)Web service schema (OpenAPI specification)

デプロイで自動スキーマ生成を使用した場合は、swagger_uri プロパティを使用して、サービスに対する OpenAPI 仕様のアドレスを取得できます。If you used automatic schema generation with your deployment, you can get the address of the OpenAPI specification for the service by using the swagger_uri property. (例: print(service.swagger_uri))。仕様を取得するには、GET 要求を使用するか、ブラウザーで URI を開きます。(For example, print(service.swagger_uri).) Use a GET request or open the URI in a browser to retrieve the specification.

次の JSON ドキュメントは、デプロイに対して生成されるスキーマ (OpenAPI 仕様) の例です。The following JSON document is an example of a schema (OpenAPI specification) generated for a deployment:

{
    "swagger": "2.0",
    "info": {
        "title": "myservice",
        "description": "API specification for Azure Machine Learning myservice",
        "version": "1.0"
    },
    "schemes": [
        "https"
    ],
    "consumes": [
        "application/json"
    ],
    "produces": [
        "application/json"
    ],
    "securityDefinitions": {
        "Bearer": {
            "type": "apiKey",
            "name": "Authorization",
            "in": "header",
            "description": "For example: Bearer abc123"
        }
    },
    "paths": {
        "/": {
            "get": {
                "operationId": "ServiceHealthCheck",
                "description": "Simple health check endpoint to ensure the service is up at any given point.",
                "responses": {
                    "200": {
                        "description": "If service is up and running, this response will be returned with the content 'Healthy'",
                        "schema": {
                            "type": "string"
                        },
                        "examples": {
                            "application/json": "Healthy"
                        }
                    },
                    "default": {
                        "description": "The service failed to execute due to an error.",
                        "schema": {
                            "$ref": "#/definitions/ErrorResponse"
                        }
                    }
                }
            }
        },
        "/score": {
            "post": {
                "operationId": "RunMLService",
                "description": "Run web service's model and get the prediction output",
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "parameters": [
                    {
                        "name": "serviceInputPayload",
                        "in": "body",
                        "description": "The input payload for executing the real-time machine learning service.",
                        "schema": {
                            "$ref": "#/definitions/ServiceInput"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The service processed the input correctly and provided a result prediction, if applicable.",
                        "schema": {
                            "$ref": "#/definitions/ServiceOutput"
                        }
                    },
                    "default": {
                        "description": "The service failed to execute due to an error.",
                        "schema": {
                            "$ref": "#/definitions/ErrorResponse"
                        }
                    }
                }
            }
        }
    },
    "definitions": {
        "ServiceInput": {
            "type": "object",
            "properties": {
                "data": {
                    "type": "array",
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "integer",
                            "format": "int64"
                        }
                    }
                }
            },
            "example": {
                "data": [
                    [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]
                ]
            }
        },
        "ServiceOutput": {
            "type": "array",
            "items": {
                "type": "number",
                "format": "double"
            },
            "example": [
                3726.995
            ]
        },
        "ErrorResponse": {
            "type": "object",
            "properties": {
                "status_code": {
                    "type": "integer",
                    "format": "int32"
                },
                "message": {
                    "type": "string"
                }
            }
        }
    }
}

詳細については、OpenAPI の仕様をご覧ください。For more information, see OpenAPI specification.

仕様からクライアント ライブラリを作成できるユーティリティについては、swagger-codegen を参照してください。For a utility that can create client libraries from the specification, see swagger-codegen.

バッチ推論Batch inference

Azure Machine Learning のコンピューティング先は、Azure Machine Learning によって作成され、管理されます。Azure Machine Learning Compute targets are created and managed by Azure Machine Learning. これは Azure Machine Learning パイプラインからのバッチ予測に使用できます。They can be used for batch prediction from Azure Machine Learning pipelines.

Azure Machine Learning コンピューティングを使用したバッチ推論のチュートリアルについては、バッチ予測を実行する方法に関するページを参照してください。For a walkthrough of batch inference with Azure Machine Learning Compute, see How to run batch predictions.

IoT Edge の推論IoT Edge inference

エッジにデプロイするためのサポートは現在、プレビューの段階にあります。Support for deploying to the edge is in preview. 詳細については、IoT Edge モジュールとしての Azure Machine Learning のデプロイに関する記事を参照してください。For more information, see Deploy Azure Machine Learning as an IoT Edge module.

Web サービスを更新するUpdate web services

Web サービスを更新するには、update メソッドを使用します。To update a web service, use the update method. 推論の構成で指定できる新しいモデル、新しいエントリ スクリプト、または新しい依存関係を使用するように Web サービスを更新することができます。You can update the web service to use a new model, a new entry script, or new dependencies that can be specified in an inference configuration. 詳細については、Webservice.update のドキュメントを参照してください。For more information, see the documentation for Webservice.update.

重要

新しいバージョンのモデルを作成するときは、それを使用したい各サービスを手動で更新する必要があります。When you create a new version of a model, you must manually update each service that you want to use it.

SDK を使用するUsing the SDK

次のコードは、SDK を使用して Web サービスのモデル、環境、エントリ スクリプトを更新する方法を示しています。The following code shows how to use the SDK to update the model, environment, and entry script for a web service:

from azureml.core import Environment
from azureml.core.webservice import Webservice
from azureml.core.model import Model, InferenceConfig

# Register new model.
new_model = Model.register(model_path="outputs/sklearn_mnist_model.pkl",
                           model_name="sklearn_mnist",
                           tags={"key": "0.1"},
                           description="test",
                           workspace=ws)

# Use version 3 of the environment.
deploy_env = Environment.get(workspace=ws,name="myenv",version="3")
inference_config = InferenceConfig(entry_script="score.py",
                                   environment=deploy_env)

service_name = 'myservice'
# Retrieve existing service.
service = Webservice(name=service_name, workspace=ws)



# Update to new model(s).
service.update(models=[new_model], inference_config=inference_config)
print(service.state)
print(service.get_logs())

CLI を使用するUsing the CLI

ML CLI を使用して Web サービスを更新することもできます。You can also update a web service by using the ML CLI. 次の例では、新しいモデルを登録し、この新しいモデルを使用するように Web サービスを更新する方法を示します。The following example demonstrates registering a new model and then updating a web service to use the new model:

az ml model register -n sklearn_mnist  --asset-path outputs/sklearn_mnist_model.pkl  --experiment-name myexperiment --output-metadata-file modelinfo.json
az ml service update -n myservice --model-metadata-file modelinfo.json

ヒント

この例では、JSON ドキュメントを使用して、登録コマンドから更新コマンドにモデル情報を渡します。In this example, a JSON document is used to pass the model information from the registration command into the update command.

新しいエントリ スクリプトまたは環境を使用するようにサービスを更新するには、推論構成ファイルを作成し、それを ic パラメーターで指定します。To update the service to use a new entry script or environment, create an inference configuration file and specify it with the ic parameter.

詳細については、az ml service update のドキュメントを参照してください。For more information, see the az ml service update documentation.

モデルを継続的にデプロイするContinuously deploy models

Azure DevOps 用の Machine Learning 拡張機能を使用して、モデルを継続的にデプロイできます。You can continuously deploy models by using the Machine Learning extension for Azure DevOps. Azure DevOps 用の Machine Learning 拡張機能を使用して、新しい機械学習モデルが Azure Machine Learning ワークスペースに登録されたときにデプロイ パイプラインをトリガーできます。You can use the Machine Learning extension for Azure DevOps to trigger a deployment pipeline when a new machine learning model is registered in an Azure Machine Learning workspace.

  1. Azure Pipelines にサインアップします。そうすると、任意のプラットフォームや任意のクラウドへのご自分のアプリケーションの継続的インテグレーションとデリバリーを実現できます。Sign up for Azure Pipelines, which makes continuous integration and delivery of your application to any platform or cloud possible. (Azure Pipelines は Machine Learning パイプラインとは異なることに注意してください)。(Note that Azure Pipelines isn't the same as Machine Learning pipelines.)

  2. Azure DevOps プロジェクトを作成します。Create an Azure DevOps project.

  3. Azure Pipelines 用の Machine Learning 拡張機能をインストールします。Install the Machine Learning extension for Azure Pipelines.

  4. ご自分のすべての成果物にアクセスするために、サービス接続を使用して、ご自分の Azure Machine Learning ワークスペースへのサービス プリンシパル接続を設定します。Use service connections to set up a service principal connection to your Azure Machine Learning workspace so you can access your artifacts. プロジェクト設定に移動し、 [サービス接続] を選択して、 [Azure Resource Manager] を選択します。Go to project settings, select Service connections, and then select Azure Resource Manager:

    Azure Resource Manager の選択Select Azure Resource Manager

  5. [スコープ レベル] の一覧で、 [AzureMLWorkspace] を選択し、残りの値を入力します。In the Scope level list, select AzureMLWorkspace, and then enter the rest of the values:

    AzureMLWorkspace の選択

  6. Azure Pipelines を使用してご自分の機械学習モデルを継続的にデプロイするために、パイプラインの下で [リリース] を選択します。To continuously deploy your machine learning model by using Azure Pipelines, under pipelines, select release. 新しい成果物を追加し、 [AzureML Model] 成果物と前の手順で作成したサービス接続を選択します。Add a new artifact, and then select the AzureML Model artifact and the service connection that you created earlier. デプロイをトリガーするモデルとバージョンを選択します。Select the model and version to trigger a deployment:

    AzureML モデルの選択Select AzureML Model

  7. ご自分のモデル成果物に対してモデル トリガーを有効にします。Enable the model trigger on your model artifact. トリガーを有効にすると、そのモデルの指定したバージョン (最新バージョン) がワークスペースに登録されるたびに、Azure DevOps リリース パイプラインがトリガーされます。When you turn on the trigger, every time the specified version (that is, the newest version) of that model is registered in your workspace, an Azure DevOps release pipeline is triggered.

    モデル トリガーを有効にするEnable the model trigger

他のサンプル プロジェクトと例については、GitHub の次のサンプル リポジトリを参照してください。For more sample projects and examples, see these sample repos in GitHub:

モデルをダウンロードDownload a model

モデルをダウンロードし、独自の実行環境でそれを使用する場合、次の SDK / CLI コマンドでそれを行うことができます。If you want to download your model to use it in your own execution environment, you can do so with the following SDK / CLI commands:

SDK:SDK:

model_path = Model(ws,'mymodel').download()

CLI:CLI:

az ml model download --model-id mymodel:1 --target-dir model_folder

モデルのパッケージ化Package models

場合によっては、モデルをデプロイせずに Docker イメージを作成することが必要になることがあります (たとえば、Azure App Service にデプロイする予定がある場合)。In some cases, you might want to create a Docker image without deploying the model (if, for example, you plan to deploy to Azure App Service). または、イメージをダウンロードして、ローカルの Docker インストールで実行することが必要な場合もあります。Or you might want to download the image and run it on a local Docker installation. さらに、イメージのビルドに使用するファイルをダウンロードし、それらを検査および変更して、手動でビルドすることが必要な場合もあります。You might even want to download the files used to build the image, inspect them, modify them, and build the image manually.

モデルのパッケージ化により、これらを行うことができます。Model packaging enables you to do these things. モデルを Web サービスとしてホストするために必要なすべてのアセットをパッケージ化し、完全にビルドされた Docker イメージ、またはイメージのビルドに必要なファイルのいずれかをダウンロードできます。It packages all the assets needed to host a model as a web service and allows you to download either a fully built Docker image or the files needed to build one. モデルのパッケージ化を使用するには、次の 2 つの方法があります。There are two ways to use model packaging:

パッケージ化されたモデルをダウンロードする: モデルと、それを Web サービスとしてホストするために必要なその他のファイルを含む Docker イメージをダウンロードします。Download a packaged model: Download a Docker image that contains the model and other files needed to host it as a web service.

Dockerfile を生成する: Docker イメージをビルドするために必要な Dockerfile、モデル、エントリ スクリプト、およびその他のアセットをダウンロードします。Generate a Dockerfile: Download the Dockerfile, model, entry script, and other assets needed to build a Docker image. その後、イメージをローカルでビルドする前に、それらのファイルを検査するか、変更を加えることができます。You can then inspect the files or make changes before you build the image locally.

どちらのパッケージも、ローカルの Docker イメージを取得するために使用できます。Both packages can be used to get a local Docker image.

ヒント

パッケージの作成は、モデルのデプロイに似ています。Creating a package is similar to deploying a model. 登録済みのモデルと推論構成を使用します。You use a registered model and an inference configuration.

重要

完全にビルドされたイメージをダウンロードするか、ローカルでイメージをビルドするには、開発環境に Docker をインストールしておく必要があります。To download a fully built image or build an image locally, you need to have Docker installed in your development environment.

パッケージ化されたモデルをダウンロードするDownload a packaged model

次の例では、ワークスペースの Azure Container Registry に登録されているイメージをビルドします。The following example builds an image, which is registered in the Azure container registry for your workspace:

package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)

パッケージを作成した後、package.pull() を使用して、ローカルの Docker 環境にイメージをプルできます。After you create a package, you can use package.pull() to pull the image to your local Docker environment. このコマンドの出力には、イメージの名前が表示されます。The output of this command will display the name of the image. 例:For example:

Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338.

モデルをダウンロードした後、docker images コマンドを使用してローカル イメージを一覧表示します。After you download the model, use the docker images command to list the local images:

REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
myworkspacef78fd10.azurecr.io/package    20190822181338      7ff48015d5bd        4 minutes ago       1.43GB

このイメージに基づいてローカル コンテナーを開始するには、次のコマンドを使用して、シェルまたはコマンド ラインから名前付きコンテナーを開始します。To start a local container based on this image, use the following command to start a named container from the shell or command line. <imageid> 値を、docker images コマンドから返されたイメージ ID に置き換えます。Replace the <imageid> value with the image ID returned by the docker images command.

docker run -p 6789:5001 --name mycontainer <imageid>

このコマンドは、myimage という名前のイメージの最新バージョンを起動します。This command starts the latest version of the image named myimage. これはローカル ポート 6789 を、Web サービスがリッスンしているコンテナー内のポート (5001) にマップします。It maps local port 6789 to the port in the container on which the web service is listening (5001). また、コンテナーに mycontainer という名前を割り当てます。これにより、コンテナーの停止が簡単になります。It also assigns the name mycontainer to the container, which makes the container easier to stop. コンテナーが開始したら、http://localhost:6789/score に要求を送信できます。After the container is started, you can submit requests to http://localhost:6789/score.

Dockerfile および依存関係を生成するGenerate a Dockerfile and dependencies

次の例では、イメージをローカルでビルドするために必要な Dockerfile、モデル、およびその他のアセットをダウンロードする方法を示します。The following example shows how to download the Dockerfile, model, and other assets needed to build an image locally. generate_dockerfile=True パラメーターは、完全にビルドされたイメージではなく、それらのファイルが必要であることを示します。The generate_dockerfile=True parameter indicates that you want the files, not a fully built image.

package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)

このコードは、イメージをビルドするために必要なファイルを imagefiles ディレクトリにダウンロードします。This code downloads the files needed to build the image to the imagefiles directory. 保存ファイルに含まれている Dockerfile は、Azure Container Registry に格納されている基本イメージを参照します。The Dockerfile included in the saved files references a base image stored in an Azure container registry. ローカルの Docker インストールでイメージをビルドする場合、アドレス、ユーザー名、およびパスワードを使用して、このレジストリに対して認証を行う必要があります。When you build the image on your local Docker installation, you need to use the address, user name, and password to authenticate to the registry. ローカルの Docker インストールを使用してイメージをビルドするには、次の手順に従います。Use the following steps to build the image by using a local Docker installation:

  1. シェルまたはコマンド ライン セッションから、次のコマンドを使用して Azure Container Registry で Docker を認証します。From a shell or command-line session, use the following command to authenticate Docker with the Azure container registry. <address><username>、および <password> を、package.get_container_registry() によって取得した値に置き換えます。Replace <address>, <username>, and <password> with the values retrieved by package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. イメージをビルドするには、次のコマンドを使用します。To build the image, use the following command. <imagefiles> を、package.save() でファイルを保存したディレクトリへのパスに置き換えます。Replace <imagefiles> with the path of the directory where package.save() saved the files.

    docker build --tag myimage <imagefiles>
    

    このコマンドは、イメージ名を myimage に設定します。This command sets the image name to myimage.

イメージがビルドされたことを確認するには、docker images コマンドを使用します。To verify that the image is built, use the docker images command. myimage イメージが一覧に表示されます。You should see the myimage image in the list:

REPOSITORY      TAG                 IMAGE ID            CREATED             SIZE
<none>          <none>              2d5ee0bf3b3b        49 seconds ago      1.43GB
myimage         latest              739f22498d64        3 minutes ago       1.43GB

このイメージに基づいて新しいコンテナーを開始するには、次のコマンドを使用します。To start a new container based on this image, use the following command:

docker run -p 6789:5001 --name mycontainer myimage:latest

このコマンドは、myimage という名前のイメージの最新バージョンを起動します。This command starts the latest version of the image named myimage. これはローカル ポート 6789 を、Web サービスがリッスンしているコンテナー内のポート (5001) にマップします。It maps local port 6789 to the port in the container on which the web service is listening (5001). また、コンテナーに mycontainer という名前を割り当てます。これにより、コンテナーの停止が簡単になります。It also assigns the name mycontainer to the container, which makes the container easier to stop. コンテナーが開始したら、http://localhost:6789/score に要求を送信できます。After the container is started, you can submit requests to http://localhost:6789/score.

ローカル コンテナーをテストするクライアントの例Example client to test the local container

次のコードは、コンテナーで使用できる Python クライアントの例です。The following code is an example of a Python client that can be used with the container:

import requests
import json

# URL for the web service.
scoring_uri = 'http://localhost:6789/score'

# Two sets of data to score, so we get two results back.
data = {"data":
        [
            [ 1,2,3,4,5,6,7,8,9,10 ],
            [ 10,9,8,7,6,5,4,3,2,1 ]
        ]
        }
# Convert to JSON string.
input_data = json.dumps(data)

# Set the content type.
headers = {'Content-Type': 'application/json'}

# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)

他のプログラミング言語でのクライアントの例については、Web サービスとしてデプロイされたモデルの使用に関する記事を参照してください。For example clients in other programming languages, see Consume models deployed as web services.

Docker コンテナーを停止するStop the Docker container

コンテナーを停止するには、別のシェルまたはコマンド ラインから次のコマンドを使用します。To stop the container, use the following command from a different shell or command line:

docker kill mycontainer

リソースのクリーンアップClean up resources

デプロイされた Web サービスを削除するには、service.delete() を使用します。To delete a deployed web service, use service.delete(). 登録済みのモデルを削除するには、model.delete() を使用します。To delete a registered model, use model.delete().

詳細については、WebService.delete()Model.delete() のドキュメントを参照してください。For more information, see the documentation for WebService.delete() and Model.delete().

次の手順Next steps