Files
sentinel-home-ai/PROGRESS.md

16 KiB
Raw Blame History

项目进度追踪

最后更新: 2026-08-20 14:20

服务运行状态

服务 节点 地址 状态 验证结果
FAM-Core NAS 0.0.0.0:8000 运行中 health=ok, gunicorn --threads 4, scheduler+dispatcher+poller 全部 running
FAM-Edge Oracle 0.0.0.0:5000 运行中 v2.0, SQLite 异步队列 + 消费者线程 + TokenBucket 速率限制
MariaDB NAS 127.0.0.1:3306 运行中 10.11.11, 6 张表, utf8mb4
Ollama Oracle 127.0.0.1:11434 运行中 qwen2.5:7b仅智能问答兜底不参与视觉/融合)
Tailscale Oracle ↔ NAS 100.74 ↔ 100.70 ⚠️ 待修复 Tailscale 运行但端口不通当前用公网IP
FAM-UI NAS 0.0.0.0:8501 运行中 Streamlit 1.61.1, HTTP 200, health=ok

环境状态

Oracle Cloud (129.146.203.203) - FAM-Edge 节点

项目 状态 备注
OS Ubuntu 20.04 ARM64 Ampere A1 2C12G
Python 3.8.10 python3-venv 已安装
pip 25.0.1 (venv内)
FFmpeg 已安装 apt 安装
Ollama 0.32.14
qwen2.5:7b 已拉取 纯文本模型,仅问答兜底(原 llava-phi3 已废弃)
Python 依赖 全部安装成功 flask, gunicorn, requests, PyYAML, opencv, numpy
模块导入验证 PASS FAM-Edge 全部 8 个模块导入正常
代码部署 /opt/fam-edge/ rsync 同步
venv /opt/fam-edge/venv/ 已创建
Tailscale 1.102.2 已安装 待用户认证

Synology NAS (192.168.50.64) - FAM-Core + FAM-UI 节点

项目 状态 备注
型号 DS220+ (Geminilake) DSM 7
Python 3.8.15 (系统) + 3.10.20 (venv) FAM-Core/UI venv 使用 Python 3.10
pip3 venv 内可用 fam-core/venv + fam-ui/venv
MariaDB 10.11.11 已运行 端口 3306, root 密码 iLoveJava5!
sentinel_home_ai 库 6 张表已创建 DDL 执行成功
Docker 24.0.2 (ContainerManager) 路径 /var/packages/ContainerManager/target/usr/bin/docker
Tailscale 已运行 IP: 100.70.234.39, hostname: ericwyuan-nas
FAM-Core venv 已创建 Python 3.10.20, flask/PyMySQL/gunicorn/PyYAML/requests
FAM-UI venv 已创建 Python 3.10.20, Streamlit 1.61.1 + pandas 2.3.3
Streamlit 已安装 1.61.1, 运行于 0.0.0.0:8501 (headless)

网络互通 (Tailscale)

节点 Tailscale IP 状态
NAS (ericwyuan-nas) 100.70.234.39 已连接
Oracle (oracle-fam-edge) 待认证 需用户访问认证 URL
当前方案 Oracle Tailscale 待认证,认证后可直连

模型可行性基准测试 (Task 1.4)

测试环境

  • Oracle Ampere A1 2C12G ARM64
  • Ollama 0.32.14 + llava-phi3:latest (2.9 GB)
  • Python 3.8.10 + requests

测试结果

场景 加载时间 Prompt 处理 生成时间 Token 数 总耗时 是否达标(≤8s)
冷启动 (首次推理) 54.56s 37.40s 17.22s 86 109.21s 否 (首次加载)
预热 (无限制) 0.06s 0.20s 13.06s 65 13.35s
预热 (num_predict=30) 0.07s 1.41s 2.83s 15 4.34s PASS

结论

  1. 冷启动延迟: 首次推理需加载 2.9GB 模型到内存,耗时 ~55s。建议通过 systemd keep-alive 或定时心跳保持模型常驻
  2. 预热性能: 模型加载后,单图推理可控制在 4-5s限制输出 30 token满足 ≤8s 设计目标
  3. ARM CPU 瓶颈: token 生成速度 ~0.1-0.2s/token多帧分析(5-8帧)需合理设置 num_predict(默认 500)
  4. 已优化: OllamaAdapter 新增 num_predict 可配置参数,默认 500

任务进度

已完成

