Azure Machine Learningのいろは

# はじめに
[Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/) とはAzureのサービスの一つで、Azureで機械学習モデルを構築、運用できるプラットフォームです。
Azure上で**ノートブック**（Python）を用いたモデル構築だけでなく、データを投入するだけで自動的に最適なモデル・パラメータ探索を行ってくれる**AutoML**やGUIベースでパイプラインを構築できる**デザイナー**機能もあり、幅広いユーザにとって活用場面のあるサービスなのですが、その幅広さ故に初めて触る人にはちょっとわかりにくい部分もあるなあと思い、構造的に理解をするために記事にすることにしました。
これからAzure Machine Learningを触ろうと考えている方、また少し触ってみたが深くは理解できていない方の一助になれればと思います。
なお、本記事の内容は私の独自の理解に基づいた記述となっており、また日々提供サービスも更新されていることを念頭に置いてあくまで参考としてお読みいただけると幸いです。
間違っている内容や古い情報に気づかれましたらコメントにてお教えいただけると嬉しいです。

まだこの記事で全部を網羅できているわけではありませんが、記事の内容は随時アップデート予定です。

# 前提
Azureを利用するにあたりアカウントを作成する必要があります。
本記事ではAzure Machine Learningのポータル画面から話を始めますが、
それ以前の準備に関しては別記事を参照お願いいたします。
日本マイクロソフト社が開催しているハンズオンに参加した時の記事[Azure AutoML ハンズオン](https://qiita.com/gnbrganchan/items/6ea417336ca6baca192a)でも紹介しています。

# 全体像
Azure Machine Learningにおける機械学習モデルの構築・運用の流れとしては下記の流れになります。
1. データの登録
2. モデルの選択・学習・評価
3. モデルデプロイ
4. 運用
また、各段階においてインターフェースが複数用意されているため、便利でもあり少しわかりにくくなっている要因でもあるので、以下では上記の段階×インターフェースの切り口で解説していきます。
まず、以下はAzure Machine Learningのトップ画面です。
<img width="1058" alt="01_overviw.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/d845c29a-74d9-cc90-d431-167d5334f2f6.png">

初めて触る方は公式のチュートリアルを一通り触ってみるのも良いでしょう。
画面の左側に
・作成者
・アセット
・管理
とあります。

**作成者**
初めて見たときは意味がよくわからなかったのですが、要はモデルを構築するためのインターフェースだと考えていいと思います。
英語だとAuthorと書いてあるのですが、どちらにしてもあまりニュアンスはよくわかりません。。

**アセット**
その名の通り資産のことで、Azureに登録したデータや作成したモデルなどが表示されます。

**管理**
主にコンピュータリソースを管理します。
後述しますが、Azureは基本的に従量課金のため、無駄にコンピュータリソースを稼働させていると不必要に高額な費用を発生させてしまいかねないので注意が必要です。

本記事では、モデルを構築する順番通り、
データ登録⇒モデル学習⇒モデル登録⇒デプロイ⇒推論の順番に紹介していきます。
本当はその前にAzure上で学習・推論などを行うためのコンピューティングリソースの作成・管理の話が必要なのですが、少しややこしいため最後にまとめて記載します。

# データの準備
データソースはcsvファイルやWeb上のデータ等、おおよそ何でも使えます。
今回はお馴染みの[TitanicデータをCSV化したもの](https://github.com/gnbrganchan/Qiita/tree/master/AzureMachineLearning/data)をローカルから読み込ませて学習・推論させます。

# データの登録
Azure上でモデルを学習・推論させるにあたり、モデルを登録させる必要があります。
登録されたデータはアセットの`データセット`に表示されます。

## アセットから登録する
ホーム画面から`アセット`⇒`データセット`⇒`データセットの作成`でデータを登録することができます。
<img width="1058" alt="02_データセット登録_アセットから.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/4017d803-8c13-0bb5-31a7-7245116d7ee3.png">
図の赤枠をクリックすると、`ローカルファイルから` `データストアから` `Webファイルから` `Open Datasetsから`という選択肢が表示されます。
ここではローカルファイルからデータセットを登録します。
登録画面に以下の手順で情報を入れていくと、データセットの登録が進みます。
データの形式などはAzure側である程度判別してくれるので、ユーザ側でそこまで細かい設定をする必要はありません。

**基本情報**

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|名前|データセットの名前。後で見て何のデータかわかるように設定する。|titanic-train|
|データセットの種類|音声ファイルなど非定型データも登録可能。一般的なテーブルデータであれば「表形式」を選択。|表形式|
|説明|データセットの説明。任意。|Titanicの学習用データ|

**データストアとファイルの選択**

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|データストアの選択または作成|どのデータストアにデータを登録するか選択。|現在選択されているデータストア|
|データセットのファイルの選択|登録するデータを選択。|train.csv（ローカルのファイルから選択）|

**設定とプレビュー**

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|ファイル形式|表形式データであれば「区切り」を選択。|区切り|
|区切り文字|コンマ区切り、タブ区切り等を選択。|コンマ|
|エンコード|ファイルのエンコード形式を選択。|UTF-8|
|列見出し|「ヘッダーなし」を選択すると、「Column1」のように通し番号でカラム名が設定される。ファイル中にヘッダーが記載されている場合は「最初のファイルのヘッダーを使用する」等を選択。|最初のファイルのヘッダーを使用する|
|行のスキップ|ファイルの先頭数行に不要な行（ファイルの説明等）が入っている場合は、その行を無視するためにスキップする行数を指定。|なし|

**スキーマ**

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|含める|Azureに取り込むか否かを選択。|ON|
|列名||PassengerId|
|プロパティ|||
|種類|整数、文字列、日付などから選択|整数|

ここまで来るとデータセットの登録が完了します。
データセットの登録が完了すると、`アセット`⇒`データセット`に登録したデータセットが表示されます。
<img width="1058" alt="03_データセット登録_アセットから_完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/7be9e6ea-cf4e-26fd-683b-836c6cdc4743.png">


# モデルの学習
Azure Machine Learning のコア機能となるモデルの学習ですが、Python でユーザが自由にモデルを構築できる`ノートブック`をはじめ、データと予測対象列を指定すると自動的に最適なモデル学習を行ってくれる`自動ML`やノンプログラミングで予測パイプラインの構築を行うことができる`デザイナー`など、多彩なインターフェースが用意されています。

## ノートブックを使って学習する
ノートブックを使って自由にモデルを構築することができます。
ノートブックからAzure Machine Learning上のアセットにアクセスするにはPython SDKのインポートが必要になります。
ノートブックからAzure Machine Learning上のアセットにアクセスするための下準備については[Python SDKによるAzure Machine Learning上のアセットの操作](#python-sdkによるazure-machine-learning上のアセットの操作)にまとめていますのでご参考にしてください。
下準備が済んでしまえば、scikit-learn等を使ったローカル環境と変わらない操作でモデルの学習を行うことができます。

## 自動MLを使って学習する
自動MLを使うと、指定したデータ・メトリクスに対して様々なモデルを試行してくれます。
Azure Machine Learningではデータ・メトリクスを指定した一連の学習を「実験」と呼び、
1つの実験の中の個々のモデルの学習のことを「実行」と呼んで区別しています。
つまり、1つの実験を作成すると自動MLによっていくつもの実行が作成されます。

ホーム画面から`作成者`⇒`自動ML`⇒`新しい自動MLの実行`を選択すると自動MLを始めることができます。
<img width="1057" alt="モデル学習_AutoMLから.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/3a07d59b-f0be-8559-17af-48439344fa53.png">

**データセットの選択**
学習に使用するデータセットを選択します。
前述の方法でデータセットを登録済みであれば、登録したデータセットが表示されます。
ここで初めてデータを登録することも可能です。

**実行の構成**
トレーニングクラスターの作成については[コンピューティングクラスター](#コンピューティングクラスター)を参照してください。
今回は事前に作成したコンピューティングクラスター(MinCompCluster01)をトレーニングクラスターとして使用しますが、この画面から新にコンピューティングクラスターを作成することもできます。

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|新しい実験名|ユーザが実験を識別するために名前をつける|titanic_exp01|
|ターゲット列|予測したい列名。モデルの出力となる列。被説明変数。|Survived|
|トレーニングクラスターを選択する|学習に使うリソースを選択。|MinCompCluster01|

**タスクの種類の選択**
今回の目的が分類（カテゴリ値の予測）なのか、回帰（連続値の予測）なのか、時系列の予測なのかを選択します。
分類の場合、ディープラーニングを有効化することもできます。（2020/6/14時点でプレビュー版）
今回はタイタニック号乗船者の生存(1)または死亡(0)を予測する分類タスクのため、「分類」を選択します。

必要な情報を入力し終えると、自動MLが動き出し、学習が始まります。
<img width="1058" alt="モデル学習_AutoML_開始中.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/dcb66422-7436-c767-53ad-595f75295093.png">

しばらくすると実験が完了します。
<img width="1057" alt="モデル学習_AutoML_完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/19c8811f-2d30-4f18-6193-8f981ee24705.png">

実験IDをクリックすると、実験の詳細画面に遷移し、今回の実験におけるベストモデルとそのときの精度など詳細情報を確認することができます。
<img width="1057" alt="モデル学習_AutoML_完了_詳細.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/2e69498f-6296-5e6a-49fc-5b1f5a126be3.png">


## デザイナーを使って学習する
デザイナー機能を使うと、GUIによるモデル構築が可能です。
自動MLでは完全に自動でモデルが選択・学習されますが、デザイナー機能を使うと使用するモデルや特徴量生成・選択をある程度自由に行うことができます。
部分的にRやPythonのコードを挿入することもできるので、柔軟性を高めつつ視覚的に処理がわかりやすいモデリングが可能となります。
デザイナー機能は`作成者`⇒`デザイナー`から使用することができます。
<img width="1058" alt="学習_デザイナー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/492fce65-12e6-e4f2-d33e-eec7afbd0389.png">

デザイナーで使うことができるモジュールはAzure Machine Learning特有のもので、慣れるまでは使い勝手がわかりにくいため、初めのうちはサンプルをコピーしてデータセット等を書き換えながら使用することをおすすめします。
Azure Machine Learningには、回帰・分類など多様なタスクに対応したサンプルのパイプラインが豊富に用意されているので、よほど複雑なタスクでない限りはカバーできると思います。

今回は二値分類タスクのため、「Sample 3: Binary Classification with Feature Selection - Income Prediction」をベースにパイプラインを作成していきます。
サンプルを開くと、作成済みのパイプラインが表示されます。
デザイナーを使って学習を行うには、自動MLのときと同様にコンピューティングクラスターを設定する必要があります。
ここではあらかじめ作成したMinCompCluster01を使用します。
このサンプルでは「Adult Census Income Binary Classification dataset」というデータセットを使っていますので、まずこれを今回学習させたいタイタニックデータに置き換えます。
<img width="1058" alt="モデル学習_デザイナー_データセット置き換え.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/a2d7f980-b1f1-7a8e-e695-a2d2b67fe372.png">

データセットは変更しましたが、予測対象とするカラムの情報などがサンプルのままなので、適宜書き換えます。（今回のターゲットは「Survived」列です）
<img width="1058" alt="モデル学習_デザイナー_データセット置き換え_ターゲット変更1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/d5b365ca-fa86-5aeb-7f85-0810d885a5d8.png">
<img width="1056" alt="モデル学習_デザイナー_データセット置き換え_ターゲット変更2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/f3044abb-0bcf-dfcc-8a95-7970937ce225.png">

データセット・ターゲット列等を適切に設定したのち、「送信」をクリックするとパイプラインが動き出し、学習が始まります。
各モジュールの設定が正しくされていれば問題なく進みますが、列名の指定等に誤りがあると、途中で実行が止まってしまいます。
実行に失敗すると、下図のように失敗した箇所が赤く表示されます。
<img width="1058" alt="モデル学習_デザイナー_失敗.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/883c4e40-abcc-343b-63b8-79fd2807a04a.png">
モジュールをクリックすると、詳細を確認することができます。
今回は、列名を「Survived」としなければいけないところをサンプルのまま「income」としていたためエラーが起こっていることがわかりましたので、修正の上再度実行します。
<img width="1056" alt="モデル学習_デザイナー_失敗_原因.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/f62ddee4-2052-08de-7db6-0fd3e404319e.png">

パイプラインを実行すると、`アセット`⇒`パイプライン`に表示されます。
ここで状態が「完了」となっていれば、パイプラインの実行が問題なく完了したことがわかります。
<img width="1056" alt="モデル学習_デザイナー_実行結果.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/233136ce-e549-6d02-12cc-7264ba188028.png">

モデルの学習結果については、デザイナーの画面から「Evaluate Model」モジュールをクリックすることで確認できます。
Evaluate Model画面から「出力とログ」⇒「データ出力を表示する」⇒グラフのマーク（可視化）をクリックすると、ROC曲線などモデルの学習結果に関する情報を確認することができます。
<img width="1058" alt="モデル学習_デザイナー_スコア確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/e17e91b4-1699-fdec-a5a3-e97a298f4eb7.png">
<img width="1058" alt="モデル学習_デザイナー_スコア確認_詳細.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/1d752c16-0760-b310-3ad3-7a9f36166c9d.png">

[Microsoftが公開しているチュートリアル](https://docs.microsoft.com/ja-jp/azure/machine-learning/tutorial-designer-automobile-price-train-score)にはより細かい実行例が記載されているので、ご参考にしていただければと思います。

# モデルの登録・デプロイ・推論
学習したモデルを使ってWebサービスを開始したり、新しいデータから予測値を算出するには、学習したモデルを登録する必要があります。
Webサービスとして使用するためには更にデプロイが必要です。
バッチ的に新しいデータを読み込ませて予測値を算出するだけであればデプロイはする必要はなく（デプロイしてもいいのですが）、ノートブックから登録したモデルを呼び出すことで推論を行うことができます。

## ノートブックを使ってデプロイする
### 自動MLの結果を利用する
自動MLで実行した実験結果をノートブックから取得・利用することができます。
実験結果の取得には`Experiment()`を使用します。
引数には実験名`experiment=`が必要となります。
以下の処理では、自動MLで作成した実験`titanic_exp01`において精度が最もよかったモデルを探索し、呼び出しています。
`experiment.get_runs(include_children = True)`によって、子実験まで含めた全実験を取得し、それぞれにおける精度を比較することで最良精度の実行IDを`max_acc_runid`に保存しています。
最後に、`Run(experiment=experiment, run_id=max_acc_runid)`によって実験IDから実行結果を呼び出しています。

```Python3:自動MLの結果を取得する
# 実験名を指定して実験結果を取得
experiment = Experiment(workspace=ws, name="titanic_exp01")

max_acc_runid = None
max_acc = None

# すべての子実験結果から、最良のモデルを探索
for run in experiment.get_runs(include_children = True):
    run_metrics = run.get_metrics()
    run_details = run.get_details()
    # メトリクスが保存されていないid（親ID等）はスキップ
    if len(run_metrics) == 0:
        continue
    # メトリクスやIDはdict型で保存されている
    run_acc = run_metrics["accuracy"]
    run_id = run_details["runId"]
#     print(run_id + ":" + str(run_acc))

    # 精度が最大のIDを記録
    if max_acc is None:
        max_acc = run_acc
        max_acc_runid = run_id
    else:
        if run_acc > max_acc:
            max_acc = run_acc
            max_acc_runid = run_id

# 最良精度のIDと精度を出力
print("Best run_id: " + max_acc_runid)
print("Best run_id accuracy: " + str(max_acc))

# idを指定して実験結果を呼び出し
best_run = Run(experiment=experiment, run_id=max_acc_runid)
```

###モデルを登録する
`Run.register_model`によって、実行結果からモデルを登録することができます。
モデルを登録すると、Azure Machine Learningのアセット上で確認できるようになり、モデルのデプロイや呼び出しをすることができるようになります。

```Python3:モデルを登録する
model = best_run.register_model(model_name = 'model_automl01', model_path = "", model_framework = Model.Framework.SCIKITLEARN)
```

## ノートブックを使って推論する
ここでは、学習済みモデルをサービスとしてデプロイするのではなく、予測用データを用いて予測値を算出する方法を紹介します。

```Python3:ノートブックを使って推論する
# モデルのpklファイルを含む、実行に関するデータをすべてAzure上のマイファイルにダウンロード
best_run.download_files(output_directory = "./download")
# pklファイルからモデルをロード
model = joblib.load("./download/outputs/model.pkl")
# 推論用のデータセットを読み込み
dataset = Dataset.get_by_name(workspace = ws, name = "titanic-test").to_pandas_dataframe()
# 予測を実行
pred = model.predict(dataset)
# csvとして出力
sub = pd.DataFrame({"PassengerId" : dataset.PassengerId, "Survived" : pred})
sub.to_csv("./submission.csv", index = False)
```

## 自動MLからデプロイする
AutoMLで実行した実験結果からモデルを選択し、デプロイしてサービスとして開始することができます。
`作成者`⇒`自動ML`または`アセット`⇒`実験`から実行した実験を選択し、その中からどれかモデルを選択すると画面上に`デプロイ`が表示されます。
<img width="1057" alt="デプロイ_AutoML.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/71902a12-03bc-9ca6-9257-26f1f0c1a60e.png">

ここで、デプロイするモデルの名前やデプロイの形式を選択します。
<img width="1058" alt="デプロイ_AutoML_登録.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/f7cd3fb1-0ced-5bd1-30c8-4642966bcb13.png">

**名前**
デプロイするモデルの名前をつけます。

**説明**
モデルの説明を加えます。（任意）

**コンピューティングの種類**
AKSまたはACIから選択することができます。

デプロイが完了すると、モデルの概要画面の「デプロイの状態」が完了になります。
<img width="1058" alt="デプロイ_AutoML_登録完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/cb831906-bbf0-c730-1b52-0dcec00f6135.png">

さらに、`アセット`⇒`エンドポイント`に先ほどデプロイしたモデルが表示されます。
<img width="1057" alt="デプロイ_AutoML_登録完了_エンドポイント.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/f491d0aa-0a3a-974d-6d78-b6a5e179dec3.png">

### デプロイされたモデルの動作確認
デプロイしたモデルにリクエストを送信することで、モデルの動作確認を実施できます。
Azure Machie Learningのノートブックから動作確認を行う方法が[こちら](https://docs.microsoft.com/ja-jp/learn/modules/use-automated-machine-learning/deploy-model)に書かれています。

## デザイナーから推論をする
デザイナーで作成したモデルを使って推論を行うためには推論用のパイプラインを作成する必要があります。
推論パイプラインはトレーニングパイプラインのデザイナー画面から、「推論パイプラインの作成」をクリックすることで作成できます。
![デザイナー_推論パイプライン作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/b407771a-9043-339a-e2fc-88893d976bff.png)

推論パイプラインを作成すると、「Web Service Input」と「Web Service Output」というモジュールが自動で追加されています。
![デザイナー_推論パイプライン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/c4721474-2af5-a1e8-3c09-f168e87a0748.png)

## デザイナーからデプロイする
推論パイプラインのデザイナー画面から「デプロイ」をクリックすると、作成したパイプラインをデプロイすることができます。
![デザイナー_推論パイプライン_デプロイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/4f4b3b6c-c727-90ed-9657-ef0e1c078365.png)



# Python SDKによるAzure Machine Learning上のアセットの操作
## ノートブックを使用する
Azure Machine Learning上のノートブック機能を使って、自動MLによる学習などAzure Machine Learningの各種機能を利用することができます。
ノートブックを使用するには後述のコンピューティングインスタンスが必要となります。

**SDKの読み込み**
初めに、Azure Machine Learningの各種機能を利用するためにライブラリをインポートする必要があります。
インポートが問題なく完了すると、下記スクリプトの最後のprint文によりSDKのバージョンが表示されます。（表示されるバージョンは下記とは異なる場合がありますが、問題ありません）

```Python3:ライブラリのインポート・バージョン確認
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

import azureml.core
from azureml.core import Workspace
from azureml.core import Experiment
from azureml.core import Run
from azureml.core import Dataset
from azureml.core import Model
from azureml.train.sklearn import SKLearn
from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

# check core SDK version number
print("Azure ML SDK Version: ", azureml.core.VERSION)
> Azure ML SDK Version:  1.6.0
```

**ワークスペースの読み込み**
次に、作業を行うワークススペースを読み込みます。
ワークスペースの読み込みには`サブスクリプションID` `リソースグループ名` `ワークスペース名`の3つの情報が必要となります。

```Python3:ワークスペースの読み込み
subscription_id = '*****' # サブスクリプションIDを入力
resource_group  = '******' # リソースグループ名を入力
workspace_name  = '********' # ワークスペース名を入力

try:
    ws = Workspace(subscription_id = subscription_id, resource_group = resource_group, workspace_name = workspace_name)
#     ws.write_config()
    print('Library configuration succeeded')
except:
    print('Workspace not found')
```

ワークスペースの読み込みが完了すると、ワークブックからAzure Machine Learningを使用する準備が整います。

## ローカルの環境からAzure Machine Learningを使用する
Python SDK を使うことで、ローカルの環境からAzure Machine Learningの各サービスを使用できるようになり、Azure Machine Learning上のノートブックを使わない分、費用を抑えることができます。
ローカルからAzure Machine Learningを動かす方法については、他の型の記事ですが下記でまとめられていますので、ご参照ください。
[ローカルでAzure Machine Learningを実行するときのメモ](https://qiita.com/dyamaguc/items/63a8e4ae8593f70ed2ab)

# 管理 - コンピューティング
Azure Machine Learningに使う仮想マシンの作成・管理についてまとめます。
モデルの学習・推論に仮想マシンが必要なことは言うまでもないですが、Azure Machine Learning上のワークブック機能を使う際にも仮想マシンが必要となります。
そして、Azure Machine Learningの費用はどの程度の性能のインスタンスを何時間使うかによって
ほとんど決まるため、仮想マシンについての理解は不可欠です。
仮想マシンのサイズと料金の関係については後述の費用を参照ください。

Azure Machine Learning上で扱う仮想マシンは、ホーム画面から`管理`⇒`コンピューティング`で確認することができます。
<img width="1056" alt="管理_コンピューティング.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/9e17c2cc-7a6f-07bc-33ce-cec5b34d4add.png">
Azure Machine Learningで扱う仮想マシンには、「コンピューティングインスタンス」「コンピューティングクラスター」「推論クラスター」「アタッチされたコンピューティング」の4種類があります。
それぞれ、Azure上でノートブック等を編集・実行するためのリソースや、ノードをいくつも立ち上げて学習・推論を行うためのインスタンスなど、役割が分かれています。
また、PythonSDKを使う場合、ローカルの環境からAzureの実験をsubmitしたり、資産を操作することもできます。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/6f220585-4fb6-1d2d-79ff-528f0286387c.png)


## コンピューティングインスタンス
コンピューティングインスタンスはノートブックを使用するための仮想マシンです。
コンピューティングインスタンスを作成するにあたり必要な項目は下記の通りです。
<img width="1058" alt="管理_コンピューティング_コンピューティングインスタンス_作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/5d6f4412-7f73-4b7f-aaa7-4c0aa6796ec7.png">

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|コンピューティング名|ユーザが認識できるように名前をつける。|MinCompInstance01|
|仮想マシンの種類|CPUまたはGPUを選択可。|CPU|
|仮想マシンのサイズ|仮想マシンのスペックを選択。高性能ほど時間当たりの費用も増える。|Standard_D1_v2|

コンピューティングインスタンスの作成には数分かかります。
作成完了すると、以下のように一覧に現れます。
コンピューティングインスタンスは、使用しないときは明示的に停止する必要がある（停止をしないと課金され続けてしまう）ため注意が必要です。
（後述のコンピューティングクラスターは、適切に設定をすることで使用していないときの課金を自動的に防ぐことができます）
<img width="1056" alt="管理_コンピューティング_コンピューティングインスタンス_作成完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/6fefb4bd-dcfc-1030-fab0-673755c30bc4.png">


## コンピューティングクラスター
コンピューティングクラスターはモデルの学習を行うための仮想マシンです。
前述のコンピューティングインスタンスと名前が似ていますが、目的が異なります。
コンピューティングクラスターを作成するにあたり必要な項目は下記の通りです。
<img width="1058" alt="管理_コンピューティング_コンピューティングクラスター_作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/dbc76e40-1c5e-4e3a-0e1c-ca685b8677d1.png">

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|コンピューティング名|ユーザが認識できるように名前をつける。|MinCompCluster01|
|仮想マシンの種類|CPUまたはGPUを選択可。|CPU|
|仮想マシンの優先度|専用または低優先度から選択可。低優先度は低コストだがノード数が保証されず、ジョブ割込みを受ける可能性あり。|専用|
|仮想マシンのサイズ|仮想マシンのスペックを選択。高性能ほど時間当たりの費用も増える。|Standard_D1_v2|
|最小ノード数|ジョブが少ないときの最小のノード数。|0|
|最大ノード数|ジョブが多いときの最大のノード数。|4|
|スケールダウンするまでのアイドル時間（秒）|ここで設定した時間だけアイドル時間が発生した場合、最小ノード数までスケールダウンされる。|120|

コンピューティングクラスターの作成には数分かかります。
作成完了すると、以下のように一覧に現れます。
このコンピューティングクラスターは最小ノード数を0に設定しており、作成直後はなんのジョブも投入されていないため自動的にノード数が0となり、課金されません。
最小ノード数を1以上にすると何もしていなくてもノードが確保される状態となり費用が発生するので注意が必要です。
<img width="1057" alt="管理_コンピューティング_コンピューティングクラスター_作成完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/74cce47b-4c17-80c4-8b75-c6281cccb0ec.png">


## 推論クラスター
推論クラスターはモデルをデプロイ、推論を行うための仮想マシンです。
推論クラスターを作成するにあたり必要な項目は下記の通りです。
<img width="1058" alt="管理_コンピューティング_推論クラスター_作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/7322e4b0-dc98-52b3-88ab-9c104637f094.png">

|項目名|説明 |例|
|:-----------------|:------------------|:------------------|
|コンピューティング名|ユーザが認識できるように名前をつける。|MinInfCluster01|
|仮想マシンのサイズ|仮想マシンのスペックを選択。高性能ほど時間当たりの費用も増える。|Standard_D1_v2|
|クラスターの目的|「運用」または「開発テスト」から選択する。|開発テスト|
|ノード数|推論に使用するノード数。|1|

推論クラスターはアタッチされている間、費用が発生し続けます。
（クラスター作成後、クラスターをデタッチまたは削除するまで費用が発生します。）
そのため、必要のない推論クラスターはデタッチまたは削除する必要があります。
<img width="1058" alt="管理_コンピューティング_推論クラスター_作成完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/f9322360-d1a0-adf0-2718-616fbe418ba2.png">

推論クラスターをデタッチすると一覧から消えてしまいますが、再度推論クラスターの作成画面を開き、Kubernetes Serviceの項目で「既存のものを使用」を選択すると、先ほどデタッチした推論クラスターを選択し、再度アタッチすることができます。
<img width="1057" alt="管理_コンピューティング_推論クラスター_再作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/030fc213-40e6-2a46-4d5a-454b84052104.png">


# 費用
Azure Machine Learning の費用については[Azure Machine Learning の価格](https://azure.microsoft.com/ja-jp/pricing/details/machine-learning/)をご参照ください。
仮想マシンについては、例えば、DS3 v2（4 CPU, 14GiB）の料金は2020/6/14時点で¥45.808/時間です。
1か月24時間動かし続けると¥33,439.84/月です。
サーバー代や保守にかかる費用を考えると格安ですね。
さらにスペックの低いDS1 v2（1CPU, 3.5GiB）であれば¥11.424/時間です。（本記事執筆時点）

## Azure Machine Learningの費用を抑えるTips
Azure Machine Learningは普通に使っていても安価ですが、いくつか費用を安く抑えるポイントがあります。
 - ローカルからPython SDKを使ってAzure Machine Learningに接続する
 - 低優先度の仮想マシンを使用する
 - 単価の安いロケーションを指定する
### ローカルからPython SDKを使ってAzure Machine Learningに接続する
[ローカルの環境からAzure Machine Learningを使用する](https://qiita.com/gnbrganchan/items/43e6c44754cb83220db5#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%8B%E3%82%89azure-machine-learning%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)で紹介した方法を使ってローカル環境からAzure MLを使うようにすると、Azure ML上のノートブックを使うときに比べて費用を安く抑えることができます。（Azure ML上でノートブックを使用するとコンピューティングインスタンスの費用が発生するので）
モデル作成時に使用するコンピューティングクラスターは、実行完了後に自動的にノードを非アクティブにすることができますが、ノートブックを動かすために必要なコンピューティングインスタンスが手動でOFFにする必要があるため、切り忘れのリスクも考えるとローカル環境からAzure MLを使用することをお勧めします。

### 低優先度の仮想マシンを使用する
コンピューティングクラスターを作成する際、仮想マシンの優先度を「低優先度」にすると、時間当たりの費用が格段に下がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/72cbe3a8-4510-9584-bbe1-92c7e1632dcb.png)
ただし、低優先度の仮想マシンになるので、マシンの割り当てに時間がかかったり、実行が途中で中断されてしまうことがあります。（実行が中止されることはありません。待てばそのうち再開されます）
時間当たりの料金は、マシンのスペックによって異なりますが、桁1つ程度安くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/5324d67a-31c1-e536-12ce-68a64aba70ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458253/37a5aa62-d02a-5168-317f-075b63a2c2ce.png)

### 単価の安いロケーションを指定する
Azure Machine Learningのリソース作成時にロケーションを単価が安い地域に設定すると、すべての仮想マシンの料金に影響します。
Azure Machine Learningのリソース作成後はロケーションを変更することはできませんので、注意してください。
基本的に日本リージョンは単価が高いです。


# 終わりに
冒頭にも記載した通り、私の理解が足りていない点や、記事公開以降にAzure Machine Learningが仕様変更などを行うことによって記事の内容が古くなってしまうこともあるかと思います。
最新の情報はマイクロソフト公式のものをご参照いただくよう、お願いします。
また、記事の内容について不足・誤り等ございましたらコメント等にてご指摘いただけると嬉しいです。