深度学习项目结构(整理版)
原始资料: Deep Learning Best Practices;原始仓库 fork 版本:yumf24/minimal-lightning-hydra-template created: 2026-07-02 21:34 整理说明: 本版本结合原始笔记和可读取的原始教程重排、补全和翻译,保留常用英文术语。
内容简要概括
这份笔记整理了基于 PyTorch Lightning、Hydra 和 Wandb 的深度学习项目模板结构。核心原则是把配置、源代码、数据、日志、脚本、测试和文档分开管理,让训练、评估、推理和实验复现都有明确入口。最值得记住的是:src/ 管代码逻辑,configs/ 管实验参数,data/ 管输入数据,logs/ 管输出结果。
PyTorch Lightning、Hydra、Wandb、configs/、src/、datamodules、LightningModule、Trainer、logs/、tests/、Makefile、pyproject.toml、项目模板、实验复现
目录
1. 总体目录结构
典型模板结构如下:
├── .github/ # GitHub Actions 工作流配置
│
├── configs/ # Hydra 配置文件目录
│ ├── callbacks/ # 回调函数配置,如 checkpoint、early stopping
│ ├── datamodule/ # 数据模块配置,如数据路径、batch size、num_workers
│ ├── debug/ # 调试模式配置,用于快速跑通或定位问题
│ ├── experiment/ # 实验配置,用于保存一组完整实验参数
│ ├── extras/ # 额外工具配置,如日志打印、异常处理等
│ ├── hparams_search/ # 超参数搜索配置
│ ├── hydra/ # Hydra 自身的配置
│ ├── local/ # 本地环境配置,通常不提交到远程仓库
│ ├── logger/ # 日志工具配置,如 Wandb、TensorBoard
│ ├── model/ # 模型配置,如网络结构、学习率、优化器参数
│ ├── paths/ # 路径配置,如数据目录、日志目录、输出目录
│ ├── trainer/ # PyTorch Lightning Trainer 配置,如 epoch、GPU、精度
│ │
│ ├── eval.yaml # 评估主配置文件
│ ├── train.yaml # 训练主配置文件
│ └── inference.yaml # 推理主配置文件
│
├── data/ # 项目数据目录
├── logs/ # 日志和实验结果目录
├── notebooks/ # Jupyter Notebook 目录,用于探索性分析和原型实验
├── scripts/ # Shell 脚本目录,如训练脚本、数据下载脚本
│
├── src/ # 项目核心源代码
│ ├── datamodules/ # 数据加载与预处理代码
│ ├── models/ # 模型结构、LightningModule、loss、optimizer 等代码
│ ├── utils/ # 工具函数,如日志、路径、配置辅助函数
│ │
│ ├── eval.py # 评估入口脚本
│ ├── train.py # 训练入口脚本
│ └── inference.py # 推理入口脚本
│
├── tests/ # 测试代码目录
│
├── .env.example # 环境变量示例文件
├── .gitignore # Git 忽略文件配置
├── .pre-commit-config.yaml # pre-commit 代码检查和格式化配置
├── .project-root # 项目根目录标记文件
├── environment.yaml # Conda 环境配置文件
├── Makefile # 常用命令快捷入口
├── pyproject.toml # Python 项目配置文件
├── requirements.txt # pip 依赖列表
└── README.md # 项目说明文档
一句话总览:
src/ 负责代码逻辑
configs/ 负责实验参数
data/ 负责输入数据
logs/ 负责输出结果
tests/ 负责可运行性和关键逻辑检查
2. 核心目录职责
2.1 configs/:实验配置目录
configs/ 是 Hydra 配置目录,用来管理训练、评估、推理过程中的参数,避免把参数硬编码到 Python 文件中。
不要在代码中写死:
lr = 1e-3
batch_size = 64
max_epochs = 50
更推荐放到配置文件里,再通过命令行覆盖:
python src/train.py trainer.max_epochs=50 datamodule.batch_size=64 model.lr=1e-3
重要子目录:
| 路径 | 说明 |
|---|---|
configs/model/ |
模型相关配置。 |
configs/datamodule/ |
数据加载相关配置。 |
configs/trainer/ |
训练器配置。 |
configs/logger/ |
日志工具配置。 |
configs/callbacks/ |
回调函数配置。 |
configs/experiment/ |
完整实验配置。 |
configs/debug/ |
调试配置。 |
configs/paths/ |
路径配置。 |
主配置文件:
| 文件 | 说明 |
|---|---|
configs/train.yaml |
训练主配置。 |
configs/eval.yaml |
评估主配置。 |
configs/inference.yaml |
推理主配置。 |
2.2 src/:核心源代码目录
src/ 存放主要 Python 源代码。推荐原则:
训练入口只负责任务调度
模型文件只负责模型定义
数据文件只负责数据读取和预处理
工具函数单独放到 utils
典型结构:
src/
├── datamodules/
├── models/
├── utils/
├── train.py
├── eval.py
└── inference.py
子目录说明:
| 路径 | 说明 |
|---|---|
src/datamodules/ |
数据加载、数据预处理、Dataset、DataLoader。 |
src/models/ |
神经网络结构、LightningModule、loss、optimizer。 |
src/utils/ |
日志、路径、配置处理等通用工具函数。 |
入口脚本说明:
| 文件 | 说明 |
|---|---|
src/train.py |
读取配置、创建模型、创建数据模块、启动训练。 |
src/eval.py |
加载 checkpoint,并在验证集或测试集上评估。 |
src/inference.py |
加载模型,并对新样本预测。 |
2.3 data/:数据目录
data/ 用于存放项目数据,常见拆分:
data/
├── raw/ # 原始数据
├── processed/ # 预处理后的数据
└── external/ # 外部数据或第三方数据
大规模数据通常不要直接提交到 Git。可以在 .gitignore 中忽略:
data/
然后在 README.md 中写清楚下载方式、解压位置和数据目录格式。
2.4 logs/:日志和实验结果目录
logs/ 保存训练、评估、推理产生的结果,包括:
训练日志
评估结果
模型 checkpoint
Hydra 保存的配置文件
Wandb 日志
TensorBoard 日志
示例:
logs/
├── train/
│ └── runs/
├── eval/
│ └── runs/
└── inference/
└── runs/
logs/ 通常也不提交到 Git。
2.5 notebooks/:探索性实验目录
notebooks/ 适合放探索性工作:
数据可视化
数据探索
模型原型验证
错误案例分析
快速实验
正式训练逻辑不建议长期写在 notebook 中。推荐命名:
1.0-jqp-initial-data-exploration.ipynb
含义:
编号-作者缩写-简短描述
2.6 tests/:测试目录
深度学习项目中的测试不只测试模型精度,更重要的是确认代码能跑通:
DataLoader 是否能返回正确 batch
模型 forward 输出 shape 是否正确
loss 是否能正常计算
配置文件是否能正常加载
训练脚本是否能跑通一个 mini batch
示例:
tests/
├── test_datamodule.py
├── test_model.py
└── test_train.py
2.7 scripts/:脚本目录
scripts/ 存放 Shell 脚本或辅助脚本,常见用途:
下载数据
启动训练
批量跑实验
提交集群任务
运行超参数搜索
示例:
scripts/
├── download_data.sh
├── train.sh
└── sweep.sh
2.8 .github/:GitHub Actions 配置
.github/ 通常用于 GitHub Actions workflow:
自动运行测试
自动检查代码格式
自动构建文档
自动发布包
示例:
.github/
└── workflows/
├── tests.yaml
└── docs.yaml
3. 根目录文件职责
| 文件 | 作用 |
|---|---|
.env.example |
环境变量示例文件,只放占位符,不放真实密钥。 |
.gitignore |
忽略数据、日志、缓存、checkpoint、密钥等不应提交的文件。 |
.pre-commit-config.yaml |
配置提交前的代码检查和格式化工具。 |
.project-root |
标记项目根目录,帮助代码从任意子目录定位根路径。 |
environment.yaml |
Conda 环境配置,适合管理 Python、CUDA 和复杂依赖。 |
requirements.txt |
pip 依赖列表,适合记录 Python 包依赖。 |
Makefile |
常用命令快捷入口,例如 make train、make test。 |
pyproject.toml |
Python 项目配置,可管理打包、formatter、linter、pytest 等。 |
README.md |
项目说明文档,帮助他人安装、训练、评估和复现。 |
.env.example 示例:
WANDB_API_KEY=your_wandb_key
DATA_DIR=/path/to/data
LOG_DIR=/path/to/logs
真实 .env 通常包含敏感信息,不应提交到 Git。
.gitignore 常见内容:
data/
logs/
.env
__pycache__/
*.ckpt
wandb/
Makefile 示例:
train:
python src/train.py
test:
pytest tests/
format:
ruff check src tests
README.md 推荐包含:
项目简介
环境安装方法
数据准备方法
训练命令
评估命令
推理命令
项目结构
实验结果
引用方式
License
4. 环境安装和依赖管理
environment.yaml 负责创建基础 Conda 环境,requirements.txt 负责列出 pip 依赖。
完整示例:
conda env create -f environment.yaml
conda activate my_project
pip install -r requirements.txt
命令说明:
| 命令或参数 | 作用 |
|---|---|
conda env create -f environment.yaml |
根据 environment.yaml 创建 Conda 环境。 |
conda activate my_project |
激活名为 my_project 的环境;实际名称取决于 environment.yaml 中的 name 字段。 |
pip install -r requirements.txt |
根据 requirements.txt 安装 pip 依赖。 |
-r |
--requirement 的缩写,表示从依赖文件读取包列表。 |
如果想手动命名环境:
conda create -n my_project python=3.9
conda activate my_project
pip install -r requirements.txt
建议环境名用项目短名,例如 mnist-lightning、segmentation-exp,不要用过于宽泛的 test 或 env。
5. 一次训练流程如何运行
假设运行:
python src/train.py model=cnn datamodule=cifar10 trainer=gpu logger=wandb
整体流程:
1. 启动 src/train.py
2. Hydra 读取 configs/train.yaml
3. train.yaml 组合 model、datamodule、trainer、logger、callbacks 等配置
4. 根据 datamodule 配置创建数据模块
5. 根据 model 配置创建模型
6. 根据 trainer 配置创建 PyTorch Lightning Trainer
7. 开始训练
8. 日志、配置和 checkpoint 保存到 logs/
9. 如果启用 Wandb,同步实验结果到 Wandb
命令中的配置含义:
| 参数 | 作用 |
|---|---|
model=cnn |
切换模型配置组为 CNN。 |
datamodule=cifar10 |
使用 CIFAR-10 数据模块配置。 |
trainer=gpu |
使用 GPU trainer 配置。 |
logger=wandb |
使用 Wandb 记录实验。 |
6. 新项目启动建议
- 先用模板默认配置跑通
python src/train.py。 - 在
src/datamodules/中实现自己的数据读取逻辑。 - 在
configs/datamodule/中写数据路径、batch size 和 worker 数。 - 在
src/models/中实现LightningModule。 - 在
configs/model/中写模型和优化器配置。 - 用
configs/experiment/保存一组完整实验配置,方便复现。 - 用
tests/保证数据、模型 forward、loss 和 mini-batch train 能跑通。 - 用
.gitignore排除data/、logs/、.env、checkpoint 和缓存文件。 - 在
README.md中记录安装、数据准备、训练、评估和推理命令。
待确认问题
- 原始笔记中的 fork 仓库链接
https://github.com/yumf24/minimal-lightning-hydra-template.git未能通过浏览工具读取具体仓库内容;本整理版保留该链接,并参考了可读取的官方教程首页和原始模板仓库页面。