先日の世界コンピュータ将棋オンライン大会では、ねね将棋はAWSのスポットインスタンス上で将棋エンジンを動作させていました。スポットインスタンスはAWS上の余剰計算資源を安価に貸し出すような形態で、余剰が少なくなると強制的に終了されてしまう仮想マシンです。メリットは価格がオンデマンドインスタンス(強制終了されない通常の仮想マシン)と比べて1/3程度になることです。今回使用した8GPUのインスタンスはオンデマンドですと1時間当たり3000円を超えるため、金銭負担を軽減するためリスクを受け入れてスポットインスタンスを利用することにしました。幸い今回のイベントでは一度も強制終了されることはなくすべての対局を実施できました。一応強制終了されても対局を放棄しないようにローカルマシンに切り替える仕掛けとして使えるのがフェイルオーバーツールで、以前の記事で紹介しました。
この記事ではスポットインスタンスを利用したことによる別の問題について事後検証結果を報告します。その問題は、起動に時間がかかるという点です。スポットインスタンスはAMIと呼ばれる仮想マシンテンプレートのようなものを指定して起動します。AMIにはスナップショットと呼ばれる読み取り専用のディスクイメージが関連付けられていて、ここにOSやソフトウェアがインストールされた状態になっています。スポットインスタンス起動時にはスナップショットをコピーして読み書き可能なディスク(EBSボリューム)が生成されるという挙動になります。
今回の運用では各対局直前にスポットインスタンスを起動するという運用をとってコストを最小化する方針としました。これを実施するにあたり生じた問題は、スポットインスタンスでは起動直後のランダムアクセスのパフォーマンスが著しく悪い(と思われる挙動をする)という問題でした。具体的には将棋エンジン上でCUDA、TensorRT、DNNモデルを読み込む部分で6分ほどもかかるという点でした。一度読み込みができると、将棋エンジンを終了して再度読み込みを行っても1分以内で完了するということも分かりました。スポットインスタンスの起動の指示を出してからsshでログイン可能となるまで2分程度かかるため、対局前にトータルで10分程度時間が必要でした。
今後のためにこの読み込み速度を改善できないか調べたところ、Amazon EBS ボリュームの初期化という記事を見つけました。
スナップショットから復元されたボリュームへのアクセスは、ストレージブロックがAmazon S3からプルダウンされてボリュームに書き込こまれると可能になります。この事前処理には一定の時間がかかるため、各ブロックへの初回アクセス時には、I/O 操作のレイテンシーが著しく増加する可能性があります。ボリュームのパフォーマンスは、すべてのブロックがダウンロードされてボリュームに書き込まれると正常値に達します。
オンデマンドインスタンスにはあらかじめ対応するEBSボリュームが存在しており、起動直後からランダムアクセスのパフォーマンスが十分高いのですが、スポットインスタンスでは上記の挙動が発生することでCUDA等の読み込み速度が低下している可能性があります。
この問題への対処策として、Amazon EBS 高速スナップショット復元が使えそうでした。
Amazon EBS 高速スナップショット復元を使用するとスナップショットからボリュームを作成でき、このボリュームは作成時に完全に初期化された状態になります。これにより、ブロックの初回アクセス時における I/O オペレーションのレイテンシーがなくなります。高速スナップショット復元を使用して作成されたボリュームでは、プロビジョンドパフォーマンスをすべて即座に提供できます。
これを実際に試してみました。この機能は1時間当たり$0.75×アベイラビリティゾーン数だけコストがかかるため、本番利用の日にだけ有効化すべきです。
以上の設定をしたうえで、従来通りスポットインスタンスを起動し、そこから対局開始までの所要時間を計測しました。
結果は、1分23秒でssh接続が可能となり、直後に将棋エンジンを起動したところ計測開始から2分3秒で対局が開始しました。従来ですと8分以上かかっていたため大幅に改善したことになります。なお高速スナップショット復元には利用頻度の制限があるようですが、今回のように90GBのイメージを1時間あたり最大2回程度起動する用途であれば十分のようです。
AWSのスポットインスタンス上のGPU利用将棋エンジンの起動高速化に高速スナップショット復元が利用できることがわかりました。次の機会があれば設定したいと思います。