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
$ python recipe.py

使用文档

WIP

文件结构

当 Chinopie 第一次运行后,将在代码的同目录下创建同名于传递给 Bootstrap 对象参数的文件夹结构:

1
2
3
4
5
6
7
/logs                训练产生的 log
/opts 训练数据的数据库
/deps/boards 可被 tensorboard 可视化的训练数据
/deps/checkpoints 模型检查点
/deps/data 数据集
/deps/state 训练中的共享数据
.gitignore git 忽略配置文件

建议按照该结构管理你的训练文件及记录。

训练记录

Chinopie 生成的训练记录分为两个部分:纯文本的 log 文件及可被 tensorboard 加载的可视化数据。

你能够在 log 文件中发现所有经 chinopie 管理的日志、指标、中间结果等。合理使用其他命令行工具即可提取你所需要的数据,例如:

1
2
3
4
5
6
# 提取每个 epoch 的 metric 和 loss
$ cat deps/logs/xxxx-xxxx-xxx.log | grep 'END'
# 提取所有超参中的最高性能
$ cat deps/logs/xxxx-xxxx-xxx.log | grep 'best score'
# 提取最优超参
$ cat deps/logs/xxxx-xxxx-xxx.log | grep 'HYPERPARAMETER' -A 10

另外,你也可使用 tensorboard 加载 boards 文件夹来查看可视化的实时数据:

1
$ tensorboard --logdir=deps/boards

代码快照

该功能原型来自于 labrab 项目。

通过在项目文件夹下初始化 git 并启动 Chinopie 的快照功能,你的每份代码在启动实验前都会留存一份增量快照。

  • 快照能够帮助你在快速迭代实验参数、代码、bug 时不至于彻底丢失某个时间的代码版本,帮助你守住最后一道关卡。
  • 若合理利用代码注释,你同样可以直接使用代码快照形成自己的原始实验记录。

为使用该功能,你需要首先在实验代码目录初始化 git 并提交一次。

1
2
3
$ git init
$ git add .
$ git commit -m 'init project'

而后,在再次修改代码后,就可使使用代码快照功能追踪你的实验变动了。

如何访问你的某版本代码

使用以下命令访问快照

1
$ git 

超参优化

Chinopie 内置了易用的超参自动优化。

除直接查看最优参数外,如果你想分析有关超参的可视化数据:

1
$ optuna-board sqlite:///opts/xxxxx.db

微调锁定

Chinopie 提供了微调模型时正确锁定模型参数的改进函数,具体可阅读本文

训练加速

Chinopie 目前提供了以下加速技术

  • early stop:在模型性能无法达标时提前结束当前训练。
  • autocast:自动选用合适精度降低计算量。

使用建议

版本管理

Chinopie 建议实验名称为

1
<name>-<version><label>-<dataset>
  • name: 方法名称
  • version: 方法版本
  • label: 版本后缀(a 无调参,test 测试)
  • dataset: 数据集名

但是你同样可以自行利用三个字段来定义对自己可读的实验名称。

开源代码

Github


  1. 当然,如果你喜欢 Lightning,也可以说 Chinopie 的功能残缺。
  2. 关于这两个东西,可进一步参阅该文章

Chinopie 轻量深度学习框架
https://blog.chenc.me/2023/05/16/project-chinopie/
作者
CC
发布于
2023年5月16日
许可协议