モデルの外部実行 Driverless AI -MLの自動化ツール-  Part 4

# これまでの振り返り

ここまでDriverless AIの起動からモデルの作成、予測結果の取得やモデルの評価について書きました。

これまでの記事はこちら！
[まずは起動から！Driverless AI -MLの自動化ツール- Part 1](https://qiita.com/tom_m_m/items/318569bf762c527174ec)
[学習の実行！Driverless AI -MLの自動化ツール- Part 2](https://qiita.com/tom_m_m/items/32f79edba6c47b95f3b3)
[モデルの評価！ Driverless AI -MLの自動化ツール- Part 3](https://qiita.com/tom_m_m/items/15a669e13e7f377dbb5b)

日本語化もされているので、その情報はこちらをご覧ください。
[Driverless AI ついに日本語化！](https://qiita.com/tom_m_m/items/8b3524c8eab6823a95f2)

前回は、作成したモデルにCSVファイルを投入して予測結果を得るところまでやりました。
ただ、いつもブラウザ画面を操作して予測結果を出すのは、業務フローに入れ込めません。

ということで、今回は作成したモデルを外に出して、JavaやPythonで実行できるパイプライン機能を試してみます。

**2020年2月17日 追記あり**
daimojoライブラリ(MOJO2RUNTIME)について追記しました。

# Driverless AIのパイプライン

学習が終わったときの画面を改めて開きます。
中央上部分に黄色のボタンが並んでいますが、ここに **DOWNLOAD MOJO SCORING PIPELINE** というボタンがあります。
(パイプラインが作られていない場合がありますが、その場合は**BUILD MOJO SCORING PIPELINE**をクリックします。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/d4880f76-7eb1-0fec-c466-7a40dfbb3e0a.png)

## Pipelineとは
Driverless AIで作成したモデルにデータを流し込むためのモジュールです。
これを使うことで、独自のプログラムから機械学習のモデルを使えるようになります。

今回はMOJO pipelineというものを使っていきます。
MOJO pipelineはJava, Python, Rそれぞれの言語で使うことができます。

**DOWNLOAD MOJO SCORING PIPELINE** をクリックするとこのような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/2bb0059f-6e43-ee23-aa06-cef4f276d2c6.png)

※注意 : MOJO pipelineの利用にはLicenseが必要になります。
Free Trialの場合は、そのLicenseで良いですが、Aquarium環境ではLicenseを取得できません。
そのため、MOJO pipelineを使うことはできません。

画面に表示されている **DOWNLOAD MOJO SCORING PIPELINE** をクリックすると`mojo.zip`という名前のzipファイルがダウンロードされます。

このzipファイルを展開してみると中身はこんな感じです。

```bash
mojo-pipeline/
├── README.txt
├── example.csv
├── mojo2-runtime-javadoc.jar
├── mojo2-runtime.jar
├── pipeline.mojo
└── run_example.sh
```

MOJOパイプラインを動かすためにはライセンスが必要です。
今回は、`license.sig` というファイルを同じディレクトリに作成しました。
中にはLicenceの文字列が記述されています。

まずはJavaで見ていきましょう。

# Java MOJOパイプライン

zipファイルを展開した中に、Java用のサンプルのシェルスクリプトが入っています。
まず試してみたい場合は、こちらを動かしてみましょう。

```
./run_example.sh pipeline.mojo example.csv license.sig
```

`example.csv`の中身は下のようなデータになっています。
これは、Driverless AIが学習に使ったデータから自動的に生成されています。

|Store|Dept|Date|
|:-----------|:------------|:------------|
|1.0|9.0|2010-03-19|
|7.0|4.0|2010-02-05|
|6.0|8.0|2010-04-09|
|3.0|8.0|2010-02-26|
|7.0|8.0|2010-02-19|
|1.0|2.0|2010-03-19|
|3.0|8.0|2010-04-02|
|5.0|10.0|2010-03-19|
|3.0|3.0|2010-02-19|
|4.0|2.0|2010-03-19|

このデータを使って実際にMOJO pipelineを実行してみます。
実行時の標準出力はこんな感じです。

```bash
~/mojo-pipeline % ./run_example.sh pipeline.mojo example.csv license.sig
+ MOJO_FILE=pipeline.mojo
+ CSV_FILE=example.csv
+ LICENSE_FILE=license.sig
+ CMD_LINE='java -Xmx5g -Dai.h2o.mojos.runtime.license.file=license.sig -cp mojo2-runtime.jar ai.h2o.mojos.ExecuteMojo'
+ cat
======================
Running MOJO2 example
======================

MOJO file    : pipeline.mojo
Input file   : example.csv

Command line : java -Xmx5g -Dai.h2o.mojos.runtime.license.file=license.sig -cp mojo2-runtime.jar ai.h2o.mojos.ExecuteMojo pipeline.mojo example.csv

+ java -Xmx5g -Dai.h2o.mojos.runtime.license.file=license.sig -cp mojo2-runtime.jar ai.h2o.mojos.ExecuteMojo pipeline.mojo example.csv
Mojo load time:  2.044 sec
Weekly_Sales
11532.768
20871.309
29347.87
58422.03
45508.63
20151.307
10769.156
20628.24
27490.023
4169.9106
Time per row:   5.100 msec (total time:  51.000 msec)
```

入力データの行分の結果が返ってきています。
また、スクリプトではなくてJavaを直接実行したい場合は以下の形で実行します。

```
java -Xmx5g -Dai.h2o.mojos.runtime.license.file=license.sig -cp mojo2-runtime.jar ai.h2o.mojos.ExecuteMojo pipeline.mojo example.csv
```

Javaを直接実行してみます。
実行するときに、csvファイルに書き出してみるとこんな感じになります。

```bash
~/mojo-pipeline % java -Xmx5g -Dai.h2o.mojos.runtime.license.file=license.sig -cp mojo2-runtime.jar ai.h2o.mojos.ExecuteMojo pipeline.mojo example.csv >> result.csv
Mojo load time:  2.153 sec
Time per row:   8.100 msec (total time:  81.000 msec)
~/mojo-pipeline % cat result.csv
Weekly_Sales
11532.768
20871.309
29347.87
58422.03
45508.63
20151.307
10769.156
20628.24
27490.023
4169.9106
```
予測結果だけcsvに書き出されています。
こうすれば、推定結果を別のプログラムで参照したり、プログラムを書いてDBに入れることもできます。

LinuxやMac上でも動くことを確認できました。
実は、IBM iやAIX上でもJava MOJOを実行できます。

# Python MOJOパイプライン

次はPythonのMOJOパイプラインを見てきます。

## 環境

Pythonのバージョン
- Python 3.6

必要ライブラリ
- datatable
- mojoPyRuntime (daimojo)

※インストール方法は後ろで記載します。

Experimetページの **DOWNLOAD MOJO SCORING PIPELINE** をクリックしたときに表示されるポップアップのPythonタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/6974ba1f-73d1-4414-b072-03fdad618878.png)

パイプラインは、`mojo.zip`を展開したときに入っている`pipeline.mojo`を使います。
Javaの時と同じものです。

## daimojoライブラリインストール
**mojoPyRuntime** をクリックすると、mojoPyRuntimeのwheelがダウンロードできます。
Aquariumの場合は、`daimojo-2.1.6+master.43-cp36-cp36m-linux_x86_64.whl` がダウンロードされます。
※バージョンは利用している環境のバージョンによって変わります。

POWERアーキテクチャの場合は、`daimojo-2.1.6+master.43-cp36-cp36m-linux_ppc64le.whl` がダウンロードされます。
対応するアーキテクチャ用のwheelを使う必要があります。

このwheelは、Python 3.6でしかインストールできません。

インストールはpipで行います。
```pip install daimojo-2.1.6+master.43-cp36-cp36m-linux_x86_64.whl```

- **2020年2月17日 追記**

2月17日現在、1.8.4.1が最新バージョンです。
このバージョンでは、daimojoライブラリ(MOJO2ランタイム)をOS毎に選択出来るようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/638ed200-00e2-449c-1104-f1789d4295fc.png)
POWERアーキテクチャ上で作ったモデルをLinuxやMac上で動かすことができそうです。

daimojoライブラリは、上部項目**リソース**内の`MOJO2 PYTHON RUNTIME`からダウンロードすることも出来るようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/d5b50344-6611-32da-b2cb-3dfad267e52b.png)

