おはようございます。エンジニアの japlj です。作曲 (DTM) をしています。
去る 2019 年 1 月に、新人エンジニア主催でISUCONに機械学習の要素を取り入れた新しいタイプのコンテスト “PIGICON” を開催したことはみなさまご存じだと思います (つい先程まで PIGICON の存在を知らなかったという方もたった今リンク先の記事によって PIGICON を知ったことになり、認知度は 100% であることが明らかになっています)。
PIGICON 紹介記事にもあるように、PIGICON では短期間に多数の採点を行ったにもかかわらず運営の実装起因でのエラーは一度もなく、採点ごとのスコアも非常に安定していました。本記事では、PIGICON の安定性を支えたコンテストシステムの構成と、その一翼を担ったベンチマークツールについて紹介します。
まず最初に、コンテストシステムの特徴的な点を挙げると:
特に、ポータルサイトとベンチマークツールを完全に切り離したことがコンテストシステムの安定性と利便性に大きく寄与しました。
採点ジョブの管理・実行を Batch に一任することでポータル側でのジョブ管理の負担を軽減し、かつ複数回の採点でスコアのぶれが出にくい安定したベンチマークを行うことができました。
また、参加者が「どうもうまくサーバが応答できていないな」と感じた場合など、自由なタイミングで採点を中断できるようになっています。こういった便利な機能も Batch のジョブをキャンセルするだけで実現できるので、Batch の採用は非常に良かったと感じています。
これらのインフラ (EC2, ECR, ECS, Batch など) の構成を Terraform で、参加者に与える EC2 インスタンスに参考実装や ssh の公開鍵を設置するセットアップ方法を Ansible で、それぞれコード化することで保守性や再利用性を高めています。その上で、実際の AWS 環境への適用は CI ツールである drone に行わせるようにすることで、インフラ周辺まで含めて高速に開発を進めることができました。
コンテストシステムの全体構成は上図のようになっており、矢印で示された順にしたがって採点が行われます:
ポータルとベンチマークツールが分離されているので、ベンチマークツールが必要な情報はすべて環境変数で受け取れるようになっています。
また、ベンチマークツール側からは指定された URL に対し HTTP で採点の進捗情報や結果などを通知します。これにより、採点の途中経過がリアルタイムにポータル側で表示されます。この機能は採点の進捗 (上手く動いているかどうか) が分かりやすく、また処理速度が目に見えて分かる点で非常に好評でした。ビジュアル面についての詳細は、実際の画面の様子を含めたポータルサイト編の解説記事 (同期の辣腕 Web エンジニアによる渾身の記事) で紹介される予定ですので、ご期待ください。
ベンチマークツールは Scala で実装されており、Akka HTTP を使って実際のリクエスト/レスポンスのやりとりを行っています。
こちらもいくつかの特徴的な点を挙げると:
多くの情報を環境変数で外部から指定できるようにしたことと、ベンチマーク処理をデータセットに出来るだけ依存しない形で設計したことで、データセットを差し替えて同様のコンテストがすぐに開催できるようになっています。(もちろん、実際にはスコア計算のバランス調整などが必要になりますが、ベンチマークツールやポータルなどのシステムにはほとんど手を加える必要がありません)
ポータル (Web アプリ) を ECS、ベンチマークツールを Batch で動かすことで、非常に安定したコンテストシステムを構築することができました。ポータルとベンチマークツールがうまく分離されていたことで、それぞれ別メンバーが中心となって効率よく開発を進めることができました。こういったシステムの設計は初めての経験でしたが、開発面でも成果物の面でも上手くいったと思います。