benchmark ด้านโค้ดมีความลับที่ไม่ค่อยมีใครพูดถึง คือการจะให้คะแนนโมเดล คุณต้อง รัน สิ่งที่มันเขียน การรัน pass@k กับโจทย์หลายร้อยข้อ ข้อละสิบคำตอบ เท่ากับโปรแกรมที่เพิ่งสร้างใหม่นับพัน และถ้ามาจากคนแปลกหน้า คุณจะไม่ curl | bash แม้แต่ตัวเดียว
คนส่วนใหญ่เริ่มบนแล็ปท็อปด้วย subprocess.run และ timeout วิธีนี้ใช้ได้จนกว่าจะมีคำตอบสักตัวเขียนไฟล์ขนาด 40 GB, fork โพรเซสจนเครื่องค้าง หรือแอบอ่านโฮมไดเรกทอรีของคุณ ทางแก้ไม่ใช่ timeout ที่ฉลาดกว่า ทางแก้คือรันคำตอบในที่ที่คุณไม่ต้องห่วง
การตั้งค่าที่ได้ผล
แซนด์บ็อกซ์คือ Firecracker microVM ที่มี Python 3.12, Node.js 22 และ bash เริ่มทำงานในราวหนึ่งวินาทีและถูกลบเมื่อคุณใช้เสร็จ อินเทอร์เน็ตขาออกใช้ได้ ขาเข้าใช้ไม่ได้ และข้างในไม่มีอะไรของคุณเลย
กับดักคือการมองแซนด์บ็อกซ์เป็นการเรียกฟังก์ชัน แต่ละตัวคิดเงินอย่างน้อย 60 วินาทีและใช้เวลาเริ่มหนึ่งวินาที แซนด์บ็อกซ์ต่อคำตอบจึงทั้งช้าและเปลือง ให้วาง harness ไว้ข้างในแทน:
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 รันคำตอบแต่ละตัวในโพรเซสย่อยที่มี timeout สั้น ๆ ของตัวเอง และบันทึกผลเป็น pass, fail หรือ timeout คำตอบที่ทำตัวผิดปกติจะฆ่าแค่โพรเซสย่อยของมันเอง ไม่ใช่การรันทั้งหมด ถ้าคำตอบสักตัวทำให้แซนด์บ็อกซ์พังได้ คุณเสียแค่ส่วนเดียว สร้างแซนด์บ็อกซ์ใหม่ แล้วทำต่อ
ไฟล์ส่งได้สูงสุด 5 MB ต่อครั้ง ดังนั้นให้แบ่งชุดข้อมูลใหญ่เป็นส่วน ๆ ซึ่งคุณก็ต้องทำอยู่แล้วเพื่อการรันขนาน
Throughput แบบตรงไปตรงมา
บัญชีหนึ่งมีแซนด์บ็อกซ์ได้สูงสุด 20 ตัว แต่ ทำงานพร้อมกันได้ 2 คำสั่ง งานเบื้องหลังนับรวมตราบที่ยังรันอยู่ การประเมินที่เร็วจึงหน้าตาเป็นแซนด์บ็อกซ์สองตัวที่ต่างคนต่างบดส่วนของตัวเองอยู่เบื้องหลัง ไม่ใช่แซนด์บ็อกซ์ยี่สิบตัวแย่งกันสองช่อง
สำหรับ benchmark ด้านโค้ดทั่วไป แค่นี้ก็เหลือเฟือ คำตอบส่วนใหญ่จบในเวลาไม่ถึงวินาที และแซนด์บ็อกซ์ตัวเดียวทำได้หลายพันคำตอบต่อชั่วโมง ถ้าคุณต้องประเมินหลายโมเดลพร้อมกันกับชุดทดสอบขนาดมหึมา คุณจะชนเพดาน ถึงตอนนั้น VPS ที่รันการแยกส่วนของคุณเองคือเครื่องมือที่ดีกว่า
กฎเรื่อง CPU ที่ควรรู้
แซนด์บ็อกซ์ออกแบบมาสำหรับงานที่ใช้ทรัพยากรเป็นช่วง ๆ แซนด์บ็อกซ์ที่ ใช้ CPU เกิน 90% นานกว่า 15 นาที ถือว่าเป็นการใช้งานในทางที่ผิด แซนด์บ็อกซ์ชั่วคราวจะถูกหยุด การประเมินปกติที่สลับไปมาระหว่างการรันสั้น ๆ กับการบันทึกผลไม่เข้าใกล้เกณฑ์นี้เลย แต่ benchmark ที่เผา CPU เต็มเป็นชั่วโมง (คอมไพล์โปรเจกต์ใหญ่ทุกคำตอบ หรือ stress test เชิงตัวเลข) จะเข้าใกล้ สำหรับงานแบบนั้นให้เช่า VPS รายเดือน: แพ็กเกจ AI agent ให้ 4 vCPU และ 4 GB ในราคา $10
รันหนึ่งครั้งเสียเท่าไร
คุณจ่ายรายวินาทีตาม 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 |
| Build + เทสต์ทุกคำตอบ | plus (2 vCPU, 4 GB) | ~3 ชม. | $0.40 |
การเรียกโมเดลเพื่อสร้างคำตอบเหล่านั้นจะแพงกว่าการรันเสียอีก โดยทั่วไปราวสิบเท่า
คีย์และการทำซ้ำได้
ถ้า harness เรียก API ของโมเดลจากภายในแซนด์บ็อกซ์ เช่น เพื่อให้คะแนนแบบ LLM-as-judge ให้ส่งคีย์เป็นตัวแปรสภาพแวดล้อมของแซนด์บ็อกซ์ ค่าต่าง ๆ จะถูกเก็บแบบเข้ารหัส ไม่ถูกบันทึกลงล็อก และ API จะคืนให้แค่ชื่อตัวแปร
เพื่อให้ทำซ้ำผลได้ ให้ล็อกเวอร์ชันแพ็กเกจใน harness และบันทึกแพ็กเกจของแซนด์บ็อกซ์ไว้คู่กับผลลัพธ์ แซนด์บ็อกซ์ทุกตัวเริ่มจากอิมเมจสะอาดเดียวกัน ซึ่งตัดตัวแปร "บนแล็ปท็อปผมรันได้นะ" ออกจากตัวเลขของคุณ พูดตรง ๆ แค่ข้อนี้ข้อเดียวก็คุ้มที่จะเปลี่ยนแล้ว
เริ่มจาก หน้าแซนด์บ็อกซ์ และ เอกสารแซนด์บ็อกซ์ บัญชีใหม่ได้เวลาแซนด์บ็อกซ์มูลค่า $1 พอสำหรับการประเมินครั้งแรกหลายพันคำตอบบนแพ็กเกจ small เอกสารอ้างอิง SDK อธิบายงานเบื้องหลังและการส่งไฟล์ ส่วน ข้อจำกัดและการคิดเงินของแซนด์บ็อกซ์ มีตารางโควตาฉบับเต็ม
เกี่ยวข้อง: แซนด์บ็อกซ์สำหรับ AI agent และ งานแรกของ agent ในแซนด์บ็อกซ์
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