학습

Acurast를 알아보세요. 우리의 이야기를 읽고, 기술 문서를 확인하고, 에코시스템 파트너를 만나보세요.

빌더 스포트라이트: NodeGhost


빌더 스포트라이트: 표준 OpenAI 엔드포인트로 접속할 수 있는 휴대폰 위의 비공개 LLM


빌더 스포트라이트

Acurast 터널과 NodeGhost가 하는 일, 그리고 둘을 결합하면 일어나는 일

제품에 LLM을 추가하는 일반적인 방법은 OpenAI 호환 클라이언트를 호스팅된 API에 연결하고, 프롬프트를 서드파티 제공업체의 서버로 보내는 것입니다. 모델도 내 것이 아니고, 머신도 내 것이 아닙니다. 자체 호스팅을 한다고 해도 보통은 워크로드를 임대한 클라우드 GPU로 옮기는 데 그칩니다.
Acurast app-tunnel 계열의 이 예제는 대신 증명된 스마트폰 한 대에서 모델을 실행합니다. Acurast 터널은 로컬에 바인딩된 이 모델을 공개 HTTPS URL로 접속할 수 있게 만들고, NodeGhost는 Bring Your Own Model 지원을 통해 이를 그대로 교체해 쓸 수 있는 OpenAI 호환 엔드포인트로 제공합니다. 두 가지 기능, 그리고 그 사이의 등록 단계 하나입니다.
평범한 OpenAI 호출입니다. 응답하는 모델은 휴대폰에서 실행됩니다.

프로젝트 한눈에 보기

01 /

무엇인가
증명된 Acurast 프로세서 한 대에서 실행되는 양자화된 Qwen2.5-3B 모델로, 평범한 OpenAI 호환 엔드포인트처럼 사용됩니다.

02 /

무엇이 이를 가능하게 하나
두 가지 기능입니다. 접속성을 위한 Acurast 터널, 그리고 표준 API를 제공하는 NodeGhost의 BYOM 게이트웨이. 엔드포인트 등록 한 번으로 둘이 연결됩니다.

03 /

상태
지금 바로 Acurast Canary에 배포할 수 있는 동작하는 레퍼런스 예제이며, 모바일 CPU에서 돌아가는 3B 모델의 처리 속도도 솔직하게 밝힙니다.

01 / 섹션

Acurast 터널이 하는 일

NAT 뒤에 있는 휴대폰의 로컬 바인딩 서비스를, 인바운드 연결 없이 어디서나 접속할 수 있게 만듭니다.

Acurast 프로세서는 공인 IP 없이 통신사 NAT 뒤에 있습니다. 여기서 127.0.0.1에 바인딩된 서비스는 기본적으로 외부에서 보이지 않습니다. 이를 바꾸는 것이 터널입니다.
인바운드 연결 없는 인바운드 접속. 휴대폰은 들어오는 연결을 받아들이지 않습니다. 대신 릴레이 집합으로 발신 연결을 맺고 이를 계속 열어 두며, 터널의 공개 URL로 보낸 트래픽은 같은 연결을 따라 로컬 포트로 돌아옵니다. 휴대폰에서 인바운드 트래픽을 기다리는 것이 없으므로 통신사 NAT나 공인 IP 부재는 걸림돌이 되지 않습니다.
자동 TLS가 적용된 공개 HTTPS URL. 각 터널은 https://<clientId>.<your-domain>:8443에서 열리며, 인증서는 ACME를 통해 자동으로 발급됩니다. 호출하는 쪽은 평범한 서브도메인과 일반 HTTPS로 통신합니다.
실행할 때마다 새로운 아이덴티티. 각 배포는 터널 아이덴티티로 새 P-256 키를 생성하고, 그 키에서 새 서브도메인이 파생됩니다. URL은 배포마다 다릅니다. 배포가 실행되는 동안에만 작동하고 배포가 끝나면 중지되며, 배포는 시작될 때 콜백을 통해 실제 URL을 보고합니다. 고정 주소가 필요하다면 키를 번들에 저장하거나(이 경우 번들이 유출되면 주소도 함께 유출됩니다), URL이 바뀔 때 소비자 측이 다시 등록하도록 하면 됩니다.
프로토콜이 아니라 포트를 전달합니다. 터널은 자신이 LLM 트래픽을 전달한다는 사실을 모릅니다. TCP 포트를 전달할 뿐입니다. 자매 예제인 app-tunnel/cargo는 같은 터널 클라이언트로 SSH를 실행하는데, 이는 터널이 범용 기본 요소이고 그 뒤의 서비스는 얼마든지 바꿀 수 있다는 것을 보여 줍니다.
증명된 휴대폰에서 실행됩니다. 배포는 증명된 Acurast 휴대폰에만 매칭되며, 터널 클라이언트는 Shell 런타임의 proot 샌드박스 안에서 워크로드와 함께 실행되고 로컬 JSON-RPC 브리지를 통해 프로세서와 협업합니다.

