Open2

サブミット後の実行時間(Public LBのスコアが出るまで)がわかるコード

currypurincurrypurin

kaggleのコードコンペでは、実行時間の限度があり実行にかかる時間を知るのが重要。
サブミット後、次のコードを動かしておくことで、実行時間がわかる。

from kaggle.api.kaggle_api_extended import KaggleApi
import datetime
from datetime import timezone
import time

api = KaggleApi()
api.authenticate()

COMPETITION =  '<コンペ名を入れる>'
result_ = api.competition_submissions(COMPETITION)[0]
latest_ref = str(result_)  # 最新のサブミット番号
submit_time = result_.date

status = ''

while status != 'complete':
    list_of_submission = api.competition_submissions(COMPETITION)
    for result in list_of_submission:
        if str(result.ref) == latest_ref:
            break
    status = result.status

    now = datetime.datetime.now(timezone.utc).replace(tzinfo=None)
    elapsed_time = int((now - submit_time).seconds / 60) + 1
    if status == 'complete':
        print('\r', f'run-time: {elapsed_time} min, LB: {result.publicScore}')
    else:
        print('\r', f'elapsed time: {elapsed_time} min', end='')
        time.sleep(60)

output

実行中は、サブミットからの経過時間が表示される

実行が終了すると、実行時間とLBのスコアが表示される

メモ

出力をカスタマイズするときのためのメモ。  
notebookのurlや名前も出力しておくと便利。

  • result.url: notebookのurl
  • result.fileName: notebookの名前
  • result.errorDescription: エラーコード

todo

  • コードを動かしてからの時間が表示されるようにする ← 表示するようにした
    • tqdmのように表示できると良い
  • サブミット直後にこのコードを動かさないといけないので、直後じゃなくても計測できるように修正 ← 次のサブミットまでならいつ初めてもokにした
    • 'result[date]'にサブミット時刻が入っているので、そこから計算できる。
  • ログファイルに吐き出したり、lineに通知したりして使うと良いと思う

作った経緯

まますさんの次のツイートのコードが素晴らしかったので、Pythonでやる版を作ってみました。