지원 기기 · 벤치마크

폐폰에서도 같은 코어가 돕니다

제품의 본체는 PC입니다. 폰은 「같은 코어가 어디까지 내려가는가」를 보이는 자리입니다 — 서랍 속 폐폰 두 대에 같은 모델을 올리고 같은 서류를 라벨링했습니다. 아래는 전부 우리가 직접 잰 값입니다.

재 본 기기 셋, 잴 기기 다섯

같은 스크립트 · 같은 서류 5건 · 같은 모델(MiniCPM5-2B)로 잰 값입니다. 재지 못한 기기는 「예정」으로 남겼습니다.

실측

노트북 — Dell Inspiron 7501

i7-10750H · 16GB · 2020년

18.7초 / 건라벨 14 / 15

MiniCPM5-2B · 4스레드

실측

Galaxy A34

SM-A346N · 6GB · Dimensity 1080

89.1초 / 건라벨 12 / 15

MiniCPM5-2B · 8스레드

실측

Galaxy Note 20 Ultra

SM-N986N · 12GB · Snapdragon 865

81.0초 / 건라벨 13 / 15

MiniCPM5-2B · 빅코어 4스레드 고정 · 충전 안 된 상태의 하한값

아직 안 잰 기기

예정

미니PC — Intel N100 8GB

체험 인스턴스가 될 기기입니다.

예정

Galaxy S21 Ultra · Galaxy S20

아직 재지 않았습니다.

예정

Raspberry Pi 5

아직 재지 않았습니다.

예정

2013년 이전 구형 데스크톱 (AVX1)

중고 구매 예정 — 설치기가 「공식 바이너리가 죽는 PC」를 살리는 장면을 여기서 찍습니다.

시연 영상(46초) — 인텔 N100 소형 PC 실물에서 시작해 서류 22건이 라벨링·승인·정리되는 화면 녹화입니다. 소개 페이지에서 재생 · 유튜브. 폰 터미널 실측 영상과 중고 폐PC(AVX1) 설치 영상은 촬영 예정입니다.

실측표 — 같은 스크립트 · 같은 서류 5건 · 같은 모델 두 개

서류 5건은 임대차계약서(워드) · 통장내역(엑셀) · 급여대장(엑셀) · 근로계약서(워드) · 원천세신고서(한글)입니다. 라벨 셋(거래처 · 기간 · 서류 종류)을 맞힌 개수를 15점 만점으로 셉니다. 문서 한 건마다 KV 캐시를 새로 엽니다.

컨텍스트 2048 마이크로배치 128 KV 캐시 f16 문서 사이 3초 휴지 2026-09-10 실측
기기모델스레드건당 초라벨 15점
Dell Inspiron 7501i7-10750H · 16GB · 2020년 노트북MiniCPM5-2B418.714
MiniCPM5-2B320.214
Qwen2.5-1.5B413.010
Qwen2.5-1.5B315.210
Galaxy A34SM-A346N · 6GB · Dimensity 1080MiniCPM5-2B889.112
MiniCPM5-2B2 (빅코어 고정)132.812
Qwen2.5-1.5B869.610
Qwen2.5-1.5B2 (빅코어 고정)91.810
Galaxy Note 20 UltraSM-N986N · 12GB · Snapdragon 865MiniCPM5-2B4 (빅코어 고정)81.013
MiniCPM5-2B8425.612
Qwen2.5-1.5B4 (빅코어 고정)61.710
Qwen2.5-1.5B8362.210

주황 숫자는 스레드를 코어 수(8)에 맞췄다가 시간이 무너진 회차입니다 — 이유는 다음 절에.

두 폰 다 MiniCPM5-2B가 Qwen2.5-1.5B보다 정확했습니다. Qwen이 빠르지만 라벨을 더 틀립니다 — 라벨링에서는 틀린 라벨이 느린 라벨보다 비쌉니다. 그래서 기본 모델은 MiniCPM5-2B입니다(둘 다 Apache-2.0).

Note 20 Ultra는 실측 내내 충전 상태가 아니어서 큰 코어가 최대 클럭의 57%로 묶여 있었습니다. 지금 값은 하한입니다 — 충전기를 꽂으면 오릅니다. 이 노트북의 llama.cpp는 배포판 디버그 빌드라 속도가 보수적으로 나온 값입니다.

설정 하나로 「1분 20초」와 「7분」이 갈립니다

같은 폰 · 같은 모델 · 같은 서류. 스레드 수 하나가 다릅니다.

빅코어 4스레드 고정
81.0초 / 건
Note 20 Ultra · MiniCPM5-2B · 라벨 13/15
코어 수에 맞춘 8스레드
425.6초 / 건
같은 폰 · 같은 모델 · 라벨 12/15 — 5.3배
llama-bench · 빅코어 4개 고정
9.21tok/s
토큰 생성 속도
llama-bench · 8스레드
0.13tok/s
약 70배 느림

Note 20 Ultra에서 서류 한 건이 빅코어 4스레드에서 81.0초, 코어 수에 맞춘 8스레드에서 425.6초입니다. 5.3배. Qwen도 같습니다(61.7초 → 362.2초, 5.9배). 라벨 정확도는 13/15와 12/15로 거의 같습니다. 즉 같은 폰 · 같은 모델 · 같은 서류인데 설정 하나로 시간이 다섯 배 갈리고 정확도는 그대로입니다.

