はじめに
みなさん、こんにちは。
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 PredictionIO をHerokuで動作させ、機械学習を試してみたいと思います。
システムの概要
機械学習で使用する学習データとして、Salesforce組織から各種レコードを一括取得し、PredictionIOにインポートするJavaアプリケ−ション、お勧めのゲームを表示するVisualforceページの2つを作成します。
必要なもの
- Heroku アカウント
- Heroku Command Line
- Git
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)に対してインポートを行うアプリケーションを作成します。