diff --git a/README.md b/README.md index b59e444..2abbaf0 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@

- - - - + + + +

@@ -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 ``` diff --git a/README_zh.md b/README_zh.md index 275a23e..4fa0cfc 100644 --- a/README_zh.md +++ b/README_zh.md @@ -6,10 +6,10 @@

- - - - + + + +

@@ -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 ``` diff --git a/TODO.md b/TODO.md index 4fc7a0b..7aa0b12 100644 --- a/TODO.md +++ b/TODO.md @@ -1,125 +1,103 @@ - -# 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.12,Torch/PyG 等);锁文件 `uv.lock`。 --一览:显式未实现 / 需要实现(按优先级排序) +## 当前完成度(粗略评估) +- 已完成 + - GDS 解析与 patch 裁剪(含裁剪多边形与面积比例等元信息)。 + - 图构建(节点几何/层特征,KNN/Radius 边,PyG Data 包装)。 + - GNN 编码器(GCN/GraphSAGE/GAT)与 Transformer 主干的基本数据流。 + - 监督训练 Trainer(BCEWithLogitsLoss)、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. 文档化输入目录结构和所需文件名约定。 - - 估时:3–8 小时,取决于是否复用 `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 中已提及)。 - - 估时:2–16 小时(实现完整解析 + 并行化视复杂度而定)。 +### 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)。 - - 估时:1–3 小时。 +### 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)包含相同数量的 patch(nodes),然后用 `.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` 处保证每个样本序列长度固定(但这限制较大)。 - - 估时:2–6 小时。 +### 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`(视任务而定)。 - - 估时:3–8 小时。 +### 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 类型与损失配置。 - - 估时:2–4 小时。 +## 风险与边界条件(建议处理) +- 空 patch/稀疏边界:预处理阶段应丢弃无几何或孤立节点过多的 patch,并统计占比。 +- 类别不平衡:提供正负样本重采样或损失加权;评估报告中输出混淆矩阵与 PR 曲线。 +- 版本与兼容:已将 Python 要求更新为 3.12+;如需老版本 Python,需回溯依赖并测试。 +- 随机性:固定随机种子并在日志中写入,以确保结果可复现。 -- [ ] 7) 可选:scripts/visualize_attention.py 与可解释性工具(低优先级) 🔍 -- 说明:README 提到 attention 可视化,但 `scripts/visualize_attention.py` 需要检查是否完整实现(未详细扫描)。如果目标是可解释性,应实现从 Transformer attention 到版图坐标/多边形映射的工具链。 -- 估时:4–12 小时(视可视化深度)。 +--- -- [ ] 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。 -- 估时:1–3 小时。 +维护者可按上述优先级推进,每完成一项请勾选对应复选框并在 PR 中引用本条目以便追踪。 -隐含的设计改进(建议) 💡 -- 增加端到端的单元/集成测试(最小例:人工构造的 patch -> graph -> forward pass),确保 pipeline 各步正确。 -- 在 `scripts/preprocess_gds.py` 中加入小样本模式(debug 用),能快速构造少量样本用于单元测试。 -- 考虑在 `src/data/` 中添加一个轻量的 synthetic generator(随机几何与层),便于 CI 下的快速运行和回归测试。 - -建议的短期工作分配(建议先做 1→2→3) 🔜 -- A. 实现 `scripts/preprocess_gds.py`(若已有成熟解析器可复用):2–16h -- B. 实现 `src/data/dataset.py::process()` 加载 `processed/` 数据并写入 `data.pt`:3h -- C. 修复 `geo_layout_transformer` 中的序列 reshape(改为按图聚合或 padding+mask):3–6h -- D. 在 `main.py` 中实现数据划分与 checkpoint load/save:1–3h -- E. 在 `trainer` 中加入 eval & checkpoint:3–6h - -- 质量门(quality gates) ✅ -- 在完成 A+B 后,应跑通一个最小端到端 smoke test:生成 1–5 个 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 test(1 epoch,CPU),并把结果写入 `TODO.md` 下的进度条目。 - -要求与注意事项(请确认或提供) -- 你希望我直接修改代码并在仓库中提交这些改动吗?(我已准备好直接修改并运行 smoke test)。 -- 如果有偏好的 GDS 解析库(`gdstk` 或 `klayout`),请说明;我会优先使用 `gdstk`(requirements.txt 已列出)。 - -需求覆盖映射 -- "遍历项目代码,找出项目做什么" —— Done(在文档与简短项目说明中覆盖)。 -- "找出哪些没有实现的地方" —— Done(列出显式 `pass` / `TODO`,并补充潜在的设计缺陷与改进项)。 -- "整理到 TODO.md 里面" —— Done(此文件即为输出)。 - -变更记录 -- 创建:`TODO.md`(列出问题与修复建议)。 - -最后简短说明:如果你允许我继续实现优先级 A+B+C,我将开始具体编码并在每个重要阶段给出进度更新(包括运行结果和短时间的 smoke tests)。