深度学习代码和实验管理的「奇技淫巧」

加入极市专业CV交流群,与  1 0000+来自港科大、北大、清华、中科院、CMU、腾讯、百度  等名校名企视觉开发者互动交流!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注  极市平台  公众号  , 回复  加群, 立刻申请入群~

编辑|极市平台

深度学习模型结构变化程度大,参数多,那么如何高效的进行代码和实验管理?对此,本文整理了一些有价值的观点。

经验总结一

作者:武博文

https://www.zhihu.com/question/269707221/answer/470576066

git管理代码是跟深度学习、科研都没关系的,写代码肯定要用版本管理工具。用不用github个人觉着倒是两可,毕竟公司内是不可能所有代码都挂外部git的。

那么说几个写代码的时候需要注意的地方吧:

1.  试验参数尽量使用config文件传入,并且config尽量与log文件同名保存。

一方面外部传入参数可以避免git上过多的版本修改是由于参数导致的,介于DL不好debug,有时候利用git做一下代码比对是在所难免的;

另一方面当试验了万千版本之后,相信你不会知道哪个model是哪些参数了,好的习惯是非常有效的。另外新加的参数尽量提供default值,方便调用老版的config文件。

2.  尽量让不同的模型之间解耦

同一个项目里,好的复用性是编程的一种非常好的习惯,但是在飞速发展的DL coding中,假设项目是以任务驱动的,这也许有时候会成为牵绊,所以尽量把可复用的一些函数提取出来,模型结构相关的尽量让不同的模型解耦在不同的文件中,反而会更加方便日后的update。否则一些看似优美的设计几个月之后就变得很鸡肋。

3.  在满足一定稳定性的同时,定期跟进新版的框架

往往有个尴尬的情况,从一个项目开始到结束,框架update了好几个版本,新版有一些让人垂涎若滴的特性,但是无奈有些api发生了change。所以在项目内可以尽量保持框架版本稳定,项目开始前尽量考量一下不同版本的利弊,有时候适当的学习是必要的。

另外,对不同的框架怀揣着一颗包容的心。

4. 一次训练的时间挺长的,coding结束不要盲目的就开始跑实验,个人经验提供debug模式来实验小数据+更多的log是个不错的选择。

5.  记录好随着模型update performance的变化,因为可能随时需要退回去重来。

经验总结二

作者: 曲晓峰

https://www.zhihu.com/question/269707221/answer/350542551

代码管理一定是要用 github 的。学生可以申请学生大礼包。github 的教育优惠的说明:Discounted and free plans are available for educational use:

https://education.github.com

实验一定要有报告,要带有所用代码的 commit id (SHA1 hash value),如果数据不多,可以直接把数据塞进来,做一个 submodule 或者单独的 repo(单独的话也得记录预处理过的数据的 commit id)。报告主要是记得每个实验的目的,方法,和结果。实验做多了,忘了做哪个实验,或者忘了实验的目的是什么的,比比皆是。

其实,最好论文、报告使用 overleaf,写作工具是 latex,然后可以与 github repo 或者本地 git repo 同步。这样,论文进度、实验进度、定期汇报、代码版本、数据,都有了统一的版本管理。具体根据情况,可以用 submodule,也可以就是分开几个 repo。

论文、报告中的图表,尽量使用自动生成的(有点类似函数式编程的概念)。当然,实验太漫长的还是没办法。这个实现,可以使用 R 系的 knitr 实现,也可以简单的,实验代码(Matlab 或者 Python)输出 csv,绘图或者列表直接使用 latex 去读取。优点是,实验确保能够重复。同时,数据更新后,报告和论文直接重新编译,也跟着一起更新了。不推荐在实验代码中嵌入绘图输出,前端展示与后端计算,还是分离比较合适。这样不会遇到图片分辨率不够高的问题。同时图片和表格也容易根据环境调整。

当然,latex 本身支持 input 和 include,还有功能更强大的 import 包,可以充分利用。可以复用一些写过的小段。

参考文献,如果中文的比较少,就还是推荐 mendeley,毕竟被 elsevier 收了,还主导了开源 ref 的标准,然后 bib 可以直接同步到 overleaf。如果中文比较多,那还是得用 noteexpress。

------

@cyhone 提到 gitee 和 coding.net。我很早就用过 coding.net,早期 coding.net 主要是在线 IDE,git 托管都没有 pages 服务。还有 gitcafe,现在也被 coding.net 收了。我还做过本地配置,可以同时同步 github/gitcafe/coding.net,其实也很简单,手动修改 .git 里面 remote 的 repo 的地址配置就行,多加几个就可以了,当然要小心。内地 git 的好处,是访问速度快,不会被 Ban。但如果有心做学术,有心软件工程师职业发展,还是尽早建立起完整的 github credit 比较好。github 非常开放,“事业心”没有内地那么重,上下游都有很多可以配套的生态环境。例如说,在 github 上的 jupyter/ipython 的 notebook,可以直接打开。写个教程、汇报、或者交流个实验结果,说明文档/代码/运行结果/图表可以集成在一起展示,非常方便。内地的等位产品,都要搞“生态”,想做点新东西的时候,会比较难搞。

然后公有和私有的问题,可以酌情考虑。公有库确实 github 是最好的选择。私有库,内地服务确实快,海外也有 gitbucket.org 可以用。可以先用私有干活,差不多了,github 公有库发布,或者是有相应的需求了,再用 github。我个人觉得维持多个会有点麻烦,主要是我这边访问 github 也还算方便。但如果受限于网络条件(教育网或者断网太频繁),也没太好的办法,也只能哪个顺手用哪个。我记得四五年前吧,有一段时间,教育网访问 github 比 coding.net 和 gitcafe 还快(捂脸。

推荐阅读:

添加极市小助手微信 (ID : cv-mart) ,备注: 研究方向-姓名-学校/公司-城市 (如:AI移动应用-小极-北大-深圳),即可申请加入 AI移动应用极市技术交流群 ,更有 每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、 干货资讯汇总、行业技术交流 一起来让思想之光照的更远吧~

△长按添加极市小助手

△长按关注极市平台,获取 最新CV干货

觉得有用麻烦给个在看啦~   

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章