공급자 가이드 · 노드 등록과 실행층

대규모로 임대한 GPU 클러스터의 남는 노드를 등록해 시간 단위로 되파는 방법입니다. 구매자는 노드의 호스트 OS를 만지지 않고 컨테이너만 받아요 — 팔린 시간이 시작되면 구매자의 도커 이미지가 노드의 GPU 전부를 받아 뜨고, 끝나면 컨테이너와 데이터가 파기됩니다.

1. 노드 준비

노드마다 미리 있어야 하는 것:

항목기준
OSUbuntu 22.04 / 24.04 (systemd)
GPUNVIDIA 드라이버(CUDA 12 지원 · R535 이상 권장) · 멀티 GPU 노드는 fabric manager
컨테이너docker + nvidia-container-toolkit — docker run --rm --gpus all nvidia/cuda:12.6.3-base-ubuntu22.04 nvidia-smi 가 전 GPU를 보여야 해요
네트워크아웃바운드 HTTPS 만(에이전트는 밖으로만 연결) · 구매자 SSH는 노드 공인 IP의 임의 포트(도커가 배정)로 열려요 → 인바운드 TCP 1024~65535 허용
디스크컨테이너 이미지·작업 공간용 여유(NVMe 권장 · /var/lib/docker /workspace)
권한설치는 root 한 번

2. 클러스터 등록

공급자 콘솔 → 클러스터 등록에서 이름·SKU·노드 호스트 이름(또는 공인 IP)·공급 종료 시각·자동 매도 정책을 넣어요. SKU는 노드 실제 사양(GPU 종류·장수)과 같아야 합니다 — 다르면 그 노드에는 인스턴스를 띄우지 않아요(콘솔에 「문제」로 표시).

API:

curl -s $RERENT/v1/clusters -H "Authorization: Bearer $RERENT_TOKEN" -H 'content-type: application/json' -d '{
  "name":"판교 IDC 랙 A","sku":"icn-1-h100","available_to_at":1791964800,
  "nodes":[{"hostname":"gpu-01.example.com"},{"hostname":"203.0.113.12","label":"랙A-2"}],
  "auto_sell":{"enabled":true,"price":30000,"floor_price":18000,"ramp_hours":24,"horizon_days":14,"keep_nodes":0}
}'

응답의 installs[] 에 노드마다 설치 명령(install.shell)이 들어 있어요. 안의 bootstrap 토큰은 1회용이고 이 응답에서만 보입니다. 잃으면 POST /v1/clusters/{id}/nodes/{nodeId}/install (콘솔 「설치 명령」)로 재발급하세요.

3. 에이전트 설치(노드마다)

콘솔이 보여 주는 설치 명령을 노드에서 root로 실행합니다. 하는 일:

  1. 실행층(onpod) 에이전트 바이너리를 내려받아 /usr/local/bin/onpod-agent 로 설치
  2. /etc/onpod-agent.env 에 제어면 주소·호스트 이름·bootstrap 토큰 기록
  3. systemd 서비스 onpod-agent 등록·시작

10초 안에 콘솔의 노드가 온라인으로 바뀌고 감지된 GPU(모델 × 장수)가 표시돼요(콘솔은 1분마다 갱신). 점검:

systemctl status onpod-agent
journalctl -u onpod-agent -f

노드가 온라인인데 「GPU가 감지되지 않았어요」 가 뜨면 서버에서 nvidia-smi -L 이 GPU를 보이는지(드라이버) 확인하세요. 에이전트는 설치 때 한 번만 GPU를 살피니, 드라이버를 고친 뒤에는 콘솔에서 노드를 빼고 다시 추가해 새 설치 명령을 실행합니다. 「SKU 사양은 … 인데 노드는 …이에요」 는 클러스터 SKU와 실제 카드(모델·장수)가 다른 경우예요 — 그 노드에는 인스턴스를 띄우지 않으니 SKU를 맞추거나 운영자에게 알려 주세요.

