编程基准测试有个不太光彩的秘密:要给模型打分,就得运行它写的东西。在几百道题上做 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 智能体沙箱和在沙箱中完成第一个智能体任务。
评论
暂无评论。来做第一个吧。