共计 2227 个字符,预计需要花费 6 分钟才能阅读完成。
旷视开源的深度学习框架 MegEngine,MegEngine 是一个疾速、可拓展、易于应用且反对主动求导的深度学习框架。
以最新的 release 版本 release-1.13.0 为例介绍一下 MegEngine 的代码构造以及如何学习 MegEngine 的代码。
1. 编译
对于学习大型项目,咱们倡议源码编译我的项目而不是间接安装包,这样咱们能够间接批改代码(并编译)再察看咱们的改变的影响。
2. 从一个例子动手,自顶向下
大型项目动辄几千上万条 commit,代码行数也是几十万行起步,把每个 commit、每一行代码都看一遍对于集体开发者来说显然是不事实的。因而咱们应该先从较为重要的、咱们比较关心的文件动手,缓缓拓展咱们对于我的项目的认知。
在 MegEngine 的官网文档中提供了一个用 MegEngine 实现手写数字辨认的例子。
看了这个例子后,你可能会有以下疑难:
- MegEngine 是如何获取数据集的呢?
- MegEngine 如何对数据集进行解决?我又要如何实现本人的数据处理办法呢?
- Functional 中的算子是如何实现计算的呢?GradManager 和 Optimizer 如何治理我的参数梯度呢?
- 训练和推理出了问题,我又该如何调试呢?
- …
每个开发者 / 用户的关注点都可能不同,Python 层作为深度学习框架的入口,咱们能够从这里的代码学习起来:https://github.com/MegEngine/MegEngine/tree/master/imperative/python/megengine
粗略浏览一下目录构造,能够看到这里实现了很多 Python 层的接口,能够挑一个感兴趣的开始看,咱们举荐从 functional 开始,这里实现了罕用的算子,你也能够在这里增加算子。
比方咱们的例子中用了 conv 算子,咱们就能够跳转到这个算子的实现:https://github.com/MegEngine/MegEngine/blob/master/imperative/python/megengine/functional/nn.py#L224,通过浏览函数的正文咱们能够晓得每个参数都是做什么的,逐行读下来之后咱们会发现这里做的最次要的一件事就是把参数扔到一个 builtin.Convolution 的货色之后去执行(apply)了。这里做的事是:python 层的算子实现须要调用 C++ 的算子实现,builtin.xxx 作为一个接口能够了解为让咱们在 Python 程序中接入咱们的 C++ 算子实现。这里能够参考 MegEngine 官网文档中对于增加算子的形容,找到咱们关怀的算子的实现,比方 conv:https://github.com/MegEngine/MegEngine/blob/master/imperative/src/impl/ops/convolution.cpp#L15。
间接看算子的 C++ 实现可能会一头雾水,这时候倡议照着 MegEngine 的官网文档,自底向上看(MegDNN→Graph Runtime→Imperative Runtime):https://www.megengine.org.cn/doc/stable/zh/development/how-to…,因为下层要调用上层的实现。对于各模块作用以及调用关系感到困惑的话能够参考 MegEngine 的架构设计文档:https://www.megengine.org.cn/doc/stable/zh/development/architecture-design/index.html。
3. 如何进阶
理解了一个算子的 Python 实现向下到具体的硬件实现之后, 你可能会有更多的疑难 ,你可能会对 MegEngine 如何提供基础设施反对下层的算法开发感到好奇,咱们再看一眼 MegEngine 的架构设计图:
不得不说单看图就可知这里波及到的组件数量泛滥、调用关系简单。集体是难以在短时间内把握所有组件的架构细节的(更不可能把代码全看一遍了)。咱们举荐依据架构图先简略理解各个模块的性能:每个模块的作用、与上下游其余模块之间的关系。在对于我的项目整体架构有了粗略把握之后,再对咱们感兴趣的模块进行更深刻的钻研。
- MegEngine 中动态图(imperative runtime)局部的内容次要在:https://github.com/MegEngine/MegEngine/tree/master/imperative
- MegEngine 中动态图(graph runtime)局部的内容次要在:https://github.com/MegEngine/MegEngine/tree/master/src
- MegEngine 中硬件算子库(MegDNN)局部的内容次要在:https://github.com/MegEngine/MegEngine/tree/master/dnn
感兴趣的同学能够深刻源码进行钻研,能够边看代码边改、解决我的项目现有的 issues、为仓库奉献代码等都是很好的学习形式。
4. 寻求帮忙
一个人学习大型项目难免会有十分多的疑难,在学习的过程中该当多查阅材料、多于别人交换。遇到困难时能够取得帮忙的伎俩有:
- ChatGPT
- 官网文档
- 官方论坛
- MegEngine 用户交换 QQ 群:1029741705
欢送参加 MegEngine 社区奉献,成为 Awesome MegEngineer,荣誉证书、定制礼品享不停。