Azure Machine Learning モデルを curl でテストする

Azure Machine Learning で作成したモデルを Azure Container Instance (ACI) や Azure Kubernetes Service (AKS) に Web サービスとしてデプロイすると、REST API エンドポイントが作成されます。 
デプロイされたモデルのテスト方法について、python はじめプログラムを用いたテスト方法に関する記事は多数存在しますが、プログラミングなしにテストする手順が見当たらなかったため、当記事では curl でシンプルにテストする手順について説明します。

# 前準備
モデルの作成、モデルのデプロイが必要です。以下記事等を参考に実施ください。

- [Azure Machine Learning の概要](https://docs.microsoft.com/ja-jp/learn/modules/intro-to-azure-machine-learning-service/)
- [Azure Machine Learning を使用して機械学習モデルをトレーニングする](https://docs.microsoft.com/ja-jp/learn/modules/train-local-model-with-azure-mls/)
- [Azure Machine Learning を使用した機械学習モデルのデプロイ](https://docs.microsoft.com/ja-jp/learn/modules/register-and-deploy-model-with-amls/)  

# モデルのテスト手順

### Swagger Spec の取得

Machine Learning モデルがデプロイされると、以下二つのURLが生成されます。Azure Machine Learning Studio の「エンドポイント」のメニューより、対象のURL を確認します。

1. REST エンドポイント
1. Swagger URI

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575879/b8dbe140-0d5b-4195-8a82-1fd315717230.png)

このうち、Swagger URI から REST API のインターフェース仕様が参照可能です。Swagger URI のリンク先にアクセスし、swagger.json (JSON 形式の Swagger Spec) の内容をコピーします。

>※ Swagger とは、REST API のドキュメント記載に関するフォーマット仕様と、周辺ツールを指します。
自動的にドキュメント生成までしてくれ、ドキュメントから実際のリクエストが可能です。
仕様の詳細は、[こちら](https://swagger.io/specification/)より確認ができます。

### Swagger UI による API 仕様の確認

swagger.json を読み込むツールは様々ありますが、今回は簡単に Web から直接利用できる [オンラインの Swagger UI](http://editor.swagger.io/) を使用します。外部に出せない情報を扱う場合は、[GitHub リポジトリ](https://github.com/swagger-api/swagger-ui)よりSwagger UI をダウンロードし、個別の環境にインストールすることも出来ます。


[Swagger UI](http://editor.swagger.io/) にアクセスし、画面左の Swagger Editor の領域に、先ほどコピーした swagger.json の内容をペーストします。
（ペーストする際、「Would you like to convert your JSON into YAML?」というポップアップが表示されますが、変換してもしなくてもどちらでも問題ありません。）
すると、画面右の領域に REST API ドキュメントが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575879/bcc76f91-4895-a019-d9ce-d87ecce8870b.png)

スコアリング用の API を表す「POST /score」をクリックして展開し、その中の「Try it out」をクリックします。
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575879/6f4dbdef-7334-18a1-9416-e1875fb8fd94.png">

入力パラメーターのサンプルをベースに、テストしたいデータに置き換えて「Execute」をクリックします。
（パラメーターのフォーマットはモデルによって異なります。以下の例は、DATE を入力するとその日付の需要予測結果を返す時系列モデルの例になりますので、予測したい日付のみを渡しています。）
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575879/ea6603ad-4494-ee47-0bf0-2c6917225593.png">

POST 先がデフォルトの Swagger UI のホスト名となっているためそのまま実行すると 404 エラーとなりますが、実行した curl の内容が得られますので、その内容をコピーします。
（ブラウザーで Swagger UI から直接 API のテスト実行したい場合は CORS 対応が必要となり手順が複雑になるため、ここではシンプルに curl を使ってテストします。）
<img width="640" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575879/4e8a18f1-f911-6edf-8a8b-d97548702804.png">

### モデルのテスト

コピーした curl コマンド内の POST 先の URL を、冒頭の手順で確認した ML モデルの「REST エンドポイント」に置き換えて実行します。

```
curl -X POST "http://xxx.xxx.azurecontainer.io/score" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"data\": [    {      \"DATE\": \"2021-01-01 00:00:00,000000\"    }  ]}"
```

モデルの予測結果が返ります。
（以下の例では、`10757.955705800832`という予測値が返ってきています）

```
"{\"forecast\": [10757.955705800832], \"index\": [{\"DATE\": 1609459200000, \"_automl_dummy_grain_col\": \"_automl_dummy_grain_col\"}]}"
```