贾扬清的编程水平有多高,为什么能写出像caffe这么厉害的框架?他是怎么提升自己的编程水平的?


--------几天后的补充:我在前年深入研究过caffe代码,主要因我对编程感兴趣,也打算做出类似的框架。我大量参考了caffe,用c#开发了我自己玩的框架,本来只是一时兴趣,没想到收获特别。可以说caffe让我重新认识了深度学习,相当于从原子角度去理解宏观物质的变化,感谢caffe。

------错误纠正:由于对发展历史的不了解,最初写的几点出现了几处错误,被诸位高手指出来:1.caffe不是第一个框架;2.当时cudnn没推出来。

--------以下是原来的回答:

caffe的代码很经典,贾扬清很厉害,更厉害的是他是第一个编出通用深度学习框架的。首创的难处是一切全靠自己,没有经验可参照,这不但要求开发者编程能力极强,还要求他的思想超前,力压群雄,否则机会不会是他的。

从caffe看所需知识和技能,主要是:

1.高性能计算。这个当时时机已成熟,nvidia已经推出cuda和cudnn,只要调用就可以,并非最难。-----后来补充:如果当时没推出cudnn,那么每一个层计算都要用cuda加速,工作量和难度大增,同时运算效率要比cudnn低许多,还带来调试的困难。

2.存储和序列化设计。他为了减轻设计工作量,以及提高模型的通用性,也使用了谷歌的协议代码,还用了开源的内存资料库。里面的难度是模型格式的设计和规划,这不是代码或编程的难度,是软体工程上的难度,没有一定的开发经验是无法设计的,而一旦决定之后是极难更改的。

3.线程调度。这点比较小巧,对编程高手不算什么难度,贾大神应该是轻松搞定。

4.网路机制的设计。如何传递数据,空间效率时间效率问题,以及如何在显卡和内存传递数据。这个设计上并不复杂,他设计了blob来作为基本存储方式。

5.网路预处理,即初始化部分。这是最难的地方之一,一个是包容性,要包容各种类型的层。另一个是整体性,它是层计算、模型解释(把文本描述转化为数据结构)、过程式控制制的纽带,非常难以设计。我估计贾大神在net类中花了不少精力,修改试验了不少办法。

6.层注册。非常巧妙的设计,既与上面的谷歌开源协议有关,又与网路计算方式有关,使得许多代码变得清晰明了。

7.太多了,不写了。总体感觉caffe代码就像一个精致的艺术品,光凭手艺高超是不够的,还需要对当时的视觉方面的深度学习有深刻的理解,对软体工程有熟练的使用经验才能设计出来。特别是具有通用性的软体,因为通用,所以设计必须考虑一切可能,设计难度比个人自用提升十倍。

至于怎样才能达到这样的水平,天才+勤奋+正确的方向。

打了这么多字,从设计角度谈了我个人的部分看法,还有大部分没有提到。总之堪称经典。


一个完备的库或者框架,需要的远远超出单纯的「编程水平」这个范畴。

  1. 你得精擅于对应的业务逻辑。要是不懂机器学习,怎么可能写出机器学习的框架?
  2. 机器学习涉及大量的高性能计算,你得有相应的底层编程的知识,比如内存对齐、SIMD调用、显卡计算。
  3. 需要有大局观,正确处理系统中各个组件的拆分、耦合方式。


需求是创造之母。你想干什么事,发现没有顺手的工具,就自己造一个。

即使自己没有需求,至少要认识有需求的人,这样才有反馈。

如果实在要为了造轮子而造轮子,那就开个公司,然后顾产品经理。。。


大神如何提升编程水平,外人的猜测无非是关乎天赋、勤奋和热情(比如用写博士毕业论文的时间来写 Caffe,而导师认为 Caffe 应该获得更高的优先顺序),但具体的方法还是大神本人分享更加可靠。这里不做猜测。

至于 Caffe 的成功,离不开如下三个层面:

  • 对机器学习演算法和需求的理解

贾大神本来是想用深度学习解决心理学问题的,写 Caffe 的初衷是让演算法用得更 6,将其开源是为了让研究人员玩深度学习更 6。所以说大神懂演算法,知道实现需要什么样的能力。

在Caffe之前,深度学习领域缺少一个完全公开所有的代码、演算法和各种细节的框架,导致很多的研究人员和博士生(例如我)需要一次又一次重复实现相同的演算法,这不好。我觉得作为一个科研人员,还是需要有开放的胸怀来帮助整个社区的发展,所谓不忘初心,方得始终。

  • 良好的设计和开发模式

贾大神在框架开发上会强化 Caffe 受大家长期热爱的特点,比如稳定的模型架构、合理的设备抽象等,比如 Caffe2 出于性能考虑不做对动态图的支持。

Caffe2的任务就是提供最佳的性能,而如果想要极端灵活的计算,请选择PyTorch。

另外就是开源的模式,让大家都能使用,都能反馈,都能贡献,所以软体有生命力。

  • 扎实的基本功

深度学习系统涉及演算法结构,也涉及高性能计算,需要解决的问题比较多,大神见多时光,掌握的知识多,可以更从容地为问题选择解决办法。比如:

我个人觉得在研究生阶段,特别是机器学习的研究生阶段,学一点实际的编程语言(比如C++和Python)是很有帮助的,我以前大部分程序都在Matlab下实现,但是改用C++和Python以后,发现Matlab下很难实现的很多优化,比如说多GPU,多个机器的通信等等,可以非常容易地实现出来,于是就不再用Matlab了(听起来有点广告嫌疑…)。

参考:

Caffe作者贾扬清,教你如何打造优秀的深度学习架构 | 雷锋网?

www.leiphone.com图标Caffe2正式发布!新框架有何不同?贾扬清亲自解答?

www.sohu.com图标贾扬清:希望Caffe成为深度学习领域的Hadoop-CSDN.NET?

www.csdn.net


编程的技巧需要数年的训练,这包括编程基本功、扎实的计算机体系结构知识、多线程及网路通讯、内存管理、高性能数据操作等等。然后参与过一些底层工具框架的开发,对架构设计驾驭到一定程度之后,应该是可以写出类似的工具库的。

好的工具设计,应该说还是非常耗费心神的,打磨的时间相当长,从开始写代码到成型几个月十几个月都很常见。写出好的代码不是件容易的事情。

另外业务领域的知识特别重要,你需要非常清晰的理解,科学计算、深度神经网路的结构及训练过程,并且有足够的实践经验,这样才能对需求理解非常充分。对业务理解不到位,很可能写出很多没用的冗余代码。


推荐阅读:
查看原文 >>
相关文章