【Python SDK v2】Azure MLで作成したパイプラインをPythonからトレーニング〜推論まで行ってみた

はじめに

Python CLI/SDK v2を用いてAzureMLのデザイナーで作成したパイプラインをトレーニングからモデルの登録・デプロイ・推論まで行ってみようと思います。

開発環境

  • OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
  • Visual Studio Code 1.73.1
  • Python 3.9

パイプラインをPythonからトレーニングする

今回はこのパイプラインを使っていきます。
image.png

Pythonから操作できるように、入力データと出力データにはそれぞれImport DataExport Dataコンポーネントを使い、パイプラインパラメータを設定します。
やり方は以前の記事で紹介してます。

学習データにはKaggleのTPSを使いました。failureが0か1か予測する二項分類タスクです。

まずはデザイナーで作成したパイプラインが動くか、ジョブ送信をして確認します。
image.png
問題なく完了しました!
あとはPythonから実行できるように、このパイプラインを公開します。

公開すると、「概要」のところにRESTエンドポイントやパイプラインIDが記載されています。
これを使ってPythonからトレーニングを行ってみます!
スクリーンショット 2022-12-16 14.11.40.png

v1の場合はパイプラインIDとazureml-coreExperimentクラスやPublishedPipelineを用いてジョブの送信を行いましたが、今回はRESTエンドポイントを使ってPOSTしてみました。

ワークスペースへの接続

実験の前に、ワークスペースへ接続します。
DefaultAzureCredentialクラスのget_tokenメソッドを使ってアクセストークンが得られるかチェックし、できない場合はブラウザを起動して取得するようにしてます。

最後にMLClientでワークスペースの操作をできるようにします。

コンピューティングクラスターの作成

クラスターの名前やコンピューティングサイズを次のように設定します。

POST

先ほど公開したパイプラインに記載してあった「RESTエンドポイント」でrequestsのPOSTメソッドを使ってAzureにジョブを送信してみます。

DefaultAzureCredentialクラスのget_tokenメソッドを使うとAzure Active Directory認証トークンを取得できます。取得したトークンはaad_tokenに入れておきます。

そして、Authorization : Bearer{aad_token}のようにベアラートークンとして入れます。

引数jsonのところには実験名、またパイプライン作成時にパイプラインパラメータを設定していたので、それぞれ入力データがあるパス名と出力先のパス名を入れます。

これで実行してみます!
ワークスペースの方をのぞいてきちんと実行できているか確認してみると…
スクリーンショット 2022-12-16 14.27.43.png

完了になっていました!
今回Scoreデータを出力するようにしていたので、それもデータストアの方から確認してみます。
スクリーンショット 2022-12-16 15.12.13.png
Export_scoreファイルにscore-1216.csvができており、さらに中身にはScored labelsなどが作成されているのを確認できました。

トレーニングしたモデルをデプロイ・推論する

それでは今度はデプロイを行っていきますが、まずはその前にモデルの登録から行います。
その後、エンドポイントの作成をしてデプロイ・推論という流れでやっていきます。

モデルの登録

まずはワークスペースへ接続し、azure.ai.ml.entitiesModelクラスで登録を行います。
モデルのパスと登録するときの名前を入れたらml_client.models.create_or_update()で登録します。

パスの取得は完了したジョブへ移って、Train Modelコンポーネントをダブルクリックし、
無題.png
「出力」の「データセット」をクリック

azureml2.png

するとこのページに移るので、右側の「データストア」の下にあるパスをコピーしておきます。

あとは公式にパスの記載方法が示されているので、同じような形になるよう書きます。
image.png
ちなみに今回はAzureMLデータストア上のパスになるので、azureml://datastores/<datastore-name>/paths/以下に先ほど取得したパスを貼り付けました。
また、モデルのパスは入力データごとに出力先が異なるため、現時点では手動でUIからパス取得する方法しか確認できませんでした。

実行後、ワークスペースのモデル一覧を確認すると
image.png
このように登録できていました。

エンドポイントの作成

デプロイ前にエンドポイントを作成します。
同じようにワークスペースに接続したらエンドポイントの名前を決め、ml_clientでエンドポイントを作成します。

エンドポイントの名前ですが、”_(アンダーバー)”などを使うと

このようなエラーが出ます。必ず”-(ハイフン)”を使った名前に設定しておきましょう。

デプロイ

エンドポイントが作成できたので、いよいよデプロイしてみます。

conda_env.yamlscore.pyは登録したモデルの「成果物」からダウンロードできます。
image.png

conda_env.yaml

yamlの中身はこちら

score.py

score.pyの中身も見ておきましょう。

モデルの読み込みを行い、入力データをjson形式のデータを辞書型に変換し、辞書の値にはリスト型で格納するようにします。

さて、これをデプロイしてみると
image.png
正常にデプロイを行えました。

「使用」タグに移ると
azure.png

RESTエンドポイントやPythonコードも書かれています。これを使って次に推論を行います。

推論

先ほどのコードから追加した部分はdataの部分とapi_keyのところです。
api_keyは「主キー」のところで取得できます。

結果

実行すると、このように結果が返ってきました。

この記事を書いた人

azure-recipe-user