程式設計基準測試有個不太光彩的秘密:要給模型打分,就得執行它寫的東西。在幾百道題上做 pass@k,每題十個解答,就是幾千個剛產生的程式——而如果它們來自陌生人,您連一個都不會去 curl | bash。
大多數人一開始在筆電上用 subprocess.run 加一個超時。這能用,直到某個解答寫出 40 GB 的檔案、不斷 fork 直到機器卡死,或悄悄讀取您的主目錄。解決辦法不是更聰明的超時,而是在一個您不在乎的地方執行這些解答。
行之有效的設定
沙箱是一台 Firecracker microVM,內建 Python 3.12、Node.js 22 和 bash,大約一秒啟動,用完即刪。對外網路可用,對內不可用,裡面也沒有任何屬於您的東西。
陷阱在於把沙箱當成函式呼叫。每個沙箱至少按 60 秒計費,啟動要一秒,所以每個解答一個沙箱又慢又浪費。正確做法是把評測框架放進沙箱:
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。出問題的解答只會殺死自己的子程式,而不是整個執行。如果某個解答把沙箱本身弄壞了,您只損失一個分片,重建沙箱後繼續即可。
每次傳輸的檔案最大 5 MB,所以要把大資料集切成分片——為了並行,您本來也需要這樣做。
吞吐量,實話實說
一個帳戶最多可持有 20 個沙箱,但同時只執行 2 條指令。背景任務在執行期間計入其中。所以快速評測的樣子是兩個沙箱各自在後台處理自己的分片,而不是二十個沙箱爭搶兩個槽位。
對於常見的程式設計基準,這綽綽有餘:大多數解答在一秒內完成,一個沙箱每小時能處理幾千個。如果您要同時在一個龐大的測試集上評測許多模型,就會碰到上限。這時,執行您自己隔離方案的 VPS 是更好的工具。
您應該知道的 CPU 規則
沙箱是為突發式負載設計的。CPU 超過 90% 持續 15 分鐘以上的沙箱會被視為濫用——臨時沙箱會被停止。正常的評測在快速執行和結果記錄之間交替,根本接近不了這個閾值。但一個連續數小時滿載 CPU 的基準測試(每個解答都編譯一個大專案、數值壓力測試)會。這種情況請按月租用 VPS:AI agent 方案以 $10 提供 4 vCPU 和 4 GB。
一次執行的費用
您按秒為方案的 vCPU 和記憶體付費,最少 60 秒,從預付餘額扣除。
| 負載 | 方案 | 時間 | 大致費用 |
|---|---|---|---|
| 1,000 個簡短的 Python 解答 | 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 |
產生這些解答的模型呼叫會比執行本身更貴——通常貴一個數量級。
金鑰與可復現性
如果評測框架要在沙箱內呼叫模型 API——比如做 LLM-as-judge 式的評分——請把金鑰作為沙箱的環境變數傳入。這些值加密儲存,從不寫入記錄,API 只返回變數名。
為了可復現,請在評測框架中固定套件版本,並把沙箱方案和結果一起記錄下來。每個沙箱都從同一個乾淨的映像啟動,從您的資料中去掉了「在我筆電上能跑」這個變數。說實話,光這一點就值得切換。
從沙箱頁面和沙箱文件開始。新帳戶可獲得 $1 的沙箱時長——足夠在 small 方案上完成第一次幾千個解答的評測。SDK 參考介紹了背景任務和檔案傳輸,完整的配額表見沙箱限制與計費。
相關閱讀:AI 代理沙箱和在沙箱中完成第一個代理任務。
評論
目前還沒有評論。歡迎成為第一位。