レジストリを使用してワークスペース間でモデル、コンポーネント、環境を共有する

Azure Machine Learning レジストリを使用すると、組織内のワークスペース間で共同作業を行うことができます。 レジストリを使用すると、モデル、コンポーネント、環境を共有できます。

複数のワークスペースで同じモデル、コンポーネント、環境のセットを使用する 2 つのシナリオがあります。

  • クロスワークスペース MLOps: dev ワークスペースでモデルをトレーニングしており、 test および prod ワークスペースにデプロイする必要があります。 この場合は、モデルが test または prod ワークスペースにデプロイされているエンドポイントと、 dev ワークスペースでモデルのトレーニングに使用されたトレーニング ジョブ、メトリック、コード、データ、環境の間にエンドツーエンドの系列を設定する必要があります。
  • さまざまなチーム間でモデルとパイプラインを共有および再利用する: 共有と再利用により、コラボレーションと生産性が向上します。 このシナリオでは、トレーニング済みのモデルと、それをトレーニングするために使用される関連するコンポーネントと環境を中央カタログに発行できます。 そこから、他のチームの同僚は、自分の実験で共有した資産を検索して再利用できます。

この記事では、次の方法について説明します。

  • レジストリに環境とコンポーネントを作成します。
  • レジストリのコンポーネントを使用して、ワークスペースにモデル トレーニング ジョブを送信します。
  • トレーニング済みのモデルをレジストリに登録します。
  • レジストリからワークスペース内のオンライン エンドポイントにモデルをデプロイし、推論要求を送信します。

前提 条件

この記事の手順に従う前に、次の前提条件があることを確認してください。

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料または有料版のAzure Machine Learningをお試しください。
  • モデル、コンポーネント、環境を共有するためのAzure Machine Learning レジストリ。 レジストリを作成するには、レジストリを 作成する方法を参照してください。

  • Azure Machine Learning ワークスペース。 ない場合に作成するには、「 クイック スタート: ワークスペース リソースの作成 」の記事の手順を使用します。

    重要

    ワークスペースを作成するAzureリージョン (場所) は、Azure Machine Learning レジストリでサポートされているリージョンの一覧に含まれている必要があります

  • Azure CLI と ml 拡張機能、または Azure Machine Learning Python SDK v2

    Azure CLIと拡張機能をインストールするには、 CLI (v2)を参照してください。

    重要

    • この記事の CLI の例では、Bash (または互換性のある) シェルを使用していることを前提としています。 たとえば、Linux システムまたは Linux 用 Windows サブシステム

    • また、この例では、サブスクリプション、ワークスペース、リソース グループ、または場所のパラメーターを指定する必要がないように、Azure CLIの既定値を構成していることを前提としています。 既定の設定を設定するには、次のコマンドを使用します。 次のパラメーターを構成の値に置き換えます。

      • <subscription>をAzureサブスクリプション ID に置き換えます。
      • <workspace>をAzure Machine Learningワークスペース名に置き換えます。
      • <resource-group> を、ワークスペースを含むAzure リソース グループに置き換えます。
      • <location> を、ワークスペースを含むAzureリージョンに置き換えます。
      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
      

      az configure -l コマンドを使用すると、現在の既定値を確認できます。

リポジトリの例を複製する

この記事のコード例は、nyc_taxi_data_regression サンプルに基づいています。 開発環境でこれらのファイルを使用するには、次のコマンドを使用してリポジトリを複製し、ディレクトリを例に変更します。

git clone https://github.com/Azure/azureml-examples
cd azureml-examples

CLI の例では、サンプル リポジトリのローカル クローンでディレクトリを cli/jobs/pipelines-with-components/nyc_taxi_data_regression に変更します。

cd cli/jobs/pipelines-with-components/nyc_taxi_data_regression

SDK 接続の作成

ヒント

この手順は、Python SDK を使用する場合にのみ必要です。

Azure Machine Learning ワークスペースとレジストリの両方へのクライアント接続を作成します。

ml_client_workspace = MLClient( credential=credential,
    subscription_id = "<workspace-subscription>",
    resource_group_name = "<workspace-resource-group",
    workspace_name = "<workspace-name>")
