finish this part

This commit is contained in:
Jiao77
2025-09-20 00:59:36 +08:00
parent 7cc845b71a
commit 51086f364b
3 changed files with 102 additions and 124 deletions

View File

@@ -6,10 +6,10 @@
</p>
<p>
<a href="https://github.com/your-username/Geo-Layout-Transformer/stargazers"><img src="https://img.shields.io/github/stars/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="https://github.com/your-username/Geo-Layout-Transformer/network/members"><img src="https://img.shields.io/github/forks/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="https://github.com/your-username/Geo-Layout-Transformer/issues"><img src="https://img.shields.io/github/issues-raw/your-username/Geo-Layout-Transformer" /></a>
<a href="https://github.com/your-username/Geo-Layout-Transformer/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/your-username/Geo-Layout-Transformer" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/stargazers"><img src="https://img.shields.io/github/stars/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/network/members"><img src="https://img.shields.io/github/forks/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/issues"><img src="https://img.shields.io/github/issues-raw/your-username/Geo-Layout-Transformer" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/your-username/Geo-Layout-Transformer" /></a>
<a><img src="https://img.shields.io/badge/python-3.12%2B-blue" /></a>
<a><img src="https://img.shields.io/badge/PyTorch-2.x-orange" /></a>
</p>
@@ -115,7 +115,7 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
2) Clone the repository:
```bash
git clone https://github.com/your-username/Geo-Layout-Transformer.git
git clone http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer.git
cd Geo-Layout-Transformer
```
@@ -143,7 +143,7 @@ Notes:
1) Clone the repository:
```bash
git clone https://github.com/your-username/Geo-Layout-Transformer.git
git clone http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer.git
cd Geo-Layout-Transformer
```

View File

@@ -6,10 +6,10 @@
</p>
<p>
<a href="https://github.com/your-username/Geo-Layout-Transformer/stargazers"><img src="https://img.shields.io/github/stars/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="https://github.com/your-username/Geo-Layout-Transformer/network/members"><img src="https://img.shields.io/github/forks/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="https://github.com/your-username/Geo-Layout-Transformer/issues"><img src="https://img.shields.io/github/issues-raw/your-username/Geo-Layout-Transformer" /></a>
<a href="https://github.com/your-username/Geo-Layout-Transformer/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/your-username/Geo-Layout-Transformer" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/stargazers"><img src="https://img.shields.io/github/stars/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/network/members"><img src="https://img.shields.io/github/forks/your-username/Geo-Layout-Transformer.svg" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/issues"><img src="https://img.shields.io/github/issues-raw/your-username/Geo-Layout-Transformer" /></a>
<a href="http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/your-username/Geo-Layout-Transformer" /></a>
<a><img src="https://img.shields.io/badge/python-3.12%2B-blue" /></a>
<a><img src="https://img.shields.io/badge/PyTorch-2.x-orange" /></a>
</p>
@@ -115,7 +115,7 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
2克隆代码仓库
```bash
git clone https://github.com/your-username/Geo-Layout-Transformer.git
git clone http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer.git
cd Geo-Layout-Transformer
```
@@ -143,7 +143,7 @@ uv sync
1克隆代码仓库
```bash
git clone https://github.com/your-username/Geo-Layout-Transformer.git
git clone http://jiao77.cn:3012/Jiao77/Geo-Layout-Transformer.git
cd Geo-Layout-Transformer
```

202
TODO.md
View File