# 任务 提交 日期
1 项目骨架 + 全部 Python 模块代码 d741ade 2026-08-19
2 DDL 数据库建表脚本 d741ade 2026-08-19
3 部署脚本 + 文档 d741ade 2026-08-19
4 init.py 导出链路 c45464c 2026-08-19
5 Storage-Cleaner 补全 5e4587b 2026-08-19
6 服务器凭证写入 README ba905d2 2026-08-19
7 requirements.txt 兼容 Python 3.8 c1bfac5 2026-08-19
8 Oracle 部署: venv + 依赖 + 导入验证 50d8353 2026-08-19
9 模型基准测试 (llava-phi3 ≤8s PASS) 50d8353 2026-08-19
10 OllamaAdapter 优化 (num_predict) 50d8353 2026-08-19
11 Tailscale 安装 (Oracle + NAS) + 认证 e5ac667 2026-08-19
12 NAS MariaDB DDL 执行 (6 张表) e5ac667 2026-08-19
13 db_layer.py 切换 PyMySQL (45KB 替代 19MB) 完成 2026-08-19
14 config_loader.py 路径修复 (3 级 dirname) 完成 2026-08-19
15 NAS Python 依赖安装 (flask/gunicorn/pymysql/PyYAML) 完成 2026-08-19
16 NAS 代码部署 + FAM-Core 导入验证 PASS 完成 2026-08-19
17 NAS DB 连接验证 PASS (PyMySQL → MariaDB 10.11.11) 完成 2026-08-19
18 config.yaml 实际配置 (FAM-Core + FAM-Edge + FAM-UI) 完成 2026-08-19
19 NAS 启动 FAM-Core (gunicorn, Python 3.10 venv) 完成 2026-08-19
20 Oracle 启动 FAM-Edge (gunicorn) 完成 2026-08-19
21 MariaDB JSON 路径兼容修复 (name_member) 完成 2026-08-20
22 FAM-Core API 全端点测试通过 完成 2026-08-20
23 FAM-Edge 聊天代理端点 (/api/edge/chat) 完成 2026-08-20
24 FAM-UI PyMySQL 迁移 完成 2026-08-20
25 FAM-Core 配置切换至 Oracle 公网 IP 完成 2026-08-20
26 端到端聊天验证 (Core→Edge→Ollama) 完成 2026-08-20
27 NAS 安装 Streamlit + pandas + 部署 FAM-UI 完成 2026-08-20
28 Ollama 模型常驻内存 (OLLAMA_KEEP_ALIVE=-1) 完成 2026-08-20
29 关键帧提取改为自适应帧数 (随视频时长动态计算) 完成 2026-08-20
30 FFmpeg 快速 seek 替代 fps 滤镜 (6-8x 提速) 7ce8aff 2026-08-20
31 真实视频性能基准测试 (30min 360MB 视频) 完成 2026-08-20
32 视频端到端集成测试 (task 289 → SUCCESS, 落库正确) 完成 2026-08-20
33 生产目录切换 forward-only (285 历史视频占位跳过) 完成 2026-08-20
34 今日 17 片段诊断根因Ollama 本地融合 300s 超时) 完成 2026-08-20
35 架构重构移除本地融合run_text_fusion云端 VLM 直出 JSON → format_cloud_result → 直存 DB babf5b0 2026-08-20
36 适配器 chat() 方法 + run_qa 三模型降级Gemini→NVIDIA→Ollama 兜底) babf5b0 2026-08-20
37 端点 /api/edge/chat/ask + chat_handler 改走 Edge 编排qa_url babf5b0 2026-08-20
38 双端部署验证Oracle 7 文件 + 重启NAS chat_handler + config 手术 + HUP实测 /api/edge/chat/ask provider=nvidia、NAS→Edge 编排 43s 落库 完成 2026-08-20
39 fix: NVIDIA 单帧 JSON 解析 — parse_vlm_json 要求全 schema 但 NVIDIA 只返回单帧 JSON改用轻量 _parse_single_frame_json 853cb21 2026-08-20
40 fix: Gemini timeout 30s→90s + 熔断器 threshold 3→5 cooldown 600→300 853cb21 2026-08-20
41 fix: dispatcher crash on invalid failure_stage — Edge 返回 'process' 不在 ENUM 中导致 DataError 崩溃db_layer 加容错映射 + dispatcher per-task try/except d75c745 2026-08-20
42 视频管线批量处理验证 — task 291/297 SUCCESSNVIDIA 6 帧分析 ~15s/任务events + event_details 落库正确 完成 2026-08-20
43 异步任务队列架构 — Edge 端 SQLite 队列 + TokenBucket 速率限制 (Gemini 1000 RPM, NVIDIA 40 RPM, burst 2x) + 消费者线程 02da23e 2026-08-20
44 NAS Dispatcher 重构为 enqueue 模式 — 上传视频后立即返回 202不等 AI 处理结果 02da23e 2026-08-20
45 NAS Poller 线程 — 定期从 Edge /api/edge/results 拉取处理结果写 MariaDB 02da23e 2026-08-20
46 fix: dispatcher/poller 超时分离模式 — timeout 改为 (connect, read) 元组stale_timeout 3600→600s 4f0f19b 2026-08-20
47 异步队列端到端验证 — task 312 (5.7MB e2e clip): 上传38s + Edge处理54s + Poller落库 = 93s 总耗时event_id=12 落库 PASS 完成 2026-08-20
48 分块断点续传上传 — 20MB/块 + 分块级重试(3次) + 断点查询 + /assemble 合并入队 b6c13a9 2026-08-20
49 串行上传 + 看门狗 — Dispatcher limit=1 避免带宽争抢 + 线程存活检测(is_alive) + 60s 看门狗自动重启 + 退避缩短至 30×(n+1)s 881ea3f 2026-08-20
50 fix: 分块大小 5MB + chunk_size 变更防护 — Edge 端 total_chunks 变更自动清理旧分块NAS 端断点续传检测 total_chunks 不匹配时从头上传timeout (60,180) 5915cf4 2026-08-20

