실행 프로그램과 확장

Backburner: 아이폰으로 맥의 로컬 LLM 프리필 가속하기

USB-C로 연결한 아이폰이 맥의 긴 입력 처리와 문맥 보관을 나눠 맡아요.

Backburner는 Mac에서 실행하는 Qwen3.8-27B에 iPhone을 USB-C로 연결해 긴 입력을 더 빨리 읽고, 64K를 넘는 문맥 일부를 휴대전화 메모리에 보관하는 실험적인 llama.cpp 포크예요. 공개된 2026년 10월 1일 측정은 M4 Pro 24GB와 iPhone 17 Pro Max 조합에 한정돼요. 이 글에서는 프리필1과 디코드2 수치의 차이, 64K 이후 iPhone의 역할, 설치 순서를 구분해요.

실행 조건과 핵심 내용
  • 2,000토큰 입력을 읽은 공개 측정에서 iPhone은 16K·32K·48K 문맥의 프리필 대기를 각각 31%·22%·23% 줄였어요.
  • 64K까지는 Mac이 1~40층, iPhone이 41~64층을 나눠 처리하고, 그보다 긴 문맥에서는 iPhone이 오래된 KV 페이지의 attention을 맡아요.
  • 27K~33K 문맥의 디코드는 같은 포크에서 Mac 단독 25.0 tok/s, iPhone 연결 25.1 tok/s였어요.

Backburner는 Mac과 iPhone에 일을 나누는 로컬 LLM 서버예요

Backburner는 Mac에서 Qwen3.8-27B 모델을 실행하고, USB-C로 연결해 앞에 열어 둔 iPhone에 일부 계산을 맡기는 프로젝트예요. 긴 프롬프트를 읽는 프리필에서는 두 기기가 모델 층을 나눠 처리하고, 64K 문맥을 넘으면 iPhone이 오래된 문맥의 KV 캐시3 일부를 보관해 attention4 계산을 돕습니다. 결과는 Mac의 OpenAI 호환 서버에서 받아 다른 호환 앱으로 연결할 수 있어요.

Mac이 입력의 앞쪽 층을 계산하는 동안 iPhone은 뒤쪽 층을 계산해요. 두 기기의 GPU5를 함께 활용하는 방식이죠. Mac의 엔진에는 DFlash2 초안 모델과 커널 최적화도 들어 있고, 기본 구성은 한 번에 요청 하나를 처리해요.

나무 책상 위에서 USB-C 케이블로 연결된 은색 노트북과 거치대의 스마트폰
Mac은 모델을 실행하고 iPhone은 긴 입력 처리와 문맥 보관을 나눠 맡아요.

긴 입력을 읽는 프리필에서 차이가 났어요

프리필은 질문·문서·도구 결과처럼 모델에 전달한 입력을 읽어 다음 답을 준비하는 단계예요. 저장된 에이전트 세션에 2,000토큰6 파일 또는 도구 결과를 추가한 측정에서, 이미 쌓인 문맥이 길수록 Mac 단독보다 Mac+iPhone 조합의 처리량7이 높고 대기 시간이 짧았습니다. 아래 수치는 2026년 10월 1일 M4 Pro 24GB, iPhone 17 Pro Max, Qwen3.8-27B IQ4_XS에서 기록됐고 깊이마다 두 번 읽은 값이에요.

저장된 세션에 2,000토큰을 추가했을 때의 프리필 속도와 대기 시간이에요.
기존 문맥Mac 단독Mac + iPhone입력 읽기 대기 감소
16K109 tok/s · 18.8초157 tok/s · 13.1초31%
32K101 tok/s · 20.3초130 tok/s · 15.8초22%
48K87 tok/s · 23.5초113 tok/s · 18.1초23%

저장된 세션에 2,000토큰을 추가했을 때의 프리필 속도와 대기 시간이에요.

16K

Mac 단독
109 tok/s · 18.8초
Mac + iPhone
157 tok/s · 13.1초
입력 읽기 대기 감소
31%

