AutoDL 自动化运维系统
概述
本文档描述 AutoDL GPU 服务器自动化运维系统的设计、实现和使用方法。该系统旨在实现:
- 多服务器配置管理
- 自动开关机控制
- 健康检查和监控
- 智能任务调度
- 成本优化(自动扩缩容)
- 告警通知
系统架构
┌─────────────────────────────────────────────────────────────┐
│ PyBridge 任务系统 │
│ (视频合成、超分、插帧等任务) │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ ServerManager (服务器管理模块) │
│ - 服务器选择 - 健康检查 - 开关机控制 - 状态同步 │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ AutoDL API │
│ - 开关机 - 状态查询 - 资源监控 - 余额查询 │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ GPU 服务器集群 (AutoDL) │
│ - autodl-gpu-1 (905机) - autodl-gpu-2 (A10机) │
│ - maa-cpu (生产环境) │
└──────────────────────────────────────────────────────────────┘核心组件
1. servers.json - 服务器配置文件
路径:/Users/mzy/docker/dnmp/www/stooland/pybridge/servers.json
配置结构:
json
{
"servers": [
{
"id": "autodl-gpu-1",
"name": "AutoDL GPU服务器 #1 (905机)",
"autodl_uuid": "12f34797da-3ee966a9",
"priority": 1,
"ssh": {
"host": "connect.westd.seetacloud.com",
"port": 41092,
"user": "root",
"password": "H4knio3lKhkU"
},
"services": {
"pybridge": {
"port": 6008,
"public_url": "https://uu575958-97da-3ee966a9.westd.seetacloud.com:8443",
"startup_command": "cd /root/autodl-tmp/stooland/pybridge && ./start.sh"
},
"comfyui": {
"port": 6006,
"public_url": "https://uu575958-97da-3ee966a9.westd.seetacloud.com:6006"
}
},
"resources": {
"cpu": {
"cores": 32,
"model": "13th Gen Intel(R) Core(TM) i9-13900K"
},
"memory": {
"total_gb": 251.6
},
"gpu": {
"count": 6,
"model": "NVIDIA RTX PRO 6000",
"vram_gb": 97,
"gpu_idle_num": 5
}
},
"pricing": {
"price_per_hour": 13.99,
"credit_balance": 6.23
}
}
]
}字段说明:
id: 服务器唯一标识autodl_uuid: AutoDL 实例 UUID(用于 API 调用)priority: 优先级(1-100,数字越小优先级越高)ssh: SSH 连接信息services: 部署的服务列表resources: 服务器资源配置pricing: 价格和余额信息
2. ServerManager - 服务器管理模块
路径:/Users/mzy/docker/dnmp/www/stooland/pybridge/src/utils/server_manager.py
主要功能:
2.1 服务器控制
python
# 启动服务器
manager.start_server("autodl-gpu-1")
# 关闭服务器
manager.stop_server("autodl-gpu-1")
# 重启服务器
manager.restart_server("autodl-gpu-1")2.2 健康检查
python
# 检查服务器健康状态
health_status = manager.check_health("autodl-gpu-1")
# 返回:
# {
# "ssh": True/False,
# "pybridge": True/False,
# "comfyui": True/False,
# "gpu": {
# "available": True/False,
# "idle_count": 5,
# "vram_free_gb": 97
# }
# }2.3 智能服务器选择
python
# 选择最佳服务器执行任务
best_server = manager.select_best_server(
service="pybridge", # 服务类型
require_gpu=True # 是否需要 GPU
)
# 返回服务器 ID,如 "autodl-gpu-1"选择算法:
- 过滤可用服务器(已启动 + 健康检查通过)
- 按优先级排序
- 按负载排序(CPU/内存/GPU 使用率)
- 返回优先级最高、负载最低的服务器
2.4 自动扩缩容
python
# 根据任务队列长度自动开关机
manager.auto_scale(
task_queue_length=10, # 当前任务队列长度
idle_minutes=30 # 服务器空闲时长(分钟)
)扩缩容策略:
扩容(启动服务器):
- 任务队列长度 > 5
- 所有运行中的服务器 CPU 使用率 > 80%
- 按优先级启动下一台服务器
缩容(关闭服务器):
- 服务器空闲时间 > 30 分钟
- 任务队列长度 < 2
- 关闭优先级最低的服务器
2.5 成本监控
python
# 查询账户余额
balance = manager.check_balance()
# 返回余额(元)
# 余额告警
if balance < 10:
manager.send_alert(f"AutoDL 余额不足:{balance}元")AutoDL API 集成
API 认证
需要在环境变量中配置 AutoDL API Key:
bash
# .env 文件
AUTODL_API_KEY=your_autodl_api_key_here获取方法:登录 AutoDL 控制台 → 个人中心 → API 密钥
API 接口
1. 启动实例
bash
POST https://www.autodl.com/api/v1/instance/{uuid}/start
Headers:
Authorization: Bearer {AUTODL_API_KEY}2. 关闭实例
bash
POST https://www.autodl.com/api/v1/instance/{uuid}/stop
Headers:
Authorization: Bearer {AUTODL_API_KEY}3. 查询实例状态
bash
GET https://www.autodl.com/api/v1/instance/{uuid}
Headers:
Authorization: Bearer {AUTODL_API_KEY}4. 查询账户余额
bash
GET https://www.autodl.com/api/v1/account/balance
Headers:
Authorization: Bearer {AUTODL_API_KEY}使用场景
场景 1:视频合成任务调度
python
from src.utils.server_manager import ServerManager
# 初始化管理器
manager = ServerManager()
# 选择最佳服务器
server_id = manager.select_best_server(
service="pybridge",
require_gpu=False # 视频合成不需要 GPU
)
# 获取服务器配置
server = manager.get_server(server_id)
# 提交任务到选定的服务器
pybridge_url = server['services']['pybridge']['public_url']
response = requests.post(
f"{pybridge_url}/compose",
json=task_data
)场景 2:视频超分任务(GPU 密集型)
python
# 选择 GPU 服务器
server_id = manager.select_best_server(
service="pybridge",
require_gpu=True # 超分需要 GPU
)
# 检查 GPU 可用性
health = manager.check_health(server_id)
if not health['gpu']['available']:
# GPU 不可用,尝试启动备用服务器
backup_server = manager.select_best_server(
service="pybridge",
require_gpu=True,
exclude=[server_id]
)
if backup_server:
manager.start_server(backup_server)
server_id = backup_server
# 提交超分任务
server = manager.get_server(server_id)
pybridge_url = server['services']['pybridge']['public_url']
response = requests.post(
f"{pybridge_url}/enhance",
json=enhancement_data
)场景 3:ComfyUI 工作流
python
# 选择 ComfyUI 服务器
server_id = manager.select_best_server(
service="comfyui",
require_gpu=True
)
server = manager.get_server(server_id)
comfyui_url = server['services']['comfyui']['public_url']
# 提交工作流
response = requests.post(
f"{comfyui_url}/prompt",
json=workflow_data
)定时任务配置
1. 服务器状态同步(每 5 分钟)
bash
# crontab -e
*/5 * * * * cd /path/to/pybridge && python -c "from src.utils.server_manager import ServerManager; ServerManager().sync_server_status()"2. 自动扩缩容检查(每 10 分钟)
bash
# crontab -e
*/10 * * * * cd /path/to/pybridge && python -c "from src.utils.server_manager import ServerManager; from src.service.fastapi_app import jobs; ServerManager().auto_scale(len(jobs), 0)"3. 余额告警(每天 9:00)
bash
# crontab -e
0 9 * * * cd /path/to/pybridge && python -c "from src.utils.server_manager import ServerManager; m = ServerManager(); b = m.check_balance(); m.send_alert(f'AutoDL 余额:{b}元') if b < 50 else None"告警通知
1. 余额不足告警
- 触发条件:账户余额 < 50 元
- 通知方式:微信/邮件/钉钉
- 通知频率:每天一次
2. 租期到期提醒
- 触发条件:距离租期到期 < 3 天
- 通知方式:微信/邮件/钉钉
- 通知频率:每天两次(9:00, 18:00)
3. 服务健康告警
- 触发条件:服务健康检查失败
- 通知方式:微信/邮件/钉钉
- 通知频率:实时
监控指标
服务器级别
- CPU 使用率
- 内存使用率
- GPU 使用率
- 磁盘使用率
- 网络流量
任务级别
- 任务队列长度
- 任务成功率
- 平均执行时间
- 错误率
成本级别
- 每日费用
- 账户余额
- 预计可用天数
- 成本/任务比
成本优化建议
1. 空闲时关机
- 服务器空闲 > 30 分钟自动关机
- 节省成本约 70%(假设任务时段集中)
2. 使用抢占式实例
- 价格便宜 50%-80%
- 适合可中断的任务(视频合成)
- 不适合长时间运行的任务
3. 任务批处理
- 积累多个任务后统一执行
- 减少开关机次数
- 提高资源利用率
4. 多服务器负载均衡
- 优先使用便宜的服务器
- 高负载时启用昂贵的服务器
- 动态调整服务器数量
故障排查
问题 1:SSH 连接失败
现象:paramiko.ssh_exception.SSHException: Error reading SSH protocol banner
原因:
- 服务器未启动
- SSH 端口错误
- 网络问题
解决:
- 检查服务器状态(AutoDL 控制台)
- 验证 SSH 端口和密码
- 手动 SSH 测试
问题 2:服务健康检查失败
现象:requests.exceptions.ConnectionError
原因:
- 服务未启动
- 端口映射错误
- 防火墙阻止
解决:
- 登录服务器检查服务状态
- 验证端口配置
- 手动启动服务
问题 3:AutoDL API 调用失败
现象:401 Unauthorized 或 403 Forbidden
原因:
- API Key 错误或过期
- 余额不足
- API 限流
解决:
- 更新 API Key
- 充值账户
- 添加重试逻辑
待实现功能
高优先级
- [ ] 配置 AUTODL_API_KEY 环境变量
- [ ] 测试开关机功能
- [ ] 实现定时任务:每5分钟更新服务器状态
- [ ] 实现自动扩缩容逻辑
中优先级
- [ ] 配置余额告警通知(微信/邮件/钉钉)
- [ ] 实现租期到期提醒功能
- [ ] 集成到 PyBridge 任务提交流程
低优先级
- [ ] 实现监控面板(实时状态、成本统计)
- [ ] 任务重试机制(服务器故障时自动切换)
- [ ] 成本分析报表(按任务类型、时间段统计)
- [ ] 预测式扩容(基于历史数据预测负载)
相关文件
- 服务器配置:
/Users/mzy/docker/dnmp/www/stooland/pybridge/servers.json - 管理模块:
/Users/mzy/docker/dnmp/www/stooland/pybridge/src/utils/server_manager.py - 环境配置:
/Users/mzy/docker/dnmp/www/stooland/pybridge/.env - 部署文档:
/Users/mzy/docker/dnmp/www/stooland/pybridge/GPU_DEPLOYMENT.md
参考资料
更新日志
- 2025-12-18:创建初始文档,完成 ServerManager 基础实现