Azure MLのパイプラインをPythonから実行する方法


# はじめに
前回Azure MLのデザイナーで作った[こちら](https://qiita.com/kkawano_neko/items/efde483c297bdf1f2559)のパイプラインをPythonから実行してみます。

# 開発環境
+ OS Windows 10(NVIDIA GTX 1650Ti,16GB RAM, i5-10300H CPU)
+ Visual Studio Code 1.73.1
+ Python 3.9

# Pythonから実行するまで
PythonからAzure MLを使用するには「Azure CLI」をインストールする必要があります。
[公式](https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli)に載っている方法でインストールをしてください。

Windowsの場合は、[こちら](https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli)を開き、「Azure CLIの最新のリリース」をクリックしてインストールファイルを実行すればできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/35ad46b3-5040-d71a-d6c6-3f2950a79f42.png)

コマンドプロンプトからログインをします。

```
az login
```
これでWebページに飛ぶので、ログインを完了したら前準備は終わりです。

## Azure MLのデザイナーを起動
それでは前回作成したデザイナーを開きます。
（作成方法やジョブの実行方法は前の記事をご覧ください！）

今回はパスを指定することで、
+ 学習させる入力データ
+ 結果データの出力先

を決めていけるようにしていきます。

### 前回からのブロック変更箇所
+ **Import Data**コンポーネント
+ **Export Data**コンポーネント

これらのコンポーネントを追加、パス設定を変更します。


#### コンポーネントの追加
追加したパイプラインがこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/9a6b2283-af59-1d67-986e-9e4213c31aab.png)

前回は入力データを「TPS-AUG-2022」としていたところを、**Import Data**コンポーネントに変更しています。そして、**Score Model**の結果を**Export Data**で取り出せるようにしました。

#### パイプラインパラメータの変更
次に追加した2つのコンポーネントの設定を変更します。
まず、**Import Data**については、学習データをどこから持ってくるか設定する必要があります。

学習データが入っている「データソース」、「データストア」を選択後、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/326177d5-4c6f-3c55-5f1a-3e3f1f2f8f30.png)

このようにパス設定を求められます。

ここで使用するのが「パイプラインパラメータ」。
これを用いることで実行ごとに学習データセットの選択と出力先を決めることが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/6704ca9e-73e9-3eb9-1440-6ced68c2caf1.png)

右上の「・・・」をクリックし、「＋パイプラインパラメータへの追加」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/5f8d6592-d6c3-016e-41ba-e0a25cd27af9.png)

「パラメーター名」と「値」を入力すれば作成できます。

今回の学習データには前回同様に[KaggleのTabular Playground Series - Aug 2022](https://www.kaggle.com/competitions/tabular-playground-series-aug-2022)を使っていきます。
データセットは前回追加したので、trainデータセットの保存先のパス名を「値」に入力します。

また「パラメーター名」は「Import_data_path」としました。

同様に、**Export Data**のパイプラインパラメータも設定します。
「パラメーター名」を「Export_score_path」に、
「値」には出力したい場所のパスと出力時の名前を入力します。

これでパイプラインパラメータの追加は完了です。

### パイプラインパラメータの更新・削除
パイプラインパラメータの名前の変更や削除は右上の「設定」から「・・・（三点リーダー）」から可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/f86cb85c-4321-786e-b97a-2a6013bfe42a.png)

## ジョブで実行できているか確認
ブロックの変更が完了したので、いったんこのパイプラインを実行できるか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/8ba751ca-d026-57c6-7a0d-780e85c70999.png)
問題なく実行できました！

## パイプラインエンドポイントの作成
Pythonoから実行できるようにパイプラインを公開していきます。

まずは実行完了したジョブから「公開」ボタンを押して、パイプラインのエンドポイントを作成します。

そして作成後、「パイプラインID」ができるのでこれを使えばPythonからの実行ができます。

IDはどこに書いてあるのかというと、作成したパイプラインエンドポイントを開き

![azureml-pipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/341f2a01-1ddb-003a-8021-cc6fab348da3.png)

概要の下の方にスクロールしたときに現れる「既定の公開されたパイプライン」に書かれてあります。
これがパイプラインIDです。

## Pythonから実行
こちらのコードを動かして、パイプラインをPythonから実行していきます。

```azureml-test.py
from azureml.core import Workspace
from azureml.core.experiment import Experiment
from azureml.pipeline.core import PublishedPipeline

ws = Workspace.from_config()
experiment = Experiment(workspace=ws, name='XXX')
published_pipeline = PublishedPipeline.get(workspace=ws, id="YYY")
pipeline_run = experiment.submit(
    published_pipeline,
    pipeline_parameters={
        "Import_data_path": "UI/2022-11-18_090809_UTC/train.csv",
        "Export_score_path": "/t-kawano-test-20221125.csv",
        }
    )
#XXX:実験名
#YYY:パイプラインID
```
実験名は任意で、パイプラインIDは先ほどのものを貼り付けます。
`Import_data_path`と`Export_score_path`にはそれぞれ学習データがあるパスと、出力先のパスを設定します。


しかし、これで実行してみたら**azureml-core**と**azureml-pipeline-core**がないと言われたので、
```
pip install azureml-core
pip install azureml-pipeline-core
```
これでpipインストールします。

インストール後、もう１回実行したら今度は
「The workspace configuration file config.json, could not be found」
というエラーが出てきました。

このエラーの対処としては、ワークスペースに戻り、右上のアカウント名をクリックします。
![azureml-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/5a7007c3-349e-3d85-d0b1-7477496419f1.png)

そして「構成ファイルをダウンロードする」をし、config.jsonをプロジェクト直下に置きます。

これでもう１度実行！
```
Submitted PipelineRun XXX #実行ID
Link to Azure Machine Learning Portal:https://YYY #ジョブへのURL
```
このような結果が返ってきました。
2行目のURLに飛んでみたら、ちゃんと実行できていました^^
<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/0d9958ae-3a59-1696-cf37-4141078a05c8.png)
-->

実行が終わったらジョブタグで状態ステータスが「完了」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/4aaece76-74b5-fdf6-a9be-5cad16994163.png)

結果データファイルがExportされているか確認してみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/1ede9011-e7ac-9a8e-6bce-b63c74a9805b.png)

指定した場所にきちんと出力されていました。

一応中身も確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976188/198dc549-1b43-01be-7f3a-3b00b8d87b0a.png)

スコアデータも見れるようになってます！

# まとめ
+ Azure MLで作成したパイプラインをPythonから実行してみた。
+ **Import Data**や**Export Data**を追加し、パイプラインパラメータを使えば実行のたびに学習データや出力先を設定できる。