print(ml_client_workspace)

ml_client_registry = MLClient(credential=credential,
                        registry_name="<REGISTRY_NAME>",
                        registry_location="<REGISTRY_REGION>")
print(ml_client_registry)

レジストリに環境を作成する

環境では、トレーニング ジョブの実行またはモデルのデプロイに必要な docker コンテナーとPython依存関係を定義します。 環境の詳細については、次の記事を参照してください。

ヒント

同じ CLI コマンド az ml environment create を使用して、ワークスペースまたはレジストリに環境を作成できます。 --workspace-nameコマンドを使用してコマンドを実行すると、ワークスペースに環境が作成されますが、--registry-nameコマンドを実行すると、レジストリに環境が作成されます。

python:3.10 Docker イメージを使用する環境を作成し、SciKit Learn フレームワークを使用してトレーニング ジョブを実行するために必要なPython パッケージをインストールします。 サンプル リポジトリを複製し、cli/jobs/pipelines-with-components/nyc_taxi_data_regressionフォルダーにある場合は、docker ファイル env_train.ymlを参照する環境定義ファイルenv_train/Dockerfileを確認できます。 env_train.ymlの内容は次のとおりです。

$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
name: SKLearnEnv
version: 1-<VERSION>
description: Scikit Learn environment
build:
  path: ./env_train

次のように、 az ml environment create を使用して環境を作成します。

az ml environment create --file env_train.yml --registry-name <registry-name>

この名前とバージョンの環境がレジストリに既に存在するというエラーが発生した場合は、versionenv_train.yml フィールドを編集するか、env_train.ymlのバージョン値をオーバーライドする別のバージョンを CLI で指定できます。

# use shell epoch time as the version
version=$(date +%s)
az ml environment create --file env_train.yml --registry-name <registry-name> --set version=$version

ヒント

version=$(date +%s) は Linux でのみ機能します。 これが機能しない場合は、 $version を乱数に置き換えます。

name コマンドの出力から環境のversionaz ml environment createをメモし、次のようにaz ml environment showコマンドで使用します。 レジストリでコンポーネントを作成するときは、次のセクションで nameversion が必要になります。

az ml environment show --name SKLearnEnv --version 1 --registry-name <registry-name>

ヒント

別の環境名またはバージョンを使用した場合は、それに応じて --name パラメーターと --version パラメーターを置き換えます。

az ml environment list --registry-name <registry-name>を使用して、レジストリ内のすべての環境を一覧表示することもできます。

Azure Machine Learning スタジオ内のすべての環境を参照できます。 グローバル UI に移動し、 レジストリ エントリを探してください。

レジストリ内の環境のスクリーンショット。

メモ

レジストリ リソースのシステム割り当てマネージド ID には、そのレジストリに関連付けられている Azure Container Registry (ACR) インスタンスに対する AcrPull アクセス許可があります。 ワークスペース コンピューティングで環境イメージをプルする必要がある場合、AzureML レジストリは、ワークスペース コンピューティングによってイメージをプルできるように、適切なスコープ マップを持つ ACR トークンを作成して返します。 ワークスペースとコンピューティング マネージド ID のどちらも、レジストリの ACR に直接アクセスすることはできません。

レジストリにコンポーネントを作成する

コンポーネントは、Azure Machine LearningのMachine Learning パイプラインの再利用可能な構成要素です。 個々のパイプライン ステップのコード、コマンド、環境、入力インターフェイス、出力インターフェイスをコンポーネントにパッケージ化できます。 その後、異なるパイプラインを記述するたびに依存関係とコードを移植することを心配することなく、複数のパイプライン間でコンポーネントを再利用できます。

ワークスペースにコンポーネントを作成すると、そのワークスペース内の任意のパイプライン ジョブでコンポーネントを使用できます。 レジストリにコンポーネントを作成すると、組織内の任意のワークスペース内の任意のパイプラインでコンポーネントを使用できます。 レジストリにコンポーネントを作成することは、モジュール式の再利用可能なユーティリティまたは共有トレーニング タスクを構築する優れた方法です。これは、組織内のさまざまなチームによる実験に使用できます。

