今天上午两个学生找我反馈,说自己写的一份代码昨天在 MegStudio 上还可以跑通,现在怎么跑不通了?报错如下图所示:
我一看,原来是 dataloader 在对传入 dataset 的类型做了检查,发现不对劲,然后就挂了。同样的一份代码,怎么之前能跑通,今天就突然跑不通了呢?费劲交流了一下才发现,在未经过人为调整的情况下,MegStudio 项目所用的 MegEngine 版本发生了变化,从 v1.0.0 变成了 v1.1.0 版本。
MegStudio 改动了什么
MegStudio 后台今日做了一个奇怪的改动,将所有环境为 MegEngine v1.0.0 版本的项目自动替换为 v1.1.0 版本(如下图),这个行为是非预期的。我们希望 MegStudio 上能够添加对 MegEngine v1.1.0 版本的支持,指的是在创建新项目以及编辑项目环境的时候 MegEngine v1.1.0 版本能作为可选项,而不是将其它已经写好的 v1.0.0 版本的项目全部自动地换成 v1.1.0 版本。
- MegStudio 研发的疑惑是,既然能兼容**(然而目前确实会有兼容性破坏)**,为什么要提供旧版本;
- MegEngine 发版后如何让 MegStudio 进行支持,目前没有清晰具体的流程。
MegEngine 改动了什么
即使 MegStudio 正确地增加了 v1.1.0 版本选项(而不是更新替换 v1.0.0), 一份常见的 v1.0.0 版本的 MegEngine 代码也理应能够在 v1.1.0 版本跑通 —— 这说明 v1.1.0 发生了 Breaking Change.
在远古 MGE-630 需求中提出:要让 dataloader 支持 StreamDataset, 需要对 dataloader 和 dataset 做一定程度的重构。在重构之前,天元的官网教程(以及对应的 MegStudio 官方提供的入门项目)都是教用户直接继承 Dataset 类:
在 v1.1.0 版本中 Dataset 和 Dataloader 都进行了重构,导致用户封装数据集时必须继承自 MapDataset 或 StreamDataset :
得知这一改动后 Tutorials 中也进行了修改:
在 v1.2.0 版本中,MapDataset 被重命名为 Dataset. 教程又可以改回原样了,似乎岁月静好。但是这就导致在 v1.0.0 和 v1.2.0 的 dataloader 代码和 v1.1.0 之间互不兼容, v1.1.0 用户神奇地获得了一个叫做 MapDataset 的概念,然而除了 v1.1.0 版本以外不会再用到。
所以当时在新增对 StreamDataset 支持的时候,为什么没有考虑到原本就有的继承 Dataset 的写法呢?
@xxr 由于对 Commits 的整理(让一切看起来正常),这种奇怪的变动似乎要无迹可寻了。