02 / 섹션

NodeGhost가 하는 일, 그리고 BYOM 연결

어디에나, 심지어 휴대폰에도 둘 수 있는 백엔드 앞에 놓이는, 그대로 교체해 쓸 수 있는 OpenAI API.

README는 NodeGhost를 좁은 범위로 설명하며, 이 예제가 의존하는 것도 그뿐입니다. NodeGhost는 Pocket Network를 통해 추론을 라우팅하고, OpenAI 호환 API를 제공하며, Bring Your Own Model을 지원합니다.
그대로 교체해 쓸 수 있는 OpenAI 호환 API. NodeGhost는 OpenAI API와 같은 인터페이스를 제공하므로, 기존 클라이언트, 라이브러리, 도구는 base URL만 바꾸면 계속 작동합니다.
Pocket Network를 통한 라우팅. 요청은 단일 제공업체의 엔드포인트로 직접 가지 않고 POKT 탈중앙화 레이어를 통해 라우팅됩니다.
Bring Your Own Model. 운영자는 NodeGhost가 호스팅하는 모델 대신 자신의 OpenAI 호환 백엔드에 API 키를 연결합니다. 이 예제에서 그 백엔드는 터널을 통해 접속하는 Acurast 프로세서의 llama-server입니다.
연결 단계. 터널이 URL을 보고하면, 그 URL을 NodeGhost에 BYOM 엔드포인트로 등록합니다. (llama-server는 기본적으로 인증 없이 실행되므로 예제의 등록 호출에는 엔드포인트 키가 없습니다.) 그다음부터는 표준 chat-completions 요청이 NodeGhost를 거쳐 터널을 지나 휴대폰의 모델로 라우팅되며, 응답에 모델 이름이 포함되어 어디서 처리되었는지 확인할 수 있습니다.

03 / 섹션

두 가지가 결합되는 방식

등록 한 번으로 접속성과 표준 API가 휴대폰에 도달하는 요청이 됩니다.

터널도, OpenAI 호환 게이트웨이도 그 자체로는 평범합니다. 이 예제의 핵심은 결합입니다. 터널 URL을 BYOM 백엔드로 등록하는 단계 하나만 추가하면, 휴대폰에서 호스팅되는 모델이 그대로 교체해 쓸 수 있는 추론 엔드포인트가 되고, 호출하는 애플리케이션은 전혀 바뀌지 않습니다.

휴대폰 · Acurast 프로세서 (Shell 런타임 / proot)

llama-server :8080
Qwen2.5-3B-Instruct-Q4_K_M

↓
터널 · Acurast 터널

릴레이로 발신 연결  ->  https://<clientId>.<your-domain>:8443
(임시 P-256 아이덴티티, ACME TLS, 콜백으로 보고되는 URL)

↓
게이트웨이 · NodeGhost (OpenAI 호환, POKT 라우팅)

터널 URL을 BYOM 엔드포인트로 등록
POST https://<gateway>/v1/chat/completions
-> 터널을 통해 라우팅 -> 휴대폰에서 추론

