벤치마크 모범 사례
버전: 0.3.2 상태: 방법론 발전에 따라 업데이트되는 문서 참고: MLPerf Inference, SPEC CPU 2017, NVIDIA GenAI-Perf
개요
asiai bench는 확립된 벤치마크 표준을 따라 Apple Silicon의 추론 엔진 간 신뢰할 수 있고, 재현 가능하며, 비교 가능한 결과를 생성합니다. 이 문서는 구현된, 계획 중인, 또는 의도적으로 제외된 모범 사례를 추적합니다.
준수 요약
| 카테고리 | 사례 | 상태 | 도입 버전 |
|---|---|---|---|
| 메트릭 | TTFT와 tok/s 분리 | 구현됨 | v0.3.1 |
| 결정론적 샘플링 (temperature=0) | 구현됨 | v0.3.2 | |
| 서버 API의 토큰 수 (SSE 청크가 아님) | 구현됨 | v0.3.1 | |
| 엔진별 전력 모니터링 | 구현됨 | v0.3.1 | |
| generation_duration_ms 명시적 필드 | 구현됨 | v0.3.1 | |
| 워밍업 | 엔진당 1회 비계측 생성 | 구현됨 | v0.3.2 |
| 실행 횟수 | 기본 3회 (SPEC 최소) | 구현됨 | v0.3.2 |
| 주요 메트릭으로 중앙값 (SPEC 표준) | 구현됨 | v0.3.2 | |
| 보조로 평균 + 표준편차 | 구현됨 | v0.3.0 | |
| 분산 | 풀링된 프롬프트 내 표준편차 | 구현됨 | v0.3.1 |
| CV 기반 안정성 분류 | 구현됨 | v0.3.0 | |
| 환경 | 순차적 엔진 실행 (메모리 격리) | 구현됨 | v0.1 |
| 서멀 스로틀링 감지 + 경고 | 구현됨 | v0.3.2 | |
| 서멀 레벨 + speed_limit 기록 | 구현됨 | v0.1 | |
| 재현성 | 벤치마크별 엔진 버전 저장 | 구현됨 | v0.3.2 |
| 모델 포맷 + 양자화 저장 | 구현됨 | v0.3.2 | |
| 하드웨어 칩 + macOS 버전 저장 | 구현됨 | v0.3.2 | |
| 오픈소스 벤치마크 코드 | 구현됨 | v0.1 | |
| 회귀 | 과거 기준선 비교 (SQLite) | 구현됨 | v0.3.0 |
| (engine, model, prompt_type)별 비교 | 구현됨 | v0.3.1 | |
| metrics_version 필터링 | 구현됨 | v0.3.1 | |
| 프롬프트 | 4가지 다양한 프롬프트 유형 + 컨텍스트 채움 | 구현됨 | v0.1 |
| 프롬프트별 고정 max_tokens | 구현됨 | v0.1 |
계획된 개선 사항
P1 — 통계적 엄밀성
| 사례 | 설명 | 표준 |
|---|---|---|
| 95% 신뢰 구간 | CI = mean +/- 2*SE. +/- stddev보다 유용. | 학술 |
| 백분위수 (P50/P90/P99) | 특히 TTFT용 — 테일 레이턴시가 중요. | NVIDIA GenAI-Perf |
| 이상치 감지 (IQR) | [Q1 - 1.5IQR, Q3 + 1.5IQR] 범위 밖 실행 플래그. | 통계 표준 |
| 추세 감지 | 실행 간 단조 성능 저하 감지 (서멀 드리프트). | 학술 |
P2 — 재현성
| 사례 | 설명 | 표준 |
|---|---|---|
| 엔진 간 쿨다운 | 서멀 안정화를 위해 3-5초 일시 중지. | GPU 벤치마크 |
| 토큰 비율 검증 | tokens_generated < max_tokens의 90%일 때 경고. | MLPerf |
| 내보내기 형식 | 커뮤니티 제출용 asiai bench --export JSON. |
MLPerf 제출 |
P3 — 고급
| 사례 | 설명 | 표준 |
|---|---|---|
ignore_eos 옵션 |
처리량 벤치마크를 위해 max_tokens까지 강제 생성. | NVIDIA |
| 동시 요청 테스트 | 배치 처리량 테스트 (vllm-mlx에 해당). | NVIDIA |
| 백그라운드 프로세스 감사 | 벤치마크 중 무거운 프로세스 실행 시 경고. | SPEC |
의도적 편차
| 사례 | 편차 이유 |
|---|---|
| MLPerf 최소 600초 지속 시간 | 데이터센터 GPU용으로 설계됨. Apple Silicon에서 3회 실행 + 4개 프롬프트로 약 2-5분이면 안정적인 결과에 충분합니다. |
| SPEC 2회 비계측 워밍업 워크로드 | 1회 워밍업 생성 사용 (2회 전체 워크로드가 아님). JIT 워밍업이 최소인 로컬 추론 엔진에는 1회 워밍업으로 충분합니다. |
| 모집단 표준편차 vs 표본 표준편차 | N-1 제수 대신 N 제수의 모집단 표준편차를 사용. 적은 N (3-5회)에서는 차이가 미미하며 모집단이 더 보수적입니다. |
| 주파수 스케일링 제어 | Apple Silicon은 CPU 거버너 제어를 노출하지 않습니다. 대신 thermal_speed_limit를 기록하여 스로틀링을 감지합니다. |
Apple Silicon 고유 고려 사항
통합 메모리 아키텍처
Apple Silicon은 CPU와 GPU가 메모리를 공유합니다. 두 가지 주요 의미가 있습니다:
- 두 엔진을 동시에 벤치마크하지 마세요 — 동일한 메모리 풀을 경쟁합니다.
asiai bench는 설계상 엔진을 순차적으로 실행합니다. - VRAM 보고 — Ollama와 LM Studio는
size_vram을 네이티브로 보고합니다. 다른 엔진 (llama.cpp, mlx-lm, oMLX, vLLM-MLX, Exo)에서는 libproc을 통한ri_phys_footprint를 대체 추정값으로 사용합니다. 이는 Activity Monitor가 표시하는 값과 동일하며 Metal/GPU 할당을 포함합니다. 추정값은 UI에 "(est.)"로 표시됩니다.
서멀 스로틀링
- MacBook Air (팬 없음): 지속 부하에서 심각한 스로틀링. 5-10분 후 결과 저하.
- MacBook Pro (팬 있음): 경미한 스로틀링, 보통 팬 속도 증가로 처리.
- Mac Mini/Studio/Pro: 능동 냉각, 최소 스로틀링.
asiai bench는 결과별로 thermal_speed_limit를 기록하고 실행 중 스로틀링이 감지되면 (speed_limit < 100%) 경고합니다.
KV 캐시와 컨텍스트 길이
큰 컨텍스트 크기 (32k+)는 모델 로드 시 KV 캐시를 사전 할당하는 엔진에서 성능 불안정을 일으킬 수 있습니다. 예: LM Studio는 기본적으로 loaded_context_length: 262144 (256k)를 사용하며, 이는 35B 모델에 약 15-25 GB의 KV 캐시를 할당하여 64 GB 통합 메모리를 포화시킬 수 있습니다.
권장 사항:
- 큰 컨텍스트 벤치마크 시 실제 테스트 크기에 맞게 엔진 컨텍스트 길이를 설정하세요 (예: 64k 테스트의 경우 lms load model --context-length 65536).
- 공정한 결과를 위해 동일한 컨텍스트 길이 설정의 엔진을 비교하세요.
벤치마크별 저장 메타데이터
SQLite의 모든 벤치마크 결과에 포함됩니다:
| 필드 | 예시 | 목적 |
|---|---|---|
engine |
"ollama" | 엔진 식별 |
engine_version |
"0.17.4" | 업데이트 간 성능 변화 감지 |
model |
"qwen3.5:35b-a3b" | 모델 식별 |
model_format |
"gguf" | 포맷 변형 구분 |
model_quantization |
"Q4_K_M" | 양자화 수준 구분 |
hw_chip |
"Apple M4 Pro" | 하드웨어 식별 |
os_version |
"15.3" | macOS 버전 추적 |
thermal_level |
"nominal" | 환경 조건 |
thermal_speed_limit |
100 | 스로틀링 감지 |
metrics_version |
2 | 수식 버전 (버전 간 회귀 방지) |
이 메타데이터로 다음이 가능합니다: - 공정한 회귀 비교: 메타데이터가 일치하는 결과만 비교 - 머신 간 벤치마크: 하드웨어 차이 식별 - 커뮤니티 데이터 공유: 자체 기술 결과 (v1.x에서 계획)