はじめに
データ分析コンペの Kaggle に参加する際、Notebook (Kernel) やラップトップを使用していましたが、モデルの学習時にリソースが足りなくなることが多くあります。単純に AWS で EC2インスタンス を立てて Jupyter を導入することもできますが、出来るだけ低コストに使えるように AWS のスポットインスタンスで Jupyter を起動するまでの手順 について書こうと思います。
AWS スポットインスタンスとは
スポットインスタンスはオンデマンド価格より低価格で利用できる未使用の EC2 インスタンスで、需要と供給によって利用料金が変動します。GCP でいうとプリエンティブインスタンスにあたると思います。オンデマンドに比べて大幅に割引されますが、いくつかの理由によりインスタンスを中断されることがあります。今回の Kaggle 計算環境のように中断されてもそこまで影響の無いワークロードに向いています。
手順
早速ここから手順について説明します。
スポットインスタンスのリクエスト
EC2のページのスポットインスタンスからスポットインスタンスのリクエストを選択します。まずどんなタスクに使用するかの選択をします。ここでは Big data workloads を選択します。
AMI やコンピュートユニットを選択します。ここでは、既存のインスタンスタイプから r3.xlarge を選択します。様々なインスタンスタイプがあるので、Amazon EC2 料金表 などを参考に決めるといいでしょう。
その他もろもろの設定をしてリクエストの作成をする時に割引率が提示されます。この時は81%offの価格で利用できることが分かります。
少し時間がたつとインスタンスが作成されるので、ターミナル(Macの場合)などから ssh します。インスタンスに ssh する前には、インスタンスのセキュリティグループ(ファイアウォールのようなもの)の設定が必要です。
セキュリティグループの設定
インスタンスのセキュリティグループが下記赤枠から確認できます。
対象のセキュリティグループのインバウンドルールにクライアントのIPを設定します。
個々の環境によって異なるかと思いますが、下記のようにMy IPを選択すれば今使っている端末のグローバルIPが自動で設定されるようです。
SSH接続する
作成したインスタンスにSSH接続します。SSH接続するためのコマンドは接続をクリックすると表示されます。
$ chmod 400 spot-instance-key.pem
$ ssh -i "spot-instance-key.pem" root@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com
# SSH完了
[ec2-user@ip-xxx-xx-xx-xx ~]$
これでスポットインスタンスへのSSHが完了しました。
ここからは各自自由にJupyterを起動するまでの手順を進めてください。
今回自分の場合は、ローカル環境で Docker を使って環境構築して開発していたものを Github リポジトリで管理していたので、git clone をして、docker run をしました。Kaggle 公式の Docker イメージを取得するのもありです。
Dockerのインストールは Get Docker CE for Ubuntu を参考に進めます(Ubuntuの場合)。
Kaggle 公式 Dockerイメージの pull
$ docker pull gcr.io/kaggle-images/python
AMI作成
スポットインスタンスは停止をすることができないため、計算が完了したら削除をしないといけません。よって、2度目以降に同じ環境を構築するためにAMIを作成しておきます。
AMIを作成しておけば、再度スポットインスタンスを作成するときに、テンプレートとしてそのAMIを指定することで同じ環境を構築することができます。
参考:インスタンスと AMI