モデリングや予測をAPIで実行するときに、非同期処理できますか?
もしできる場合はどのように終了通知を受け取ることができるでしょうか?
システムへの組み込み方を検討中で、質問させていただきました!
よろしくお願いします。
こんにちは。
ご質問ありがとうございます。田中と申します。
@Aiko_Nakagawa wrote:
モデリングや予測をAPIで実行するときに、非同期処理できますか?
もしできる場合はどのように終了通知を受け取ることができるでしょうか?
システムへの組み込み方を検討中で、質問させていただきました!
よろしくお願いします。
たとえばモデリングの場合、下記の記事のとおり目的変数を指定してオートパイロットの実行を下記の行で行うことができます
project.set_target("目的変数")
※この行だけ実行しても動きませんので詳細は下記のgithubをご覧ください。
上記のコマンドはDataRobotにオートパイロットを行うことを指示していますが、モデリングがはじまるまでのモデリング前の前処理が終わりましたら上記行は終了し、DataRobot側でオートパイロットが行い続けるようになります。こちらが非同期処理になるかと思いますが、ご質問の非同期処理に沿っていますか?
上記で問題なければ、例えば下記のコマンドを実行していただくことでオートパイロット処理を確認することができます。
project.get_status()
# Output sample
#
# Autopilot実行中の場合
#{'autopilot_done': False,
# 'stage_description': 'Ready for modeling',
# 'stage': 'modeling'}
#
# Autopilot終了時の場合
#{'autopilot_done': True,
# 'stage_description': 'Ready for modeling',
# 'stage': 'modeling'}
status = project.get_status()
print(status['autopilot_done'])
# Output
#True
なお、DataRobotのSDKでもautopilotが終了するまで待機するメソッドを用意しております。
project.wait_for_autopilot()
予測について複数の予測方式を用意しておりますがたとえば下記のバッチ予測処理ですと、インプットデータをDataRobotのendpointに投げてからローカルはポーリングすることになりますので、それが非同期処理に該当すると思いますがいかがでしょうか?
https://app.datarobot.com/docs-jp/predictions/batch/cli-scripts.html
上記スクリプトでインプットデータ投入後、一定の間隔でjobを確認し予測が終了しているか確認している処理が入っております。
こちらご回答になっておりますでしょうか?
ご確認よろしくお願いいたします。
田中翔
@Sho Tanaka
すみません、求めている回答が違ったので補足させていただきます。
知りたいのは端的に言うと
「project.wait_for_autopilot()」を使わずに、オートパイロットが終わったことを検知できないのか?です。
今、社内でモデリング用の環境を構築しようとしており、クライアント側からサーバ側にオートパイロットをリクエストした場合、いつオートパイロットが終わったのか?を検知する仕組みが「project.wait_for_autopilot()」を使って同期で待つ、しかわかっていません。
非同期で、オートパイロットが終わったことを検知する手法が知りたいです。
例えば、定期的にクライアント側からDataRobotにポーリングしてステータスを見る、とか。
オブジェクトをDataRobotに渡せばコールバックしてくれるメソッドがある、とか。
いかがでしょうか?
※@Aiko_Nakagawa は、私のチームのメンバーですので内部的に話をしていますのでご安心ください。
@k.sakamoto さん
ご確認ありがとうございます。想定と異なる回答とのこと失礼いたしました。
> 「project.wait_for_autopilot()」を使わずに、オートパイロットが終わったことを検知できないのか?です。
> 例えば、定期的にクライアント側からDataRobotにポーリングしてステータスを見る、とか。
最初に回答に記載いたしました project.get_status()が、project.wait_for_autopilot()を使わないでオートパイロットの状況を確認するメソッドになります。
たとえば、get_status()とsleep、while文を組み合わせると、wait_for_autopilot()を使わずDataRobotにオートパイロットの状況を一定間隔で確認することでオートパイロットの終了を確認できます。下記にサンプルを記載させていただきますね。このsleepがかかれているブロックでオートパイロット中に他のプログラムを動かせますので、ご質問いただいている非同期処理に相当すると思いますがいかがでしょうか?
#先程紹介したこのメソッドを利用します:project.get_status()
#事前にprojectに作成したProject情報が入っている前提です
import time
while True:
if project.get_status()['autopilot_done'] == True:
break
time.sleep(5)
参考:DataRobot SDK リファレンス get_status()
こちら求めている回答になっておりますでしょうか?
ご確認よろしくお願いいたします。
ご確認・追加回答ありがとうございます!
ひとまず、理解しました。
ただ、もう一つ突っ込んでお聞きしたいのですが、オートパイロットを開始した後、いったんpythonのプログラム実行が終了した後、別のプログラムからオートパイロットの状況を監視し続けることは可能でしょうか?
例えば、オートパイロット開始時にDataRobot側からトークンなどがクライアント側プログラムに渡されて、そのトークンを使って別のプログラムからオートパイロットの状況を監視する、みたいなことができたりしないでしょうか?
@k.sakamoto さん
> ただ、もう一つ突っ込んでお聞きしたいのですが、オートパイロットを開始した後、いったんpythonのプログラム実行が終了した後、別のプログラムからオートパイロットの状況を監視し続けることは可能でしょうか?
オートパイロット実行後、該当のプロジェクトIDを保存(例えばcsvなど)し、別のプログラムからファイルを読み出しIDをロードすれば可能です。以下にサンプルを記載いたしますね(ファイルへのアウトプット、インプットは省略しております。)
project_id = project.id
#
# ファイルにproject_idを保存する処理
#
#
# ファイルからproject idをロードして、prj_idに格納する処理
#
project = dr.Project.get(project_id=prj_id)
project.get_status()
ご確認よろしくお願いいたします。