RunPod GPU 비용 아끼는 법 — 15달러로 버틴 AI 작곡 사용기와 클로드 코드 비용 감시 플러그인 모니파드(moni_pod)
15달러로 버티는 클라우드 GPU 작곡 — 그리고 그 돈을 지켜 준 모니파드
게임을 만들면서 배경음악은 ACE-Step과 Stable Audio 같은 AI 음악 생성 모델로 만들고 있었습니다. 그동안은 회사 노트북의 GPU로 돌렸어요. 그런데 회사 노트북을 더는 쓸 수 없게 됐습니다. 아시는 분은 아시겠지만, 저는 지금 실직 상태입니다.
집에 있는 개인 PC의 GPU로는 이 음악 모델들을 돌릴 수가 없었습니다. 그래서 어쩔 수 없이 RunPod처럼 GPU를 시간 단위로 짧게 빌려 쓸 수 있는 클라우드에 돈을 내기로 했습니다.
문제는 그 돈입니다. 생활비도 빠듯한 상황이라 딱 10달러만 충전했습니다. 여기에 가입 기념 쿠폰 5달러를 더해 총 15달러. 이걸로 아등바등 버텨야 합니다.
그러니 필요한 건 GPU만이 아니었습니다. 철저한 비용 예측과 감시가 필요했어요. 그래서 만든 게 오늘 소개할 모니파드(moni_pod) 입니다.
👉 GitHub: https://github.com/reddol18/moni_pod (MIT License)
왜 GPU 비용 감시 도구가 필요했나 — 생성 호출은 $0, 돈은 시간이 쌓는다
요즘은 클로드 코드에서 대화만으로 클라우드 GPU를 켤 수 있습니다. RunPod 공식 Claude Code 플러그인과 MCP가 바로 그 기능을 하죠. 편리합니다. 그런데 15달러로 버티는 입장에서 보면 무서운 구조이기도 합니다.
Pod를 만드는 호출 자체는 $0입니다. 돈은 Pod가 켜져 있는 시간만큼 쌓입니다. “호출 한 번에 얼마” 식으로 막는 예산 가드는 이걸 원리상 못 막아요. 에이전트가 작업을 끝내고 Pod 끄는 걸 깜빡하면? 제가 자는 동안에도 RTX 4090은 시간당 0.89달러씩 꼬박꼬박 잔액을 먹습니다. 15달러면 17시간이면 끝이에요.
RunPod에는 원래 정한 시각에 Pod를 끄는 stopAfter라는 기능이 있었는데, 동작하지 않아 제거됐습니다. 사용률이 낮으면 Pod를 끄는 공식 Idle Monitor도 있지만, 열심히 돌고 있는데 이제 필요 없는 Pod는 못 끕니다.
그래서 모니파드는 이 빈 곳, 에이전트가 쓰는 Pod의 수명을 맡습니다.
모니파드(moni_pod)가 하는 일 — 켜고 끄는 건 사람, 감시는 플러그인
모니파드는 RunPod 공식 MCP·플러그인 위에서 동작하는 Claude Code 플러그인입니다. 클로드 코드 안에서 이렇게 씁니다:
/moni-pod:gpu-list 24 # 24 GB 이상 GPU 재고, 시간당 요금, 잔액으로 쓸 수 있는 시간
/moni-pod:gpu-start 4090 2h # 견적 -> 사용자 확인 -> 2시간 뒤 자동 정지하는 Pod 시작
/moni-pod:gpu-status # 켜진/정지된 Pod, 남은 시간, 누적 요금, 정지 후에도 나가는 디스크 요금, SSH 주소
/moni-pod:gpu-extend pod-1 1h # 자동 정지 시각 연장 (추가 비용 먼저 확인)
/moni-pod:gpu-stop pod-1 # "결과 파일 회수했나?" -> 정지 또는 삭제 -> 최종 요금과 청구액 대조
핵심 원칙은 다섯 가지입니다.
- 시작과 종료는 사용자가 직접 합니다.
/gpu-start,/gpu-stop,/gpu-extend는 모델이 호출할 수 없습니다. 사용자가 입력하면 1회용 승인 토큰이 발급되고, 견적을 보여 준 뒤 확인을 받습니다. - 훅은 판단하지 않고 잠그기만 합니다. RunPod MCP,
runpodctl, 셸에서 직접 부르는 REST/GraphQL로 Pod를 생성·시작·수정·삭제하려 하면, 토큰이 없을 때 거부합니다. - 최후 방어선은 Pod 안에 있습니다. Pod의 시작 명령을 타이머로 감싸서 합의한 시간(TTL)이 지나면 Pod가 스스로 정지합니다. 제 PC나 클로드 코드가 꺼져 있어도요. 기본 2시간, 상한 8시간, 세션 예산 2달러입니다.
- 자동 삭제는 없습니다. 결과 파일을 회수했는지 답한 뒤에만 삭제합니다.
- 정지해도 요금이 0은 아닙니다. 정지한 Pod도 디스크 요금이 나가니까, 상태 화면과 상태줄에서 계속 보여 줍니다.

