AtCoderのジャッジ環境と同じEC2インスタンスを借りる件

はじめに

こんにちは。競技プログラミングのコンテストに参加しているyunixです。 AHC033楽しかったですね。盤面が小さなゲームなのにこんなに難しいなんて最初に見た時には思いもよらなかったです。組み合わせの偉大さを身に沁みて感じました。

さて、今回のコンテストではビームサーチを使用しました。ビームサーチは一般的に速度の調整が焼きなましのような局所探索系の手法より難しく、TLEしないか心配でした。 一応今までの処理にかかった時間からビーム幅を変更するような処理は入れていたのですが、念のためにAtCoderのジャッジ環境と同じ環境をAWSに借りて実行して時間を計測してみました。

今回と同じように問題の種類によってはジャッジ環境に近い環境を借りたくなることがあるので、AtCoder環境と同じCPUを持った環境を借りてVSCode上でリモートSSHによってEC2上で開発やテストの実行などを行う方法についてメモを残しておきます。(システスを待つ時間が暇なのでw)

※注意 クラウドを使用するには料金がかかります。また、キーペアの管理などを適当にするとセキュリティのリスクもあります。使用の際には十分に気をつけましょう。 また、コンソールのデザインや手順などは時代とともに変わりうるものです。今と違っている可能性があるので注意してください。

AtCoder環境を調べる

昔のあーだこーだーでchokudaiさん?がbashを使ってコードテストからジャッジ環境のCPU調べられるよー、って言っていたのを覚えています(記憶違いかな...?)。 具体的には、bash

cat /proc/cpuinfo

を実行します。 実行すると以下のような結果になります:

cpu情報の検索結果

これを見ると、

Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz

というCPUを使用していることがわかります。 AWSで該当のCPUを持つインスタンスを調べると、m6i.largeというインスタンスであるという情報がありました。*1 というわけでm6i.largeのインスタンスを借りて、sshで繋げば良さそうです。

m6iのインスタンスを立ち上げる

m6iのEC2インスタンスを借ります。ちなみにm6iは一日あたり3ドルかかります(円安のせいで500円くらい)。

  • EC2のコンソールに行きます
  • インスタンスを起動ボタンを押します

  • インスタンスに適当な名前をつけて、マシンイメージを選択します。Amazon Linuxで良いでしょう(料金も安いので...)

  • インスタンスタイプでm6i.largeを選択します

  • 新しいキーペアを作ります 作成ボタンを押すと、ssh秘密鍵が自動でダウンロードされます。この秘密鍵を使用してsshでリモートに接続するので、大事に保管しましょう。 他の人が見れるところにおいたり、無くさないようにしましょう。

  • セキュリティグループを作ります この際に、トラフィックを許可する場所を任意の場所ではなく、自分の使用しているIPアドレスを指定しておきましょう(無用のリスクは避けましょう)。

以上の設定でインスタンスの作成ボタンを押すと、インスタンスが作成されます。

VSCodeで接続する

インスタンスが起動されると以下のような画面が出てきます。このインスタンスに接続するのボタンを押すと参考になる情報が出てきます。

  • 先ほどダウンロードした秘密鍵を~/.ssh/に移動させます
  • ~/.sshで以下のコマンドを実行します
chmod 400 "秘密鍵名"
  • ~/.ssh/configにホストの情報を登録
Host ホスト名(ec2-user@....ap-northeast-1.compute.amazonaws.comみたいなやつ)
  HostName ホスト名(上記と同じ)
  IdentityFile ~/.ssh/"秘密鍵名"
  User ec2-user

ホストに接続するを選択すると、上記で設定したホスト名が出てくると思います。それを選択すれば借りたEC2インスタンス上のファイルをVSCodeで触れるようになります。ターミナルも動くので自分でジャッジ環境に近い環境で色々できます(一日500円)。

色々インストールをする

最初では何も入っていないので色々入れましょう。

  • g++とclang
sudo yum install g++ clang 

これでC++の環境は整います

  • screen リモートログインする時にはscreenを使用しています(tumuxみたいなやつ)。 セッションが切れても実行中のプロセスを動かし続けてくれます。
sudo yum install screen

設定はいつもこれを使っています: .screenrcにこれだけは設定しとけっていうオススメ設定 #Bash - Qiita

あとはやりたい放題です。

片付けをする

AWSにリソースを借りたら料金が発生します。 使用し終わったら必ずリソースを削除しましょう。 今回の課金対象のものはEC2インスタンスだけですが、同時にセキュリティグループとキーペアも作成しているので、不要になったら消してしまいましょう。

最後に

AtCoderのジャッジ環境と同じようなインスタンスを用意する方法を個人的な備忘録を兼ねて書きました。 記述にまずいところがあってもAWSでの実行は自己責任でよろしくお願いします〜 (コメントでご指摘いただければ助かります) あと、EC2インスタンスを必ず消すようにしましょう。破産するほどではないですが、一月放置すると100ドル近く料金がかかり悲しいことになります。