Azure Synapse Analyticsで機械学習を利用しよう ①モデル学習からスコアリングの流れ

# AzureSynapseAnalyticsで機械学習を利用しよう①モデル学習からスコアリングの流れ

## はじめに

Azure Synapse Analytics(以下、Synapse)上での機械学習の利用について[Azure Synapse Analytics の Machine Learning 機能 (ワークスペース プレビュー)](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/machine-learning/what-is-machine-learning)に記載されているような概要で機能が形になってきました。

分析に関わるワークロードを集約する環境として開発が進みついにGAが発表されたSynapseですが、今回はMLワークロードの中でもDWHデータに対するスコアリングができる[チュートリアル:Synapse SQL プール向けの機械学習モデル スコアリング ウィザード](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/machine-learning/tutorial-sql-pool-model-scoring-wizard)で案内されているウィザードを使った結果を記載したいと思います。  
※すんなりいかなかった箇所も含めて紹介します。 

(2020/12時点の情報）


### スコアリング ウィザードについて

GUIでT-SQLのスコアリングスクリプトが生成されます。
特に、モデルへのInput、Outputが定義されている場合、テーブルの列とモデルへのマッピングがGUIでガイドされます。

![イメージ](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/machine-learning/media/tutorial-sql-pool-model-scoring-wizard/tutorial-sql-scoring-wizard-00e.png)


## スコアリング ウィザード利用時に必要な仕様理解

注意しておくべき仕様をまとめました。MLflowの利用については私もさほど詳しくないので、ここでは割愛します。

1. 現状、Synapseから認識できるAzureMLのモデルはonnx形式のみです。ONNXモデル以外は選択肢として表示されません。
2. 現状 Azure MLの Auto MLではGUIでonnxモデルの作成ができません。
3. テーブルの列とモデルへのマッピングを使うためにはモデル登録にML Flowを利用する必要があります。

2については、GUIでもできるようにしてほしいところです。「ONNX モデルの互換性を有効または無効にする」が対応していない状況となっています。

[モデルの設定](https://docs.microsoft.com/ja-jp/azure/machine-learning/concept-automated-ml#model-settings)

>| |Python SDK|Studio Web エクスペリエンス|
>|----|:----:|:----:|
>|**最適なモデルの登録、デプロイ、説明可能性**| ✓|✓|
>|**投票アンサンブルとスタック アンサンブル モデルを有効にする**| ✓|✓|
>|**プライマリ メトリック以外に基づいて最適なモデルを表示する**|✓||
>|**ONNX モデルの互換性を有効または無効にする**|✓||
>|**モデルのテスト** | ✓| |

## モデル構築環境について

スコアリングウィザードを利用する際のモデルの訓練から登録について、チュートリアルのモデル学習～登録のNotebookを実行する環境として以下のパターンで試しました。

1. Azure ML Compute Instance上でモデル学習～登録(チュートリアル通り)
2. Spark Notebook上でモデル学習～登録

2については実際にSynapseを利用する際にはあるパターンかなと思って試しています。データの準備からモデル構築までをシームレスに実行できるようなイメージです。

## 準備

それぞれ環境を準備して、linked Serviceを作成しておきます。

[クイック スタート:Synapse ワークスペースを作成する](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/quickstart-create-workspace)  
[クイック スタート:Azure portal を使用して新しい Apache Spark プールを作成する](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/quickstart-create-apache-spark-pool-portal)  
[クイック スタート:Azure portal を使用して Synapse SQL プール (プレビュー) を作成する](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/quickstart-create-sql-pool-portal)
[チュートリアル:Jupyter Notebook で Azure Machine Learning の作業を開始する](https://docs.microsoft.com/ja-jp/azure/machine-learning/tutorial-1st-experiment-sdk-setup)

[クイック スタート:Synapse で Azure Machine Learning のリンクされたサービスを新規作成する](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/machine-learning/quickstart-integrate-azure-machine-learning)※コンピューティングインスタンスを作成するのみです。

## チュートリアル通りにやってみる

### Azure ML Compute Instance上でモデル学習～登録(チュートリアル通り)


pip list 上のscikit-learnのversionが指定と違ったので、importしなおして、カーネル再起動をかけて実行します。

ちなみにversion変更をせずに実行するとエラーが出ます。

> onnx_model = convert_sklearn(clf, "nyc_taxi_tip_predict", model_inputs)
> 

![sklearn_onnxConvertError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f0dc97a1-2516-bc59-ff86-5b17485ef956.png)


### Spark Notebook上でモデル学習～登録

Synapse上でもやってみました。
もしかしたらSynapse studioでやるほうが推奨なのかも？

ライブラリのバージョンは一旦無視します。    

ただし、Spark Poolの作成時期によってはmlflowがビルトインされていないようなので、以下の内容のrequirements.txtを用意してSynapse Sparkのパッケージ追加を行います。
※2020/12 現在はビルトインされています

```:
azureml-mlflow
mlflow
```

Azure ML にonnxモデルが登録されました。

一覧
![mlmodel_summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cc74da6c-0746-a235-08d3-c16a460749f1.png)


詳細
![mlmodel_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1dd3ce04-c70c-8048-b497-5b3796d0c58e.png)


成果物
![mlmodel_artifact.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/001e3951-ef22-1a5c-27f2-951845d4c71e.png)


このinput_exampleや、signatureが用意されていることが非常に重要でした。  
これがないと上述の**マッピング機能が利用できません**。MLFlowでの登録はこの作成をしてくれるようです。



### スコアリングウィザード

さて、スコアリングウィザード の確認ですが、この状態であれば、SQL Poolからも利用ができ、マッピングも用意されています。

手順通りテーブルを作成して、右クリックでウィザードを起動します。

![](.media/wizard1.png)
![wizard1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ab0f42ec-c38e-f8e8-711b-3fb28b97a8bf.png)


モデルを選択します。バージョン情報が出ていて親切です。


![wizard2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d72352ec-41bc-c6c4-abef-e553dfdf4fae.png)


スコアリング用のスクリプトはストアドプロシージャとして作成されます。

![wizard3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/902ba83b-2334-599d-2482-a80f2ffd03f7.png)


内容はこんな感じ.  
PREDICT関数が利用されています。

[PREDICT (Transact-SQL)](https://docs.microsoft.com/ja-jp/sql/t-sql/queries/predict-transact-sql?view=sql-server-ver15)

![wizard4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/81a93937-a67f-ca19-c4eb-f85c81a3cc70.png)


実行すると、output labelとして、スコアリング結果が表示されます。

![wizard5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/38911de9-dac3-8efc-3309-a52035257547.png)


## おわり

Synapse Studio上で実行すれば非常に簡単になっていました。

次回は、AutoMLの利用の紹介とともに、Synapseを中心としたモデル学習について紹介してみようと思います

## 追記
2020/12/07
Compute Instanceでの実行でカーネル再起動忘れをしていたので修正しました。