QuantumCoreをGCP(無料枠)で動かしてみた 

# 1.目的
GCP(無料枠)を使って公式のGoogleColabノートブック(相当)のサンプルを動かせるようにする！
(サンプルが動かせるということは、最低限の環境が整ったということ)

# 2.環境
OS：CentOS7
マシンタイプ：f1-micro（vCPU x 1、メモリ 0.6 GB）

タイトルでGCP(無料枠)とうたっていますが、別にGCPでなくても大丈夫です。
(自分の遊べる環境がGCPくらいしかなかっただけの問題)

・GCP(無料枠)
GCPの無料枠については以下を参照。
[これから始めるGCP（GCE）安全に無料枠を使い倒せ](https://qiita.com/Brutus/items/22dfd31a681b67837a74)

# 3.レッツトライ
### 3.1.Pyenv環境の構築
Pyenv環境を構築するために、以下のシェルを保存して実行してください。
シェルの実行が完了すると、pyenvコマンドが実行できるようになります。

```shell:construct.sh
#!/bin/sh
yum install -y gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel libffi-devel git
git clone https://github.com/yyuu/pyenv.git /opt/pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git /opt/pyenv/plugins/pyenv-virtualenv
git clone git://github.com/yyuu/pyenv-update.git /opt/pyenv/plugins/pyenv-update
echo 'export PYENV_ROOT=/opt/pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
````

## 3.2.pythonのインストール
QuantumCoreはPythonのバージョンに合わせて幾つかパッケージが提供されているようです。
私はとりあえず新しいものを追いたいので、`qore_sdk-0.1.0-cp37-cp37m-linux_x86_64.whl`を使いたいと思います。
別のバージョンを使いたい場合は`pyenv install --list`を実行し、対応するPythonのバージョンがあるかを確認しましょう。(今回は`3.7.5`を選択)


```shell:
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.5
```

GCP(無料枠)はスペックが低いので、インストールに時間がかかります(0.5H程度)

無事完了したら以下コマンドを実行して指定したバージョンでPythonが動くことを確認しましょう。
(ついでにpipのバージョンもあげておきましょう)

```shell:
pyenv shell 3.7.5
pip install --upgrade pip
python
```

Pythonのバージョンが3.7.5となっていればOKです。


## 3.3.QuantumCoreライブラリのインストール
Gitリポジトリをクローンして必要なパッケージをインストール。

```shell:
git clone https://github.com/qcore-info/advent-calendar-2019
cd advent-calendar-2019
pip install requirements.txt
```

`qore_sdk-0.1.0-cp37-cp37m-linux_x86_64.whl`のあるディレクトリに移動して以下コマンドを実行。

```shell:
pip install qore_sdk-0.1.0-cp37-cp37m-linux_x86_64.whl
```

ここまで問題なく終了すれば、QuantumCore環境が準備できました。

# 4.サンプルプログラムの実行
ここでは、「深層学習以外の機械学習と応用技術 by QuantumCore Advent Calendar 2019」[一日目の記事](https://qiita.com/ryoppippi/items/f607c8828238094eade0)を実行します。
ベースはGoogleColabのノートブックになります。

## 4.1.サンプルデータの取得
以下コマンドをシェルスクリプトにして実行してください。

```shell:get_sampledata.sh
#!/bin/sh
mkdir data
cd data
curl gdrive.sh | bash -s  1YAtEGe-_xTMDhWeSBvXHLpQTKtzzRBKU
curl gdrive.sh | bash -s  196nFe8vB-TFWjPg1NGX3ptAZfNALnVot
curl gdrive.sh | bash -s  1g0UFllMm7m7DXVoyHOLIigwVFvzSIX2e
curl gdrive.sh | bash -s  1EqyotynOrxEJwwCxO-sZ75etHZDzFyHO
```

data配下に以下4つのjsonファイルができていればOKです。
・jpvow_test_x.json
・jpvow_test_y.json
・jpvow_train_x.json
・jpvow_train_y.json

## 4.2.サンプルプログラムの実行

サンプルプログラムをPythonスクリプトにして実行します。
(APIユーザ、パスワード、エンドポイントは払い出されたものを使ってください)

```python:client.py
from qore_sdk.client import WebQoreClient
from sklearn import model_selection
from sklearn.metrics import accuracy_score, f1_score
from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import LogisticRegression
import time
import numpy as np
import json
import os

with open("data/jpvow_train_x.json", "r") as f:
    X_train = json.load(f)
with open("data/jpvow_train_y.json", "r") as f:
    y_train = json.load(f)
with open("data/jpvow_test_x.json", "r") as f:
    X_test = json.load(f)
with open("data/jpvow_test_y.json", "r") as f:
    y_test = json.load(f)

data = np.concatenate((X_train, X_test), axis=0)
target = np.concatenate((y_train, y_test), axis=0)
X_train, X_test, y_train, y_test = model_selection.train_test_split(
    data, target, test_size=0.2, random_state=1)

client = WebQoreClient(username="API実行ユーザ名",
                       password="API実行ユーザのパスワード",
                       endpoint="APIエンドポイント")
res = client.classifier_train(X=X_train, Y=y_train)
print(res)

res = client.classifier_predict(X=X_test)
print("acc=", accuracy_score(y_test.tolist(), res["Y"]))
print("f1=", f1_score(y_test.tolist(), res["Y"], average="weighted"))
```

以下コマンドで実行！！

```shell:
python client.py
#{'res': 'ok', 'train_time': 1.0987462997436523}
#acc= 0.9921875
#f1= 0.9921496212121212
```
一日目の記事とも実行結果が一致しました！
これでQuantumCoreの実行環境が無事にGCPに構築できましたね。

# 5.まとめ
QuantumCoreの実行環境が揃えられたので、ようやくスタートラインに立てました。
エンドポイントからのレスポンスも大体10秒程度と満足のいく結果です。
機械学習がわからない方でも、まずは環境を作って手を動かすところから開始していただければと思います。
[QuantumCoreのアドベントカレンダー](https://qiita.com/advent-calendar/2019/quantumcore_reservoir)では他の方も記事を書いています。
参考にして自分だけのテーマを見つけて機械学習ライフを楽しみましょう！