Einsteinってどんなもの?Heroku+PredictionIOを使って機械学習をわかった気になってみよう!(第1回)

はじめに

みなさん、こんにちは。

Dreamforce'16で最も注目を集めたEinsteinですが、Sales Cloud Einstein、Service Cloud Einstein、Marketing Cloud Einstein、Commerce Cloud Einstein、App Cloud Einsteinとあらゆるサービスに組み込まれ、近いうちにAIの恩恵にあずかれそうですね。果たして、実際の業務がEinsteinによってどのように革新的に変わるのか興味や期待は高まる一方です!

そんなEinsteinですが、機械学習で使われるアルゴリズムやニューラルネットワークなどの本質的なことはその道のプロにお任せするにせよ、やはり開発者たるもの実際に機械学習を触って体験しておきたいものでよね?

そこで、今回はSalesforce Summer 2016やDreamforce'16で紹介された、モバイルやIoT、 AIといった最新のトレンドを取り込んだサンプルアプリケ−ション「DreamHouse」でEinstein Serviceとして使われている、Apache PredictionIOHerokuで動作させ、機械学習を試してみたいと思います。

システムの概要

機械学習で使用する学習データとして、Salesforce組織から各種レコードを一括取得し、PredictionIOにインポートするJavaアプリケ−ション、お勧めのゲームを表示するVisualforceページの2つを作成します。

必要なもの

HerokuにPredictionIOの環境構築

HerokuにPredictionIOを環境構築する方法として、Heroku ButtonやHeroku Build Packが公開されており、そちらを使用することもできるようです。今回はSalesforce Developer Workshops 2016で紹介されている方法を真似て環境を作成したいと思います。

PredictionIOは、Event ServerとEngineで構成されます。詳細は割愛しますが、「PredictionIO - A Quick Intro」あたりが参考になります。

Step1.ソースコードをクローン

Event ServerとEngineのソースコードをクローンします。

$ git clone https://github.com/rajdeepd/pio-eventserver-heroku <YOUR_EVENT_SERVER_NAME>
$ git clone https://github.com/rajdeepd/pio-engine-heroku <YOUR_ENGINE_NAME>

<YOUR_EVENT_SERVER_NAME>、<YOUR_ENGINE_NAME>は適宜ご自身の設定に合わせて読み替えて下さい。

これ以降の手順で<YOUR_EVENT_SERVER_NAME>の表記は各自のEvent Serverを表し、便宜上 pio-eventserver-jimaoka を設定例として使用します。同様に<YOUR_ENGINE_NAME>の表記はEngineを表し、pio-engine-jimaokaを設定例として使用します。

Step2. Herokuアプリの作成

クローンしてできたEvent Serverのフォルダに移動し、Herokuアプリを作成します。

$ cd pio-eventserver-jimaoka
$ heroku create pio-eventserver-jimaoka

Herokuアプリの作成に成功すると以下のように表示されます。

Creating ⬢ pio-eventserver-jimaoka... done
https://pio-eventserver-jimaoka.herokuapp.com/ | https://git.heroku.com/pio-eventserver-jimaoka.git

Step3. HerokuにEvent Serverをデプロイ

Herokuにデプロイします。

$ git push heroku master

デプロイに成功すると以下のような表示がされます。

Counting objects: 42, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (34/34), done.
Writing objects: 100% (42/42), 1.00 MiB | 0 bytes/s, done.
Total 42 (delta 12), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Scala app detected
remote: -----> Installing OpenJDK 1.8... done
remote: -----> Priming Ivy cache... done
remote: -----> Running: sbt compile stage
remote: Downloading sbt launcher for 0.13.11:
・・・途中省略・・・
remote: -----> Compressing...
remote:        Done: 183.1M
remote: -----> Launching...
remote:        Released v4
remote:        https://pio-eventserver-jimaoka.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/pio-eventserver-jimaoka.git
 * [new branch]      master -> master

DATABASE_URLを確認します。

$ heroku config

以下のようにDATABASE_URLが確認できます。DATABASE_URLは後で使用するのでメモしておきます。

DATABASE_URL: postgres://wjuvewtahxhoge:uicXfpsCUPgW6ZukB4l3pXHOGE@ec2-50-17-220-39.compute-1.amazonaws.com:5432/d771sv7qbh0ge7

