【備忘録】Sagemakerの学習にスポットインスタンスを使う【超カンタン】

2021.01.22

せーのでございます。

Sagemakerを使って機械学習をしていますと、気になるのはやっぱりコストです。特に学習インスタンスはGPUを沢山積んでいたりして、単価が高めになっているので、なるべく節約して使いたい。今回はそういうお話です。

どうやばいのか

Sagemakerの学習インスタンスのコストはタイプによっていろいろ違います。。例えば私がよく使うp2やp3系だとこんな感じになります。

Sagemakerの場合、学習インスタンスは学習した時間しかかかりません。それでも複数インスタンスを一気に回したりし続けると、月に関するコストはかなりの負担になります。

そこで活用したいのがスポットインスタンスです。Sagemakerでは「マネージドスポットインスタンス」というものが使えます。

マネージドスポットインスタンスとは

マネージドスポットインスタンスとは、トレーニングジョブをオンデマンドではなく、スポットインスタンスを使って自動的に実行する、というものです。
これにより70%〜90%のコストが削減できる、という素晴らしいものです。

スポットインスタンス、ということは、当然中断することもあるわけです。ただ、機械学習の場合は途中までの学習結果をチェックポイントとして保存していますので、再開した時はその最後のチェックポイントから学習を再スタートさせられます(ちなみに私はまだ一回も中断したことはありません)。こんなの、利用しない手はないですね。

やってみた

やり方は簡単です。Estimatorのコードにスポットインスタンス用の設定を3つ、追加してあげるだけです。

estimator = PyTorch(entry_point='train.py',
                            source_dir='source_dir',
                            hyperparameters=hyper_param,
                            role=role,
                            framework_version='1.0.0',
                            py_version="py3",
                            instance_count=1,
                            instance_type='ml.p3.2xlarge',
                            max_run=20000, # 追加1(トレーニングジョブを最大どれだけ回すか)
                            use_spot_instances=True, # スポットインスタンスを使う、という宣言
                            max_wait=20000, # スポットインスタンスでトレーニングジョブをどれだけ回すか
                            output_path=s3_output_data)

まずはuse_spot_instances=Trueとしてスポットインスタンスを使うことを宣言します。次にmax_runとmax_waitですが、トレーニングジョブを回す最大秒数がmax_runで、スポットインスタンスでのトレーニングジョブを待つ時間がmax_waitです。スポットインスタンスでトレーニングする時は中断している間もmax_waitの秒数だけ待ち続けることになるのでmax_waitはmax_runと同じか、よりmax_waitの方を大きく設定する必要があります。

これで学習させると、結果トレーニングジョブはこのように表示されます。

この「トレーニング時間」が実際にかかった時間です。が、請求されるのは下の「請求可能な時間」となります。結果70%ものコストダウンが達成されました!

まとめ

こんな数行のコード追加で70%のコストが減らせるのであれば、これはもう絶対やった方がよいですね。
マネージドで自動的に学習インスタンスが立ち上がると「スポットを使う」という発想がなかなか出てこないため、備忘録として書いておきました。

参考リンク