コンポーネントの詳細については、次の記事を参照してください。

cli/jobs/pipelines-with-components/nyc_taxi_data_regressionフォルダーにいることを確認します。 Scikit Learn トレーニング スクリプト train.ymlをパッケージ化するコンポーネント定義ファイルtrain_src/train.pyがあります。 train.ymlは、 レジストリからsklearn-1.5azuremlを使用します。 environmentの [train.yml] フィールドを編集して、前の手順で作成した Scikit Learn 環境を使用したり、キュレーションされた環境を保持したりできます。 コンポーネント定義ファイル train.yml は、次の例のようになります。

# <component>
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_linear_regression_model
display_name: TrainLinearRegressionModel
version: 1
type: command
inputs:
  training_data: 
    type: uri_folder
  test_split_ratio:
    type: number
    min: 0
    max: 1
    default: 0.2
outputs:
  model_output:
    type: mlflow_model
  test_data:
    type: uri_folder
code: ./train_src
environment: azureml://registries/azureml/environments/sklearn-1.5/labels/latest
command: >-
  python train.py 
  --training_data ${{inputs.training_data}} 
  --test_data ${{outputs.test_data}} 
  --model_output ${{outputs.model_output}}
  --test_split_ratio ${{inputs.test_split_ratio}}
# </component>

キュレーションされた環境ではなく、前の手順の独自の環境を使用する場合は、 environment フィールドを azureml://registries/<registry-name>/environments/SKLearnEnv/versions/1に更新します。 az ml component create コマンドを実行して、次のようにコンポーネントを作成します。

az ml component create --file train.yml --registry-name <registry-name>

ヒント

同じ CLI コマンド az ml component create を使用して、ワークスペースまたはレジストリにコンポーネントを作成できます。 --workspace-nameコマンドを使用してコマンドを実行すると、ワークスペースにコンポーネントが作成されますが、--registry-nameを使用してコマンドを実行すると、レジストリにコンポーネントが作成されます。

train.ymlを編集しない場合は、CLI で次のように環境名をオーバーライドできます。

az ml component create --file train.yml --registry-name <registry-name> --set environment=azureml://registries/<registry-name>/environments/SKLearnEnv/versions/1

ヒント

コンポーネントの名前がレジストリに既に存在するというエラーが発生した場合は、 train.yml でバージョンを編集するか、CLI のバージョンをランダム なバージョンでオーバーライドできます。

name コマンドの出力からコンポーネントのversionaz ml component createをメモし、次のようにaz ml component showコマンドで使用します。 ワークスペースでトレーニング ジョブを作成して送信するには、次のセクションの nameversion が必要です。

az ml component show --name <component_name> --version <component_version> --registry-name <registry-name>

az ml component list --registry-name <registry-name>を使用して、レジストリ内のすべてのコンポーネントを一覧表示することもできます。

Azure Machine Learning スタジオ内のすべてのコンポーネントを参照できます。 グローバル UI に移動し、 レジストリ エントリを探してください。

レジストリ内のコンポーネントのスクリーンショット。

レジストリのコンポーネントを使用してワークスペースでパイプライン ジョブを実行する

レジストリからコンポーネントを使用するパイプライン ジョブを実行する場合、 コンピューティング リソースと トレーニング データ はワークスペースに対してローカルになります。 ジョブの実行について詳しくは、次の記事をご覧ください。

前のセクションで作成した Scikit Learn トレーニング コンポーネントを使用してパイプライン ジョブを実行し、モデルをトレーニングします。 フォルダー cli/jobs/pipelines-with-components/nyc_taxi_data_regressionにあることを確認します。 トレーニング データセットは、 data_transformed フォルダーにあります。 component ファイルの train_job セクションの下にある single-job-pipeline.yml セクションを編集して、前のセクションで作成したトレーニング コンポーネントを参照します。 結果の single-job-pipeline.yml は次のとおりです。

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: nyc_taxi_data_regression_single_job
description: Single job pipeline to train regression model based on nyc taxi dataset