32K

Mac 단독
101 tok/s · 20.3초
Mac + iPhone
130 tok/s · 15.8초
입력 읽기 대기 감소
22%

48K

Mac 단독
87 tok/s · 23.5초
Mac + iPhone
113 tok/s · 18.1초
입력 읽기 대기 감소
23%

표의 기존 문맥은 새 입력을 넣기 전에 대화에 이미 들어 있던 양이에요. 16K에서는 같은 약 2,000토큰을 읽는 시간이 18.8초에서 13.1초로 줄었죠. 한 번 읽을 때 약 5.7초를 덜 기다린 셈이에요. 코드 에이전트가 파일이나 도구 결과를 반복해서 읽는 작업에서 이런 차이를 느낄 수 있어요. 새 입력이 대략 512토큰보다 짧으면 Mac이 그대로 처리해요.

64K 이후에는 iPhone 메모리가 오래된 문맥을 맡아요

기본 구성에서 64K까지는 Mac이 1~40층, iPhone 17 Pro Max가 41~64층을 나눠 계산해요. 문맥이 Mac에 둔 64K를 넘어가면 Mac이 64개 층을 모두 계산하고, iPhone은 오래된 KV 페이지를 보관해 그 페이지의 attention을 계산합니다. iPhone의 GPU와 Neural Engine이 이 오래된 문맥 계산에 참여해요.

Mac 단독으로 긴 문맥을 쓰는 구성에서는 4비트 KV 설정을 사용해요. iPhone을 연결하면 8비트 KV를 유지한 채 더 긴 문맥을 보관할 수 있죠. 공개된 종단 간 시험은 8비트 128K와 4비트 140K까지예요. 서버가 시작할 때 표시하는 196K~229K는 iPhone의 여유 메모리로 산정한 용량이에요.

KV 정밀도와 실제 시험한 문맥 길이를 함께 비교해요.
구성문맥확인 상태
M4 Pro 24GB, Mac 단독8비트 64K측정됨 · 128K는 4비트 구성
M4 Pro 24GB + iPhone 17 Pro Max8비트 196K~229K시작 시 여유 메모리로 산정
M4 Pro 24GB + iPhone 17 Pro Max8비트 128K종단 간 시험 완료
M4 Pro 24GB + iPhone 17 Pro Max4비트 140K종단 간 시험 완료

KV 정밀도와 실제 시험한 문맥 길이를 함께 비교해요.

M4 Pro 24GB, Mac 단독

문맥
8비트 64K
확인 상태
측정됨 · 128K는 4비트 구성

M4 Pro 24GB + iPhone 17 Pro Max

문맥
8비트 196K~229K
확인 상태
시작 시 여유 메모리로 산정

M4 Pro 24GB + iPhone 17 Pro Max

문맥
8비트 128K
확인 상태
종단 간 시험 완료

M4 Pro 24GB + iPhone 17 Pro Max

문맥
4비트 140K
확인 상태
종단 간 시험 완료
Mac과 iPhone의 USB-C 단자에 데이터 케이블이 연결된 가까운 장면
공개 프리필 비교는 10Gb/s USB-C 케이블로 연결한 두 기기에서 측정했어요.

64K 이하의 답변 생성 속도는 거의 같았어요.

답변 토큰을 차례로 만드는 디코드는 Mac의 엔진 최적화가 주로 맡아요. 공개된 27K~33K 비교에서는 기본 llama.cpp가 11.3 tok/s, Backburner 포크의 Mac 단독이 25.0 tok/s, iPhone 연결이 25.1 tok/s였어요. 같은 포크끼리 비교하면 iPhone 연결 전후의 생성 속도가 거의 같았죠. 입력을 빨리 읽는 효과와 답변을 빨리 만드는 효과를 나눠 이해하면 돼요.

같은 27K~33K 문맥에서 게시된 decode 처리량 비교예요.
실행 구성디코드
stock llama.cpp (Homebrew), Mac11.3 tok/s
Backburner 포크, Mac 단독25.0 tok/s
Backburner 포크, Mac+iPhone25.1 tok/s

