Alteryx PromoteのAPIたち
こんにちは、小澤です。
Alteryx PromoteではAlteyx DesignerやPython, Rで作ったモデルのリアルタイム推論用APIを提供します。
推論結果を得るためのREST APIはメイン機能なので当然用意されているのですが、 実はそれ以外にもいくつかAPIのエンドポイントが提供されています。
今回はそれら、どのようなものがあるのか紹介したいと思います。
提供されているAPIリスト
さて、どのようなAPIが用意されているのでしょうか?
と、その前にまずはちょっとした疑問を投げかけてみましょう。 AlteryxのワークフローからPromoteを使って推論を行うにはScoreツールを利用します。 Scoreツールの設定で「Alteryx Promote Model」を選択すればいいのですが、 その際設定画面にはPromote上のモデル一覧と選択中のモデルに関する情報が表示されます。
この情報はどうやって取得しているのでしょうか? これこそが、Alteryx Promoteが提供する"推論以外のAPI"の1つとなります。
どのようなAPIが提供されているかについては、コミュニティの以下の記事下部「Extras」に記載があります。
内容としては、以下のものになっています。
エンドポイント | メソッド | 取得するもの |
---|---|---|
http://<promote_url\>/<username\>/models/<model\>/predict | POST | 推論結果 |
http://<promote_url\>/api/models | GET | モデル一覧 |
http://<promote_url\>/api/models/<user\>/<model\>/versions | GET | モデルのバージョン一覧 |
http://<promote_url\>/<username\>/models/<modelname\>/info | GET | モデルが動いているコンテナの状態 |
http://<promote_url\>/api/metrics | GET | Alteryx Promote全体でのシステムの状態 |
これらのAPIはすべてJSONで結果を返します。
Alteryx Promoteではモデルの名前とアップロードしたユーザ名の組み合わせで一意にモデルを特定する仕組みになっています。 そのため、エンドポイント中の以下の値を適切に置き換えてください。
項目 | 実際に入れる値 |
---|---|
promote_url | Alteryx PromoteリーダノードのIPまたはURL |
user | モデルをアップロードしたユーザ |
model | モデル名 |
なお、注意点としてDevおよびStagingのモデルはユーザ名はアップロードしたユーザとなりますが、Productionに関しては、ユーザ名がproductionとなります。
各APIを見てみる
では、これらのAPIの出力結果を確認していきましょう。 ここからはPythonのrequestsを使って動かしてみたいと思います。
推論
最も頻繁に利用するのがこの推論APIでしょう。 こちらはPromoteにWebからアクセスするとサンプルでも確認ができますが、以下のように行います。
import json import requests from requests.auth import HTTPBasicAuth data = { "sepal_length": [6.7], "sepal_width": [3.1], "petal_length": [5.6], "petal_width": [2.4] } auth=('johnsmith', '<api key>') r = requests.post('http://<promote_url>/johnsmith/models/IrisClassifier/predict', json=data, auth=auth) print(json.loads(r.text))
以下のような結果が得られます。
{'result': [{'prediction': 'Iris-virginica'}], 'promote_id': '5bcb11de-0dce-4ec4-b21f-87acb3abe42e', 'status': 'OK', 'timestamp': '2019-01-10T00:25:30.877Z', 'model_name': 'IrisClassifier', 'model_version': '1'}
推論時に与えるjsonは各特徴量の値が配列になっているため、一度に複数のデータの推論が行えます。 そのため、結果も配列として返ってきます。
モデル一覧
続いては、モデル一覧を返すAPIを使ってみましょう。 メソッドがGETになるのと対象となるデータの指定がない以外は推論と同じやり方で実行可能です。
r = requests.get('http://<promote_url>/api/models', auth=auth) models = json.loads(r.text) print(models)
結果は以下のようになります。
{'status': 'OK', 'timestamp': '2019-01-10T01:10:38.826Z', 'models': [{'username': 'production', 'id': '13fc763b-e394-420b-8f99-db1d7ba5e1bd', 'name': 'HigherEDDTREE', 'user_id': '9fdbeaef-6772-4e08-96e0-c1c553836e3c', 'active_version': 1, 'status': 'online', 'build_status': 'success', 'latest_build_failed': False, 'example_input': {}, 'num_replications': 2, 'insert_time': '2018-10-26T01:02:25.583Z', 'in_review': False, 'active_image': 'production-highereddtree-1-ec794773-0ae3-4328-b299-6cb4e4ae9cc3'}, ...省略... {'username': 'johnsmith', 'id': '1fa319c4-2dd0-41a4-83a9-54186a0655db', 'name': 'TitanicRF', 'user_id': '49362848-bdf3-48ec-9808-f22dfc798ed3', 'active_version': 2, 'status': 'online', 'build_status': 'success', 'latest_build_failed': False, 'example_input': {}, 'num_replications': 2, 'insert_time': '2018-10-26T00:45:10.034Z', 'in_review': False, 'active_image': 'johnsmith-titanicrf-2-bd6211c8-74e1-4831-b269-f5cff9011e63'}]}
アップロードされているモデルの数多いと出力も長くなります。 各モデルに対して得られる項目は同じなので、途中は省略しています。
Scoreツールのモデル一覧のようにユーザ名とモデル名だけを一覧で取り出せればいいときは以下のようにするといいでしょう。
for model in models['models']: print('{}/models/{}'.format(model['username'], model['name']))
モデルのバージョン一覧
続いてはモデルのバージョン一覧です。 Alteryx Promoteではモデルを更新する際に上書きではなく、バージョン更新となります。 そのため、データの変更などを行って複数回モデルを作っているとその分バージョンも増えていきます。 このAPIではモデルの各バージョンに関する情報が取得できます。
r = requests.get('http://<promote_url>/api/models/johnsmith/HigherEDDTREE/versions', auth=auth) json.loads(r.text)
結果は以下のようになります。
{'status': 'OK', 'timestamp': '2019-01-10T00:31:37.494Z', 'modelVersions': [{'username': 'johnsmith', 'user_id': '49362848-bdf3-48ec-9808-f22dfc798ed3', 'name': 'HigherEDDTREE', 'model_id': 'c7cb7630-3958-4aab-af40-8218270e7458', 'active_version': 2, 'status': 'online', 'version': 2, 'image': 'johnsmith-highereddtree-2-5f905614-a0d3-4a2a-b247-1027d1ed2b27', 'service_name': 'johnsmith-HigherEDDTREE-2', 'insert_time': '2018-11-01T08:14:51.225Z', 'bundle_path': '/var/promote/bundles/HigherEDDTREE-johnsmith-1541060091196.Rdata', 'version_id': '0e9ec6bd-f4e1-40fa-8ba3-35e4bd1fd289', 'metadata': None}, {'username': 'johnsmith', 'user_id': '49362848-bdf3-48ec-9808-f22dfc798ed3', 'name': 'HigherEDDTREE', 'model_id': 'c7cb7630-3958-4aab-af40-8218270e7458', 'active_version': 2, 'status': 'online', 'version': 1, 'image': 'johnsmith-highereddtree-1-d4e8f0bc-ad80-41eb-9308-99efc14e3197', 'service_name': 'johnsmith-HigherEDDTREE-1', 'insert_time': '2018-10-26T01:01:48.437Z', 'bundle_path': '/var/promote/bundles/HigherEDDTREE-johnsmith-1540515708426.Rdata', 'version_id': '5feb287f-5546-435b-904e-9d6dc5b140ac', 'metadata': None}]}
コンテナ、システムの状況
さて、残り2つですが、どちらもこれまでと使い方は同じです。 両方ともシステムに関する情報を取得するものなのでまとめて出力結果だけを見ていきましょう。
モデルがデプロイされているコンテナの状況は以下のように取得されます。
{'status': 'OK', 'timestamp': '2019-01-10T00:33:35.937Z', 'uptime': 1131293, 'nPredictions': 0, 'host': '7807c25592ec', 'load': [0.38037109375, 0.26513671875, 0.2177734375], 'freeMem': 84.57620364674489}
システムの状況に関しては、以下のような情報がPromoteのノード数分表示されます。
{'status': 'OK', 'timestamp': '2019-01-10T00:34:47.208Z', 'hosts': [{'name': 'ip-172-31-7-87.ap-northeast-1.compute.internal', 'metrics': {'ram': 13.360430593656202, 'disk': [{'used_percent': 6.677010950008009, 'device': 'overlay', 'path': '/'}, {'used_percent': 6.677010950008009, 'device': 'nvme0n1p1', 'path': '/etc/nodehostname'}, {'used_percent': 6.677010950008009, 'device': 'nvme0n1p1', 'path': '/etc/hostname'}, {'used_percent': 6.677010950008009, 'device': 'nvme0n1p1', 'path': '/etc/hosts'}, {'used_percent': 6.677010950008009, 'device': 'nvme0n1p1', 'path': '/etc/resolv.conf'}], 'cpu': 4.7690763052221286, 'internet': True}}, ...省略... ]}
おわりに
今回は、Alteryx Promoteで提供されているAPIについて解説しました。
実はドキュメントにも以下のページのMonitor Model Uptimeに記載があります。
ドキュメントを結構読み込んでないと見落としてしまいそうではありますが、知っておくと便利に使える場面もあるのではないかと思います。
Alteryxの導入なら、クラスメソッドにおまかせください
日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。