待完成

# 任务 依赖 优先级
48 单元测试 (JSON parser, circuit breaker, schema) -
49 Tailscale 防火墙修复 (NAS↔Oracle) -
50 daily_summaries 每日摘要 -
51 视频预压缩 — 360MB 生产视频 HTTP 上传超时/断连,需在 NAS 端预压缩后再上传 Edge5MB 分块已缓解但 72 块仍需 ~18min -

技术决策记录

  1. 移除 google-generativeai SDK 硬依赖 - 代码用 requests 直接调 REST API兼容 Python 3.8
  2. rsync 替代 git clone - Oracle 无法直连 NAS Gitea (无 Tailscale),用 rsync 从本地同步
  3. num_predict 参数 - ARM CPU 上 qwen2.5:7b 生成速度较慢,限制输出 token 数控制延迟
  4. PyMySQL 替代 mysql-connector-python - 45KB 纯 Python 替代 19MB C 扩展NAS 无需编译
  5. MariaDB JSON 路径兼容 - MariaDB 10.11 不支持 MySQL 的 $[*] 通配符 JSON 路径和 -> 操作符name_member() 改用 Python 层解析 + 逐行 UPDATE
  6. Python 3.10 venv - NAS 系统 Python 3.8 过旧,用 Synology Python3.10 包创建 venv
  7. FAM-Edge 聊天代理 - 历史:/api/edge/chat 直连 Ollama 代理;架构重构后被 /api/edge/chat/ask 三模型编排端点取代(旧端点保留兼容)
  8. Oracle 公网 IP 替代 Tailscale - Tailscale 两节点在线但端口不通防火墙edge_url 和 qa_url 改用 Oracle 公网 IP 129.146.203.203
  9. Ollama 模型常驻内存 - systemd 加 OLLAMA_KEEP_ALIVE=-1,模型加载后永不卸载,消除 55s 冷启动延迟,常驻占用 4.3GB 内存(系统 12GB 够用)
  10. 关键帧自适应帧数 - 原固定 5-8 帧对长视频太稀疏30分钟仅8帧=每3.75分钟1帧改为随视频时长自适应候选帧 clamp(duration_min×2, 30, 120),关键帧上限 clamp(duration/150s, 8, 30)。30分钟→12帧60分钟→24帧封顶30帧
  11. 云端直出直存(架构重构) - 本地 Ollama 完全移出视频链路:云端 VLMGemini 多图单请求 / NVIDIA 逐帧聚合)直接产出结构化 JSONEdge 仅 format_cloud_result 格式化/校验(无模型调用)后直存 NAS DB。根因CPU 版 Ollama 对无上限融合 prompt 预填充极慢导致 300s 超时
  12. Q&A 三模型降级编排 - 智能问答由 Edge run_qa 编排Gemini → NVIDIA → 本地 Ollama仅两云端都失败才启用本地兜底各适配器实现 chat() 纯文本接口
  13. FFmpeg 快速 seek 替代 fps 滤镜 - 原方案 ffmpeg -vf fps=1/interval 需全解码视频30min 360MB 视频在 ARM CPU 上需 180s+(超 120s 超时)。改为逐帧 ffmpeg -ss <ts> -frames:v 1 快速 seek仅 33s6-8x 提速)
  14. 异步任务队列架构 (SQLite + TokenBucket) - 原 Dispatcher 同步推送 360MB 视频至 Edge 等待 AI 处理,单任务阻塞 15+ 分钟导致后续任务积压。重构为NAS Dispatcher 仅上传视频入 Edge SQLite 队列202 立即返回)→ Edge 消费者线程异步处理TokenBucket 按 API 限制 2x 速率Gemini 1000 RPM / NVIDIA 40 RPM→ NAS Poller 定期拉取结果写 MariaDB。e2e 验证5.7MB 视频全链路 93s (上传 38s + 处理 54s + 落库 1s)
  15. 超时分离模式 - requests.post(timeout=300) 对大文件上传无总超时限制per-write 不触发),改为 timeout=(10, 60) 分离连接/读取超时,配合 stale_timeout 600s 回收僵尸任务
  16. 生产视频预压缩(待实施) - 360MB 30min 1080p H.264 视频跨公网 HTTP 上传超时/断连,需在 NAS 端 FFmpeg 预压缩(降分辨率/码率)后再上传
  17. 串行上传策略 - Dispatcher 轮询 limit=1一次只处理一个任务避免多任务并行上传争抢带宽。NAS 上行带宽仅 ~1Mbps并行上传会导致所有任务都超时
  18. 5MB 分块大小 - 实测 NAS→Oracle 上行带宽 ~1Mbps1MB 需 6s5MB 需 35s10MB 需 85s。20MB 分块在 ~1Mbps 下需 170s 超出 120s 读取超时。5MB 分块 + timeout(60,180) 在 ~35s/块 下有充裕余量72 块 360MB 约 18min 完成上传
  19. chunk_size 变更防护 - Edge 端 upload_chunk 检测 total_chunks 变更(由 chunk_size 变化导致),自动清理旧分块防止混合不同大小分块导致 assemble 后文件损坏。NAS 端 _query_uploaded_chunks 比对 expected_total != edge_total 时跳过断点续传
  20. 看门狗机制 - app.py 启动 daemon 看门狗线程,每 60s 检查 scheduler/dispatcher/poller 线程 is_alive(),崩溃自动 check_and_restart()。/api/status 改用 thread.is_alive() 替代 _running 标志,防止线程假死误报

