教程:构建 AI 驱动的 GPU 集群优化器
Source: Dev.to
抱歉,您提供的消息中只有来源链接,没有需要翻译的正文内容。请提供要翻译的文本,我将为您翻译成简体中文。
Introduction
在 DigitalOcean Gradient AI 平台上部署一个无服务器的 LangGraph 代理,使用自然语言查询来监控您的 GPU 集群。该代理通过 Prometheus 风格的端口 9400 端点从 GPU Droplets 抓取实时的 NVIDIA DCGM 指标(温度、功耗、显存、引擎利用率),检测空闲和利用率不足的 GPU,并且可以触发诸如自动关机等操作。通过用主动的 AI 助手取代被动的仪表盘监控,从而降低云成本。
为什么 GPU 机群管理很困难
- 成本影响: 单个闲置的 GPU Droplet 若整夜保持运行,可能会在月账单上增加数百美元。
- 传统仪表盘: 显示原始指标,但仍需人工判断机器是“在工作”还是“浪费金钱”。
本教程将指导您使用 DigitalOcean Gradient AI 平台和代理开发套件(ADK)构建一个 AI 驱动的 GPU 机群优化器。完成后,您将能够:
- 部署一个无服务器、自然语言的 AI 代理,实时审计 GPU 基础设施。
- 抓取 NVIDIA DCGM 指标(温度、功耗、显存使用、引擎利用率)。
- 在闲置资源导致云账单膨胀之前进行标记。
- 分叉并自定义蓝图(调整阈值、添加工具、更改代理的角色设定)。
前置条件
- DigitalOcean 账户,至少拥有一个正在运行的 GPU Droplet。
- DigitalOcean API 令牌(具备读取权限和 GenAI 范围的个人访问令牌)。
- Gradient 模型访问密钥(可在 Gradient AI 仪表板生成)。
- Python 3.12(推荐使用,以获得最新的 LangGraph 和 asyncio 功能)。
- 熟悉 Python、REST API 和 Linux 命令行基础。
Source: …
NVIDIA DCGM 指标
NVIDIA 数据中心 GPU 管理器(DCGM)通过 9400 端口上的 Prometheus 兼容导出器公开硬件遥测数据。
| Metric | 测量内容 | 重要性说明 |
|---|---|---|
DCGM_FI_DEV_GPU_TEMP | GPU 芯片温度(摄氏度) | 高温表明 GPU 正在进行活跃计算。 |
DCGM_FI_DEV_POWER_USAGE | 当前功耗(瓦特) | 空闲状态下 GPU 的功耗会显著降低。 |
DCGM_FI_DEV_FB_USED | 已使用的帧缓冲(显存)容量 | 显存为空表示没有加载模型。 |
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 – 大语言模型决定调用
@tool函数,例如analyze_gpu_fleet()。 - Parallel Scraping –
analyzer.py使用ThreadPoolExecutor并发查询 DigitalOcean API 以及每个 Droplet 的 DCGM 端点。 - Omniscient Payload – 所有原始数据(温度、功耗、VRAM、RAM、CPU、成本)被打包成结构化的 JSON 字典供 LLM 使用。
- Synthesis – LLM 读取 JSON 并以自然语言返回节点名称、成本和建议。
欲了解更多关于使用 LangGraph 的有状态 AI 代理,请参阅 Getting Started with Agentic AI Using LangGraph 教程。
定制蓝图
代理角色(config.py)
编辑 AGENT_SYSTEM_PROMPT 以更改 AI 的沟通方式。
- 删除表情符号,并请求以原始项目符号形式输出,适用于技术 DevOps 助手。
- 使用面向管理的语气撰写成本汇总报告。
阈值
默认的空闲检测使用以下字典(以代码块形式便于复制粘贴):
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,
},
}
根据工作负载基准调整数值(例如,如果你的推理服务器通常在 8 % GPU 利用率时空闲,则将 idle_util_percent 设置为 10.0)。
Droplet 过滤
默认情况下,仅扫描 size_slug 中包含 "gpu" 的 Droplet:
target_droplets = [d for d in all_droplets if "gpu" in d.get("size_slug", "").lower()]
- 将
"gpu"改为"c-"以筛选 CPU‑优化的 Droplet。 - 完全移除过滤条件即可扫描所有 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])
警告: 授予写入权限需要严格的防护措施——建议使用确认提示、标签限制以及审计日志。
本地运行
启动开发服务器:
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 代理
| 因素 | 静态仪表盘 (Grafana + Prometheus) | AI 代理(此蓝图) |
|---|---|---|
| 设置复杂度 | 中等(需要 Prometheus 服务器、Grafana、DCGM exporter) | 低(克隆仓库、设置环境变量、部署) |
| 实时告警 | 基于规则的告警,使用固定阈值 | 自然语言查询,具备自适应推理 |
| 多指标关联 | 手动可视化比较 | 自动 LLM 关联温度、功耗、显存、成本 |
| 可操作性 | 只读;需要额外的自动化 | 通过 @tool 可扩展,直接进行 API 操作 |
| 对话式后续 | 不支持 | 内置于 LangGraph MemorySaver 与 thread_id 范围 |
| 适用场景 | 拥有专职 SRE/DevOps 人员并进行历史趋势分析的大型团队 | 需要快速、对话式 GPU 审计且无需完整监控栈的中小团队 |
对于约 20 台 GPU Droplets 以下的机群,AI 代理消除了完整监控栈的开销,同时仍能提供可操作的洞察。对于更大的机群,使用两种方案可能更有益。
架构考虑
- 上下文智能:
MemorySaver提供对话历史,使得在不重新扫描整个集群的情况下进行深入提问。 - 并行处理:
ThreadPoolExecutor并发扫描数十个 Droplets,防止 LLM 超时。 - 成本论证: 单个闲置的每月 500 美元 GPU 实例的节省足以证明代理推理成本的合理性。
- 优雅降级: 如果端口 9400 无法访问,代理会报告 “DCGM Missing”,并回退到 CPU/RAM 指标。
- 安全性: 除非添加写入工具,否则使用只读 API 令牌;仔细限定权限范围并实现审计日志。
好处与使用场景
- 捕获遗忘的资源: 识别在实验或训练任务完成后仍在运行的 GPU Droplets。
- 噪声降低: 直接查询 GPU 引擎和显存(VRAM)使用率,避免误导性的低 CPU 指标。
- 统一工作流: 一个自然语言查询即可取代多个 UI 操作(DigitalOcean 控制面板、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 部署。