@@ -1,125 +1,103 @@
<!-- TODO.md -->
# TODO — Geo-Layout-Transformer 🚀
# Geo-Layout-Transformer TODOs
目的:遍历项目并把发现的未实现/待完善项整理到此文件,方便后续开发分配与跟踪。📝
本文件汇总项目目标、架构概览、当前完成度与改进计划,按优先级分组并提供可执行清单(复选框)。
简短项目说明 ✨
- 这是一个面向半导体版图GDSII/OASIS的研究型工程目标构建一个混合 GNN + Transformer 的“版图理解基础模型(自监督预训练 + 任务微调),用于热点评估、连通性校验、版图匹配等下游任务。
## 项目目标(简述)
- 构建用于物理设计版图理解的统一基础模型,面向热点检测、连通性验证、结构匹配等任务。
- 采用“GNN Patch Encoder + 全局 Transformer”的混合架构支持自监督预训练与任务头微调。
检索与覆盖说明(工具扫描结果) 🔎
- 已扫描主要入口和核心模块:`README*.md`, `main.py`, `src/models/*`, `src/data/*`, `src/engine/*`, `scripts/*`
- 发现显式未实现/占位符(`pass``TODO`)的位置列在下方
## 架构概览(对应代码位置)
- 数据层:`src/data/`
- `gds_parser.py`GDSII/OASIS 解析、按 patch 裁剪与几何特征提取(使用 gdstk
- `graph_constructor.py`:从几何对象构建 PyG 图节点特征、KNN/Radius 边、元信息)。
- `dataset.py`InMemoryDataset 加载处理后的 `.pt` 数据。
- 模型层:`src/models/`
- `gnn_encoder.py`:可切换 GCN/GraphSAGE/GAT 的 Patch 编码器 + 全局池化。
- `transformer_core.py`Transformer 编码器(正余弦位置编码 + EncoderStack
- `task_heads.py`:分类/匹配任务头;`geo_layout_transformer.py` 组装端到端模型。
- 训练与评估:`src/engine/`
- `trainer.py`监督训练循环BCEWithLogitsLoss缺少 focal loss 等实现。
- `evaluator.py`Accuracy/Precision/Recall/F1/AUC 指标计算。
- `self_supervised.py`:占位式“掩码版图建模”流程,尚不稳定(见改进项)。
- 脚本与入口:
- `scripts/preprocess_gds.py`GDS → 图数据集流水线(保存为 InMemoryDataset
- `scripts/visualize_attention.py`:注意力可视化占位,需实现细节。
- `main.py`:加载配置、构建数据/模型,并在 pretrain/train/eval 模式下运行。
- 配置:`configs/default.yaml``configs/hotspot_detection.yaml`
- 依赖与版本:`pyproject.toml`Python >=3.12Torch/PyG 等);锁文件 `uv.lock`
-一览:显式未实现 / 需要实现(按优先级排序
## 当前完成度(粗略评估
- 已完成
- GDS 解析与 patch 裁剪(含裁剪多边形与面积比例等元信息)。
- 图构建(节点几何/层特征KNN/Radius 边PyG Data 包装)。
- GNN 编码器GCN/GraphSAGE/GAT与 Transformer 主干的基本数据流。
- 监督训练 TrainerBCEWithLogitsLoss、Evaluator 指标管线。
- 预处理脚本与 InMemoryDataset 持久化;基础日志与配置装载/合并。
- README 中安装/运行指引(推荐 uv备选 Conda/Pip
- 进行中/占位
- 自监督预训练self_supervised掩码策略与维度重塑存在假设需调通与验证。
- 注意力可视化脚本:仅说明性注释,未接入模型权重与实际权重提取。
- main.py 数据集切分:目前 train/val 复用同一数据源,留有 TODO。
- 缺失/需改进
- 任务头与损失的更丰富支持(如 focal loss、class weights、masking/采样)。
- 训练循环的验证与早停、最佳模型保存、学习率调度等训练工程化能力。
- 自监督目标的严谨实现mask 索引与 batch/ptr 对齐、掩码、重建头/投影器)。
- 可复现实验脚本与最小数据样例;单元测试与快速 CI 校验。
- CUDA/大图内存管理梯度累积、混合精度、GraphSAINT/Cluster-GCN 等)。
- 可观测性TensorBoard/CSVLogger、随机种子、配置溯源与版本记录
- [ ] 1) 必要:数据处理与加载(高优先级) ⚠️
- 文件:`src/data/dataset.py`
- 问题:继承 `InMemoryDataset``download()``process()` 方法均为 `pass`
- 影响:无法自动将原始 GDS/OASIS 转换并打包为 PyG 可加载的 `data.pt``main.py` 依赖 `LayoutDataset(root=...)` 加载数据,会在没有 `processed` 数据时失败。
- 建议实现:
1. `download()`:可选,从远程或指定路径复制原始文件(若不需要可留空并在 README 标注)。
2. `process()`:读取 `raw_dir` 下已由 `scripts/preprocess_gds.py` 生成的 `.pt` 或中间文件,或直接在此处调用解析与图构建逻辑(调用 `src/data/gds_parser.py``src/data/graph_constructor.py`),最后保存 `torch.save((data, slices), self.processed_paths[0])`
3. 文档化输入目录结构和所需文件名约定。
- 估时38 小时,取决于是否复用 `scripts/preprocess_gds.py`
## 优先级清单(可执行项)
- [ ] 2) 必要:预处理脚本(高优先级) 🔧
- 文件:`scripts/preprocess_gds.py`
- 问题:脚本中存在 `pass``TODO`(未实现从标签文件加载标签或完整的预处理流程)
- 影响:无法从 GDS/OASIS 生成可训练的数据集patch 切分、polygon 裁剪、节点/边构建、保存为 `.pt`
- 建议实现:
1. 实现或封装 `gds_parser`(基于 `gdstk``klayout`)以读取多层几何并输出 polygon 列表与层信息
2. 实现 patch 切分窗口大小、stride、polygon 裁剪与 `is_partial`、area ratio 计算
3. 调用 `graph_constructor` 构造 PyG `Data`节点特征、边、metadata并保存为单个或批量 `.pt` 文件放入 `processed_dir`
4. 提供 `--overwrite``--workers``--verbose` 等 CLI 参数。
- 依赖:`gdstk``klayout`README 中已提及)
- 估时216 小时(实现完整解析 + 并行化视复杂度而定)
### P0立即优先
- [ ] 数据集切分与 DataLoader 管线
- `main.py` 引入可配置的 train/val/test 切分比例与随机种子;支持从目录/清单载入各 split
- `configs/default.yaml` 增加 `splits` 字段;更新 `README*` 用法说明
- [ ] 监督训练工程化
-`trainer.py` 补充验证阶段与最佳模型保存(`torch.save` 至指定路径)
- 引入学习率调度器(如 StepLR/CosineAnnealingWarmRestarts与早停策略
- 支持 class weights/focal loss`trainer.py` 增加 `focal_loss` 实现并在配置选择
- [ ] 自监督预训练修复
- 明确 batch 内每图的 patch 序列映射:根据 `batch.ptr` 逐图生成 mask 索引,避免跨图混淆
- 将掩码作用在输入特征/图结构层而非已池化的图级嵌入或增加“节点级→patch 聚合→重建头”
-`transformer_core` 或单独模块增加重建头MLP以回归原 patch 表征;提供单元测试。
- [ ] 3) 必要:训练脚本中的数据集划分与 checkpoint中/高优先级) 🗂️
- 文件:`main.py`
- 问题:存在 TODO当前将整个 `LayoutDataset` 直接用于 train/val loaders 而非划分;模型 checkpoint 加载被注释(示例中注释掉 `load_state_dict`)。
- 影响:无法做标准的训练/验证/测试分割,也缺少断点重载逻辑
- 建议实现:
1.`main.py` 中实现基于 `random_split` 或按设计文件/布局分层划分(确保跨-layout 的分割策略),并将结果保存 `splits/` 以保证可复现性
2. 实现 checkpoint 的保存(按 epoch/metric和加载逻辑支持 optimizer 和 scheduler state
- 估时13 小时。
### P1高优
- [ ] 任务头与损失扩展
- `task_heads.py` 增加多标签分类、回归头增添可插拔的池化CLS token/Mean/Max/Attention Pool)。
-`trainer.py` 支持多任务训练配置(不同 head/loss 的加权)
- [ ] 训练与日志可观测性
- 增加 TensorBoard/CSVLogger记录 epoch 指标、学习率、耗时;保存 `config``git` 提交信息
- 固定随机种子PyTorch/NumPy/环境变量),在 `utils` 中提供 `set_seed()` 并在入口调用
- [ ] 可复现实验与最小数据
- 提供最小 GDS 示例与对应的 processed `.pt` 小样,便于 CI 与用户快速体验。
-`scripts/` 增加一键跑通的小样流程脚本preprocess→train→eval
- [ ] 4) 必要/需修正:模型中批次/序列维度处理(中优先级) 🧩
- 文件:`src/models/geo_layout_transformer.py`
- 问题:代码里直接用 `nodes_per_graph[0]` 假设每个图sample包含相同数量的 patchnodes然后用 `.view(num_graphs, nodes_per_graph[0], -1)` 强制 reshape。这在真实数据里通常不成立patch 数量/节点数会变化)
- 影响:当样本 patch 数不同或数据使用不定长序列时会崩溃或产生错误的上下文分割
- 建议实现:
1. 使用 `torch_geometric``Batch` 提供的信息按-图聚合 patch embeddings例如对每个图做 mean/max pooling或构建 padded sequences 并 mask
2. 另外可`graph_constructor` 处保证每个样本序列长度固定(但这限制较大)。
- 估时26 小时。
### P2中优
- [ ] 大图/性能优化
- 引入混合精度(`torch.cuda.amp`)、梯度累积、可选更小 batch监控显存
- 探索 GraphSAINT/Cluster-GCN 等大图训练策略,并与当前 patch 划分结合
- [ ] I/O 与生态集成
- `klayout` Python API 的可选集成与安装脚本说明;解析 OASIS 的路径补全与测试
- `graph_constructor.py` 为边策略加入可学习/基于几何关系的拓展(如跨层连接边)。
- [ ] 可解释性与可视化
- 完成 `scripts/visualize_attention.py`:注册 Hook 提取注意力/特征图,绘图并保存到 `docs/`
-`Data.node_meta` 基础上支持几何叠加可视化patch bbox 与局部多边形)。
- [ ] 5) 必要/改进Trainer 功能不完整(中优先级) 🚦
- 文件:`src/engine/trainer.py`
- 问题:仅支持少数优化器和 BCE 损失没有早停、学习率调度、checkpoint 保存、验证调用;示例中注释掉了 Evaluator 的使用
- 影响:难以进行标准训练流程与调参。
- 建议实现:
1. 增加 checkpoint 保存/加载model + optimizer + epoch
2. 支持 scheduler如 CosineAnnealingLR、ReduceLROnPlateau与早停逻辑
3.`run()` 中每个 epoch 后调用 `Evaluator`(或传入回调)做验证与模型选择。
4. 扩展损失函数注册,添加 `cross_entropy``focal``dice`(视任务而定)。
- 估时38 小时。
### P3后续
- [ ] 更丰富的自监督任务
- 对比学习SimCLR/GraphCL/MaskGIT风格、上下文预测、旋转/裁剪增广等
- [ ] 生成式方向探索
- 以 Transformer 编码为条件,尝试版图片段重建/扩展的生成任务。
- [ ] 文档与示例完善
-`README*` 增补训练曲线示例、模型结构图与常见问题FAQ
- [ ] 6) 改进/增强:任务头与可扩展性(中优先级) 🧠
- 文件:`src/models/task_heads.py``src/models/geo_layout_transformer.py`
- 问题:任务头目前仅示例了 classification 与 matching两者接口可能需要标准化输入 shape、masking、loss 约定)
- 建议:定义统一的 Head 接口forward 接受 embeddings + mask可返回 logits + aux并在配置configs/*.yaml中声明 head 类型与损失配置
- 估时24 小时
## 风险与边界条件(建议处理)
- 空 patch/稀疏边界:预处理阶段应丢弃无几何或孤立节点过多的 patch并统计占比。
- 类别不平衡:提供正负样本重采样或损失加权;评估报告中输出混淆矩阵与 PR 曲线
- 版本与兼容:已将 Python 要求更新为 3.12+;如需老版本 Python需回溯依赖并测试
- 随机性:固定随机种子并在日志中写入,以确保结果可复现
- [ ] 7) 可选scripts/visualize_attention.py 与可解释性工具(低优先级) 🔍
- 说明README 提到 attention 可视化,但 `scripts/visualize_attention.py` 需要检查是否完整实现(未详细扫描)。如果目标是可解释性,应实现从 Transformer attention 到版图坐标/多边形映射的工具链。
- 估时412 小时(视可视化深度)。
---
- [ ] 8) 项目文档 & CI低优先级 📚
- 问题:`pyproject.toml` 中 Python 要求为 3.12(但 README 写 3.9+),依赖列表为空,`requirements.txt` 存在但需与 `pyproject` 同步。
- 建议:统一 python 版本约定、完善 `pyproject.toml` dependencies 或使用 `requirements.txt`,添加 basic `tox`/`github actions` 用于 lint/test。
- 估时13 小时。
维护者可按上述优先级推进,每完成一项请勾选对应复选框并在 PR 中引用本条目以便追踪。
隐含的设计改进(建议) 💡
- 增加端到端的单元/集成测试(最小例:人工构造的 patch -> graph -> forward pass确保 pipeline 各步正确。
-`scripts/preprocess_gds.py` 中加入小样本模式debug 用),能快速构造少量样本用于单元测试。
- 考虑在 `src/data/` 中添加一个轻量的 synthetic generator随机几何与层便于 CI 下的快速运行和回归测试。
建议的短期工作分配(建议先做 1→2→3 🔜
- A. 实现 `scripts/preprocess_gds.py`若已有成熟解析器可复用216h
- B. 实现 `src/data/dataset.py::process()` 加载 `processed/` 数据并写入 `data.pt`3h
- C. 修复 `geo_layout_transformer` 中的序列 reshape改为按图聚合或 padding+mask36h
- D. 在 `main.py` 中实现数据划分与 checkpoint load/save13h
- E. 在 `trainer` 中加入 eval & checkpoint36h
- 质量门quality gates
- 在完成 A+B 后,应跑通一个最小端到端 smoke test生成 15 个 processed `.pt`,用 `main.py --mode pretrain``--mode train` 在 1 epoch 上跑通CPU 可行)。
- 增加 2 个单元测试:
1. graph_constructor 测试:输入简单 polygon 输出节点/边及元数据
2. model 前向测试:使用 synthetic batch 验证 forward 不崩溃并返回期望 shape
文件与代码位置清单(已发现的占位实现)
- src/data/dataset.py — download(), process(): pass
- scripts/preprocess_gds.py — 主要预处理逻辑存在 pass/TODO
- main.py — TODO: 数据集划分checkpoint 加载示例被注释
- src/models/geo_layout_transformer.py — 假定每个图拥有相同 patch 数reshape 问题),建议改为可变长度处理
- src/engine/trainer.py — 基础训练循环已实现但缺少评估调用、checkpoint、scheduler 支持
后续步骤(我可以为你做的)
- 如果你同意,我将按优先级 **实现/修复 A + B + C**
1. 实现 `scripts/preprocess_gds.py` 的基础版本(支持 gdstk 作为依赖)并保存 `processed/*.pt`
2.`src/data/dataset.py` 中实现 `process()` 以加载 `processed` 文件并生成 `data.pt`
3. 修复 `geo_layout_transformer` 中的 reshape采用 pooling 或 padded sequences + mask。
4. 运行一个快速 smoke test1 epochCPU并把结果写入 `TODO.md` 下的进度条目。
要求与注意事项(请确认或提供)
- 你希望我直接修改代码并在仓库中提交这些改动吗?(我已准备好直接修改并运行 smoke test
- 如果有偏好的 GDS 解析库(`gdstk``klayout`),请说明;我会优先使用 `gdstk`requirements.txt 已列出)。
需求覆盖映射
- "遍历项目代码,找出项目做什么" —— Done在文档与简短项目说明中覆盖
- "找出哪些没有实现的地方" —— Done列出显式 `pass` / `TODO`,并补充潜在的设计缺陷与改进项)。
- "整理到 TODO.md 里面" —— Done此文件即为输出
变更记录
- 创建:`TODO.md`(列出问题与修复建议)。
最后简短说明:如果你允许我继续实现优先级 A+B+C我将开始具体编码并在每个重要阶段给出进度更新包括运行结果和短时间的 smoke tests