搭建基于 Flask + SocketIO 的 GPU 集群实时监控系统,包含远程采集、定时调度、Web 前端可视化及项目文档。
GPU Monitor
GPU Monitor 是一个基于 Flask + SocketIO 的轻量级 NVIDIA GPU 集群实时监控系统。它通过 SSH 远程连接多台服务器,定时执行 nvidia-smi 采集 GPU 状态(利用率、温度、显存等),并通过 WebSocket 实时推送到浏览器前端,提供可视化卡片与历史趋势图表。
功能特性
- 🚀 实时监控:基于 WebSocket(SocketIO)的秒级数据推送,无需手动刷新
- 🖥️ 多服务器支持:在
config.yaml中配置任意数量的远程服务器 - 📊 可视化卡片:每台服务器的多张 GPU 卡片,展示利用率、温度、显存占用
- 📈 趋势图表:点击 GPU 卡片可打开详情模态框,查看利用率历史曲线
- 🔌 连接状态指示:前端实时显示 WebSocket 连接状态与服务器在线/离线
- 🌡️ 温度阈值告警:可配置温度告警阈值
- 🔧 零前端构建:前端使用 CDN 引入 Tailwind / Socket.IO / Chart.js,无需打包
技术栈
| 层级 | 技术 |
|---|---|
| 后端 | Python 3.8+ / Flask / Flask-SocketIO |
| 调度 | APScheduler(后台定时任务) |
| 采集 | paramiko(SSH)调用 nvidia-smi |
| 前端 | HTML + Tailwind CSS + Chart.js + Socket.IO(均通过 CDN) |
目录结构
GPUMonitor/
├── app.py # Flask 应用入口,启动 SocketIO 服务
├── config.example.yaml # 配置示例文件(提交到仓库)
├── config.yaml # 本地配置(含敏感信息,已被 .gitignore 忽略)
├── core/
│ ├── __init__.py
│ ├── collector.py # 通过 SSH 远程采集 GPU 数据 (GPUCollector)
│ └── scheduler.py # 定时调度与数据分发 (GPUScheduler)
├── static/ # 静态资源(js / css)
├── templates/
│ └── index.html # 前端监控页面
├── requirements.txt # Python 依赖
├── README.md
├── LICENSE
└── .gitignore
环境要求
- Python 3.8 及以上
- 目标服务器已安装 NVIDIA 驱动并可用
nvidia-smi命令 - 监控机可通过 SSH 访问目标服务器(支持密码或密钥登录)
快速开始
1. 克隆仓库
git clone https://github.com/your-username/GPUMonitor.git
cd GPUMonitor
2. 创建虚拟环境并安装依赖
python -m venv venv
source venv/bin/activate # Linux / macOS
# venv\Scripts\activate # Windows (PowerShell/CMD)
pip install -r requirements.txt
3. 配置服务器列表
复制示例配置文件并重命名为本地配置(请勿将 config.yaml 提交到仓库):
cp config.example.yaml config.yaml
编辑 config.yaml,填入你的服务器信息:
servers:
- alias: 'AIServer' # 服务器别名(前端展示用)
ip: '192.168.1.10' # 服务器 IP
port: 22 # SSH 端口
username: 'root' # SSH 用户名
password: 'your_password' # SSH 密码(建议改用 SSH Key)
# 可继续添加更多服务器 ...
settings:
interval: 5 # 采集间隔(秒)
timeout: 10 # SSH 连接超时(秒)
temperature_threshold: 80 # 温度告警阈值(°C)
⚠️ 安全提示:配置文件中的密码为明文,请仅在受信任的本地环境使用,或改用 SSH 公钥认证。生产环境务必通过环境变量
GPU_MONITOR_SECRET_KEY设置 Flask 会话密钥。
4. 运行
python app.py
启动后访问浏览器:
http://<监控机IP>:8099
前端将自动通过 WebSocket 实时刷新 GPU 数据。
配置说明
| 配置项 | 说明 | 默认值 |
|---|---|---|
servers[].alias |
服务器展示别名 | 必填 |
servers[].ip |
服务器 IP 地址 | 必填 |
servers[].port |
SSH 端口 | 22 |
servers[].username |
SSH 用户名 | 必填 |
servers[].password |
SSH 密码 | 必填 |
settings.interval |
采集间隔(秒) | 5 |
settings.timeout |
SSH 连接超时(秒) | 10 |
settings.temperature_threshold |
温度告警阈值(°C) | 80 |
工作原理
GPUScheduler使用 APScheduler 在后台按interval周期触发采集。- 每个采集周期遍历
config.yaml中的服务器,由GPUCollector通过 paramiko 建立 SSH 连接。 - 远程执行
nvidia-smi --query-gpu=...并以 CSV 格式返回,解析为结构化数据。 - 所有服务器结果汇总到
last_data,通过 SocketIO 的gpu_update事件推送给所有已连接的浏览器。 - 前端接收数据后动态渲染服务器卡片,并维护每张 GPU 的利用率趋势图表。
环境变量
| 变量名 | 说明 |
|---|---|
GPU_MONITOR_SECRET_KEY |
Flask SECRET_KEY,用于会话签名;未设置时每次启动随机生成 |
常见问题(FAQ)
Q: 前端显示「无法连接服务器」? A: 检查目标服务器 IP / 端口 / 用户名 / 密码是否正确,以及监控机到目标机的网络与 SSH 权限。
Q: 卡片显示但无数据 / 数据为空?
A: 确认目标服务器已安装 NVIDIA 驱动且 nvidia-smi 在登录 Shell(bash -l)的 PATH 中可用。
Q: 如何修改监听端口?
A: 编辑 app.py 末尾 socketio.run(app, host='0.0.0.0', port=8099) 中的 port。
Q: 支持 HTTPS / 反向代理吗?
A: 生产环境建议在 Nginx 等反向代理后部署,并为 SocketIO 配置 cors_allowed_origins 与 WebSocket 转发。
安全建议
- 不要将包含真实 IP / 密码的
config.yaml提交到任何公开仓库。 - 优先使用 SSH 公钥认证,避免明文密码。
- 通过反向代理启用 HTTPS,不要将服务直接暴露在公网
0.0.0.0。 - 设置强随机的
GPU_MONITOR_SECRET_KEY环境变量。
贡献
欢迎提交 Issue 与 Pull Request!请参阅 CONTRIBUTING.md。
许可证
本项目基于 MIT License 开源。