실제 사용기 — 15달러 GPU 가계부
게임 「후삼국 궁예전」의 엔딩 BGM을 만들려고 RunPod을 두 번 썼습니다. 둘 다 RTX 4090 SECURE, 시간당 0.89달러였습니다.
| 세션 | 모델 | 사용 시간 | 만든 곡 | 모니파드 추정 | RunPod 잠정 청구 |
|---|---|---|---|---|---|
| A (10/10) | ACE-Step v1.5 (turbo 8스텝) | 2시간 37분 | 240초 후보곡 28곡 | $2.38 | $1.53 |
| B (10/18) | Stable Audio 3 Medium | 1시간 52분 | 25곡 (최종 채택본) | $1.65 | $0.87 |
잔액은 세션 A 시작할 때 $13.67, 세션 B가 끝난 뒤 $9.63이었습니다. 실제로 줄어든 돈은 $4.04, 모니파드가 추정한 두 세션 합계는 $4.03. 거의 정확했습니다. RunPod 청구 내역은 몇 시간에 걸쳐 나눠 올라오기 때문에, 정산 직후의 “잠정 청구”는 추정치의 절반 정도로만 보였어요.
정리하면, 게임 엔딩곡 후보 53곡을 만드는 데 4달러 정도를 썼습니다. 커피 한 잔 값이죠. 실직자에게는 아주 큰 커피입니다.