이유는 작은 코어입니다. 스레드를 코어 수에 맞추면 리틀코어 4개가 매 토큰마다 나머지를 기다리게 만들어 토큰 생성이 무너집니다 — llama-bench 기준 8스레드 0.13 tok/s, 빅코어 4개 고정 9.21 tok/s, 약 70배.

그런데 Galaxy A34는 반대입니다. 빅코어 2개에 고정하면 5.63 tok/s, 코어 8개를 다 쓰면 7.29 tok/s가 나옵니다. 빅·리틀 클럭 격차가 작아 작은 코어도 제 몫을 합니다. Dimensity 1080의 빅코어는 두 개뿐이라 처음 회차에서 2코어에 4스레드를 줬다가 값이 무너져 그 회차를 버렸습니다.

기기마다 정답이 다릅니다. 그래서 고정된 계산식을 쓰지 않고, 설치할 때 기기에서 직접 짧게 재서 고릅니다. 설치기가 이것을 자동으로 고르지 못하면 「폐폰에서도 돕니다」가 「폐폰에서는 못 씁니다」가 됩니다 — 버려진 기기를 되살리는 일에서 설치기가 본체인 이유입니다.

10분 연속 구동 — 온도가 오르지 않았습니다

발열은 주장이 아니라 설정과 실측으로 말합니다. 파일 1건 = 세션 1회로 KV 캐시가 쌓이지 않게 하고, 스레드는 코어 수보다 적게, 문서 사이 3초를 쉬고, 프롬프트 배치를 128로 제한합니다. 이 설정으로 A34에서 10분 연속 라벨링을 돌렸습니다.

Galaxy A34 빅코어 2스레드 3초 휴지 충전 중 기기가 이미 달궈진 상태에서 시작
배터리 온도 (°C)10분 · 6건 · 각 건이 끝난 시점에 읽은 값
31.0°C 212초 · 30.9°C 330초 · 30.9°C 457초 · 30.9°C 570초 · 30.8°C 30.8°C
건당 초그 건의 라벨링에 걸린 시간 (초)
91.8초 212초 · 114.9초 330초 · 114.4초 457초 · 122.9초 570초 · 109.9초 91.7초
경과 (초)배터리 온도 (°C)완료 건수그 건의 초
9331.0191.8
21230.92114.9
33030.93114.4
45730.94122.9
57030.85109.9
66630.8691.7

10분 동안 온도가 오르지 않았습니다 — 31.0 → 30.8°C. 건당 시간도 첫 건 91.8초, 마지막 건 91.7초로 평탄합니다(중간 변동은 서류 길이 차이입니다). 못 잰 것도 적어 둡니다: CPU 클럭 하락은 이 회차에서 직접 재지 못했고(도구 결함, 다음 회차 몫), 휴지 없는 대조는 실측 중이며, 더 빠른 8스레드 조건은 재지 않았습니다.

어떤 폐폰이면 되나

실측으로 확인한 것과 조사로 잡은 것을 나눠 적습니다.

실제로 돌린 가장 낮은 폰 실측

Galaxy A34 · 6GB

같은 서류 5건을 89.1초 / 건, 라벨 12 / 15로 라벨링했습니다. 10분 연속 구동에서 온도가 오르지 않았습니다.

기준선 조사 기준

  • RAM 6GB 이상
  • ARMv8.2 + dotprod
  • 2019년 이후 칩셋

4GB 이하는 안드로이드 메모리 킬러가 프로세스를 죽입니다. 이 기준선은 기기를 늘려 가며 실측으로 확인합니다.

폰은 상시 워커가 아닙니다. 온디바이스 생성은 원격 호출보다 에너지를 훨씬 많이 쓰고 배터리에 무리가 갑니다. 전원에 꽂힌 기기 — PC — 가 우리 자리이고, 폰은 같은 코어가 거기까지 내려간다는 증거입니다.

폰에 올리는 법

Termux(F-Droid 판 — 플레이스토어 판은 낡아서 안 됩니다)에서 합니다. 모델 파일은 약 1.7GB라 와이파이에서 받습니다.

# 한 번만
pkg update -y && pkg install -y llama-cpp curl python termux-api
termux-wake-lock                       # 화면이 꺼져도 안 멈추게. 충전기를 꽂는다

# 빅코어가 몇 개, 몇 번인지 본다 (최대 클럭이 가장 높은 묶음이 빅코어)
for c in /sys/devices/system/cpu/cpu[0-9]*; do
  echo "$(basename $c) $(($(cat $c/cpufreq/cpuinfo_max_freq 2>/dev/null || echo 0)/1000))MHz"; done

# 모델 서버 — 빅코어 4개(cpu4~7)에 4스레드를 고정하는 예. A34처럼 빅코어가 2개면 "6,7" 에 2스레드
taskset -c 4-7 llama-server -m MiniCPM5-2B-Q4_K_M.gguf --host 127.0.0.1 --port 8097 \
  -c 2048 -ub 128 -t 4 --no-warmup

스레드 수를 코어 개수보다 크게 주지 마세요 — 2코어에 4스레드를 몰아넣으면 생성이 무너집니다. 설치기는 이 판단을 자동으로 합니다. 실측 스크립트(같은 서류 5건 · 모델 두 개 · 온도 곡선)와 결과 원본은 공개 저장소 github.com/kingcheee/nabi-core의 bench 폴더에 있습니다.

PC에는 설치기로 체험하기

서류는 기기를 떠나지 않습니다 · 외부 API 호출 0