04 / 섹션

현재 작동하는 기능

OpenAI 요청을 휴대폰에서 호스팅되는 모델에 전달하는, 배포 가능한 예제.

배포되면 프로세서는 proot Ubuntu 환경을 구성하고, 샌드박스 안에서 로컬 서버가 올바르게 바인딩되도록 작은 루프백 shim을 빌드하고, 런타임에 llama.cpp와 Qwen2.5-3B 모델을 내려받은 다음, 상태 확인 기반의 준비 루프 뒤에서 서버를 시작합니다. 모델이 로드된 뒤에야 터널이 열립니다.
콜백 수신기로 전체 순서를 따라갈 수 있습니다. 환경 구성, 다운로드, 모델 로드, 모델 준비 완료, 그리고 마지막으로 공개 터널 URL을 담은 started 이벤트입니다. 그 URL을 NodeGhost에 등록하고 일반적인 채팅 요청을 보내면 휴대폰에서 답이 돌아옵니다.
지금 사용해 보세요.
예제를 살펴보고, Canary에 배포하고, 요청이 휴대폰에 도달하는 것을 확인해 보세요: github.com/Acurast/acurast-example-apps/tree/main/apps/app-tunnel/llm

05 / 섹션

솔직한 한계

모든 기능에는 한계가 있고, 이 기능의 한계는 쉽게 말할 수 있습니다.

모바일 ARM CPU에서 실행되는 Q4 양자화 3B 모델은 초당 약 3토큰을 생성합니다. 약 120토큰 분량의 답변에 45초 정도 걸리며, 여러 단계의 추론에서는 기본적인 실수를 합니다. 이는 이 하드웨어에서 이 모델이 가진 한계이지, 터널이나 런타임이나 네트워크의 한계가 아닙니다.
실제로 이 패턴은 비동기, 배치, 짧은 컨텍스트 작업에 적합합니다. 백그라운드 요약, 분류, 대기열 기반 생성, 사람이 기다리지 않는 에이전트 단계 같은 것들입니다. 대화형 채팅용으로 만들어진 것은 아닙니다. 처리 속도를 위해 더 작은 모델을 고르는 것도, 내가 통제하는 하드웨어에 모델을 두기 위해 지연 시간을 감수하는 것도 모두 타당한 선택입니다.

이 패턴이 일반화되는 곳

터널은 무엇을 전달하든 상관하지 않고, NodeGhost는 백엔드가 호스팅될 것을 요구하지 않습니다. 자매 예제인 cargo는 같은 터널로 SSH를 실행해 이를 증명합니다. 증명된 휴대폰의 로컬 바인딩 서비스라면 무엇이든 이 방식으로 접속할 수 있고, OpenAI 형태의 워크로드라면 무엇이든 그 앞에 변경 없이 놓을 수 있습니다. 여기서의 모델은 그저 반대편에 놓인 것일 뿐입니다.

스택 소개

NodeGhost는 Pocket Network를 통해 라우팅하고, OpenAI 호환 API를 제공하며, Bring Your Own Model을 지원하는 탈중앙화 AI 추론 게이트웨이입니다. 자세한 내용은 nodeghost.ai에서 확인하세요.
Pocket Network는 NodeGhost가 요청을 라우팅하는 탈중앙화 레이어입니다. 자세한 내용은 pocket.network에서 확인하세요.
Acurast는 분산 엣지 컴퓨팅을 제공하는 증명된 스마트폰의 탈중앙화 네트워크로, 워크로드는 네트워크 전역의 증명된 휴대폰에 배포됩니다. 자세한 내용은 acurast.com에서 확인하세요.
이 예제는 acurast-example-apps 저장소에 공개된 Acurast 레퍼런스 빌드입니다.

Acurast에서 개발하고 계신가요?

증명된 휴대폰에서 자체 모델, 에이전트 백엔드 또는 다른 서비스를 실행하고 있다면 Acurast 팀과 이야기해 보세요. Discord에 참여하세요.