コーディングベンチマークには、あまり語られない秘密があります。モデルを採点するには、モデルが書いたものを実行しなければならないのです。数百問に各10件の解答で pass@k を回せば、生成されたばかりのプログラムが何千本にもなります。見知らぬ人から来たものなら、そのうち1本たりとも curl | bash で実行しないはずです。
たいていの人はノートPCで subprocess.run とタイムアウトを使って始めます。これは、ある解答が 40 GB のファイルを書き出したり、マシンが止まるまでプロセスを fork したり、こっそりホームディレクトリを読んだりするまでは機能します。解決策は賢いタイムアウトではありません。どうなっても構わない場所で解答を実行することです。
うまくいく構成
サンドボックスは、Python 3.12、Node.js 22、bash を備えた Firecracker microVM で、約1秒で起動し、使い終わったら削除されます。外向きのインターネットは使えますが受信はできず、中にはあなたのものは何もありません。
落とし穴は、サンドボックスを関数呼び出しのように扱うことです。サンドボックスはそれぞれ最低60秒分課金され、起動に1秒かかるため、解答ごとに1つでは遅く無駄が多くなります。代わりにハーネスを中に置きます。
from eqvps import Sandbox
with Sandbox.create(tariff="standard", ttl=4 * 3600) as sb:
sb.upload("/root/harness.py", open("harness.py").read())
sb.upload("/root/samples.jsonl", open("slice_03.jsonl").read())
task = sb.exec("python3 /root/harness.py /root/samples.jsonl > /root/results.jsonl",
background=True)
task.wait(poll_interval=10)
results = sb.download_text("/root/results.jsonl")
中では harness.py が各解答を個別の短いタイムアウト付きのサブプロセスで実行し、pass、fail、timeout を記録します。おかしな動きをした解答が止めるのは自分のサブプロセスだけで、実行全体ではありません。もし解答がサンドボックス自体を壊したら、失うのは1つのスライスだけです。サンドボックスを作り直して続ければ済みます。
ファイルは1回の転送あたり最大 5 MB なので、大きなデータセットはスライスに分割してください。どのみち並列化のためにそうしたいはずです。
スループットの実際
アカウントは最大20個のサンドボックスを保持できますが、同時に実行されるコマンドは2つです。バックグラウンドタスクは実行中ずっとカウントされます。ですから速い評価とは、20個のサンドボックスが2つの枠を奪い合う形ではなく、2つのサンドボックスがそれぞれバックグラウンドで自分のスライスを処理していく形です。
一般的なコーディングベンチマークならこれで十分です。ほとんどの解答は1秒未満で終わり、1つのサンドボックスで1時間に何千件も処理できます。巨大なスイートで多数のモデルを同時に評価する必要があるなら、上限に達するでしょう。その時点では、独自の分離を動かす VPS のほうが適した道具です。
知っておくべき CPU ルール
サンドボックスは断続的な負荷向けに作られています。CPU 使用率 90% 超が15分以上続くサンドボックスは不正利用とみなされ、一時サンドボックスは停止されます。素早い実行と結果の記録を交互に行う通常の評価は、その水準に近づきもしません。何時間も CPU をフルに使うベンチマーク(解答ごとに大きなプロジェクトをコンパイルする、数値計算のストレステストなど)は該当します。その場合は月単位で VPS を借りてください。AI agent プランなら $10 で 4 vCPU と 4 GB です。
1回の実行の費用
プランの vCPU と RAM に対して秒単位、最低60秒で、プリペイド残高から支払います。
| 負荷 | プラン | 時間 | おおよその費用 |
|---|---|---|---|
| 短い Python の解答 1,000件 | small(0.5 vCPU、1 GB) | 約20分 | $0.011 |
| 解答 5,000件、numpy 使用可 | standard(1 vCPU、2 GB) | 約2時間 | $0.13 |
| 解答ごとのビルド + テスト | plus(2 vCPU、4 GB) | 約3時間 | $0.40 |
これらの解答を生成するモデル呼び出しのほうが、実行よりも高くつきます。たいてい1桁違います。
キーと再現性
ハーネスがサンドボックス内からモデルの API を呼び出す場合(たとえば LLM-as-judge 方式の採点など)は、キーをサンドボックスの環境変数として渡してください。値は暗号化して保存され、ログには一切記録されず、API が返すのは変数名だけです。
再現性のために、ハーネス内でパッケージのバージョンを固定し、結果と一緒にサンドボックスのプランを記録してください。すべてのサンドボックスは同じクリーンなイメージから起動するため、「自分のノートPCでは動いた」という変数が数値から消えます。正直なところ、それだけでも乗り換える価値があります。
まずはサンドボックスのページとサンドボックスのドキュメントから始めてください。新規アカウントには $1 分のサンドボックス利用時間が付与され、small プランで数千件の解答を使った最初の評価が回せます。バックグラウンドタスクとファイル転送は SDK リファレンスに、クォータの全表はサンドボックスの制限と課金にあります。
コメント
まだコメントはありません。最初になりましょう。