9.5 KiB
TODO — Geo-Layout-Transformer 🚀
目的:遍历项目并把发现的未实现/待完善项整理到此文件,方便后续开发分配与跟踪。📝
简短项目说明 ✨
- 这是一个面向半导体版图(GDSII/OASIS)的研究型工程,目标构建一个混合 GNN + Transformer 的“版图理解”基础模型(自监督预训练 + 任务微调),用于热点评估、连通性校验、版图匹配等下游任务。
检索与覆盖说明(工具扫描结果) 🔎
- 已扫描主要入口和核心模块:
README*.md,main.py,src/models/*,src/data/*,src/engine/*,scripts/*。 - 发现显式未实现/占位符(
pass、TODO)的位置列在下方。
-一览:显式未实现 / 需要实现(按优先级排序)
-
1) 必要:数据处理与加载(高优先级) ⚠️
-
文件:
src/data/dataset.py- 问题:继承
InMemoryDataset的download()和process()方法均为pass。 - 影响:无法自动将原始 GDS/OASIS 转换并打包为 PyG 可加载的
data.pt。main.py依赖LayoutDataset(root=...)加载数据,会在没有processed数据时失败。 - 建议实现:
download():可选,从远程或指定路径复制原始文件(若不需要可留空并在 README 标注)。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–8 小时,取决于是否复用
scripts/preprocess_gds.py。
- 问题:继承
-
2) 必要:预处理脚本(高优先级) 🔧
-
文件:
scripts/preprocess_gds.py- 问题:脚本中存在
pass和TODO(未实现从标签文件加载标签或完整的预处理流程)。 - 影响:无法从 GDS/OASIS 生成可训练的数据集(patch 切分、polygon 裁剪、节点/边构建、保存为
.pt)。 - 建议实现:
- 实现或封装
gds_parser(基于gdstk或klayout)以读取多层几何并输出 polygon 列表与层信息。 - 实现 patch 切分(窗口大小、stride)、polygon 裁剪与
is_partial、area ratio 计算。 - 调用
graph_constructor构造 PyGData(节点特征、边、metadata),并保存为单个或批量.pt文件放入processed_dir。 - 提供
--overwrite、--workers、--verbose等 CLI 参数。
- 实现或封装
- 依赖:
gdstk或klayout(README 中已提及)。 - 估时:2–16 小时(实现完整解析 + 并行化视复杂度而定)。
- 问题:脚本中存在
-
3) 必要:训练脚本中的数据集划分与 checkpoint(中/高优先级) 🗂️
-
文件:
main.py- 问题:存在 TODO,当前将整个
LayoutDataset直接用于 train/val loaders 而非划分;模型 checkpoint 加载被注释(示例中注释掉load_state_dict)。 - 影响:无法做标准的训练/验证/测试分割,也缺少断点重载逻辑。
- 建议实现:
- 在
main.py中实现基于random_split或按设计文件/布局分层划分(确保跨-layout 的分割策略),并将结果保存splits/以保证可复现性。 - 实现 checkpoint 的保存(按 epoch/metric)和加载逻辑(支持 optimizer 和 scheduler state)。
- 在
- 估时:1–3 小时。
- 问题:存在 TODO,当前将整个
-
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 数不同或数据使用不定长序列时会崩溃或产生错误的上下文分割。
- 建议实现:
- 使用
torch_geometric的Batch提供的信息按-图聚合 patch embeddings(例如,对每个图做 mean/max pooling,或构建 padded sequences 并 mask)。 - 另外可在
graph_constructor处保证每个样本序列长度固定(但这限制较大)。
- 使用
- 估时:2–6 小时。
- 问题:代码里直接用
-
5) 必要/改进:Trainer 功能不完整(中优先级) 🚦
-
文件:
src/engine/trainer.py- 问题:仅支持少数优化器和 BCE 损失;没有早停、学习率调度、checkpoint 保存、验证调用;示例中注释掉了 Evaluator 的使用。
- 影响:难以进行标准训练流程与调参。
- 建议实现:
- 增加 checkpoint 保存/加载(model + optimizer + epoch)。
- 支持 scheduler(如 CosineAnnealingLR、ReduceLROnPlateau)与早停逻辑。
- 在
run()中每个 epoch 后调用Evaluator(或传入回调)做验证与模型选择。 - 扩展损失函数注册,添加
cross_entropy、focal、dice(视任务而定)。
- 估时:3–8 小时。
-
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 小时。
-
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.tomldependencies 或使用requirements.txt,添加 basictox/github actions用于 lint/test。 -
估时:1–3 小时。
隐含的设计改进(建议) 💡
- 增加端到端的单元/集成测试(最小例:人工构造的 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 个单元测试:
- graph_constructor 测试:输入简单 polygon 输出节点/边及元数据
- 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:
- 实现
scripts/preprocess_gds.py的基础版本(支持 gdstk 作为依赖)并保存processed/*.pt。 - 在
src/data/dataset.py中实现process()以加载processed文件并生成data.pt。 - 修复
geo_layout_transformer中的 reshape,采用 pooling 或 padded sequences + mask。 - 运行一个快速 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)。