같은 27K~33K 문맥에서 게시된 decode 처리량 비교예요.

stock llama.cpp (Homebrew), Mac

디코드
11.3 tok/s

Backburner 포크, Mac 단독

디코드
25.0 tok/s

Backburner 포크, Mac+iPhone

디코드
25.1 tok/s

포크에는 Mac 커널과 DFlash2 초안 모델을 이용하는 최적화가 들어 있어요. 64K가 넘으면 iPhone도 오래된 문맥의 attention을 나눠 계산하며, 프로젝트는 128K에서 12.6 tok/s를 기록했어요. 이 장문 수치에는 같은 날 측정한 Mac 단독 비교값이 없어요.

설치 전에 기기와 케이블을 확인해요

일반 설치 경로는 Apple Silicon, macOS 14 이상, 통합 메모리8 24GB 이상인 Mac을 대상으로 해요. iPhone 앱은 15 Pro 이상과 M 시리즈 iPad를 지원하며, 주요 공개 속도표는 M4 Pro 24GB와 iPhone 17 Pro Max 조합에서 나왔어요. iPad는 아직 성능 시험이 없어요. 프리필 가속을 시험하려면 데이터 전송 10Gb/s를 지원하는 USB-C 케이블을 준비하세요. 기본 동봉 USB 2 케이블보다 빠른 연결이 필요해요.

Mac에는 모델과 초안 모델 등 약 24GB의 파일을 받으며, 새 설치는 도구와 휴대전화용 파일까지 약 28GB를 내려받거나 만들 수 있어요. 설치 스크립트는 Mac에 메모리 24GB 이상, 홈 디스크 여유 공간 30GB를 권장 조건으로 검사합니다. 사용하려는 모델 파일이 약 15.5GB이고 초안 모델 파일은 약 1.3GB예요.

8GB Mac에는 모델 층을 두 기기에 나누는 별도 split decode 모드도 있어요. 프로젝트가 MacBook Neo 8GB와 iPhone Air에서 Qwen3.8-27B IQ2_XS를 시험했을 때 생성 속도는 약 4 tok/s였어요. USB 2 연결과 기기 발열 조건이 있는 다른 실험이므로, 아래의 24GB Mac 설치와 구분해 참고하세요.

긴 문서가 열린 Mac과 화면이 켜진 iPhone이 나란히 놓인 작업대
긴 입력을 Mac과 iPhone이 나눠 읽으면 첫 답변 전 대기를 줄일 수 있어요.

설치 스크립트를 확인한 뒤 서버를 시작해요

Mac 설치 스크립트는 최신 엔진, Qwen3.8-27B IQ4_XS, DFlash2 초안 모델, 휴대전화용 모델 층 파일을 준비하고 `backburner` 명령을 등록해요. 인터넷에서 스크립트를 바로 셸로 넘기기보다 파일로 내려받아 내용을 살펴본 뒤 실행하세요. 아래 경로는 공식 저장소의 현재 main 브랜치 스크립트를 받습니다.

iPhone 앱은 무료 Apple ID를 쓰는 AltStore 경로 또는 Xcode로 설치할 수 있어요. AltStore 안내에 따르면 무료 계정은 앱을 7일마다 다시 서명해야 하고, Backburner의 메모리 권한은 AltStore 2.2 이상 경로를 권장해요. 앱을 열어 앞에 둔 다음 Mac에서 전화 쪽 모델 파일을 한 번 복사합니다. `backburner`를 실행하면 서버가 `http://127.0.0.1:8080/v1`에서 열리고, 기본 포트는 Mac 내부에서만 접근할 수 있어요.

아래 명령은 iPhone 17 Pro 계열의 기본 40층 분할을 사용해요. iPhone 16 Pro의 A18 Pro로 시험할 때는 설치 명령을 `TAIL_L=52 bash "$backburner_setup/install.sh"`로 바꿔 휴대전화가 맡을 층 수를 줄이세요. 설치 프로그램이 기기별 분할을 자동으로 고르는 방식은 아니에요.