真实视频性能基准测试 (2026-08-20)

测试视频: Generic_ONVIF-001-20260819-210403 (30分钟, 360MB, 1080p H.264)

步骤 耗时 详情
1. 视频传输 (NAS→Oracle) 70s 360MB, 5.1 MB/s (Tailscale)
2a. FFmpeg 快速 seek 抽帧 33s 60 张候选帧 (每30s一张)
2b. OpenCV 关键帧筛选 5s MSE 帧差 → 12 张关键帧
2c. 压缩 0.6s 12 帧, 总 1.9MB
3. Ollama llava-phi3 分析 820s 12 帧, avg 68s/帧, 0.9 tokens/s
总计 929s (15.5min) 30 分钟视频处理

AI 分析瓶颈: 帧5耗时 229s (疑似 ARM CPU 热降频), 其余帧 50-65s

FAM-Core API 测试结果 (2026-08-20)

端点 方法 测试数据 结果
/health GET - {"service":"fam-core","status":"ok"}
/api/status GET - {"dispatcher_running":true,"scheduler_running":true}
/api/member/list GET - 返回 2 名成员 (人物A未命名, 人物B=汤圆)
/api/member/unnamed GET - 返回 1 名未命名成员 (人物A)
/api/member/name POST 人物A→张三 成功命名, 0 条事件记录回溯更新
/api/chat/ask POST "今天有什么事件?" 端到端成功, 回答"今天没有观察到张三"

端到端聊天链路验证 (2026-08-20新架构)

用户 → FAM-Core (NAS:8000) → FAM-Edge (Oracle:5000) → Gemini / NVIDIA NIM / 本地 Ollama (兜底)
                              /api/edge/chat/ask        run_qa 三模型降级编排
  • FAM-Core Chat-Handler 调用 qa_url 配置的 http://129.146.203.203:5000/api/edge/chat/ask(不再直连 Ollama
  • FAM-Edge run_qa 按 Gemini → NVIDIA → 本地 Ollama 顺序调用 chat(),首个成功即返回 {answer, provider}
  • 验证结果
    • Edge 单测:/api/edge/chat/ask → 200provider=nvidiaGemini 30s 超时后 NVIDIA 兜底成功,耗时 51s
    • NAS E2E插入临时事件上下文后 /api/chat/ask → 43s 返回模型回答,context_summary 命中 1 条事件chat_id 落库;测试数据已清理
  • 无上下文时走短路分支(直接返回提示,不调 Edge响应 <1s属正常设计