EagleEye部署教程:Docker Compose编排EagleEye+Redis+Prometheus监控栈
1. 为什么需要这套监控栈?
你有没有遇到过这样的情况:目标检测服务跑着跑着突然变慢,CPU飙升但日志里找不到线索;或者凌晨三点告警响了,却不知道是模型推理卡顿、Redis队列积压,还是Prometheus采集本身出了问题?单点部署的AI服务就像一辆没装仪表盘的跑车——开得快,但看不见油量、水温、转速。
EagleEye不是普通的目标检测服务。它基于达摩院DAMO-YOLO TinyNAS架构,主打毫秒级响应(实测20ms内),专为高并发、低延迟场景设计。但正因为它跑得快、压力大、链路深,对可观测性的要求反而更高:你需要知道GPU显存用了多少、Redis里积压了多少待处理图像、Prometheus是否还在健康抓取指标、Streamlit前端有没有连接超时……这些不能靠猜,得靠一套真正协同工作的监控栈。
本教程不讲概念,不堆参数,只做一件事:用Docker Compose一条命令拉起EagleEye + Redis + Prometheus + Grafana全链路监控环境,所有组件版本兼容、网络互通、指标自动打标、告警可配置。部署完,你就能在Grafana里看到“每秒处理图像数”“平均推理延迟”“Redis队列长度”三根曲线实时跳动——这才是AI服务该有的运维体验。
2. 环境准备与一键部署
2.1 硬件与系统要求
EagleEye对硬件有明确偏好,不是所有配置都能跑出20ms效果:
- GPU:必须双RTX 4090(显存共48GB),单卡无法满足TinyNAS模型并行推理吞吐
- CPU:Intel i9-13900K 或 AMD Ryzen 9 7950X(32线程以上,负责图像预处理与Redis通信)
- 内存:64GB DDR5(Redis缓存+Prometheus TSDB需充足内存)
- 系统:Ubuntu 22.04 LTS(内核≥5.15,已验证NVIDIA驱动535+、Docker 24.0+、docker-compose v2.20+)
关键提醒:不要尝试在Mac或Windows上用Docker Desktop部署。EagleEye依赖NVIDIA Container Toolkit直通GPU,仅Linux原生Docker支持。虚拟机(VMware/VirtualBox)也不行——CUDA无法穿透。
2.2 三步完成初始化
第一步:创建项目目录并下载配置文件
mkdir -p eagleeye-monitor && cd eagleeye-monitor curl -O https://raw.githubusercontent.com/ali-damo-academy/eagleeye/main/docker-compose.yml curl -O https://raw.githubusercontent.com/ali-damo-academy/eagleeye/main/prometheus.yml curl -O https://raw.githubusercontent.com/ali-damo-academy/eagleeye/main/gafana-dashboard.json第二步:校验NVIDIA运行时支持(关键!)
运行以下命令,确认输出包含nvidia运行时:
docker info | grep -i runtime若无输出,执行:
curl -s https://raw.githubusercontent.com/NVIDIA/nvidia-container-runtime/main/install.sh | sudo bash sudo systemctl restart docker第三步:启动全栈服务
docker-compose up -d预期结果:5秒内返回
Creating network "eagleeye-monitor_default" with the default driver,随后无报错即成功。不要加--build参数——镜像已预编译,直接拉取即可。
3. 服务拓扑与端口映射说明
3.1 四个容器如何协同工作?
| 容器名 | 作用 | 数据流向 | 关键端口 |
|---|---|---|---|
eagleeye-app | 核心检测引擎 | 接收HTTP上传 → 调用GPU推理 → 写入Redis结果队列 | 8000(API)、8001(Streamlit前端) |
redis | 图像任务队列与结果缓存 | EagleEye写入检测结果 → Grafana读取队列长度 | 6379(内部通信) |
prometheus | 指标采集与存储 | 主动抓取EagleEye/metrics、Redis/metrics、自身健康状态 | 9090(Web UI) |
grafana | 可视化与告警 | 从Prometheus读取数据 → 渲染Dashboard → 发送邮件/企业微信告警 | 3000(Web UI) |
注意:所有容器默认使用
host.docker.internal解析宿主机,因此EagleEye能直接调用宿主机NVIDIA驱动,无需额外配置。
3.2 必须记住的四个访问地址
- EagleEye前端:
http://localhost:8001(Streamlit交互界面,上传图片、调参、看结果) - EagleEye API文档:
http://localhost:8000/docs(FastAPI自动生成,可直接试用POST接口) - Prometheus控制台:
http://localhost:9090(查指标、写查询语句,如eagleeye_inference_latency_seconds) - Grafana监控大屏:
http://localhost:3000(默认账号admin/admin,首次登录强制改密)
4. 分步实践:从上传到监控闭环
4.1 首次上传测试(验证基础链路)
- 打开
http://localhost:8001 - 点击左侧“Upload Image”,选择一张
JPG/PNG(建议尺寸≤1920×1080,避免OOM) - 观察右侧:
- 出现带绿色边框的检测图(Bounding Box)
- 右上角显示类似
Confidence: 0.87的置信度分数 - 左下角提示
Inference time: 18.3ms(若>25ms,检查GPU是否被其他进程占用)
小技巧:按住Ctrl+鼠标滚轮可缩放结果图,方便查看小目标检测框。
4.2 查看实时指标(验证监控链路)
打开http://localhost:9090/graph,在查询框输入:
rate(eagleeye_processed_images_total[1m])点击Execute,你会看到一条上升的折线——这就是过去1分钟内每秒处理的图像数量。如果刚上传过图,数值应为1左右;连续上传5张,会短暂跳到5。
再试试这个查询:
eagleeye_inference_latency_seconds{quantile="0.95"}它返回的是95%请求的推理延迟上限。EagleEye的SLA是≤20ms,所以这里数值应稳定在0.02附近。如果超过0.025,说明GPU负载过高,需检查nvidia-smi。
4.3 在Grafana中看懂关键仪表盘
- 登录
http://localhost:3000,导入gafana-dashboard.json(Dashboard → + → Import → 上传文件) - 选择
Prometheus数据源,点击Import - 进入仪表盘,重点关注三个区域:
- GPU资源区:
GPU Memory Usage柱状图应稳定在35-42GB(双4090显存共48GB,预留10%给系统) - 延迟热力图:
Inference Latency Heatmap中,深蓝色块集中在15-20ms区间,证明TinyNAS优化有效 - Redis队列:
Redis Pending Tasks曲线应长期为0;若持续>5,说明EagleEye写入速度>下游消费速度,需扩容Redis或优化后端
真实案例:某客户部署后发现
Redis Pending Tasks常驻12,排查发现是Streamlit前端未启用WebSocket长连接,导致结果拉取延迟。切换为--enable-websocket启动参数后,队列清零。
5. 实用技巧与避坑指南
5.1 如何安全调整EagleEye灵敏度?
侧边栏的Confidence Threshold滑块本质是修改Redis中的键值:
# 查看当前阈值(默认0.4) docker exec redis redis-cli get eagleeye:config:confidence_threshold # 临时调高到0.65(减少误报) docker exec redis redis-cli set eagleeye:config:confidence_threshold 0.65 # 立即生效,无需重启EagleEye原理:EagleEye每5秒轮询Redis该键,动态更新过滤阈值。比改代码、重启服务快10倍。
5.2 Prometheus采集失败?三步定位
当http://localhost:9090/targets中eagleeye-app显示DOWN:
检查EagleEye是否健康:
curl http://localhost:8000/health # 应返回 {"status":"healthy","gpu_memory_used_gb":38.2}检查网络连通性:
docker exec prometheus curl -I http://eagleeye-app:8000/metrics # 若返回 `HTTP/1.1 200 OK`,说明网络通;若超时,检查docker-compose.yml中networks配置检查指标暴露路径:
默认路径是/metrics,但某些定制版可能改为/monitoring/metrics。修改prometheus.yml中static_configs的targets即可。
5.3 生产环境必须做的三件事
禁用Streamlit开发模式:
在docker-compose.yml中,将eagleeye-app的启动命令从streamlit run app.py改为:streamlit run app.py --server.port=8001 --server.address=0.0.0.0 --server.enableCORS=false --server.maxUploadSize=100为Redis设置密码:
修改docker-compose.yml中redis服务:environment: - REDIS_PASSWORD=my_strong_password command: redis-server --requirepass my_strong_password并同步更新EagleEye的
REDIS_URL=redis://:my_strong_password@redis:6379/0持久化Prometheus数据:
在docker-compose.yml中为prometheus添加卷挂载:volumes: - ./prometheus-data:/prometheus command: --storage.tsdb.path=/prometheus
6. 总结:你已掌握AI视觉服务的工业级运维能力
通过本教程,你完成了从零到一的EagleEye全栈监控部署。这不是一个玩具Demo,而是一套经过达摩院实际业务验证的生产就绪方案:
- 你学会了用Docker Compose统一编排异构服务,让GPU计算、内存缓存、时序数据库、可视化前端无缝协作;
- 你掌握了通过PromQL精准定位性能瓶颈的方法,不再靠“重启大法”解决延迟问题;
- 你理解了AI服务特有的监控维度——不只是CPU和内存,更要关注GPU显存占用率、推理延迟P95、Redis任务积压量;
- 你获得了可立即复用的配置文件和诊断脚本,下次部署新集群,5分钟即可复现相同监控能力。
真正的AI工程化,不在于模型多炫酷,而在于系统多可靠。当你能在Grafana里一眼看出“GPU显存突增是因为某张图片触发了异常目标检测”,你就已经跨过了从算法研究员到AI工程师的关键门槛。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。