MMLSpark を Databricks on EC2 のクラスタにインストールする方法


### はじめに
**MMLSpark** を **Databricks (on AWS EC2)** のクラスタで使用できるようにする手順を示します。

### 対象者
- Databricks on EC2(AWS) で分析環境を立ち上げている
    - init_script をいじったけどなんだかうまく行かない
    - ```pip``` でもうまくいかない
    - MMLSpark は Azure 以外のプラットフォームで使えないの?
- 現在使用しているアルゴリズムをSparkによる分散処理に最適化できないか方法を探している


### mmlspark とは?
正式名称は、**Microsoft Machine Learning for Apache Spark**。

**Microsoft Azure** のマネージド機械学習サービスである **Cogninive Services** や、機械学習の現場でよく使われる **LightGBM** などを Spark で効率的に活用できるように最適化したパッケージが揃っているライブラリです。

画像処理ライブラリの雄である **OpenCV** のパッケージもあります。2020年5月現在では実装されている関数は限定的ですが、大量の画像に対してシンプルな前処理を並列かつ高速に行いたい場合には選択肢に入ってきそうです。
[MMLSpark OpenCV Package](https://mmlspark.blob.core.windows.net/docs/1.0.0-rc1/pyspark/mmlspark.opencv.html)

そしてこのパッケージ、Microsoft Azure **以外**のプラットフォームでも使えます。



### インストール方法
Databricks のワークスペースで、
```Clusters```から```Libraries```に飛び、```Install New```をクリック 
<img width="858" alt="スクリーンショット 2020-05-15 7.08.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/f0ba2871-b9f9-de59-3501-306b68d3bcc9.png">

Library Source に ```Maven```を選択し、Repository に以下を入力、```Install```をクリック
```com.microsoft.ml.spark:mmlspark_2.11:1.0.0-rc1```
<img width="856" alt="スクリーンショット 2020-05-15 7.10.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/bd2e1513-a74b-7c59-20b8-0cdacdbc042f.png">


しばらくするとこちらの画面に遷移します。
Status が ```Installed```になっていればOK。これで完了です。
<img width="862" alt="スクリーンショット 2020-05-15 7.13.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/c111ff65-36c6-d0a7-d196-662884c8beaa.png">


### 参考スクリプト

以下のような感じで、Collaborative Notebook 上でモジュールが使えるようになります。

```python
triazines = spark.read.format("libsvm")\
    .load("wasbs://publicwasb@mmlspark.blob.core.windows.net/triazines.scale.svmlight")

# print some basic info
print("records read: " + str(triazines.count()))
print("Schema: ")
```


> result
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/0bcce95d-6e1d-8646-92cd-3c3cd6466195.png)



```python
triazines.printSchema()
triazines.limit(10).toPandas()

train, test = triazines.randomSplit([0.85, 0.15], seed=1)

from mmlspark.lightgbm import LightGBMRegressor
model = LightGBMRegressor(objective='quantile',
                          alpha=0.2,
                          learningRate=0.3,
                          numLeaves=31).fit(train)

from mmlspark.lightgbm import LightGBMRegressionModel
model.saveNativeModel("mymodel")
model = LightGBMRegressionModel.loadNativeModelFromFile("mymodel")

print(model.getFeatureImportances())
```

> result
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/e31f29ab-c78e-ec40-067b-efd74db2dccf.png)

```pyhon
scoredData = model.transform(test)
scoredData.limit(10).toPandas()
```

> result
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/01282cc5-7161-6a65-70ba-c5e247d8e742.png)


```python
from mmlspark.train import ComputeModelStatistics
metrics = ComputeModelStatistics(evaluationMetric='regression',
                                 labelCol='label',
                                 scoresCol='prediction') \
            .transform(scoredData)
metrics.toPandas()

```

> result
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/1716b958-4ae9-8af7-d04c-466023d33a51.png)


### おわりに
モジュールのインストール方法にもいろいろあるんですね。
依存関係が出やすいので pip 乱発はやめたいところです(自戒)

### 参考資料
[公式 MMLSpark 紹介サイト](https://mmlspark.blob.core.windows.net/website/index.html)
[公式 MMLSpark Github](https://github.com/Azure/mmlspark)

[LightGBM 上記スクリプトソース](https://github.com/Azure/mmlspark/blob/master/notebooks/samples/LightGBM - Quantile Regression for Drug Discovery.ipynb)