マラソンマッチのためのツールセットはどのようなものになるか
TL;DR
- Q. マラソンマッチ (あるいは AtCoder Heuristic Contest など) のためのツールセットであって高機能なものを考えたとき、どのようなものになるだろうか?
- A. それは個人用のオンラインジャッジシステムのようなものになるだろう。
はじめに
AtCoder Heuristic Contest が始まりました。 私もすこしずつこの手の長期コンテストに復帰していきたいと考えています1。
さて、パソコン力で殴って優位に立てるなら殴っておきたいものです。 そのような事前準備について、考察や資料のまとめを置いておきます。
要件
マラソンマッチのためのツールに必要な機能を列挙してみましょう。 これには「並列実行」「可視化」「統計」「パラメタ最適化」「履歴管理」の 5 つを挙げられるはずです2。 それぞれの詳細は下で述べますが、つまりは書いたコードを「素早く」かつ「分かりやすく」評価して改善するための枠組みが求められています3。
並列実行
コア数の多い計算機を使って並列実行することはよく行なわれます。自分で購入してもよいですし、クラウドサービス (Amazon EC2 など) で借りてもよいでしょう。借りた場合は 64 コアのマシンが 1 時間 70 円くらいです4。GitHub Actions 経由で自動実行されることもあります。
- 例:
はじめてRyzen 5950X買ってて良かったなと思いました(32スレッド並列パワーで5秒 * 1000テストケース)の実行が2分半くらいで終わる。 #AHC001 マラソン専用CPU
— きゅうり (@kyuridenamida) March 14, 2021 - 例:
GitHub に push するたび自動で 20 並列 1000 ケースでテストが走るようにしていました。再現確率が低いバグをうまく拾えるので便利でした。 #AHC001 https://t.co/zp63xICWwnhttps://t.co/KrB4jHlfxV
— kimiyuki@うさぎ🐇 (@kimiyuki_u) March 14, 2021
可視化
参加者はコンテストごとに与えられたビジュアライザを修正して改良するのが通常です。また、これをするための汎用の枠組みを作っている人もいます。
- 例:
#AHC001 お疲れ様でした.
— si💊 (@iiljj) March 14, 2021
暫定スコア 486.9 億点,148位でした.
焼き鈍しです.ときどき形を矯正したり破壊したりして,いいスコアになる state を探しました.
typescript でビジュアライザを作って,スコアが悪い問題を観察しながら進めていました.せっかくなので動画を貼ってみます. pic.twitter.com/BxxjMkuJb6 - 例:
これなんですけど、ちょっと整理して使いやすいように汎用用途でご利用できるようにgithubで公開しました(Marathon General Visualizer)。できるだけパソコン要素を減らそうと尽力はしましたがIDEなしで使いこなすのは難しそうな技術スタックになってしまったhttps://t.co/dXPbuLmnS5#AHC001 pic.twitter.com/5n9AnkS3Ia
— きゅうり (@kyuridenamida) March 14, 2021 - 例:
専用のビジュアライザを作るほどでもないけど内部状態を動画で保存したい、というときのために簡易動画出力器を作りました。動画にしたい部分に描画命令を書くだけでそのまま C++ のコードから svg 動画を html 形式で出力します 意外と便利なので次回以降も活躍予定https://t.co/oHtKOFhqY2 #AHC001 pic.twitter.com/wLdKpitvR7
— さはら (@shr_pc) March 14, 2021 - 例: kmyk/longcontest-visualizer-framework
- 例: colun/gvc
統計
ICFPC においてはチーム内の専用の順位表 (「ダッシュボード」と呼ばれることが多い) が作られることが多いです。 個人戦のマラソンマッチにおいても、複数の提出間でのテストケースごとの傾向の差を観察することは有効です。
- 例:
私の ICFPC はダッシュボード作り(1日目)と複数 AI をとりまとめるスーパーバイザ作り(2,3日目)をやっていた感じだった。今回は AI 本体には手を出さない(チームメイトに任せる)と心に決めていたので自分の仕事に集中出来てよかった。
— Shuhei Takahashi (@nya3jp) August 10, 2015 - 例:
ICFPCお疲れ様でした!こんなチームのダッシュボードつくってました。 pic.twitter.com/ShNHpylgJ2
— がぁ君 (@mecha_g3) August 7, 2017 - 例: ICFPC 2019 にチーム Pigimarl として参加し世界 3 位をとりました | RCO Ad-Tech Lab Blog
パラメタ最適化
ハイパーパラメータ自動最適化フレームワークを用いてパラメータ調整をする試みもなされています。フレームワークとしては Optuna が有名です。
- 例:
パラメータ最適化、今回はやってる余裕なかったけど
— koyumeishi (@koyumeishi_) March 14, 2021
cpp
0. コマンドライン引数でパラメータを受け取る
python
1. subprocess から上を呼ぶ
2. joblib で 1 を並列化
3. optuna で 2 を目的関数にして最適化
みたいなことをいつもしてる (並列化は optuna 自体にもあったっけ?)
履歴管理
コードの編集履歴を管理する際には Git が用いられます。 Git ではあるふたつの辞典のコードの差分を表示したり複数の変更をマージしたりできます。
結論
これらの要件をすべて (あるいはいくつか) を満たすものはどのようになるでしょうか? おそらくそれは「オンラインジャッジシステム」とかなり似たものになるはずです。 「コードを提出すると評価結果が返ってくる」という枠組みはまさにオンラインジャッジです。統計や最適化のためのいくつかの拡張が入るでしょう5し、実行環境はオフラインにあるかもしれませんが、大枠の理解としてはなおオンラインジャッジということになるように思います。
おわりに
誰か作ってください。たのむ。
注釈
-
2 週間全力を捧げるのは単純にしんどいので、赤タッチしてすぐ引退してしまっていました。 ↩
-
もちろん、まだ他にもあるかもしれません。 ↩
-
コードの自動生成をしたいという要求もありますが、今回はこれについては議論しません。事例としては colun/mmlang や競技プログラミングの問題を自動で解きたい - うさぎ小屋 (kmyk/Jikka) などがあります。 ↩
-
2021 年 03 月 18 日時点で c6g.16xlarge (64 vCPU) が $0.6385/1時間 です (料金 - Amazon EC2 スポットインスタンス - Amazon EC2 | AWS)。 ↩
-
可視化の機能が組み込まれたオンラインジャッジとしてはすで CodingGame があります。 ↩