Cognitive Services Containers を利用して ローカルの Docker コンテナーで LUIS (自然言語処理) を試す  (2)Container 設定編

"人工知能パーツ" Web API として提供されている [Azure Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/) の一部機能を Docker コンテナにダウンロード、構築して利用できる Azure Cognitive Services Containers が提供開始となっています。(2018年12月現在プレビュー)
ローカル環境の Docker に Cognitive Services の [Language Understanding (LUIS)](https://azure.microsoft.com/ja-jp/services/cognitive-services/language-understanding-intelligent-service/)  コンテナ―を作成、稼働させて利用する方法を紹介します。

### Cognitive Services Container を試すシリーズ
- Text Analytics : [Sentiment](21bb726e9bbc8db56e54)
- LUIS
    - [(1) LUIS作成編](https://qiita.com/annie/items/e8fd635cae849ca349ba)
    - (2) Container設定編 (※当記事)

## Cognitive Services Container とは
"人工知能パーツ" [Azure Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/) をコンテナーで利用できるサービス。Cognitive Services は分析モデルがマイクロソフトのデータセンターにありますが、同レベルの分析モデルをローカル環境で利用できます。そのため、分析したいデータをマイクロソフトのデータセンターに送信する必要がなくなります。(※サービス利用のための課金APIには接続している必要があります。)
![CognitiveServicesContainer.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/6e340c40-c3af-229b-53b4-d8a49408c623.png)


# 手順
- [0. 準備](https://qiita.com/annie/items/e8fd635cae849ca349ba#0-%E6%BA%96%E5%82%99) (※別ページに飛びます)
    - LUIS サービス(サブスクリプション)
    - LUIS App
    - Docker 環境
- 1. LUIS App の作成 (※別ページに飛びます)
    - [1.1 Azure Portal から LUIS サービスの作成](https://qiita.com/annie/items/e8fd635cae849ca349ba#11-azure-portal-%E3%81%8B%E3%82%89-luis-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90)
    - [1.2 LUIS Portal で LUIS App の新規作成](https://qiita.com/annie/items/e8fd635cae849ca349ba#12-luis-portal-%E3%81%A7-luis-app-%E3%81%AE%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90)
    - [1.3 LUIS Portal で LUIS App の Export](https://qiita.com/annie/items/e8fd635cae849ca349ba#13-luis-portal-%E3%81%A7-luis-app-%E3%81%AE-export)
- 2. Docker 環境にコンテナ―を作成＆起動して利用
    - [2.1 Docker 環境にコンテナ―作成、起動](#21-docker-%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%9C%E6%88%90%E8%B5%B7%E5%8B%95)
    - [2.2 Cognitive Services Containers (LUIS) のテスト](https://qiita.com/annie/items/718884672ff1b6def80b#22-cognitive-services-containers-luis-%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88)
    - [2.3 Cognitive Services Containers (LUIS) のログ確認](#23-cognitive-services-containers-luis-%E3%81%AE%E3%83%AD%E3%82%B0%E7%A2%BA%E8%AA%8D)

# 2. Docker 環境にコンテナ―を作成＆起動して利用
Cognitive Services Containers で予め用意されているイメージがあるので、そちらをダウンロードして、稼働させます。

## 2.1 Docker 環境にコンテナ―作成、起動

### Docker 環境の準備
#### Docker 環境の確認
[0.準備 - Docker 環境](https://qiita.com/annie/items/e8fd635cae849ca349ba#docker-%E7%92%B0%E5%A2%83) を確認して、Linux コンテナーをインストール、設定します。

#### 作業ディレクトリに LUIS App を配置
[1.3 LUIS Portal で LUIS App の Export](https://qiita.com/annie/items/e8fd635cae849ca349ba#13-luis-portal-%E3%81%A7-luis-app-%E3%81%AE-export) の手順でダウンロードした LUIS App を **展開したりファイル名を変更したりしないで、そのまま** 作業ディレクトリに配置します。
今回はこのようなディレクトリを作業ディレクトリとします。
C:\demo\container

> 作業ディレクトリとして、LUIS App を配置しておく Input ディレクトリ と、ログを保存する Output ディレクトリ が必要です。今回は Input と Output を同じにします (が分けても OK です)。

### Cognitive Services Containers (LUIS) のイメージダウンロードと起動
Docker CLI で LUIS のイメージを pull して取得します。(latest オプションで最新を取得しています)

```DockerCLI
docker pull docker pull mcr.microsoft.com/azure-cognitive-services/luis:latest
```

イメージが取得できたことを確認します。

```DockerCLI
docker images
```

![LUISContainer01.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/f2e41dda-0b6e-c8e8-d34b-bd7692b8d9b7.png)

こちらを以下のオプションで起動します。

 - 2CPU/メモリ 4GB
 - TCP port 5000
 - 終了後にコンテナーを削除

Cognitive Services Containers のパラメーターとして以下として設定します。

 - input フォルダー(今回は C:\demo\container) に保存した LUIS App をマウント
 - output フォルダー(今回は C:\demo\container) にログを保存
 - Billing : Azure Portal で取得した Endpoint (今回は WestUS(米国西部) を設定)
 - ApiKey : Azure Portal で取得した Key1

```DockerCLI
docker run --rm -it -p 5000:5000 --memory 4g --cpus 2 --mount type=bind,src=c:\demo\container,target=/input --mount type=bind,src=C:\demo\container,target=/output
mcr.microsoft.com/azure-cognitive-services/luis Eula=accept Billing=https://westus.api.cognitive.microsoft.com/luis/v2.0 ApiKey={___YOUR_API_KEY___}
```

無事コンテナーが起動したら、アクセスして動作を確認します。
![LUISContainer02.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/b1cba5d9-f91f-c502-2d57-ee08a4cbf21c.png)

## 2.2 Cognitive Services Containers (LUIS) のテスト

ブラウザーでこちらを開き、"Your Cognitive Services Container is up and running" と表示されれば無事起動しています。

```HTTP
http://localhost:5000
```

![LUISContainer03.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/878fc554-0c9e-c419-f248-386919f7044a.png)

### Swagger で Rest API アクセスの確認(GET)

ページ内の **Service API Description** のリンクをクリック、または下記URLにアクセスして、Swagger で Web API の定義の確認や GET/POST のテストを行います。

```HTTP
http://localhost:5000/swagger
```

![LUISContainer04.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/f5298f05-ff8c-196f-22f3-e5d8683fba8d.png)

**[Luis]** の欄にある **[GET] /luis/v2.0/apps/{appId}** をクリック、**[Try it out]** をクリックします。

取得しておいた **AppId** を入力、**q** の欄には自然言語処理を行う文章を入力します。入力できたら [Execute] をクリックしてリクエストを送信します。
![LUISContainer05.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/f648c76a-ae55-8bbd-51ca-2f6b537eed53.png)

Code 200 が返ってきて、JSON 形式で分析結果が表示されれば完了です。
この時表示される Request URL を使って アプリ等から Rest API アクセスできます。(コピーして保存しておきます)
![LUISContainer06.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/dbb1a4db-84c5-8a4a-cee2-da8ea71d3beb.png)


### Postman で Rest API アクセスの確認(GET)

Postman など、Web API ツールを使って、Rest API アクセスを確認します。
(以下 Postman を使用して確認します)

コピーしておいた GET 用の Request URL を URL 欄にペーストします。
Parameter が自動認識されますので、**[Send]** をクリックして送信します。 
Swagger と同じ結果が帰ってきたら確認 OK です。

![LUISContainer07.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/9c2234a5-5a25-c3e2-b986-002624458c91.png)

### Swagger / Postman で Rest API アクセスの確認(POST)

LUIS API は GET と POST の両方で自然言語分析結果を取得できます。
Swagger でも **POST** のページから仕様を確認できます。

![LUISContainer08.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/91a5835a-b0b5-75c5-2311-76c10f2e0726.png)

Postmanから POST でアクセスする場合、以下のように設定する必要があります。

- Header: content=application/json
- Body: "(分析したい文章を入力)"


![LUISContainer09.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/339f797a-cb90-f0f7-15c4-ddb402be8189.png)
![LUISContainer10.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/517b614a-8682-91cc-3dd7-98bd48612502.png)

## 2.3 Cognitive Services Containers (LUIS) のログ確認

[作業ディレクトリに LUIS App を配置]() で設定した output の作業ディレクトリにログが出力されます。
*output の作業ディレクトリ\luis\{Container 起動時に表示された文字列}\{LUIS App ID}.csv* がログファイルです。 

ログファイルの中身は、query (q として送信した文章)、Response (分析結果)、Timestamp です。
![LUISContainer11.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/68900bd6-bd1b-b0c1-9571-cb0e9f8e7499.png)

Response の部分は Rest API で得られる推定結果と同じ(JSON)で、これを整理すると、どのような入力(query) があったときにどのように推定しているのかを確認することができます。
![LUISContainer12.PNG](https://qiita-image-store.s3.amazonaws.com/0/117583/c9ddfe4e-2a50-d9e5-0e16-39bc6d7e9c20.png)

Ctrl+C を入力して、Container を終了します。