jobs:
  train_job:
    type: command
    component: azureml://registries/<registry-name>/component/train_linear_regression_model/versions/1
    compute: azureml:cpu-cluster
    inputs:
      training_data: 
        type: uri_folder
        path: ./data_transformed
    outputs:
      model_output: 
        type: mlflow_model
      test_data: 

重要な側面は、このパイプラインは、特定のワークスペースにないコンポーネントを使用してワークスペースで実行されるということです。 コンポーネントは、組織内の任意のワークスペースで使用できるレジストリ内にあります。 このトレーニング ジョブは、アクセスできる任意のワークスペースで実行できます。そのワークスペースでトレーニング コードと環境を使用できるようにする必要はありません。

警告

  • パイプライン ジョブを実行する前に、ジョブを実行するワークスペースが、コンポーネントを作成したレジストリでサポートされているAzureリージョンにあることを確認します。
  • ワークスペースにcpu-clusterという名前のコンピューティング クラスターがあることを確認するか、コンピューティングの名前でcomputeの下のjobs.train_job.compute フィールドを編集します。

az ml job create コマンドを使用してパイプライン ジョブを実行します。

az ml job create --file single-job-pipeline.yml 

ヒント

前提条件のセクションで説明されているように、既定のワークスペースとリソース グループを構成しなかった場合は、--workspace-nameを機能させるために--resource-groupパラメーターとaz ml job createパラメーターを指定する必要があります。

または、編集 single-job-pipeline.yml をスキップし、CLI で train_job によって使用されるコンポーネント名をオーバーライドすることもできます。

az ml job create --file single-job-pipeline.yml --set jobs.train_job.component=azureml://registries/<registry-name>/component/train_linear_regression_model/versions/1

トレーニング ジョブで使用されるコンポーネントはレジストリを介して共有されるため、組織内でアクセスできる任意のワークスペースに、異なるサブスクリプション間でもジョブを送信できます。 たとえば、 dev-workspacetest-workspaceprod-workspaceがある場合、これら 3 つのワークスペースでトレーニング ジョブを実行するのは、3 つの az ml job create コマンドを実行するのと同じくらい簡単です。

az ml job create --file single-job-pipeline.yml --workspace-name dev-workspace --resource-group <resource-group-of-dev-workspace>
az ml job create --file single-job-pipeline.yml --workspace-name test-workspace --resource-group <resource-group-of-test-workspace>
az ml job create --file single-job-pipeline.yml --workspace-name prod-workspace --resource-group <resource-group-of-prod-workspace>

Azure Machine Learning スタジオで、ジョブ出力のエンドポイント リンクを選択してジョブを表示します。 ここでは、トレーニング メトリックを分析し、ジョブがレジストリのコンポーネントと環境を使用していることを確認し、トレーニング済みのモデルを確認できます。 出力からジョブのnameをメモするか、Azure Machine Learning スタジオのジョブ概要から同じ情報を見つけます。 この情報は、レジストリでのモデルの作成に関する次のセクションでトレーニング済みのモデルをダウンロードするために必要です。

Azure Machine Learning Studioのパイプラインのスクリーンショット。

レジストリでモデルを作成する

このセクションでは、レジストリでモデルを作成する方法について説明します。 管理モデルを確認して、Azure Machine Learningでのモデル管理の詳細を確認します。 レジストリでモデルを作成する 2 つの異なる方法について説明します。 最初にローカルファイルからです。 2 つ目は、ワークスペースに登録されているモデルをレジストリにコピーすることです。

どちらのオプションでも、 MLflow 形式のモデルを作成します。これは、 推論コードを記述せずに推論のためにこのモデルをデプロイするのに役立ちます。

ローカル ファイルからレジストリにモデルを作成する

train_jobを前のセクションのジョブの名前に置き換えることで、<job-name>の出力として使用できるモデルをダウンロードします。 モデルと MLflow メタデータ ファイルは、 ./artifacts/model/で使用できる必要があります。

# fetch the name of the train_job by listing all child jobs of the pipeline job
train_job_name=$(az ml job list --parent-job-name <job-name> --query [0].name | sed 's/\"//g')
# download the default outputs of the train_job
az ml job download --name $train_job_name 
# review the model files
ls -l ./artifacts/model/