장면 1. gpu-list — 견적이 OK라고 Pod가 뜨는 건 아니다
처음엔 조금이라도 싸게 쓰려고 COMMUNITY 등급으로 Pod를 만들었는데, 세 번 연속 실패했습니다(4090 두 번, A5000 한 번, 모두 “no longer any instances available”). 견적이 통과하면 뜰 줄 알았는데, 견적은 가격만 계산하지 재고는 확인하지 않더라고요.
그래서 gpu-list를 봤습니다. SECURE와 COMMUNITY 양쪽의 시간당 요금, 재고 수준(NONE/LOW/MEDIUM/HIGH), 그리고 “지금 잔액으로 몇 시간 쓸 수 있는지”가 한 표에 나옵니다. SECURE 4090이 유일하게 재고 HIGH였고, 그걸 골랐더니 한 번에 떴습니다.
장면 2. gpu-start — 예산 상한에 두 번 막혔다
작업을 이어서 하다 보니 같은 세션 안에서 누적 금액이 쌓였고, 견적 단계에서 이렇게 거부당했습니다:
Rate: $0.8900/h compute + $0.0110/h disk
Max time: 2 h, then the pod stops itself (TTL)
Max cost: $1.80 for this run
Budget: $2.00 per session (already committed: $3.61)
REFUSED:
- estimated max $1.80 + already committed this session $3.61 exceeds the session budget $2.00
이런 거부가 두 번 떴습니다. 그때마다 에이전트는 혼자 돈을 더 쓰지 못하고 저에게 보고했고, 제가 확인한 뒤에야 --budget 플래그로 이번 실행에만 상한을 올렸습니다. 설정 파일을 고치면 다음 세션까지 높은 한도를 물려받으니 일부러 플래그를 썼고요. 에이전트가 제 지갑을 마음대로 열지 못하게 하는 장치가 실제로 작동한 순간입니다.
장면 3. TTL 자동 정지와 연장
Pod를 켜면 이렇게 알려 줍니다. STARTED ... auto-stop at 2026-10-18T17:46:29Z (UTC). Max cost $1.80. 제가 잠들어도, PC가 꺼져도, 이 시각이 되면 Pod 안의 타이머가 Pod를 끕니다.
ACE-Step 세션에서는 시간이 모자라 한 번 연장했습니다. 연장할 때도 추가 비용부터 보여 줍니다:
EXTENDED ...: auto-stop moved 14:22:35Z -> 15:22:45Z (UTC), extra cost up to $0.90
장면 4. gpu-stop — 정지했다고 끝이 아니다
작업이 끝나면 정지하고, 추정과 실제 청구를 나란히 보여 줍니다:
STOPPED moni-4090-10181546 [EXITED] estimate $1.6523 RunPod billed $0.7938 (diff -0.8584)
stopped pod still bills disk: $0.3945/day until deleted
TERMINATED moni-4090-10181546 [TERMINATED] estimate $1.6539 RunPod billed $0.8689
여기서 두 번째 줄이 중요합니다. “정지한 Pod도 디스크 요금이 하루 $0.39씩 나간다.” 이 경고가 없었으면 “껐으니 끝”이라고 넘어갔을 겁니다. 하루 0.39달러면 한 달에 12달러, 제 전 재산입니다. 두 세션 모두 결과 파일을 회수한 뒤 삭제(terminate)까지 해서 디스크 요금을 $0/day로 만들고 나왔습니다.
장면 5. SSH 업·다운로드 — 쓰다가 기능이 하나 늘었다
Pod에 스크립트와 레퍼런스 음원을 올리고(약 60MB), 결과물 WAV를 받아 와야 합니다(25곡에 약 1GB, 240초 WAV 하나가 42MB). 그런데 처음에는 모니파드에 Pod 접속 주소를 알려 주는 기능이 없었어요. 그래서 공식 RunPod MCP로 우회했는데, 이 불편을 이슈로 올려서 바로 고쳤습니다(moni_pod 이슈 #1). 지금은 moni-pod status --json에 ssh_host/ssh_port/ssh_user가 나오고, 상태 화면에도 ssh root@<host> -p <port>가 붙습니다.
15달러를 지키기 위한 눈물겨운 절약 팁
- 작은 모델 변종 쓰기: ACE-Step 세션에서 시간이 빠듯해지자, 4.46GB를 더 받아야 하는 base 모델을 포기하고 이미 받아 둔 turbo 가중치로 돌렸습니다. 다운로드는 13.9GB에서 9.4GB로 줄었고, 8스텝이라 생성도 훨씬 빨랐습니다.
- 모델은 한 번만 로드하기: 처음엔 곡마다 프로세스를 새로 띄웠다가, 모델 로드 4분을 곡마다 반복하며 시간(=돈)을 버렸습니다. 한 프로세스에서 루프로 돌리도록 바꿨습니다.
- 설치 → 다운로드 → 생성을 체인으로: 앞 단계가 끝나면 다음 단계가 자동으로 시작되게 해서, 사람이 확인하느라 GPU가 노는 시간을 없앴습니다.
- 결과물은 없는 것만 받기: 한 번
scp *.wav로 통째로 받아서, 이미 받은 22곡을 또 받았습니다. 전송 시간도 Pod가 켜져 있는 시간입니다. - RunPod Auto-Pay는 끄기: 선불 크레딧에 Auto-Pay를 끄면 최대 손실은 잔액까지입니다. 15달러 이상은 잃을 수가 없어요.
아찔했던 순간들
- 없는 볼륨 걱정: 디스크가
mfs#...runpod.net으로 보여서 “네트워크 볼륨이라 Pod를 지워도 남아서 따로 과금되겠다”고 겁먹었는데, 확인해 보니 네트워크 볼륨은 만든 적도 없었습니다. Pod 볼륨이 그렇게 보였을 뿐이에요. 반대로 진짜 볼륨을 모르고 방치했다면 조용히 돈이 나갔을 겁니다. - 스스로 끊은 SSH:
pkill -f <패턴>을 ssh 명령 안에서 돌렸더니 그 패턴이 자기 ssh 명령줄에도 걸려서 접속이 끊겼습니다. 두 번이나요. 프로세스는 PID로 죽여야 합니다. - 30분 날린 설치: 대기 스크립트에 고정 데드라인을 줬는데 설치가 늦어져서 체인이 깨졌습니다. 시간 대신 “프로세스가 끝났는지”로 판정하도록 바꿨습니다.
그렇게 만든 음악 — 들어보세요
이렇게 4달러로 만든 곡 중 네 곡을 소개합니다. 모두 Stable Audio 3 Medium으로, 레퍼런스 음원 없이 텍스트 프롬프트만으로 만들었습니다(8스텝, cfg 1.0, 44.1kHz 스테레오).
① 최종 채택 — 엔딩 BGM, 88 → 120 BPM으로 점점 빨라지는 한국풍 행진곡
게임 엔딩 BGM으로 확정된 곡입니다. 북과 관악만으로 희박하게 시작해 88 BPM에서 120 BPM으로 점점 빨라지며 고조되고, 중반부터 현악이 주선율을 받습니다. 루프가 아니라 서사가 있는 곡이라 처음부터 끝까지 들어야 의도가 삽니다(4분).
② 더 빠르고 밝게 — 104 → 144 BPM 변주
①과 같은 구성인데 “더 빠르고 밝게”를 요청해서 만든 변주입니다. 프롬프트에 BPM을 적는 것만으로 템포 설계가 된다는 걸 ①과 비교해 들어 보세요(4분).
③ 북을 앞으로 — 축제풍 (프롬프트 팁)
처음엔 북을 “soft and round”로 묘사했더니 너무 묻혀 버렸습니다. “front and center, strong steady two beat pattern with a firm accent on every downbeat”처럼 악기와 동작을 구체적으로 적자 비트가 살아났어요. 리듬은 추상적으로 말할수록 약해집니다(2분).
④ 삽질 기념곡 — steps를 8로 되돌린 순간
처음에 steps를 8에서 64로 올렸습니다. ACE-Step에서는 스텝을 올리면 품질이 좋아졌으니까요. 그런데 Stable Audio 3 Medium은 8스텝에 맞춰 증류된 모델이라, 7곡이 전부 음악이 아니라 “외계 소음”으로 나왔습니다. 공식 문서에 “8보다 높여도 품질이 좋아지지 않는다”고 적혀 있었는데 안 읽은 거죠. 이 곡은 steps를 기본값 8로 되돌리고 처음으로 음악이 나온 순간의 결과물입니다. 그 7곡을 만든 GPU 시간도 물론 돈이었습니다(2분).
설치 방법 — Claude Code 플러그인으로
필요한 것은 Claude Code, uv, Python 3.11 이상, RunPod API 키입니다. 클로드 코드에서 이렇게 설치합니다:
/plugin marketplace add reddol18/moni_pod
/plugin install moni-pod@moni-pod
API 키는 ~/.moni_pod/.env 같은 곳에 둡니다:
RUNPOD_API_KEY=your-key
그리고 다시 한번, RunPod 계정의 Auto-Pay는 꺼 두세요.
한계도 적어 둡니다
- 잠금은 에이전트가 보통 쓰는 경로(RunPod MCP,
runpodctl, 셸 안의 REST/GraphQL)를 잡습니다. 스크립트 파일·SDK·웹 콘솔 안의 호출은 보지 못해서, Pod 안의 TTL과 선불 잔액을 최후 방어선으로 둡니다. - Pod만 다룹니다. 서버리스 엔드포인트와 네트워크 볼륨은 추적하지 않습니다.
- TTL은 컨테이너가 시작된 뒤부터 셉니다. 그 전 이미지 다운로드 시간은 과금될 수 있습니다.
마치며
15달러로 시작해서 4달러를 썼고, 9달러 남짓이 남았습니다. 게임 엔딩곡도 생겼고요. 만약 에이전트가 Pod 하나를 깜빡하고 켜 둔 채 하룻밤을 보냈다면, 이 글은 “15달러가 사라진 밤” 같은 제목이 됐을 겁니다.
넉넉한 회사 GPU를 쓸 때는 몰랐던 감각입니다. GPU 시간은 곧 생활비라는 것. 그 감각을 도구로 만든 게 모니파드입니다. 저처럼 아껴 써야 하는 분들께 도움이 되면 좋겠습니다.
Comments