Chinopie 轻量深度学习框架
更新于 2024/08/26。
在搞研究的过程中,我逐渐把一些代码抽出来并写为了这样一个较为简单的框架。
Chinopie 是又一个面向 Pytorch 的深度学习框架,适用于轻量级学术研究场景下的模型训练与验证。
在最开始我希望用 Rust 写这玩意,名字叫 Chino。然后我发现这个框架需要用到未稳定的 GATs 特性,而且我好像自己也很难用到……作罢,回到 Python,并给名字加了一个 Pie (py) 的后缀。
这个框架依然在快速开发和修改中。API 并不稳定。
目标
Chinopie 的目标非常简单,它希望让使用者掌控全局,既不想封装过多细节,也不想提供太多的功能[1]。
- 对初学者较为简单,对有经验者足够清晰。
- 解耦模型设计与脚本。
- 处理深度学习中的各种 dirty work。
理念
- 使用
Recipe
概念解耦模型设计与脚本。 - 使用
Helper
概念形成统一的文件管理,覆盖模型 checkpoint、数据、持久和共享状态、日志等。 - 代码即记录。同时使用
Snapshot
自动记录代码状态,保证所有微小修改都可追溯。 - 使用
Bootstrap
概念提供深度学习中常见的重要功能(如超参优化、进度、日志)和脏处理。 - 内置轻量的分布式训练设计。
提供常见的统计探针和数据集封装。(主要是图像识别)
快速开始
你可以从这个 example 快速开始。
1. 编写你的 Model
按照你喜欢的方式编写你的 model 代码。
不建议在 model 中使用来自 chinopie 的方法。
2. 编写模型 Recipe
Chinopie 认为模型的训练过程应该与 model 完全分离和定义,因此给出了 Recipe 的设计。
在编写完成 model 后,接下来应实现模型的训练过程,recipe。recipe 定义了模型的外部资源、超参数、预载、状态持久、前向传播、损失计算、优化过程、指标统计等整个训练周期的行为,向用户提供了便捷的接口。
对于其用法,可参考这个 example,它在 Stable Diffusion 上利用本框架实现了简单的 Text Inversion 和 LoRA 微调[2]。
3. 启动训练
运行
1 |
|
使用文档
WIP
文件结构
当 Chinopie 第一次运行后,将在代码的同目录下创建同名于传递给 Bootstrap 对象参数的文件夹结构:
1 |
|
建议按照该结构管理你的训练文件及记录。
训练记录
Chinopie 生成的训练记录分为两个部分:纯文本的 log 文件及可被 tensorboard 加载的可视化数据。
你能够在 log 文件中发现所有经 chinopie 管理的日志、指标、中间结果等。合理使用其他命令行工具即可提取你所需要的数据,例如:
1 |
|
另外,你也可使用 tensorboard 加载 boards 文件夹来查看可视化的实时数据:
1 |
|
代码快照
该功能原型来自于 labrab 项目。
通过在项目文件夹下初始化 git 并启动 Chinopie 的快照功能,你的每份代码在启动实验前都会留存一份增量快照。
- 快照能够帮助你在快速迭代实验参数、代码、bug 时不至于彻底丢失某个时间的代码版本,帮助你守住最后一道关卡。
- 若合理利用代码注释,你同样可以直接使用代码快照形成自己的原始实验记录。
为使用该功能,你需要首先在实验代码目录初始化 git 并提交一次。
1 |
|
而后,在再次修改代码后,就可使使用代码快照功能追踪你的实验变动了。
如何访问你的某版本代码
使用以下命令访问快照
1 |
|
超参优化
Chinopie 内置了易用的超参自动优化。
除直接查看最优参数外,如果你想分析有关超参的可视化数据:
1 |
|
微调锁定
Chinopie 提供了微调模型时正确锁定模型参数的改进函数,具体可阅读本文。
训练加速
Chinopie 目前提供了以下加速技术
- early stop:在模型性能无法达标时提前结束当前训练。
- autocast:自动选用合适精度降低计算量。
使用建议
版本管理
Chinopie 建议实验名称为
1 |
|
name
: 方法名称version
: 方法版本label
: 版本后缀(a 无调参,test 测试)dataset
: 数据集名
但是你同样可以自行利用三个字段来定义对自己可读的实验名称。