ヒント

前提条件のセクションで説明されているように、既定のワークスペースとリソース グループを構成しなかった場合は、--workspace-nameを機能させるために--resource-groupパラメーターとaz ml model createパラメーターを指定する必要があります。

警告

az ml job listの出力は、sedに渡されます。 これは Linux シェルでのみ機能します。 Windows を使っている場合は、az ml job list --parent-job-name <job-name> --query [0].name を実行し、トレーニング ジョブ名に含まれる引用符を除去します。

モデルをダウンロードできない場合は、前のセクションのトレーニング ジョブによってトレーニングされたサンプル MLflow モデル cli/jobs/pipelines-with-components/nyc_taxi_data_regression/artifacts/model/ フォルダーにあります。

レジストリにモデルを作成します。

# create model in registry
az ml model create --name nyc-taxi-model --version 1 --type mlflow_model --path ./artifacts/model/ --registry-name <registry-name>

ヒント

  • モデル名とバージョンが既に存在するというエラーが発生した場合は、 version パラメーターに乱数を使用します。
  • 同じ CLI コマンド az ml model create を使用して、ワークスペースまたはレジストリにモデルを作成できます。 --workspace-name コマンドを使用してコマンドを実行すると、ワークスペースにモデルが作成されますが、--registry-nameコマンドを実行すると、レジストリにモデルが作成されます。

ワークスペースからレジストリにモデルを共有する

このワークフローでは、最初にワークスペースにモデルを作成し、それをレジストリに共有します。 このワークフローは、共有する前にワークスペースでモデルをテストする場合に便利です。 たとえば、エンドポイントにデプロイし、いくつかのテスト データを使用して推論を試し、すべてが問題なければモデルをレジストリにコピーします。 このワークフローは、さまざまな手法、フレームワーク、またはパラメーターを使用して一連のモデルを開発していて、そのうちの 1 つだけを運用候補としてレジストリに昇格させる場合にも役立ちます。

前のセクションで確認したパイプライン ジョブの名前を用意し、トレーニング ジョブの名前を取得するコマンド内でこれを置き換えます。 次に、トレーニング ジョブの出力からワークスペースにモデルを登録します。 --path パラメーターが、train_job構文を使用して出力azureml://jobs/$train_job_name/outputs/artifacts/paths/model出力を参照する方法に注意してください。

# fetch the name of the train_job by listing all child jobs of the pipeline job
train_job_name=$(az ml job list --parent-job-name <job-name> --workspace-name <workspace-name> --resource-group <workspace-resource-group> --query [0].name | sed 's/\"//g')
# create model in workspace
az ml model create --name nyc-taxi-model --version 1 --type mlflow_model --path azureml://jobs/$train_job_name/outputs/artifacts/paths/model 

ヒント

  • モデル名とバージョンが既に存在するというエラーが発生した場合は、 version パラメーターに乱数を使用します。
  • 前提条件のセクションで説明されているように既定のワークスペースとリソース グループを構成していない場合は、--workspace-nameが機能するように--resource-groupパラメーターとaz ml model createパラメーターを指定する必要があります。

モデル名とバージョンをメモしておきます。 モデルがワークスペースに登録されているかどうかを検証するには、Studio UI でモデルを参照するか、 az ml model show --name nyc-taxi-model --version $model_version コマンドを使用します。

次に、ワークスペースからレジストリにモデルを共有します。

# share model registered in workspace to registry
az ml model share --name nyc-taxi-model --version 1 --registry-name <registry-name> --share-with-name <new-name> --share-with-version <new-version>

ヒント

  • az ml model create コマンドで変更した場合は、適切なモデル名とバージョンを使用してください。
  • --share-with-nameパラメーターと --share-with-version パラメーターが必要です。 モデルの名前とバージョンをレジストリに設定します。

name コマンドの出力からモデルのversionaz ml model createをメモし、次のようにaz ml model showコマンドで使用します。 推論のためにモデルをオンライン エンドポイントにデプロイする場合は、次のセクションの nameversion が必要です。