설치 명령의 docker run --rm --gpus all … nvidia-smi -L 점검이 ⚠ 를 내면 nvidia-container-toolkit이 없는 상태예요 — 에이전트는 등록되지만 구매자 컨테이너가 GPU를 못 받아 뜨지 않습니다. 툴킷을 설치하고 sudo systemctl restart docker 하면 됩니다(에이전트 재설치는 필요 없어요).

에이전트는 밖으로만 연결합니다(인바운드 포트 불필요). 노드가 살아 있는지 10초마다 알리고, 배정 시간에 제어면이 내려 주는 구매자 컨테이너를 띄우고 끝나면 지웁니다.

에이전트를 지우려면 systemctl disable --now onpod-agent && rm /usr/local/bin/onpod-agent /etc/onpod-agent.env. 콘솔에서 노드를 빼면 실행층 호스트 등록도 정리돼요.

4. 팔린 시간에 일어나는 일

  • 시작 시각에 구매자의 인스턴스(도커 이미지 + 노드 GPU 전부)가 컨테이너로 떠요. 구매자는 컨테이너 안의 root로 SSH 접속하거나(노드 공인 IP:임의 포트), 자기 명령을 주 프로세스로 돌려요.
  • 컨테이너는 사용자 네임스페이스·cgroup으로 격리되고 호스트 디스크는 컨테이너 작업 공간만 써요. 호스트 OS·다른 컨테이너·공급자 데이터에는 접근할 수 없어요.
  • 배정 시간이 끝나면(또는 구매자가 되팔아 할당이 줄면) 컨테이너가 즉시 종료·파기돼요. 노드 초기화 작업은 따로 없어요.

지켜야 할 것: 팔린 시간에는 그 노드에서 자체 작업(GPU 사용)을 돌리지 마세요. 컨테이너는 GPU를 독점으로 받지만 같은 GPU를 호스트에서 동시에 쓰면 구매자 성능이 깨지고 약관 위반이에요. 팔리지 않은 시간엔 자유롭게 쓰면 됩니다(에이전트는 그대로 두세요).

5. 자동 매도 정책

항목
price기본 호가(₩/노드·시간)
floor_price하한가. 시작이 가까워지면 여기까지 내려가요
ramp_hours시작 몇 시간 전부터 내리기 시작할지(선형)
horizon_days며칠 뒤까지 호가에 올릴지
keep_nodes절대 팔지 않을 노드 수(내부용)

미판매 시간은 하루(UTC) 블록으로 잘려 호가에 올라가요. 부분 체결을 허용하므로 1시간짜리 구매자에게도 팔려요. 끄면 자동 호가는 내려가고 이미 팔린 시간은 그대로예요. 수동으로 팔고 싶으면 공급 풀에서 일반 매도 주문을 넣어도 됩니다.

6. 노드 추가·제거·기간 연장

  • 추가: 지금부터 공급 종료까지 그 노드 수만큼 할당이 더해지고, 노드마다 설치 명령이 나와요.
  • 제거: 지금부터의 시간 1노드분이 빠져요. 그 시간이 이미 팔렸거나 호가에 있으면 거절돼요(먼저 호가를 내리세요). 구매자 컨테이너가 돌고 있는 노드는 뺄 수 없어요.
  • 공급 기간 연장: 종료 시각을 뒤로 미루면 연장분 할당이 더해져요.

7. 정산

체결마다 (대금 − 수수료)가 크레딧으로 들어와요. 크레딧 → 출금으로 계좌에 송금을 요청하면 운영자가 처리해요. 조직 소유자만 출금할 수 있어요.

배정 규칙

  • 같은 SKU의 모든 클러스터 노드가 하나의 공급으로 취급돼요. 어느 클러스터의 노드가 갈지는 스케줄러가 정합니다. 공급 풀이 보유한(팔리지 않은) 시간은 자기 클러스터 노드에 우선 배정돼요.
  • 같은 풀이 연속 시간을 보유하면 같은 노드를 유지해요. 할당이 줄면 우선순위가 낮은 인스턴스가 있는 노드부터 빠져요.
  • 배정 현황은 콘솔과 GET /v1/clusters/{id}/assignments 에서 봅니다(구매자는 익명 꼬리표).