18 KiB
PyINT + Gamma 集成总体设计
日期: 2026-04-18
状态: 总体设计
范围: D-InSAR 生产引擎接入、Gamma 精配对接入、配置管理、数据库策略、运维自检、前端入口
1. 结论
本次集成建议采用两条并行但相互衔接的路线:
- 将
PyINT作为新的 D-InSAR 生产引擎接入现有多引擎框架,统一走现有任务队列、运行日志、结果登记与结果目录治理链路。 - 将
Gamma配对能力接入现有“配对基础 -> 配对规划 -> 生产执行”链路,作为数据库粗配对结果之上的精化步骤,而不是替换当前配对基础缓存。
核心判断如下:
PyINT更适合作为“受控外部引擎”集成,而不是直接作为后端内部 Python 库深度嵌入。Gamma精配对是可集成的,但更适合针对“已经筛出的场景集合/网络运行”做二次优化,不适合直接取代当前全库候选对缓存。- 一期集成建议不强制修改数据库主结构;优先复用现有
pairing_network_runs/pairing_network_edges的 JSON 承载精配对元数据。 - 如果二期需要对 Gamma 精配对历史做独立检索、统计和运维闭环,再引入单独迁移文件,并通过现有数据库自维护机制自动落库。
2. 现状与约束
2.1 当前系统已有基础
- 已有 D-InSAR 多引擎抽象:
backend/app/dinsar_engines/base.py - 已有引擎注册表:
backend/app/dinsar_engines/registry.py - 已有生产任务接口与队列:
backend/app/routers/dinsar_production.py - 已有配对基础缓存、网络运行与边追踪:
backend/app/models/orm.pybackend/app/services/pairing_cache_service.pybackend/app/services/pairing_state_service.pybackend/app/services/spatial_service.py
- 已有数据库自维护与 SQL 迁移自动执行:
backend/app/db_maintenance.py - 已有运维自检面板与健康检查汇总:
backend/app/services/health_service.py、frontend/src/HealthCheckPanel.jsx - 已有生产页与配对规划页:
frontend/src/DinsarProductionPanel.jsxfrontend/src/panels/PairPlanningPanel.jsx
2.2 PyINT 项目特征
从 D:\Code\PyINT 现状看,PyINT 不是干净的 SDK,而是以模板和脚本为中心的流程编排层:
- 主入口为
pyint/pyintApp.py - 配对能力入口为
pyint/select_pairs.py - 严重依赖环境变量:
SCRATCHDIRTEMPLATEDIRDEMDIR
- 运行方式偏 Linux / WSL,广泛调用外部命令与 GAMMA CLI
- 更适合作为“流程执行器”被调用,而不是被后端直接 import 后逐步复用内部函数
2.3 明确约束
- 本机只有一个 WSL 环境,不需要设计多 distro 调度系统。
- 系统级 Windows Python 解释器已经在根
.env中维护,可复用,不应再为 PyINT 额外复制一套 Windows Python 配置。 - 管理员口令不应进入设计文档、代码或
.env.example。权限控制继续复用现有登录态与管理员角色校验。 - 现有运维自检面板已经较重,PyINT/Gamma 的“操作入口”不应继续堆在健康检查页里。
3. 总体集成架构
3.1 总体原则
- 不新建平行子系统,优先复用现有引擎、作业、配对、结果目录与目录扫描体系。
- 不改变现有
pairing_metric_cache.spatial_baseline_meters的语义。 - 不把 Gamma 精配对结果直接覆盖数据库粗配对缓存。
- 运维页只看状态,实际操作放在生产页与配对规划页。
3.2 架构分层
A. 生产引擎层
新增 pyint 引擎,挂到现有 registry 中,与 sarscape / isce2 / landsar 并列。
B. WSL 执行适配层
新增受控执行服务,负责:
- 读取
.env配置 - 复用现有 WSL 命令执行与路径转换能力
- 组装
PyINT所需环境变量 - 生成模板文件和运行目录
- 执行
PyINT包装脚本 - 将输出归一化到系统现有结果结构
C. 配对精化层
保留现有数据库候选对缓存与网络运行。
在此基础上新增“Gamma 精配对”步骤:
- 先由当前配对接口生成候选网络
- 再将该网络对应场景集送入 Gamma / PyINT 配对流程
- 生成新的精化网络结果
- 前端允许用户查看并选择使用精化后的网络结果
D. 结果治理层
PyINT/Gamma 原始工作目录不直接作为系统正式结果。
必须经过适配层输出统一结果包,保证继续兼容:
- 结果目录扫描
- 结果目录发布
- 结果目录桥接一致性
- 预览图/缩略图生成
- AI 诊断与 catalog 追踪
4. PyINT 生产引擎设计
4.1 目标
目标不是把 PyINT 原封不动暴露给用户,而是把它包装成当前系统理解的“一个可选生产引擎”。
4.2 推荐实现方式
新增以下后端组件:
backend/app/dinsar_engines/pyint_engine.pybackend/app/services/pyint_service.pybackend/app/pyint_pipeline/run_lt1_pyint_pipeline.py
职责划分:
pyint_engine.py- 实现
DinsarEngine - 暴露
engine_code=pyint - 提供可用性检查、处理 profile、参数 schema
- 实现
pyint_service.py- WSL 执行
- 路径转换
- 模板写入
- 环境变量组装
- 烟测检查
run_lt1_pyint_pipeline.py- 作为受控包装脚本在 WSL 中运行
- 负责把系统已有
Task_*/ 配对任务目录映射成 PyINT 项目工作区 - 调用
pyintApp.py或更细粒度子脚本 - 收集输出并生成系统结果清单
4.3 与当前生产链路的关系
沿用现有生产链路:
前端生产页 -> /dinsar-production/run -> job queue -> pyint_engine.run() -> WSL -> PyINT -> 统一结果包 -> catalog/scan
这样做的收益:
- 不需要新增独立任务中心
- 不需要新增另一套运行日志
- 不需要新增另一套前端生产入口
- 与当前
DinsarProductionPanel.jsx的多引擎 UI 完全兼容
4.4 输入与工作区组织
建议一期仍以当前系统已有的任务目录为输入,不要求用户先手工构造原生 PyINT 项目。
推荐工作区结构:
- 系统输入根目录:沿用当前生产面板
root_dir - PyINT 工作根目录:系统管理目录,例如
backend/runtime/pyint_work - 模板目录:系统管理目录,例如
backend/runtime/pyint_templates - 每次运行独立
run_key - 每个 pair/task 独立 workspace,避免相互污染
4.5 结果输出策略
PyINT 原始输出不能直接作为系统正式结果目录暴露。
推荐新增“输出归一化”步骤,将 PyINT/Gamma 输出转为系统现有 bundle 约定,至少包含:
- 结果主清单
- 关键输出文件路径
- 运行元数据
- pair trace 信息
- engine/profile 信息
必须保证与现有结果目录扫描机制兼容。
4.6 Profile 设计建议
一期建议只开放一个稳定 profile:
lt1_gamma_dinsar
不建议一开始把 PyINT 全部开关都暴露到前端。应只暴露对当前业务必要的参数,例如:
- 是否强制重跑
- 多视参数
- 相干阈值
- geocode 开关
- unwrap 开关
- 超时
其余细节由模板生成器按系统默认值填充。
5. Gamma 精配对设计
5.1 目标定位
Gamma 精配对不替代当前数据库候选对缓存,而是建立在现有候选网络之上的二次精化机制。
推荐定位为:
- 当前数据库配对:全库级、粗筛级、可快速响应
- Gamma 精配对:项目级、网络级、精筛级、可生成更可靠的时空基线网络
5.2 推荐流程
- 用户在现有配对规划页完成粗配对查询
- 后端返回
network_run_id - 用户在“Gamma 精配对”区域发起精化
- 系统根据该网络运行对应的场景集合,构建 PyINT/Gamma 工作区
- 调用
select_pairs.py/base_calc生成精配对网络 - 后端将结果落回系统网络结果表示
- 前端展示“粗配对结果”和“Gamma 精配对结果”的对比摘要
- 用户选择使用哪一版网络继续生产
5.3 为什么不能直接覆盖当前 pairing cache
当前 pairing_metric_cache 里的 spatial_baseline_meters 已经在系统内承担既有语义与下游用途。
Gamma 计算出的垂直基线/网络属性与当前字段不等价,直接覆盖会带来语义混乱和回归风险。
因此必须坚持:
- 现有缓存保留原语义
- Gamma 精配对结果单独存储
- 精配对结果仅作为网络选择依据,不回写粗配对主缓存
5.4 一期存储策略
一期推荐不新建强结构化表,优先复用:
pairing_network_runs.request_params_jsonpairing_network_edges.selection_meta_json
建议约定写入内容:
refinement_engine: gamma_pyintrefinement_source_run_idgamma_bperp_mgamma_tbase_daysgamma_rankgamma_ifgram_list_pathgamma_artifact_dirgamma_selection_reason
同时新增一个新的 network_run_id,把“精配对结果”作为新的网络运行保存,而不是修改原粗配对运行。
这样做的收益:
- 一期可不改数据库结构
- 保留粗配对和精配对双轨结果,便于审计与回退
- 复用现有 network run / edge 追踪模型
5.5 二期可选扩展
如果后续有以下需求,再引入数据库迁移:
- 精配对历史独立检索
- 精配对任务状态长期统计
- 精配对工作区清理与资产追踪
- 精配对失败类型聚合运维
二期建议新增表,例如:
pairing_refinement_runspairing_refinement_artifacts
但这不是一期必须项。
6. 配置与运行管理方案
6.1 配置原则
- Windows 侧解释器继续复用根
.env中已有的PYTHON_PATH - WSL 侧只维护 PyINT/Gamma 运行必须配置
- 因为本机只有一个 WSL 环境,
PyINT与ISCE2默认共用 distro
6.2 建议新增配置项
建议在 .env / .env.example / backend/app/config.py 中新增:
PYINT_ENABLED=false
PYINT_WSL_DISTRO=
PYINT_WSL_PYTHON=
PYINT_HOME=
PYINT_APP_SCRIPT=
PYINT_TEMPLATE_ROOT=
PYINT_WORK_ROOT=
PYINT_OUTPUT_ROOT=
PYINT_DEM_ROOT=
PYINT_GAMMA_ENV_SCRIPT=
PYINT_DEFAULT_TIMEOUT_SECONDS=43200
PYINT_SMOKE_TEST_ENABLED=false
PAIRING_GAMMA_ENABLED=false
PAIRING_GAMMA_WORK_ROOT=
PAIRING_GAMMA_TEMPLATE_ROOT=
PAIRING_GAMMA_TIMEOUT_SECONDS=7200
默认策略建议:
PYINT_WSL_DISTRO为空时,默认取ISCE2_WSL_DISTROPYINT_WSL_PYTHON为空时,默认取ISCE2_PYTHONPYINT_APP_SCRIPT指向pyintApp.pyPYINT_WORK_ROOT/PAIRING_GAMMA_WORK_ROOT使用系统托管目录,不直接让用户任意指定
6.3 不建议写入设计或配置的内容
- 管理员明文密码
- ASF/GACOS 邮箱密码
- WSL sudo 密码
这些信息如确需使用,也应通过运行时安全注入或机器本地安全配置处理,不写入仓库文档。
6.4 管理与治理策略
建议增加以下治理规则:
- 所有 PyINT/Gamma 工作目录按
run_key或network_run_id分目录 - 所有运行都必须写运行摘要 JSON
- 所有正式产物必须进入统一结果发布目录
- 中间工作区可按保留策略定期清理
- 清理动作仅允许管理员执行
7. 数据库与数据库自维护策略
7.1 一期结论
一期建议:
PyINT生产引擎接入不强制改库Gamma精配对接入不强制改库- 优先复用现有 run/edge JSON 元数据承载扩展信息
7.2 二期改库触发条件
当满足以下任意条件时,再进入改库:
- 需要独立查询 Gamma 精配对运行历史
- 需要单独统计 Gamma 精配对失败率
- 需要把精配对资产纳入长期运维对象
- 需要做更细粒度的后台管理界面
7.3 改库时的落地方式
如果二期改库,必须沿用现有数据库自维护机制:
- 在
backend/migrations/新增 SQL 迁移文件,例如007_pyint_gamma_integration.sql - 在
backend/app/db_maintenance.py的MIGRATION_FILES中追加文件名 - 由
ensure_database_ready()在启动时自动执行迁移
约束:
- 不修改既有字段语义
- 不破坏现有
pairing_metric_cache/pairing_network_*查询逻辑 - 迁移必须支持重复执行幂等
8. 运维自检与健康检查设计
8.1 设计原则
运维自检页继续只做“状态观察”,不做主操作入口。
PyINT/Gamma 的正式操作入口放在:
- 生产页
- 配对规划页
8.2 健康检查应新增的内容
建议在引擎可用性检查中加入 PyINT 项:
PYINT_ENABLED- WSL distro 可访问
- WSL Python 可执行
PYINT_HOME存在pyintApp.py存在GAMMA_ENV_SCRIPT可 source- 关键命令如
base_calc可执行 - 模板目录可读
- 工作目录可写
- DEM 根目录可读
8.3 健康页展示策略
不建议在 HealthCheckPanel.jsx 再新增一大块复杂操作区。
建议只保留两类展示:
- 在现有
D-InSAR 引擎卡片中自然显示PyINT - 在健康详情或备注中显示 PyINT/Gamma 的简要检查摘要
不建议:
- 在健康页提供精配对执行按钮
- 在健康页提供模板编辑入口
- 在健康页堆叠大量结果目录说明
8.4 运维修复入口位置
- 引擎级问题:在生产页提示不可用原因
- 配对级问题:在配对规划页处理
- 只有“环境诊断/烟测”可以保留在运维页
9. 后端接口设计
9.1 生产接口
现有 /dinsar-production/engines 和 /dinsar-production/run 可继续复用。
需要做的只是:
- 在引擎注册表中加入
pyint list_engines()自动返回 PyINTsubmit_run()允许engine_code=pyint
9.2 配对接口
建议新增以下接口:
POST /pairing/refine-gamma- 输入:
network_run_id或明确场景列表 - 输出:新的精配对
network_run_id、摘要、警告、产物位置
- 输入:
GET /pairing/networks/{network_run_id}- 继续复用现有接口查看粗配对/精配对网络详情
- 可选:
GET /pairing/refine-gamma/{network_run_id}/artifacts- 用于查看 artifact 摘要,不建议一期必做
9.3 管理接口
建议增加一个轻量管理接口用于 PyINT/Gamma 环境烟测,例如:
POST /dinsar-production/engines/pyint/smoke-check
用途仅限管理员环境校验,不参与正式生产提交。
10. 前端入口与交互布局
10.1 生产页
位置:frontend/src/DinsarProductionPanel.jsx
建议改动:
- 新增
PyINT引擎卡片 - 显示 PyINT 可用性状态
- 根据 profile 展示少量必要参数
- 保留当前“根目录 + 参数 + 提交任务”交互,不新造独立页面
10.2 配对规划页
位置:frontend/src/panels/PairPlanningPanel.jsx
建议新增一个独立区域:
- 标题:
Gamma 精配对 - 放置位置:
配对基础卡片下方,结果与刷新卡片上方
该区域建议包含:
- 粗配对网络摘要
- 发起 Gamma 精配对按钮
- 精配对结果摘要
- 粗配对 / 精配对差异提示
- 选择采用哪一版网络继续生产
不建议把精配对塞进现有健康检查页。
10.3 健康检查页
位置:frontend/src/HealthCheckPanel.jsx
建议只做最小改动:
- 让
D-InSAR 引擎卡片中自动出现PyINT - 如需要,增加一条 PyINT/Gamma 环境说明
不增加复杂控制区,避免界面继续变重。
11. 涉及改动位置
11.1 后端
backend/app/dinsar_engines/registry.pybackend/app/dinsar_engines/pyint_engine.py新增backend/app/services/pyint_service.py新增backend/app/pyint_pipeline/run_lt1_pyint_pipeline.py新增backend/app/routers/dinsar_production.pybackend/app/routers/pairing.pybackend/app/services/health_service.pybackend/app/config.py.env.example
11.2 前端
frontend/src/DinsarProductionPanel.jsxfrontend/src/panels/PairPlanningPanel.jsxfrontend/src/HealthCheckPanel.jsxfrontend/src/api/dinsarProduction.jsfrontend/src/api/pairing.js
11.3 数据库
一期可不改。
二期若改,涉及:
backend/migrations/007_pyint_gamma_integration.sql新增backend/app/db_maintenance.py
12. 分阶段实施建议
Phase 1: PyINT 引擎接入
- 新增
pyint_engine - 完成 WSL 可用性检查
- 完成模板生成与工作目录治理
- 完成生产页引擎选择
- 完成结果归一化与目录扫描兼容
Phase 2: Gamma 精配对 MVP
- 新增
/pairing/refine-gamma - 基于现有
network_run_id做精化 - 精配对结果复用现有 network run / edge 模型表达
- 前端在配对规划页增加精配对区块
Phase 3: 运维与治理补齐
- 增加烟测接口
- 增加工作区清理策略
- 增加 artifact 摘要与失败类型归档
Phase 4: 二期结构化增强
- 若业务确认需要,再加数据库迁移
- 把精配对历史与资产纳入更细粒度可检索对象
13. 风险与规避
13.1 PyINT 代码稳定性
风险:
- 模板字段和脚本依赖较多
- 对目录命名和环境变量较敏感
规避:
- 不做深度 import 复用
- 使用受控包装脚本
- 限制一期只开放一个稳定 profile
13.2 WSL 与路径问题
风险:
- Windows 路径和 WSL 路径混用
- 工作区权限与可写性问题
规避:
- 所有路径统一通过适配层转换
- 工作目录和模板目录由系统托管
13.3 配对语义污染
风险:
- 把 Gamma 垂直基线直接混写进现有粗配对缓存字段
规避:
- 明确不覆盖
pairing_metric_cache语义 - 精配对结果单独落在网络运行元数据中
13.4 前端继续膨胀
风险:
- 把运维、配对、生产操作继续堆到健康检查页
规避:
- 健康页只显示状态
- 生产操作只放生产页
- 配对操作只放配对规划页
14. 最终建议
建议按以下判断执行:
PyINT生产引擎接入:必要,且应尽快按现有多引擎架构落地。Gamma精配对接入:可行,但应作为“粗配对之后的精化层”落地。- 数据库:一期不强制改库;二期若需更强管理能力,再走数据库自维护迁移。
- 运维自检:只加状态,不加大块操作区。
- 前端入口:生产页接
PyINT,配对规划页接Gamma 精配对。