Alteryx PromoteでPythonのモデルをデプロイする

こんにちは、小澤です。

Alteryx Promoteは機械学習のモデルをデプロイしてリアルタイム推論を行うAPIを提供してくれます。 デプロイ可能なモデルは、Alteryx Designerで作成したものはもちろんのこと、PythonやRで作成したモデルの利用も可能です。

今回は、Pythonで作成したモデルをデプロイする方法を紹介したいと思います。

PromoteにPythonのモデルをデプロイするまでの流れ

Rを使ってモデルをデプロイするまでの流れは以下のようになります。

  1. 必要なライブラリを記述したrequirements.txtを作成する
  2. モデルを作成して保存する
  3. Promoteで推論する際の処理内容を記述
  4. Promoteにデプロイするための設定を行う
  5. モデルをデプロイする
  6. デプロイされたモデルを使って推論

一見長い道のりのように見えますが、1つ1つはそれほど難しいことはありません。 今回は、Rでやった時と同様、Ramdom Forestのモデルを作成してみましょう。

一連の処理の流れ

では、早速一連の処理の流れを見ていきましょう。

必要なライブラリを記述したrequirements.txtを作成する

Pythonを使ったモデルのデプロイの際には、requirements.txtに記述されたライブラリがインストールされます。 そのため、まずはそれを作成しておきましょう。

pip install promote numpy scikit-learn
pip freeze > requirements.txt

モデルを作成して保存する

ここからPythonの実装に入っていきます。 まずはモデルを作成します。 今回は、scikit-learnを利用します。

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets

iris = datasets.load_iris()
x = iris.data
y = iris.target

rf = RandomForestClassifier()
rf.fit(x, y)

モデルが作成できたらこれを一度保存します。

from sklearn.externals import joblib
joblib.dump(rf, './objects/iris.pkl')

さてここで、注意点が一つあります。 モデルはobjectsというディレクトリを作成してそこに出力します。

モデルのパス以外にもPromote用のモデルを作成する際には以下のような構成にしておく必要があります。

.
├── helpers/    # 推論時の処理を複数ファイルに渡って記述する場合のpythonファイルをここに入れる
├── objects/    # モデルのファイルをここに保存する
├── predict.py # 推論用コードを記述するファイル(ファイル名はなんでもいい)
├── requirements.txt
└── train.py     # 学習時に利用するコードを記述するファイル(ファイル名はなんでもいい)

今回は、上記の処理をtrain.pyに記述しているものとします。 この段階でモデルを作成してファイルに保存しておきます。

python train.py

Promoteで推論する際の処理内容を記述

Promoteで処理する内容に関しては、関数を1つ作成します。

import pandas as pd
from sklearn.externals import joblib

model = joblib.load('./objects/iris.pkl')
def irisClassifier(data):
    predict = model.predict(pd.DataFrame(data))
    return [{'predict' : int(i) } for i in predict]

読み込んだモデルを使って推論を行なっています。 データの入出力に関しては、APIとして利用するに際しては特に指定はありませんが、Alteryx DesignerのScoreツールとやりとり可能な形式にしています。

具体的には、入力は以下のように、列ごとにデータを配列の形式で渡します。 これはこのままpandasのデータフレームに変換してscikit-learnの引数に渡すことが可能です。

{
  "sepal_length" : [5.1, 6.7], 
  "sepal_width" : [3.5, 3.1], 
  "petal_length" : [1.4, 5.6], 
  "petal_width" : [0.2, 2.4]
}

対して、出力は以下のような形式にします。

[
  {
    "prediction": 0
  },
  {
    "prediction": 2
  }
]

Promoteにデプロイするための設定を行う

では、この関数を使って推論用APIのデプロイを行います。

import promote

username = "<Your Promote User Name>"
apikey = "<Your Promote API Key>"
env = "<Your Promote URL>"

prom = promote.Promote(username, apikey, env)

必要な情報を入れて、promote.Promoteのインスタンスを作成します。

モデルをデプロイする

さて、準備が整ったのでモデルをデプロイします。

testdata = '{"sepal_length" : [5.1, 6.7], "sepal_width" : [3.5, 3.1], "petal_length" : [1.4, 5.6], "petal_width" : [0.2, 2.4]}'
# モデル名、推論に利用する関数、テストデータを引数として渡す
prom.deploy('PythonIrisClassifier', irisClassifier, testdata)

デプロイ時にテストデータを引数として渡すのは必須のようです。

デプロイされたモデルはUI上から確認できます。

また、UI上で動作確認を行うことも可能です。

デプロイされたモデルを使って推論

推論はpredict関数で行えます。

prom.predict('PythonIrisClassifier', testdata)

入出力の形式を合わせてあるので、AlteryxのScoreツールからも実行可能です。

おわりに

今回は、Pythonを使ったモデルをAlteryx Promoteにデプロイする方法を紹介しました。

今回はscikit-learnを使っていますが、学習と推論それぞれのプロセスさえ記述すれば他の実装でも利用可能です。 もちろん、helpers以下に独自に実装した処理のファイルをおいておくことも可能です。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400