설치 스크립트 검토 후 Mac 서버 시작
backburner_setup="$(mktemp -d)"
curl -fsSL https://raw.githubusercontent.com/StayLameBro/backburner/main/install.sh -o "$backburner_setup/install.sh"
less "$backburner_setup/install.sh"
bash "$backburner_setup/install.sh"

# Connect the phone with Backburner installed and open.
"$HOME/.local/bin/backburner" phone
"$HOME/.local/bin/backburner"
첫 `backburner` 실행은 모델을 적재하고 iPhone 연결을 확인해요. 재부팅할 때마다 GPU 메모리 wired 한도가 기본값으로 돌아가면 명령이 다시 권한을 요청할 수 있어요.

첫 응답을 시험하고 연결 문제를 확인해요

API9 호환 앱의 서버 주소에는 `http://127.0.0.1:8080/v1`을 입력해요. 터미널에서 먼저 간단한 요청을 보내면 앱 설정과 모델 응답 문제를 구분하기 쉽습니다. 모델 이름은 이 서버에서 임의의 문자열을 받아들이므로 예시의 `backburner-local`을 그대로 사용할 수 있어요.

서버를 실행한 터미널은 그대로 두고 다른 터미널에서 아래 요청을 보내세요. 정상 시작 로그에는 `split prefill on`, `remote KV on`, `ANE pages on`이 표시돼요. 처음에는 Neural Engine용 파일을 전송하고 앱을 다시 여는 데 약 1분이 걸릴 수 있어요. `curl -i http://127.0.0.1:8080/health`로 HTTP 200을 확인한 뒤 채팅 요청을 보내면 됩니다.

연결이 끊기면 iPhone에서 앱을 다시 화면 앞에 열고 케이블을 확인하세요. 64K를 넘는 대화에서는 iPhone이 오래된 KV를 보관하므로, 잠금이나 앱 전환으로 15초 동안 응답하지 않으면 서버가 중단돼요. 앱을 다시 연 뒤 Mac의 서버도 재시작하세요. 손쉬운 사용의 ‘사용법 유도’를 켜면 작업 중 화면이 잠기는 일을 줄일 수 있어요.

iPhone 17 Pro Max의 `app budget`이 약 6,000MiB가 아니라 3,000MiB 안팎이면 앱의 메모리 권한을 점검해요. 저장소 폴더에서 `scripts/phone-up.sh`를 실행하면 이 값이 표시됩니다. 공식 설치 문서는 AltStore 2.2 이상을 안내하며, 이 설치 경로의 권한 유지 여부는 아직 개발자가 검증 중이에요. 더 작은 예산만 표시된다면 Xcode 경로와 메모리 권한 설정을 함께 확인하세요.

Mac 재부팅 뒤에는 `backburner` 명령이 GPU wired 메모리 한도를 다시 설정하며 관리자 암호를 요청할 수 있어요. 모델이 사용할 메모리를 고정하는 설정이므로 다른 앱도 함께 쓸 여유를 남겨야 해요. 저장소의 `scripts/serve.sh`를 직접 실행해 한도 오류가 날 때만 아래 명령을 참고하세요. 20,480MiB는 이 글의 24GB Mac 구성 값이에요.

OpenAI 호환 채팅 요청 확인
curl http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"backburner-local","messages":[{"role":"user","content":"로컬 모델이 준비됐는지 한 문장으로 알려줘."}],"max_tokens":64}'
정상 응답은 JSON의 `choices` 안에 모델이 만든 답을 담아요.
재부팅 뒤 GPU wired 메모리 한도 설정
sudo sysctl iogpu.wired_limit_mb=20480
24GB Mac의 이 구성은 GPU가 모델을 메모리에 유지하도록 20,480MiB 한도를 사용해요.

사전 공개 한계를 알고 내 기기에서 시험해요

