로컬 추론 노드로서의 Galaxy Z Fold6 — llama.cpp/Vulkan, 홈랩 텔레메트리, SHA-256 모델 검증
요약
Galaxy Z Fold6를 로컬 추론 노드로 활용하기 위해 llama.cpp와 Vulkan 백엔드를 사용하는 Android 앱 'Pocket Node' 개발 사례를 소개합니다. SHA-256 모델 검증, 홈랩 텔레메트리 연동, Tailscale 기반 OpenAI 호환 API 노출 등 기술적 구현 상세를 다룹니다.
핵심 포인트
- Vulkan/OpenCL 백엔드를 활용한 모바일 기기 내 llama.cpp 추론 구현
- SHA-256 해시를 통한 로컬 모델 파일의 무결성 검증 프로세스 구축
- 홈랩 모니터링 스택과 연동하여 기기 상태 및 추론 준비 여부 확인
- Tailscale을 통해 로컬 기기를 OpenAI 호환 API 서버로 노출
- 클라우드 비용 절감을 위한 간단한 분류 및 로컬 채팅 작업 최적화
llama.cpp 추론을 기기 내에서 실행하는 Pocket Node라는 작은 Android 앱을 만들었습니다. 이 앱이 실제로 수행하는 기능과 수행하지 않는 기능은 다음과 같습니다.
수행하는 기능
- Fold6에서 GGUF 모델(SmolLM3 Q4_0, 약 1.1B 파라미터)을 직접 로드합니다.
- CPU 전용이 아닌, llama.cpp를 통해 Vulkan/OpenCL 백엔드를 사용합니다.
- 네이티브 Jetpack Compose UI로 토큰을 스트리밍합니다.
- 디코딩(decode)뿐만 아니라 프리필(prefill) 단계 중에도 중지(Stop)를 처리합니다: 프리필 단계 중에 중지를 누르면 네이티브 중단 플래그(abort flag)를 설정하고, JNI 호출을 취소하며, UI를 초기화하여 정상적으로 후속 프롬프트를 보낼 수 있게 합니다.
- 최초 로드 시 로컬 레지스트리와 모델 파일을 SHA-256으로 대조하여 검증합니다; 해시가 일치하지 않으면 추론이 차단되며 UI에 복구 경로(재스캔 / 재임포트 / 다른 모델 선택)를 표시합니다.
- 모델 상태와 상태 정보를 홈랩(homelab) 모니터링 스택에 보고하여, 휴대폰이 켜져 있는지와 추론 준비가 되었는지 한눈에 확인할 수 있습니다.
기술 스택
- 앱: Kotlin + Jetpack Compose, JNI를 통한 llama.cpp, Vulkan/OpenCL 백엔드
- 모델: SmolLM3 Q4_0 (1.1B) — 로드 시 SHA-256 검증
- 홈랩 측: Python 모니터링 서비스가 휴대폰의 헬스 엔드포인트(health endpoint)를 폴링(poll)하며, 다른 노드들과 함께 일일 요약(daily digest)에 포함합니다.
- 휴대폰은 Tailscale 상에서 OpenAI 호환 API를 노출합니다 — 직접 호출이 가능합니다; 아직 LiteLLM 라우팅 레이어에 등록되지 않아 자동 라우팅은 적용되지 않습니다. 이것이 다음 설정 단계입니다.
- 디버그 빌드, Android 16
수행하지 않는 기능
- 데스크톱 GPU나 Mac Studio를 대체할 수 있는 것은 아닙니다. 휴대폰에서 실행되는 Q4_0 방식의 SmolLM3는 짧은 작업은 처리하지만, 컨텍스트(context)가 제한적이며 긴 프롬프트는 느립니다.
- 지속성 메모리(persistent memory)나 RAG(검색 증강 생성) 기능이 없습니다. 각 대화는 독립적입니다.
- 배터리 및 발열: 짧은 실행은 괜찮습니다. 지속적인 생성 작업은 기기를 가열합니다. 벤치마크 루프에 넣어두지 마세요.
- 다른 Android 하드웨어에서는 테스트되지 않았습니다. Vulkan 드라이버 품질은 기기마다 다릅니다. 귀하의 휴대폰에서도 작동한다고 말할 수 없습니다.
- 공개 서버가 아닙니다. API는 Tailscale로 제한되어 있으며 LAN에서만 작동합니다.
왜 굳이 하는가 (Why bother)
간단한 작업들 — 빠른 분류(classification), 기기를 벗어날 필요가 없는 로컬 채팅 응답 — 을 위해서는 충분히 작동합니다. 목표는 휴대폰에서 프론티어 모델 (frontier model) 수준의 성능을 내는 것이 아닙니다. 클라우드가 필요 없는 작업들에 대해 클라우드 비용을 0으로 만드는 것입니다. 검증 단계는 제가 예상했던 것보다 더 중요했습니다. 몇 달 전에 다운로드한 모델을 실행하기 전에, 해당 모델 파일이 알려진 양호한 SHA-256 값과 일치하는지 확인하는 것은 매우 필요한 작업입니다.
갤러리 내 스크린샷: 추론 상태(inference status)가 표시된 채팅 UI, 진단(diagnostics), 진행 중 중단(stop-in-progress) 상태, P20 상태 요약(health digest).
llama.cpp JNI 레이어, 중단/프리필(stop/prefill) 처리, 또는 홈랩 모니터링 측면에 대해 궁금한 점이 있다면 기꺼이 답변해 드리겠습니다.
사전 설명: "Vulkan/OpenCL"은 이 기기에서 llama.cpp가 선택하는 백엔드(backend)를 의미합니다. llama.cpp가 노출하는 기능 외에 GPU 측에서 별도의 커스텀 작업을 수행하고 있지는 않습니다.
/u/GsxrGuy80s 가 r/LocalLLaMA 에 게시함
[link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/OpenAI Codex (search)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기