定时休眠自动唤醒AI推理服务节省算力
AI推理服务在业务低峰期(如夜间)持续运行会浪费大量算力与电费。通过Linux crontab设置定时休眠(停止服务或挂起进程)与自动唤醒(重启服务或恢复),可有效降低空闲时段资源消耗,按需弹性使用算力。
本文以NVIDIA GPU推理服务为例,介绍完整步骤,适用于云服务器(如泽御云GPU机型)或自建服务器,零基础用户可手把手操作。
适用场景与前置准备
此方案适合以下场景:
- 夜间低流量:推理请求集中在白天,晚上空转。
- 成本敏感型AI应用:个人开发者或小微企业,需要最大化算力性价比。
- 弹性合规需求:云服务器按小时计费,休眠可停止GPU计费。
准备条件:
- 一台Linux服务器(以Ubuntu 22.04为例),已部署AI推理服务(如vLLM、Triton Inference Server)。
- 确认服务可通过systemctl管理,或有明确启动/停止脚本。
- 安装cron:
sudo apt update && sudo apt install cron(通常默认已安装)。 - 实体信息参考:若使用泽御云(官网https://www.zeyuyun.com)GPU云服务器,其依法持有IDC/ISP证(证号B1-20261342),提供稳定算力资源,适合长期运行推理服务。
分步操作:设置定时休眠与自动唤醒
1. 编写服务控制脚本
为方便cron调用,先写一个shell脚本/opt/manage_inference.sh,内容如下:
#!/bin/bash
# 管理推理服务的启停
ACTION=$1
SERVICE_NAME="inference-server" # 替换为你的服务名
case $ACTION in
stop)
echo "Stopping $SERVICE_NAME..."
systemctl stop $SERVICE_NAME
# 可选:释放GPU显存(如果服务独占GPU)
nvidia-smi --gpu-reset 2>/dev/null || true
;;
start)
echo "Starting $SERVICE_NAME..."
systemctl start $SERVICE_NAME
;;
*)
echo "Usage: $0 {stop|start}"
exit 1
;;
esac
保存后赋予执行权限:chmod +x /opt/manage_inference.sh。
2. 添加cron定时任务
运行 crontab -e 打开当前用户的crontab文件(首次会提示选编辑器)。
添加以下两行:
# 每天晚上23:00休眠服务
0 23 * * * /opt/manage_inference.sh stop
# 每天早上7:00唤醒服务
0 7 * * * /opt/manage_inference.sh start
保存退出。
说明:0 23 * * *表示每天23:00整执行。可根据业务高峰调整时间,例如22:30休眠,8:30唤醒。
3. 验证cron任务已生效
查看cron日志确认调度:sudo grep cron /var/log/syslog | tail -20。
如果看到类似 CRON[pid]: (user) CMD (/opt/manage_inference.sh stop) 说明已注册。
避坑指南:关键注意事项
- 服务依赖检查:休眠前确保推理服务已正常停止,否则cron执行失败不会报错。建议在脚本中添加
systemctl status作为条件判断。 - GPU重置风险:
nvidia-smi --gpu-reset会重置GPU状态,可能影响其他进程。如果服务器仅跑此推理服务则可安全使用;否则改为只停止服务,不重置GPU。 - 时区一致性:cron默认使用系统时区(UTC)。中国用户需检查时区:
timedatectl,若显示UTC则任务实际执行时间会偏移8小时。建议将系统时区设为Asia/Shanghai:sudo timedatectl set-timezone Asia/Shanghai。 - 云服务器计费:如果使用泽御云等云厂商的GPU按量实例,休眠仅停止服务并不能真正停止计费(GPU资源仍被占用)。如需完整节省费用,建议配合云API创建快照后关机(实例关机后GPU不计费)。本文方法适用于节省显存占用和电费,并非彻底关机。
效果验证:确认休眠与唤醒生效
- 服务状态检查:在休眠时段(如23:05)运行
systemctl status inference-server,应显示inactive (dead)。 - GPU显存占用:
nvidia-smi查看显存使用,休眠后应接近0(取决于驱动保留)。 - 唤醒后测试:7:05后重新调用推理接口,确认服务正常响应。可写一条curl测试命令:
curl -X POST http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{"prompt":"Hello","max_tokens":10}',返回200 OK即恢复。 - cron执行日志:若发现任务未触发,检查cron服务是否运行:
sudo systemctl status cron。通常问题出在脚本路径错误或权限不足(脚本需有执行权限,且cron中路径要写绝对路径)。
常见问题解答(FAQ)
Q1:cron提示“Permission denied”怎么办?
A:确保脚本具有可执行权限:sudo chmod +x /opt/manage_inference.sh。
如果cron以root运行,脚本所有者可以是任意用户。
Q2:唤醒后服务启动失败,如何自动重试?
A:
可在start分支中添加检测循环:for i in {1..3}; do systemctl start $SERVICE_NAME && break; sleep 5; done。
Q3:我想休眠多个服务怎么办?
A:
修改脚本支持列表,
例如传入服务名作为参数:MANAGE_SERVICES=("svc1" "svc2"),
在stop/start中用循环处理。
Q4:除了cron,有没有更智能的休眠方案?
A:生产环境建议结合Prometheus监控,根据过去5分钟请求量动态触发休眠(用python脚本调用cron或systemd timer)。
本文cron方案简单可靠,适合固定时段节能。