속도를 재기 전에 같은 일을 비교하는지 확인한다
후보가 빨라졌다는 결론에는 무엇을 입력해 어떤 결과가 준비될 때까지 재었는지가 필요하다. 모델 forward만의 시간과 취득→제어 적용 전체 지연은 다른 경계다. 입력 해상도/시간창·batch, 카메라 수·전처리/복원, 출력 shape/행동 의미가 바뀌면 계산하는 일도 달라진다. 따라서 같은 이름의 모델이라도 계약과 버전을 확인한 뒤 비교한다.
모델 로드/최초 컴파일·초기 메모리 할당이 포함된 첫 실행과 준비 실행 뒤의 반복 구간을 나눈다. 준비 실행을 warmup이라고 하며 몇 번/무엇을 제외했는지 적는다. 운영에서 첫 응답도 중요하면 cold start를 별도 보고한다. 반복을 오래 돌려 열/메모리·다른 프로세스가 달라지는 지속 구간도 확인한다. 좋게 나온 구간만 골라 전체 결과라고 표시하지 않는다.
PyTorch 공식 benchmark 예제는 스레드 수와 CUDA 완료 동기화 같은 측정 조건을 다룬다. 벤치마크 도구의 기본 스레드 설정이 실제 운영과 다를 수 있으므로 설정을 기록한다. 비동기 호출을 썼다면 제출/필요 결과 완료·복사 경계를 명시하고 계측이 원래의 병렬 겹침을 바꾸지 않는지 확인한다. 이 단위는 실제 모델을 측정하지 않고 합성 결과를 해석한다.
평균과 분위수에 표본 수/계산 규칙을 붙인다
다음은 동일 경계로 측정했다고 가정한 가상 지연 표다. A는 20개 중 19개가 10 ms/1개가 100 ms, B는 18개가 8 ms/2개가 70 ms다. 실행 조건이 같은 후보 비교 입력이며 실제 장치에서 얻은 기록이 아니다. 평균은 합을 표본 수로 나눈다. A는 (19×10+100)/20=14.5 ms, B는 (18×8+2×70)/20=14.2 ms다.
이번 분위수는 nearest-rank로 정한다. 오름차순 정렬한 N개에서 비율 p에 대해 올림(ceil)한 pN번째 값을 사용하며 순위는 1부터 센다. 따라서 N=20에서 p95는 19번째, p99는 20번째다. A의 p95=10/p99=100 ms, B의 p95=70/p99=70 ms다. 다른 보간 규칙/라이브러리 기본값과 다를 수 있어 방법을 함께 남긴다. 작은 표에서 p99가 최대와 같다고 실제 장기 꼬리 분포를 알게 된 것은 아니다.
기한은 50 ms 이하 완료로 정한다. 초과를 세면 A는 1/20=5%, B는 2/20=10%다. B의 평균이 약간 작아도 기한 누락은 많다. 평균·분위수/최대/누락을 같은 근거 표에서 보고해야 이 차이가 보인다. 실패/timeout을 표에서 삭제하고 성공한 응답만의 평균을 전체 지연으로 쓰지 않는다. 미완료 요청은 성공 표본과 별도로 분모/경과·처리 규칙을 기록한다.
작은 계산 코드도 관측 결과와 구별한다
아래는 표준 라이브러리만 사용하는 완전한 Python 예제다. 입력 배열은 위 합성 표를 옮긴 것이며 이 코드를 실행해도 추론 벤치마크를 한 것이 아니다. 저장/설치 없이 종이로 같은 값을 계산해도 활동을 완료할 수 있다.
from math import ceil
samples = {"A": [10] * 19 + [100], "B": [8] * 18 + [70] * 2}
for name, values in samples.items():
ordered = sorted(values)
n = len(ordered)
p95 = ordered[ceil(0.95 * n) - 1]
p99 = ordered[ceil(0.99 * n) - 1]
late = sum(x > 50 for x in values)
print(name, f"mean={sum(values)/n:.1f}", f"p95={p95}",
f"p99={p99}", f"late={late}/{n}")
기대 출력은 A mean=14.5 p95=10 p99=100 late=1/20과 B mean=14.2 p95=70 p99=70 late=2/20이다. 이 계산은 작성 환경 Darwin/macOS의 Python 3.13.4에서 CPU로 실행해 확인했다. Ubuntu/ROS·GPU나 실제 모델의 지연을 측정한 결과는 아니다.
메모리도 평균 사용량과 peak를 구별한다. 가상 peak가 A 180 MiB/B 230 MiB이고 가용 한계가 200 MiB라면 A는 20 MiB 여유, B는 30 MiB 초과다. 여기의 peak는 같은 포함 범위로 관측했다고 가정하며 실제 계측에서는 프로세스/장치·캐시/할당과 측정 간격을 기록한다. 평균이 작다고 짧은 peak에서 실패하지 않는 것은 아니다.
분류 정답과 로봇 작업 성공은 분모가 다르다
가상 분류 시험 100건에서 A/B 정답이 95/96건이면 정확도는 95/96%다. 별도 작업 시험은 정상 조명/어두운 조명 각 10회이고 A는 10/8회, B는 10/6회 성공했다고 주자. 총 성공률은 A 18/20=90%, B 16/20=80%다. 어두운 조건은 A 80%/B 60%다. 오프라인 분류가 1건 늘었다고 폐루프 성공도 늘었다고 해석할 수 없다.
작업 성공은 예를 들어 '제한 시간 안에 대상 물체를 지정 구역에 놓고 유지 결과를 관측함'처럼 사전에 정의한다. 개입/재시도·중단/미상·제한 시간 초과를 어떻게 셀지도 정한다. 같은 영상의 인접 프레임이나 같은 물체/세션을 여러 번 나눈 것은 완전히 독립인 새 시험과 다르다. scikit-learn 공식 분할 설명을 연결해 그룹별 분리와 선택/시험의 책임을 확인한다.
같은 조건의 A/B 시험을 연결한 paired 비교는 조건 차이를 줄이는 데 도움이 되지만 순서/피로·물체 상태도 통제해야 한다. 이 작은 합계 표에는 어떤 회차에서 A/B가 서로 달랐는지 없어 paired 우열 검정을 할 근거가 부족하다. 신뢰구간/독립 반복과 조건별 표본을 보강하기 전 통계적으로 우수하다고 선언하지 않는다. M30에서 평가 근거를 더 다룬다.
공동 기준은 숫자를 본 뒤 바꾸지 않는다
합성 과제의 사전 관문을 '기한 누락 최대 1/20, peak 최대 200 MiB, 총 작업 성공 최소 18/20, 어두운 조건 최소 8/10'으로 정했다고 하자. A는 이 표에서 모두 통과하고 B는 누락/메모리·총 성공/어두운 조건이 모두 실패다. B의 평균/분류 정확도가 조금 좋다는 이유로 관문을 조용히 없애지 않는다. 다른 비용/요구가 있으면 새 기준을 명시해 별도 선택 시험을 하고 독립 최종 검증을 준비한다.
이 판정은 합성 표의 요구 충족 여부이며 실제 장비/안전·운영 승인이 아니다. 입력/모델 묶음·장치/스레드/전원·지속 부하, trial/관측 ID·clock과 원본 로그, 실패 이유/선택 근거를 함께 남긴다. 기존 5.10 평가와 6.6 평가 설계를 연결하면 속도/품질의 근거를 재검토할 수 있다.