az ml model show --name <model_name> --version <model_version> --registry-name <registry-name>

az ml model list --registry-name <registry-name> を使用して、レジストリ内のすべてのモデルを一覧表示したり、Azure Machine Learning スタジオ UI 内のすべてのコンポーネントを参照したりすることもできます。 グローバル UI に移動し、Registries ハブを探してください。

次のスクリーンショットは、Azure Machine Learning スタジオのレジストリ内のモデルを示しています。 ジョブ出力からモデルを作成し、そのモデルをワークスペースからレジストリにコピーした場合、モデルにモデルをトレーニングしたジョブへのリンクがあることがわかります。 そのリンクを使用してトレーニング ジョブに移動し、モデルのトレーニングに使用されるコード、環境、データを確認できます。

レジストリ内のモデルのスクリーンショット。

ワークスペース内のレジストリからオンライン エンドポイントにモデルをデプロイする

最後のセクションでは、モデルをレジストリからワークスペース内のオンライン エンドポイントにデプロイします。 ワークスペースの場所がレジストリでサポートされている場所の 1 つである場合は、アクセス権を持つ任意のワークスペースを組織内に展開できます。 この機能は、 dev ワークスペースでモデルをトレーニングし、モデルのトレーニングに使用されるコード、環境、データに関する系列情報を保持しながら、 test または prod ワークスペースにモデルをデプロイする必要がある場合に役立ちます。

オンライン エンドポイントを使用すると、REST API を使用してモデルをデプロイし、推論要求を送信できます。 詳細については、「 オンライン エンドポイントを使用して機械学習モデルをデプロイしてスコア付けする方法」を参照してください。

ヒント

この例では、わかりやすくするためにキーベースの認証を使用します。 運用環境のデプロイでは、Microsoftではトークンベースの認証 (aad_token) をMicrosoft Entraすることをお勧めします。これにより、ID ベースのアクセス制御によってセキュリティが強化されます。 詳細については、「 オンライン エンドポイントのクライアントを認証する」を参照してください。

オンライン エンドポイントを作成します。

az ml online-endpoint create --name reg-ep-1234

cli/jobs/pipelines-with-components/nyc_taxi_data_regression フォルダー内にある deploy.ymlmodel: 行を更新して、前の手順で指定したモデル名とバージョンを参照するようにします。 オンライン エンドポイントへのオンラインデプロイを作成します。 deploy.ymlを参照するために以下に示します。

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: demo
endpoint_name: reg-ep-1234
model: azureml://registries/<registry-name>/models/nyc-taxi-model/versions/1
instance_type: Standard_DS3_v2
instance_count: 1

オンライン展開を作成します。 デプロイの完了には数分かかります。

az ml online-deployment create --file deploy.yml --all-traffic

スコアリング URI を取得し、サンプルスコアリング要求を送信します。 スコアリング要求のサンプル データは、scoring-data.json フォルダーのcli/jobs/pipelines-with-components/nyc_taxi_data_regressionにあります。

ENDPOINT_KEY=$(az ml online-endpoint get-credentials -n reg-ep-1234 -o tsv --query primaryKey)
SCORING_URI=$(az ml online-endpoint show -n reg-ep-1234 -o tsv --query scoring_uri)
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data @./scoring-data.json

重要

  • ユーザー割り当て ID で作成されたエンドポイントの場合は、ロールの手動割り当てが必要です。 ID には、サブスクリプション レベルで ACRPull ロールと Storage Blob Data Reader ロールが必要です。

ヒント

  • curl コマンドは Linux でのみ機能します。
  • 前提条件のセクションで説明されているように、既定のワークスペースとリソース グループを構成していない場合は、--workspace-nameコマンドと--resource-groupコマンドを機能させるには、az ml online-endpointパラメーターとaz ml online-deploymentパラメーターを指定する必要があります。

リソースのクリーンアップ

デプロイを使用しない場合は、コストを削減するために削除する必要があります。 次の例では、エンドポイントと基になるすべてのデプロイを削除します。

az ml online-endpoint delete --name reg-ep-1234 --yes --no-wait

次の手順