Step4. Event Serverにアプリケーションを作成

Event Serverにアプリケ−ションを作成します。

$ heroku run console app new <APP_NAME>

<APP_NAME>は適宜ご自身の設定に合わせて読み替えて下さい。(例. MyApp1)

アプリケーションの作成に成功すると以下のようなものが表示されます。Access Keyは後で使用するのでメモしておきます。

[INFO] [App$] Initialized Event Store for this app ID: 1.
[INFO] [App$] Created new app:
[INFO] [App$]       Name: MyApp1
[INFO] [App$]         ID: 1
[INFO] [App$] Access Key: 6a0oIVwN8vkby0fHE3UbmG5iYEKQPDZbKNwh5s8gRyFl126xHoge_gMKJxqj1cU7

Step5. HerokuにEngineをデプロイ

クローンしたEngineのソースコードフォルダに移動し、Herokuアプリを作成&デプロイします。

$ cd pio-engine-jimaoka
$ heroku create pio-engine-jimaoka
$ git push heroku master

PredictionIOでは独自のEngineを作成することもできますし、Engine Template Galleryから用途にあったEngineをダウンロードして使うこともできます。今回のソースコードにはRecommendation Engineが組み込まれています。

Step6. Addonの削除&Event Server DBへアタッチ

EngineアプリのAddonを削除するためにAddonの情報を確認します。

$ heroku addons

以下のようにAddonが確認できます。

Add-on                                                                          Plan             Price  
─────────────────────── ──── ───────
heroku-postgresql (postgresql-vertical-88389) hobby-dev free └─ as DATABASE

Addonを削除します。

$ heroku addons:remove postgresql-vertical-88389

WARNINGが表示されるので<YOUR_ENGINE_NAME>を入力して継続します。

▸    WARNING: Destructive Action
▸    This command will affect the app pio-engine-jimaoka
▸    To proceed, type pio-engine-jimaoka or re-run this command with --confirm
▸    pio-engine-jimaoka
> pio-engine-jimaoka

Event ServerのPostgreSQLを参照できるようHerokuに環境変数を設定します。

$ heroku config:set DATABASE_URL=postgres://wjuvewtahxhoge:uicXfpsCUPgW6ZukB4l3pXHOGE@ec2-50-17-220-39.compute-1.amazonaws.com:5432/d771sv7qbh0ge7

Step7. Herokuアプリ(Engine)の環境変数を設定

Herokuアプリ(Engine)の環境変数を設定します。

heroku config:set  \
  ACCESS_KEY=<ACCESS_KEY> \
  APP_NAME=<APP_NAME> \
  EVENT_SERVER_IP=<YOUR_EVENT_SERVER_NAME>.herokuapp.com \
  EVENT_SERVER_PORT=80

設定例.

heroku config:set  \
  ACCESS_KEY= 6a0oIVwN8vkby0fHE3UbmG5iYEKQPDZbKNwh5s8gRyFl126xHoge_gMKJxqj1cU7 \
  APP_NAME=MyApp1 \
  EVENT_SERVER_IP=pio-eventserver-jimaoka.herokuapp.com \
  EVENT_SERVER_PORT=80

設定ができると以下のように表示されます。

Setting ACCESS_KEY, APP_NAME, EVENT_SERVER_IP, EVENT_SERVER_PORT and restarting ⬢ pio-engine-jimaoka... done, v6
ACCESS_KEY:        6a0oIVwN8vkby0fHE3UbmG5iYEKQPDZbKNwh5s8gRyFl126xHoge_gMKJxqj1cU7
APP_NAME:          MyApp1
EVENT_SERVER_IP:   pio-eventserver-jimaoka.herokuapp.com
EVENT_SERVER_PORT: 80

Step8. Java VMのHeapサイズを設定

PredictionIOでは内部でApache Sparkが使われており、その実行に必要なHeapサイズに増やしておきます。

$ heroku config:set JAVA_OPTS="-Xmx512m"

第2回に続く

Event ServerとEngineの環境構築は以上で完了です。環境が出来たので早速トレーニングを行いたいところですが、トレーニングには学習データが必要です。第2回では、Salesforceから各種データを一括で取得し、Event Server(PostgreSQL)に対してインポートを行うアプリケーションを作成します。