코딩 벤치마크에는 잘 이야기하지 않는 비밀이 있습니다. 모델을 채점하려면 모델이 쓴 코드를 실행해야 한다는 것입니다. 문제 수백 개에 각각 풀이 10개로 pass@k를 돌리면 방금 생성된 프로그램이 수천 개가 됩니다. 낯선 사람이 보낸 것이라면 그중 단 하나도 curl | bash로 실행하지 않을 겁니다.
대부분은 노트북에서 subprocess.run과 타임아웃으로 시작합니다. 어떤 풀이가 40 GB 파일을 쓰거나, 머신이 멈출 때까지 프로세스를 fork하거나, 몰래 홈 디렉터리를 읽기 전까지는 잘 동작합니다. 해결책은 더 영리한 타임아웃이 아닙니다. 아무래도 상관없는 곳에서 풀이를 실행하는 것입니다.
잘 동작하는 구성
샌드박스는 Python 3.12, Node.js 22, bash를 갖춘 Firecracker microVM으로, 약 1초 만에 시작되고 작업이 끝나면 삭제됩니다. 외부로 나가는 인터넷은 되지만 들어오는 연결은 안 되며, 안에는 여러분의 것이 아무것도 없습니다.
함정은 샌드박스를 함수 호출처럼 다루는 것입니다. 샌드박스마다 최소 60초가 과금되고 시작에 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을 기록합니다. 말썽을 부리는 풀이는 전체 실행이 아니라 자기 하위 프로세스만 종료시킵니다. 어떤 풀이가 샌드박스 자체를 망가뜨리면 조각 하나만 잃고, 샌드박스를 다시 만들어 계속하면 됩니다.
파일은 전송당 최대 5 MB이므로 큰 데이터셋은 조각으로 나누세요. 어차피 병렬 처리를 위해서도 그렇게 하는 편이 좋습니다.
처리량, 솔직하게
계정은 샌드박스를 최대 20개까지 가질 수 있지만, 동시에 실행되는 명령은 2개입니다. 백그라운드 작업은 실행되는 동안 계속 포함됩니다. 그래서 빠른 평가란 샌드박스 20개가 슬롯 2개를 두고 다투는 모습이 아니라, 샌드박스 2개가 각자 백그라운드에서 자기 조각을 처리해 나가는 모습입니다.
일반적인 코딩 벤치마크라면 이걸로 충분합니다. 대부분의 풀이는 1초 안에 끝나고, 샌드박스 하나가 1시간에 수천 개를 처리합니다. 거대한 스위트로 여러 모델을 동시에 평가해야 한다면 한계에 부딪힐 것입니다. 그때는 자체 격리를 돌리는 VPS가 더 나은 도구입니다.
알아 둬야 할 CPU 규칙
샌드박스는 간헐적인 부하에 맞춰 설계되었습니다. CPU 사용률 90% 초과가 15분 넘게 이어지는 샌드박스는 악용으로 간주되며, 임시 샌드박스는 중지됩니다. 빠른 실행과 결과 기록을 번갈아 하는 일반적인 평가는 이 기준에 근처도 가지 않습니다. 몇 시간씩 CPU를 최대로 태우는 벤치마크(풀이마다 큰 프로젝트를 컴파일하거나 수치 계산 스트레스 테스트를 하는 경우)는 해당됩니다. 그럴 때는 월 단위 VPS를 쓰세요. AI agent 요금제는 $10에 4 vCPU와 4 GB를 제공합니다.
실행 한 번의 비용
요금제의 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 |
이 풀이를 생성하는 모델 호출이 실행보다 더 비쌉니다. 보통 한 자릿수 정도 차이가 납니다.
키와 재현성
하네스가 샌드박스 안에서 모델 API를 호출한다면(예를 들어 LLM-as-judge 방식 채점), 키를 샌드박스 환경 변수로 전달하세요. 값은 암호화되어 저장되고 로그에 남지 않으며, API는 변수 이름만 반환합니다.
재현성을 위해 하네스에서 패키지 버전을 고정하고, 결과와 함께 샌드박스 요금제를 기록하세요. 모든 샌드박스는 같은 깨끗한 이미지에서 시작하므로, 수치에서 "내 노트북에서는 됐는데"라는 변수가 사라집니다. 솔직히 이것만으로도 바꿀 가치가 있습니다.
샌드박스 페이지와 샌드박스 문서부터 시작하세요. 새 계정에는 샌드박스 사용 시간 $1이 제공되며, small 요금제로 풀이 수천 개의 첫 평가를 돌리기에 충분합니다. 백그라운드 작업과 파일 전송은 SDK 레퍼런스에, 전체 할당량 표는 샌드박스 제한과 과금에 있습니다.
관련 글: AI 에이전트용 샌드박스, 샌드박스에서 첫 에이전트 작업하기.
댓글
아직 댓글이 없습니다. 첫 번째가 되세요.