新生Azure Machine Learning サービスを触ってみる

## 1. はじめに

Azure Machine Learningといえば既に提供されているAzure Machine Learning Studioがあります。このMachine Learning Studioは、GUIで簡易的に機械学習フローを作成してサーバーレスのWebサービスを公開できます。

しかし、Machine Learning Studioでは、Webサービスのアクセス制御、機械学習フローの変更管理、開発環境から本番環境の移送、モデルの変更管理 等、システム開発観点で求められることを実現することが困難なことがあります。また、簡易的にGUIで開発できる反面、複雑なことを行おうとするとデータサイエンス業務の観点においても開発が複雑になることがあります。

2017年12月時点でプレビューとして提供されているMachine Learning 実験（Azure Machine Learning Workbenchを用いた開発）とMachine Learning モデル管理では、より現実的な機械学習の開発フローを提案しています。

[Azure Machine Learning モデル管理の概念の概要 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/preview/model-management-overview)

<img src=https://docs.microsoft.com/ja-jp/azure/machine-learning/preview/media/model-management-overview/modelmanagement.png width=70%>

## 2. この記事で紹介する範囲

この記事では以下の手順をハンズオン形式で紹介します。

* Azureポータルで Machine Learning 実験と Machine Learning モデル管理 を作成
* Azure Machine Learning Workbench によるモデル開発
  * ローカル/Docker環境でのモデル開発
* Machine Learning モデル管理によるモデル管理
  * モデルのデプロイ/管理
  * ローカル環境でのスコアリングWebサービス構築/実行
  * クラスタ環境でのスコアリングWebサービス構築/実行

また、Azure Machine Learningでは様々な用語がでてきます。それぞれの説明や関係性は次のリンク先に詳しい説明があります。

[Azure Machine Learning プレビュー機能の概念の概要 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/preview/overview-general-concepts)

## 3. 準備

* Microsoft Azure アカウント
* Windows 10、Windows Server 2016 または macOSのマシン
* Docker がインストールされていること
* Azure Machine Learning Workbench がインストールされていること
* サブスクリプション名にCP932に変換できない文字列が含まれないこと

### Microsoft Azure アカウントの作成

Microsoft Azure アカウントを持っていない方は、次のリンク先からアカウントを作成できます。2017年12月現在、1ヶ月の試用期間中に20,500円分のリソースを使用することができます。

