---
description: "Mac에서 정확한 LLM 벤치마크 결과를 얻는 방법: 서멀 관리, 백그라운드 앱, 실행 횟수, 재현성 팁."
---

# 벤치마크 모범 사례

> **버전**: 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.5*IQR, Q3 + 1.5*IQR] 범위 밖 실행 플래그. | 통계 표준 |
| **추세 감지** | 실행 간 단조 성능 저하 감지 (서멀 드리프트). | 학술 |

### 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가 메모리를 공유합니다. 두 가지 주요 의미가 있습니다:

1. **두 엔진을 동시에 벤치마크하지 마세요** — 동일한 메모리 풀을 경쟁합니다. `asiai bench`는 설계상 엔진을 순차적으로 실행합니다.
2. **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에서 계획)