Backburner는 MIT 라이선스의 사전 공개 소프트웨어예요. iPhone 앱이 GPU를 쓰려면 화면 앞에서 계속 열려 있어야 하고, 64K 이하에서는 연결이 끊겨도 Mac이 다시 계산하지만 그보다 긴 문맥에서는 전화가 없어진 오래된 KV를 Mac이 대신 갖고 있지 않아요. 한 번에 요청 하나만 처리하는 기본값도 동시에 여러 사용자가 쓰는 서버와는 맞지 않습니다.

Mac의 서버와 프롬프트 캐시 프록시는 `127.0.0.1`에만 열려요. iPhone은 USB-C 케이블로 연결하며, Wi-Fi로 연결하려면 먼저 케이블로 페어링해야 해요. 이 연결 보호 기능이 적용된 앱 0.0.3 이상을 사용하세요.

첫 시험에서는 자주 쓰는 한 문서를 16K, 32K, 48K로 나눠 같은 방식으로 읽혀 보세요. Mac 단독과 iPhone 연결에서 첫 입력 처리 시간, 답변 생성 속도, 앱 연결 상태를 따로 적으면 Backburner가 줄여 준 대기가 무엇인지 알 수 있어요. 64K가 넘는 기능은 더 긴 문맥이 필요한 작업에만 켜고, 전화의 memory budget과 앱을 앞에 둬야 하는 시간도 함께 고려하세요.

SSD10 프롬프트 캐시는 이미 읽은 시스템 프롬프트를 다시 활용할 때 유용해요. iPhone에 KV를 둔 64K 초과 세션을 저장하려면 앱 0.0.4 이상이 필요해요. 이 저장 기능은 아직 실제 iPhone이 아닌 Mac의 loopback 대체 장치에서만 시험됐어요. 처음에는 64K 안쪽에서 읽기 시간과 연결 상태를 비교해보세요.

용어 각주

  1. 프리필 — LLM이 입력 프롬프트를 읽고 각 토큰의 내부 표현을 계산하는 단계입니다. 입력이 길수록 처리할 토큰이 많아집니다.

    본문으로 돌아가기
  2. 디코드 — LLM에서는 입력 처리 뒤 출력 토큰을 생성하는 단계를 뜻합니다. VAE나 오디오 코덱에서는 압축 표현이나 인코딩 데이터를 원래 형식으로 복원하는 처리를 가리킬 수 있습니다.

    본문으로 돌아가기
  3. KV 캐시 — 어텐션에서 이전 토큰의 키·값을 저장해 다음 토큰 생성 때 재사용하는 메모리입니다. 문맥 길이와 배치 크기에 따라 용량이 달라집니다.

    본문으로 돌아가기
  4. 어텐션 — 모델이 입력의 여러 위치를 서로 비교해 현재 계산에 참고할 정보를 정하는 연산입니다. 구체적인 동작과 비용은 모델 구조에 따라 다릅니다.

    본문으로 돌아가기
  5. GPU — 많은 계산을 병렬로 처리하는 프로세서입니다. AI 모델 실행에서는 모델 계산을 맡습니다.

    본문으로 돌아가기
  6. 토큰 — 모델이 입력이나 출력을 나누어 처리하는 단위입니다.

    본문으로 돌아가기
  7. 처리량 — 일정 시간 동안 처리하거나 생성한 작업량입니다. 토큰/초, 요청/초처럼 단위를 함께 확인해야 비교할 수 있습니다.

    본문으로 돌아가기
  8. 통합 메모리 — CPU와 GPU가 같은 물리 메모리 풀을 공유하는 구조입니다.

    본문으로 돌아가기
  9. API — 프로그램의 기능을 다른 코드에서 호출하기 위한 약속된 인터페이스입니다.

    본문으로 돌아가기
  10. SSD — 플래시 메모리를 사용하는 데이터 저장 장치입니다. 전원이 꺼져도 데이터가 보존됩니다.

    본문으로 돌아가기