콘텐츠로 이동

8.5. 원격 모델 제어

Backend.AI GO를 사용하면 헤드 노드에서 원격 머신에 직접 접근하지 않고도 연결된 원격 노드의 모델을 로드 및 언로드할 수 있습니다. 이것으로 분산 추론 워크플로우가 완성됩니다. 노드를 연결하고, 노드 간에 추론 요청을 라우팅하며, 이제 각 노드에서 실행 중인 모델을 단일 인터페이스에서 관리할 수 있습니다.

개요

원격 노드가 등록되면 헤드 노드는 해당 노드의 기본 URL과 API 키를 저장합니다. 원격 모델 제어는 이 정보를 사용하여 사용자를 대신해 원격 노드의 Management API로 모델 관리 명령을 전송합니다.

다음 작업이 지원됩니다:

  • 모델 로드 — 원격 노드에 모델 서빙을 시작하도록 지시
  • 모델 언로드 — 원격 노드에서 실행 중인 모델 중지
  • 로드된 모델 목록 — 원격 노드에서 현재 활성화된 모델 조회

API 레퍼런스

세 가지 작업 모두 Tauri IPC 명령(데스크탑 앱)과 REST API 엔드포인트(헤드리스 모드)로 사용할 수 있습니다.

원격 노드에 모델 로드

Tauri IPC: load_model_on_remote_node

REST: POST /api/v1/nodes/{fingerprint}/models/load

요청 본문:

{
  "modelId": "llama-3-8b-q4",
  "modelPath": "/path/to/model.gguf",
  "contextLength": 4096,
  "gpuLayers": -1
}
필드 타입 필수 설명
modelId string 로드할 모델 식별자
modelPath string 아니요 원격 노드의 모델 파일 절대 경로
contextLength number 아니요 기본 컨텍스트 길이 재정의
gpuLayers number 아니요 GPU 레이어 수 (-1은 전체)

응답:

{
  "success": true,
  "modelId": "llama-3-8b-q4",
  "nodeFingerprint": "fp_abc123"
}

실패 시 successfalse이며 error 필드에 문제가 설명됩니다.

원격 노드에서 모델 언로드

Tauri IPC: unload_model_on_remote_node

REST: POST /api/v1/nodes/{fingerprint}/models/unload

요청 본문:

{
  "modelId": "llama-3-8b-q4"
}

응답:

{
  "success": true,
  "modelId": "llama-3-8b-q4",
  "nodeFingerprint": "fp_abc123"
}

원격 노드의 모델 목록 조회

Tauri IPC: get_remote_node_models

REST: GET /api/v1/nodes/{fingerprint}/models

응답:

{
  "data": [
    {
      "id": "llama-3-8b-q4",
      "path": "/models/llama-3-8b-q4.gguf",
      "endpoint": "http://127.0.0.1:8081",
      "healthy": true
    }
  ]
}

실시간 업데이트

원격 노드에서 모델이 성공적으로 로드되거나 언로드되면 헤드 노드는 distributed-pool-changed 이벤트를 전송합니다. 프론트엔드 nodeStore는 이 이벤트를 구독하여 자동으로 다음을 수행합니다:

  1. 영향을 받은 노드의 원격 모델 목록 새로고침 (fetchRemoteModels).
  2. 전체 분산 풀 상태 새로고침 (getDistributedPoolStatus).

이를 통해 수동으로 페이지를 새로고침하지 않아도 UI가 동기화 상태를 유지합니다.

헤드리스 모드에서는 동일한 이벤트가 GET /api/v1/events의 SSE(Server-Sent Events) 스트림을 통해 브로드캐스트됩니다.

타임아웃

대용량 모델을 고려하여 작업에는 여유 있는 타임아웃이 적용됩니다:

작업 타임아웃
모델 로드 600초 (10분)
모델 언로드 60초
모델 목록 조회 30초

타임아웃이 발생하면 응답에 "success": false와 함께 타임아웃 시간을 나타내는 오류 메시지가 포함됩니다.

오류 처리

조건 동작
노드 핑거프린트가 등록되지 않음 404 Not Found 반환
원격 노드에 연결할 수 없음 (연결 거부) 연결 메시지와 함께 오류 반환
원격 노드 요청 타임아웃 타임아웃 시간과 함께 오류 반환
원격 노드가 2xx가 아닌 응답 반환 원격 오류 본문을 파싱하여 반환
빈 모델 ID 또는 경로 탐색이 포함된 모델 ID 요청 전에 거부

모델 ID는 네트워크 요청 전에 검증됩니다. 빈 모델 ID와 .. 시퀀스가 포함된 ID는 URL 경로 조작을 방지하기 위해 거부됩니다.

프론트엔드 스토어

useNodeStore Zustand 스토어는 원격 모델 제어를 위한 다음 셀렉터와 액션을 제공합니다:

내보내기 타입 설명
useRemoteModels(fingerprint) 셀렉터 특정 노드에 대한 캐시된 모델
useAllRemoteModels() 셀렉터 핑거프린트별로 키가 지정된 모든 원격 모델
useIsRemoteModelOperating(fingerprint) 셀렉터 로드/언로드가 진행 중인지 여부
loadModelOnNode(fingerprint, request) 액션 원격 노드에 모델 로드
unloadModelOnNode(fingerprint, modelId) 액션 원격 노드에서 모델 언로드
fetchRemoteModels(fingerprint) 액션 노드의 모델 목록 새로고침

언로드는 낙관적 업데이트를 수행합니다. 모델은 즉시 로컬 캐시에서 제거되고, distributed-pool-changed 이벤트가 백엔드에서 전체 새로고침을 트리거합니다.

보안

원격 노드에 대한 모든 요청은 Authorization: Bearer <api_key> 헤더를 사용합니다. API 키는 로컬 노드 레지스트리에 안전하게 저장되며 로그나 UI에 노출되지 않습니다. 모델 ID는 경로 인젝션을 방지하기 위해 URL에서 퍼센트 인코딩됩니다.

관련 페이지