## ライセンスの設定

環境変数にLicense情報を設定します。
ライセンスファイルを指定する場合は、`DRIVERLESS_AI_LICENSE_FILE`にファイルパスを設定します。

```bash:例
export DRIVERLESS_AI_LICENSE_FILE=~/License.sig
```

ライセンスキーを直接設定する場合は、`DRIVERLESS_AI_LICENSE_KEY`にBase64の形式で設定します。

## Python MOJOパイプランの実行

Java MOJOで使った、パイプラインとサンプルデータを使って動かしてみます。

```python
import daimojo.model
import datatable as dt

# パイプラインの読み込み
m = daimojo.model("./mojo-pipeline/pipeline.mojo")

# データの読み込み
pydt = dt.fread("./mojo-pipeline/example.csv", na_strings=m.missing_values)

# 予測の実施
res = m.predict(pydt)
print(res)
```

結果は

```bash
(py36) root@~ # python pip_from_csv_2.py 
    Weekly_Sales
--  ------------
 0      11532.8 
 1      20871.3 
 2      29347.9 
 3      58422   
 4      45508.6 
 5      20151.3 
 6      10769.2 
 7      20628.2 
 8      27490   
 9       4169.91
```

Java MOJOの実行時と同じ結果が得られています。
Pythonの場合はCSVから読み込むだけではなく、listとしてデータを持っておけばよいので、利用するバリエーションが多いのではないかと思います。

# まとめ
今回はだいぶ細かいトピックでしたが、業務の中に組み込んでいく場合はこのようなモデルの外出しが必要になります。
プログラムで自動的に動かせるので、バッチ的な処理も作ることができますし、既存のフローの中に組み込んでいくこともできるかと思います。

他にも、Python ClientといったDriverless AIの操作すべてをプログラム化することもで来ます。
次回はそのあたりの記事を書く予定です。