튜토리얼: AI 기반 GPU 플릿 최적화기 구축
Source: Dev.to
소개
DigitalOcean Gradient AI 플랫폼에 서버리스 LangGraph 에이전트를 배포하여 자연어 쿼리를 사용해 GPU 플릿을 모니터링합니다. 에이전트는 포트 9400의 Prometheus‑style 엔드포인트를 통해 GPU Droplets에서 실시간 NVIDIA DCGM 메트릭(온도, 전력, VRAM, 엔진 활용도)을 수집하고, 유휴 및 활용도가 낮은 GPU를 감지하며, 자동 전원 차단 명령과 같은 작업을 트리거할 수 있습니다. 이는 반응형 대시보드 모니터링을 능동적인 AI 어시스턴트로 대체함으로써 클라우드 비용을 절감합니다.
GPU 플릿 관리가 어려운 이유
- 비용 영향: 밤새 실행되는 단일 유휴 GPU Droplet 하나만으로도 월 청구서에 수백 달러가 추가될 수 있습니다.
- 전통적인 대시보드: 원시 메트릭을 표시하지만 여전히 기계가 “작동 중”인지 “돈을 낭비하고 있는지”를 해석하기 위해 인간이 필요합니다.
튜토리얼에서는 DigitalOcean Gradient AI Platform과 Agent Development Kit (ADK)를 사용하여 AI 기반 GPU 플릿 최적화기를 구축하는 과정을 안내합니다. 완료하면 다음을 수행할 수 있습니다:
- 실시간으로 GPU 인프라를 감사하는 서버리스 자연어 AI 에이전트를 배포합니다.
- NVIDIA DCGM 메트릭(온도, 전력 소비, VRAM 사용량, 엔진 활용도)을 수집합니다.
- 클라우드 비용이 증가하기 전에 유휴 리소스를 표시합니다.
- 청사진을 포크하고 맞춤화합니다(임계값 조정, 도구 추가, 에이전트의 페르소나 변경).
사전 요구 사항
- DigitalOcean 계정에 최소 하나의 활성 GPU Droplet이 있어야 합니다.
- DigitalOcean API 토큰 (읽기 권한 및 GenAI 범위가 포함된 개인 액세스 토큰).
- Gradient 모델 액세스 키 (Gradient AI 대시보드에서 생성).
- Python 3.12 (최신 LangGraph 및 asyncio 기능을 위해 권장).
- Python, REST API, Linux 명령줄 기본에 대한 숙련도.
NVIDIA DCGM 메트릭
NVIDIA Data Center GPU Manager (DCGM)는 포트 9400에서 Prometheus‑호환 익스포터를 통해 하드웨어 텔레메트리를 제공합니다.
| 메트릭 | 측정 대상 | 중요 이유 |
|---|---|---|
DCGM_FI_DEV_GPU_TEMP | GPU 다이 온도(섭씨) | 높은 온도는 활발한 연산을 나타냅니다. |
DCGM_FI_DEV_POWER_USAGE | 현재 전력 소비량(와트) | 유휴 상태의 GPU는 전력을 훨씬 적게 소모합니다. |
DCGM_FI_DEV_FB_USED | 사용 중인 프레임버퍼(VRAM) 메모리 | VRAM이 비어 있으면 모델이 로드되지 않은 것입니다. |
DCGM_FI_DEV_GPU_UTIL | GPU 엔진 활용도(퍼센트) | 컴퓨팅 작업의 직접적인 지표입니다. |
이 메트릭들을 직접 조회할 수 있습니다:
curl -s http://<droplet_ip>:9400/metrics \
| grep -E "DCGM_FI_DEV_GPU_TEMP|DCGM_FI_DEV_POWER_USAGE|DCGM_FI_DEV_FB_USED|DCGM_FI_DEV_GPU_UTIL"
노드에서 DCGM을 사용할 수 없는 경우, 에이전트는 표준 CPU/RAM 메트릭으로 대체하고 “DCGM Missing”이라고 보고합니다.
리포지토리 설정
기본 리포지토리부터 시작하고, 모든 것을 처음부터 작성하지 마세요.
git clone https://github.com/dosraashid/do-adk-gpu-monitor
cd do-adk-gpu-monitor
python3.12 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
비밀 설정
프로젝트 루트에 .env 파일을 생성하세요:
DIGITALOCEAN_API_TOKEN="your_do_token"
GRADIENT_MODEL_ACCESS_KEY="your_gradient_key"
보안 참고:
.env파일을 절대 버전 관리에 커밋하지 마세요; 리포지토리의.gitignore에 이미 이 파일이 제외되어 있습니다.
데이터 흐름 개요
- User Prompt –
/run엔드포인트로 전송됩니다. - LangGraph State – 대화 메모리(
thread_id)는 다중 턴 상호작용을 위해MemorySaver에 의해 관리됩니다. - Tool Execution – LLM이
analyze_gpu_fleet()와 같은@tool함수를 호출하기로 결정합니다. - Parallel Scraping –
analyzer.py는ThreadPoolExecutor를 사용하여 DigitalOcean API와 각 Droplet의 DCGM 엔드포인트를 동시에 조회합니다. - Omniscient Payload – 모든 원시 데이터(온도, 전력, VRAM, RAM, CPU, 비용)가 LLM을 위해 구조화된 JSON 사전으로 패키징됩니다.
- Synthesis – LLM이 JSON을 읽고 노드 이름, 비용 및 권장 사항을 자연어로 응답합니다.
LangGraph를 사용한 상태 저장 AI 에이전트에 대한 자세한 내용은 Getting Started with Agentic AI Using LangGraph 튜토리얼을 참조하세요.
Source: …
Blueprint 맞춤 설정
에이전트 페르소나 (config.py)
AGENT_SYSTEM_PROMPT를 편집하여 AI의 커뮤니케이션 방식을 변경합니다.
- 이모지를 제거하고 기술 DevOps 어시스턴트를 위해 순수한 불릿 포인트만 요청합니다.
- 비용 요약 보고서에는 관리‑중심 톤을 사용합니다.
임계값
기본 유휴 감지는 다음 사전(dictionary)을 사용합니다(복사‑붙여넣기를 위해 코드 블록으로 표시).
THRESHOLDS = {
"gpu": {
"max_temp_c": 82.0,
"max_util_percent": 95.0,
"max_vram_percent": 95.0,
"idle_util_percent": 2.0,
"idle_vram_percent": 5.0,
"optimized_util_percent": 40.0,
"optimized_vram_percent": 50.0,
},
"system": {
"idle_cpu_percent": 3.0,
"idle_ram_percent": 15.0,
"idle_load_15": 0.5,
"starved_cpu_percent": 85.0,
"starved_ram_percent": 90.0,
"optimized_cpu_percent": 40.0,
"optimized_ram_percent": 50.0,
},
}
작업 부하 기준에 맞게 값을 조정하세요(예: 추론 서버가 일반적으로 GPU 사용률 8 %에서 유휴 상태라면 idle_util_percent를 10.0으로 설정).
Droplet 필터링
기본적으로 "gpu"가 size_slug에 포함된 Droplet만 스캔합니다:
target_droplets = [d for d in all_droplets if "gpu" in d.get("size_slug", "").lower()]
- CPU‑최적화 Droplet을 대상으로 하려면
"gpu"를"c-"로 변경합니다. - 모든 Droplet을 스캔하려면 필터를 완전히 제거합니다.
새로운 메트릭 추가
Prometheus Node Exporter(포트 9100)를 설치하고 디스크 공간을 포함하고 싶다면:
metrics.py를 업데이트하여 디스크 메트릭을 수집합니다.analyzer.py의 반환 사전을 확장합니다:
return {
"droplet_id": droplet_id,
"gpu_temp": temp_val,
"gpu_power": power_val,
"vram_used": vram_val,
"disk_space_free_gb": disk_val, # New metric
}
쓰기 권한 도구 (예: 전원 끄기)
main.py에 새로운 @tool 함수를 추가합니다:
@tool
def power_off_droplet(droplet_id: str) -> str:
"""Power off a Droplet by ID. Use only when the user explicitly asks to stop an idle node."""
import requests, os
token = os.getenv("DIGITALOCEAN_API_TOKEN")
response = requests.post(
f"https://api.digitalocean.com/v2/droplets/{droplet_id}/actions",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={"type": "power_off"},
)
if response.status_code == 201:
return f"Successfully sent power‑off command to Droplet {droplet_id}."
return f"Failed to power off Droplet {droplet_id}: {response.status_code} {response.text}"
새 도구를 LLM에 바인딩합니다:
llm_with_tools = llm.bind_tools([analyze_gpu_fleet, power_off_droplet])
Warning: 쓰기 권한을 부여하면 엄격한 가드레일이 필요합니다—확인 프롬프트, 태그 제한, 감사 로그 등을 권장합니다.
로컬에서 실행하기
개발 서버를 시작합니다:
gradient agent run
다른 터미널에서 요청을 시뮬레이션합니다:
curl -X POST http://localhost:8080/run \
-H "Content-Type: application/json" \
-d '{
"prompt": "Give me a full diagnostic on my GPU nodes including temperature and power.",
"thread_id": "audit-session-1"
}'
후속 예시 (같은 thread_id):
curl -X POST http://localhost:8080/run \
-H "Content-Type: application/json" \
-d '{
"prompt": "Which of those nodes was the most expensive?",
"thread_id": "audit-session-1"
}'
thread_id를 변경하면 새 대화가 시작되어 범위가 제한된 메모리를 보여줍니다.
DigitalOcean Gradient 배포
gradient agent deploy
공개 엔드포인트 URL을 받게 되며, 이를 Slack 봇, 내부 대시보드, CI/CD 파이프라인 또는 모든 HTTP 클라이언트와 통합할 수 있습니다. Gradient 플랫폼은 동시 사용자에 대한 스케일링을 처리합니다.
비교: 전통적인 대시보드 vs. AI 에이전트
| Factor | Static Dashboards (Grafana + Prometheus) | AI Agent (This Blueprint) |
|---|---|---|
| Setup complexity | 보통 (Prometheus 서버, Grafana, DCGM exporter 필요) | 낮음 (레포지토리 복제, 환경 변수 설정, 배포) |
| Real‑time alerting | 고정 임계값을 가진 규칙 기반 알림 | 적응형 추론을 활용한 자연어 질의 |
| Multi‑metric correlation | 수동 시각 비교 | 온도, 전력, VRAM, 비용을 자동으로 LLM이 상관관계 분석 |
| Actionability | 읽기 전용; 별도 자동화 필요 | @tool을 통해 직접 API 작업을 수행하도록 확장 가능 |
| Conversational follow‑ups | 지원되지 않음 | LangGraph MemorySaver와 thread_id 스코핑을 통해 내장 |
| Best for | 전담 SRE/DevOps 인력이 있는 대규모 팀 및 과거 추세 분석 | 전체 모니터링 스택 없이 빠르고 대화형 GPU 감사를 필요로 하는 중소 규모 팀 |
GPU Droplet 약 20대 이하의 플릿에서는 AI 에이전트가 전체 모니터링 스택의 오버헤드를 없애면서도 실행 가능한 인사이트를 제공합니다. 더 큰 플릿은 두 솔루션을 모두 운영하는 것이 유리할 수 있습니다.
아키텍처 고려사항
- Contextual intelligence:
MemorySaver는 대화 기록을 제공하여 전체를 다시 스캔하지 않고도 상세 질문을 할 수 있게 합니다. - Parallel processing:
ThreadPoolExecutor는 수십 개의 Droplet을 동시에 스캔하여 LLM 타임아웃을 방지합니다. - Cost justification: 한 대의 유휴 $500/월 GPU 인스턴스를 절약함으로써 에이전트 추론 비용을 정당화합니다.
- Graceful degradation: 포트 9400에 접근할 수 없을 경우, 에이전트는 “DCGM Missing”이라고 보고하고 CPU/RAM 메트릭으로 대체합니다.
- Security: 쓰기 도구가 추가되지 않는 한 읽기 전용 API 토큰을 사용하고, 권한 범위를 신중히 설정하며 감사 로그를 구현합니다.
혜택 및 사용 사례
- 잊혀진 리소스 포착: 실험이나 훈련 작업이 끝난 후에도 계속 실행 중인 GPU Droplet을 식별합니다.
- 노이즈 감소: 오해를 불러일으키는 낮은 CPU 지표를 무시하고 GPU 엔진 및 VRAM 사용량을 직접 조회합니다.
- 통합 워크플로우: 하나의 자연어 쿼리로 여러 UI 상호작용(디지털오션 콘트롤 패널, Grafana, 아키텍처 다이어그램)을 대체합니다.
- 확장 가능한 자동화: 대화형 인터페이스에서 직접 리소스를 종료, 크기 조정 또는 확장하는 도구를 추가합니다.
다음 단계 및 리소스
- DigitalOcean Gradient AI Platform Documentation – AI 에이전트를 배포하고 관리하기 위한 전체 참고 문서.
- How to Build Agents Using ADK – 맞춤형 에이전트를 위한 단계별 가이드.
- Getting Started with Agentic AI Using LangGraph – 상태를 유지하는 다단계 AI 에이전트의 기본 개념.
- Stable Diffusion on DigitalOcean GPU Droplets – GPU 가속 AI 워크로드 예시.
- Scaling Gradient with GPU Droplets and Networking – GPU Droplets, 로드 밸런서 및 VPC 네트워킹을 활용한 프로덕션 GenAI 배포 설계.