[Azure の無料アカウントを今すぐ作成しましょう | Microsoft Azure](https://azure.microsoft.com/ja-jp/free/)

### Dockerのインストール方法

次のリンク先の手順に従ってDockerをインストールします。

[Docker Community Edition for Windows - Docker Store](https://store.docker.com/editions/community/docker-ce-desktop-windows)

### Azure Machine Learning Workbenchのインストール方法

次のリンク先の手順に従ってAzure Machine Learning Workbenchをインストールします。

[Azure Machine Learning サービスのインストールに関するクイックスタート | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/machine-learning/preview/quickstart-installation#install-azure-machine-learning-workbench-on-windows)

### サブスクリプション名の変更

サブスクリプション名にCP932に変換できない文字列が含まれていると、後述の `az` コマンド実行時にエラーが発生します。Azureポータルのサブスクリプションメニューから事前に変更しておくことをおすすめします。既に `az` コマンドでログイン済みの場合は、サブスクリプション名がローカルにキャッシュされているため、`az account clear` コマンド等でクリアする必要があります。

## 4. Azure Machine Learning サービスの構築

ここから実際にAzure Machine Learningサービスを構築する手順を説明します。

### 4-1. Azureサービスの作成

ここではモデルを開発するのための「Machine Learning 実験」サービスとモデルを管理するための「Machine Learning モデル管理」サービスをAzureポータルで作成していきます。

 <ol><li>https://portal.azure.com/ にアクセスしAzureポータルにログインします。

</li><li>左メニューから[その他のサービス >]を選択し、フィルターに"machine"と入力すると一覧に[Machine Learning 実験（Experimentation）]が表示されます。この☆マークをオンにするとメニューに登録されます。このメニューをクリックしてMachine Learning 実験の一覧画面を表示します。<br>

</li><li>[追加]をクリックし、新規作成画面で必要な情報を入力してMachine Learning 実験を作成します。ここで[モデル管理アカウント]をオンにするとMachine Learning モデル管理も作成できます。
ストレージアカウント名はすべてのAzureアカウントで一意になる必要があるため、同一の名称を使うことができませんので適宜変更しましょう。

* 実験アカウント名：dev-mlextutorial
* リソースグループ：dev-mltutorial
* 場所：東南アジア
* シート数：2
* ストレージアカウント：tdsemltutorial
* 実験アカウントのワークスペース：workspace
* モデル管理アカウント：チェックオン
* モデル管理アカウント名：dev-modelmanagement
* モデル管理の価格レベル：DevTest

<img src=https://qiita-image-store.s3.amazonaws.com/0/226632/a4ead108-f34c-e5c6-979a-16156e9b9238.png width=200px>

</li><li>サービスの作成が完了すると上部の通知領域に表示されます。

</li></ol>

### 4-2. Azure Machine Learning Workbenchによるモデル開発

#### プロジェクト作成

 <ol><li>Machine Learning実験を作成後、モデル開発をするためにローカルマシンでAzure Machine Learning Workbenchを起動します。<br>

</li><li>起動後、認証を求められるのでAzureアカウントを入力すると先ほど作成したMachine Learning実験とワークスペースが表示されます。<br>

</li><li>[+]をクリックし、新規プロジェクトを作成します。プロジェクト名 等を適宜入力し、プロジェクトテンプレート一覧から[Classifying Iris（あやめの分類）]を選択します。これは、あやめの花びら（Petal）の長さ・幅、がく（Sepal）の長さ・幅から品種（Species）を推測するモデルです。  

<img src=https://qiita-image-store.s3.amazonaws.com/0/226632/3ad616be-c518-56c5-0c1a-a10d04ea5a2c.png width=300px>

</li><li>プロジェクトを作成すると、モデル作成スクリプト、スコアリングスクリプト、サンプルデータ、Docker実行用の設定ファイル 等が生成されます。

</li></ol>

#### モデル作成

左のタブから様々な操作が可能です。いろいろと試してみましょう。

* [Data]タブ：入力データの追加、データ閲覧・加工
* [Notebooks]タブ：Jupiter Notebook を使ったスクリプト開発
* [Runs]タブ：スクリプトの実行履歴、実行結果の比較
* [Files]タブ：プロジェクトのファイル一覧

それではモデルを作成するためにモデル作成スクリプトを実行します。

 <ol><li>[Files]タブを選択し `iris_sklearn.py` を開くとスクリプトのソースコードを閲覧することできます。このスクリプトでは主に次のことを行っています。

* プログラム引数の値を正規化項として利用。引数が存在しない場合は0.01を設定
* 入力データの読み込み
* scikit-learn によるロジスティック回帰モデルの作成
* モデルをファイルとして出力
* `matplotlib` による2つのグラフ出力
* `run_logger.log` による精度 等のメトリクスの記録

</li><li>このスクリプトをローカル環境とDocker環境で実行していきます。まずはローカルで実行するために、実行環境に `local` を、ファイルに `iris_sklearn.py` を選択して[RUN]をクリックします。<br>

</li><li>右に表示される[Jobs]ビューから実行を選択すると実行状況や実行結果として `run_logger.log` によって出力されたメトリクスや `matplotlib` によって出力されたグラフを確認できます。

<img src=https://qiita-image-store.s3.amazonaws.com/0/226632/14082ed3-b303-9df0-04de-3cfdf6c13718.png width=70%>

<img src=https://qiita-image-store.s3.amazonaws.com/0/226632/0919af60-34c9-546d-394d-ea28ae4af391.png width=70%>

</li><li>続いてDocker環境で実行してみます。実行環境に `docker-python` を選択し、さらに[Arguments]（正規化項）に `0.005` を入力して[RUN]をクリックします。初回起動時はイメージのダウンロード等で時間がかかります。

</li><li>実行が完了するとローカル環境での実行時と同様にDocker環境の実行結果を確認できます。[Arguments]（正規化項）の値を変更して何回か実行してみます。<br>

</li><li>[RUN]タブの[All Runs]から各実行のメトリクス（モデル精度 等）を比較することができます。画像に表示されているグラフのX軸は実行番号を表しています。
  
<img src=https://qiita-image-store.s3.amazonaws.com/0/226632/06f4da04-8eb5-c779-f525-daec6b515489.png width=70%>

</li><li>[All Runs]下部の実行一覧の[Compare]で任意の実行に対して比較を行うことができます。

<img src=https://qiita-image-store.s3.amazonaws.com/0/226632/1c6bdf09-0504-84f7-26a1-d3d76c47cc40.png width=70%>

</li></ol>

### 4-3. モデルのデプロイとスコアリングの実行

次に先ほど作成したモデルをMachine Learningモデル管理にデプロイし、スコアリング処理をWebサービスとして構築して実行できるようにします。

スコアリング処理のWebサービスは、次の2つの環境に構築します。

* ローカル環境：ローカルマシン上のDockerで実行（開発環境を想定）
* クラスタ環境：Azure上のクラスタ化された環境で実行（本番環境を想定）

#### ローカル環境の構築

 <ol><li>先ほどの実行結果からモデルファイルを取得します。精度が一番高いもの 等どれでもよいので実行結果を開き、[Outputs]から `model.pkl` をダウンロードしてプロジェクトディレクトリの直下に保存します。

![47c9b75b5d4d6239941c742005d9fde3.png](https://qiita-image-store.s3.amazonaws.com/0/226632/d16660bf-08f0-e463-75a7-a3f4060b76b9.png)

</li><li>さらに `score_iris.py` を実行して（実行環境は `local` 、 `docker-python` どちらでもよい）、スコアリング処理の入出力定義を生成します。

</li><li>実行結果から `service_schema.json` をダウンロードしてプロジェクトディレクトリの直下に保存します。

</li><li>Workbenchの [File] -> [Open Command Prompt] をクリックしてコマンドプロンプトを起動します。
ここからの手順はコマンドが主体になります。

</li><li> `az` コマンドでAzureを操作するためにはログインが必要です。次のコマンドでログインします。

```sh
# 認証
az login
```

</li><li>スコアリングの実行環境では、コンテナレジストリサービスを利用するので有効化されていない場合は次のコマンドを実行します。

```sh
# コンテナレジストリ追加
az provider register --namespace Microsoft.ContainerRegistry
```

</li><li>ローカル環境を構築します。

```sh
# ローカル環境の構築
az ml env setup --name localenv --location southeastasia --resource-group dev-mltutorial
```

* --name：（任意）環境名
* --location：東南アジア（モデル管理アカウントと同じ場所）
* --resource-group：（任意）リソースグループ名

</li><li>ローカル環境の構築が完了するとAzure上にコンテナレジストリやストレージが作成されていることがわかります。<br>

</li><li>使用するモデル管理アカウントと環境を指定します。

```sh
# モデル管理アカウントを指定
az ml account modelmanagement set --name dev-modelmanagement --resource-group dev-mltutorial
# ローカル環境を指定
az ml env set -n localenv --resource-group dev-mltutorial
```

</li></ol>

#### ローカル環境にスコアリングWebサービスを構築

 <ol><li>Webサービスの入出力をログに記録するため、次の環境変数を設定します。

```sh
set AML_MODEL_DC_STORAGE_ENABLED=true
set AML_MODEL_DC_STORAGE=<ストレージの接続文字列>
```

ストレージの接続文字列は、Azureポータルの[ストレージアカウント] -> 任意のアカウント -> [アクセスキー] にアクセスしてkey1の[接続文字列]から取得します。
※アクセスキーではなく、接続文字列

</li><li>ローカル環境にWebサービスを構築するには次の手順が必要になります。
これらの手順を一括実行することも可能ですがここではそれぞれ個別に実行します。

* モデルの登録
* マニフェストの作成
* Dockerイメージの作成
* Webサービスの構築

```sh
# モデルの登録
# モデルIDが生成されるので次のコマンドで使用
az ml model register --model model.pkl --name model.pkl

# マニフェストの作成
# マニフェストIDが生成されるので次のコマンドで使用
az ml manifest create --manifest-name irisapp -f score_iris.py -r python -i <モデルID> -s service_schema.json

# Dockerイメージの作成
# イメージIDが生成されるので次のコマンドで使用
az ml image create -n irisimage --manifest-id <マニフェストID>

# Webサービスの構築
az ml service create realtime --image-id <イメージID> -n irisapp --collect-model-data true
```

</li></ol>

#### ローカル環境のWebサービスを実行

 <ol><li>Webサービスの構築が完了したらWebサービスを実行してスコアリングの動作を確認します。
まずはWebサービスの実行方法を確認します。

```sh
# Webサービスの実行方法を確認
az ml service usage realtime -i irisapp
```

</li><li> `az ml service run` または `curl` コマンドで実行できます。次のコマンドを実行すると結果として品種が返ってきます。また、ローカル環境では認証は不要です。※ `curl` コマンドはWindows標準には含まれていません

```sh
# az コマンド
az ml service run realtime -i irisapp -d "{\"input_df\": [{\"petal width\": 0.25, \"petal length\": 1.3, \"sepal length\": 3.0, \"sepal width\": 3.6}]}"

# curl コマンド（ポート番号は実行環境で異なるため、実行方法の確認結果を確認）
curl -X POST -H "Content-Type:application/json" --data "{\"input_df\": [{\"petal width\": 0.25, \"petal length\": 1.3, \"sepal length\": 3.0, \"sepal width\": 3.6}]}" http://127.0.0.1:32773/score
```

</li><li>入力値（花びら（Petal）の長さ・幅、がく（Sepal）の長さ・幅）を変更して何回かWebサービスを実行してみます。
上記で設定したストレージアカウントに入力値とスコアリング結果が記録されているのがわかります。

* 格納先パス：
`/modeldata/<サブスクリプションID>/dev-mltutorial/dev-modelmanagement/irisapp/<モデルID>-model.pkl-<model_version>/`
* 入力ログファイル：`/inputs/<年>/<月>/<日>/data.csv`
* 結果ログファイル：`/prediction/<年>/<月>/<日>/data.csv`

</li></ol>

#### クラスタ環境の構築

 <ol><li>ローカル環境での動作確認が完了したので、次にクラスタ環境で実行できるようにします。
次のコマンドでAzure上にクラスタ環境を構築します。

**注意**：Azure上に実行環境が構築されるので動作確認が終了したらAzureポータルで削除しましょう。

```sh
# クラスタ環境の構築
# Reuse storage and ACR (Y/n)? には n を指定
az ml env setup --cluster --name clusterenv --location southeastasia --resource-group dev-mltutorial

# クラスタ環境の構築には時間がかかるため、次のコマンドで状態を確認
az ml env show -n clusterenv --resource-group dev-mltutorial
```

</li><li>クラスタ環境の構築が完了するとAzure上にコンテナレジストリやストレージだけでなく、実行環境となる仮想ネットワーク・仮想マシン・ロードバランサー 等が作成されていることがわかります。<br>

</li><li>クラスタ環境を使用するように環境を指定します。

```sh
az ml env set -n clusterenv --resource-group dev-mltutorial
```

</li></ol>

#### クラスタ環境にスコアリングWebサービスを構築

 <ol><li>ローカル環境では、モデルの登録～Webサービスの構築を個別で実行しましたが次のコマンドで一括で実行することができます。

```sh
# サービスIDが生成される
az ml service create realtime -f score_iris.py --model-file model.pkl -s service_schema.json -n irisapp -r python --collect-model-data true
```

</li></ol>

#### クラスタ環境のWebサービスを実行

 <ol><li>Webサービスの構築が完了したらローカル環境のときと同様にWebサービスの実行方法を確認します。
実行結果からWebサービスのIPアドレスがローカルでないことがわかります。

```sh
# Webサービスの実行方法を確認
az ml service usage realtime -i <サービスID>
```

</li><li>クラスタ環境のWebサービスを実行するには認証キーが必要になります。
認証キーの確認には次のコマンドを実行します。

```sh
az ml service keys realtime -i <サービスID>
```

</li><li> `az ml service run` または `curl` コマンドでWebサービスの動作を確認します。

```sh
# 認証キーとWebサービスURLは適宜変更してください
curl -X POST -H "Content-Type:application/json" -H "Authorization:Bearer <key>" --data "{\"input_df\": [{\"petal width\": 0.25, \"petal length\": 1.3, \"sepal length\": 3.0, \"sepal width\": 3.6}]}" http://52.187.132.98:80/api/v1/service/irisapp/score
```

</li></ol>

今回紹介する手順はここまでとなります。

## 5. さいごに

一つひとつのサービスや手順を深くは触れていませんが、ローカルでのモデル開発～スコアリングWebサービスをクラスタ環境に構築する流れをざっと追いました。

このAzure Machine Learningサービスが提供する開発フローを実際の運用にどのように組み込めるかはさらに深掘りをして検証していく必要があると思います。
まずはモデル管理のみを使う、Workbenchツールのみを使う 等 部分的に使ってみてもいいかもしれません。

また、今回は紹介できませんでしたが Azure Machine Learning サービスでは次のことを提供しているので興味のある方は、Microsoftのドキュメントを参照してみてください。

* Azure Machine Learning Workbench による AI を活用したデータラングリング
* Azure Machine Learning モデルの Azure IoT Edge デバイスへの展開
* Visual Studio Code Tools for AI による開発

現時点ではAzure Machine Learning 実験とモデル管理はプレビュー機能ですが、機械学習開発の運用管理を改善できる可能性を秘めているので今後に期待していきましょう。