关于DL SYSTEM 设计[zz]

记着Hinton曾经说过:To solve the real-world interesting problems, you need to build a system, not just write a program.

那就听着Hinton老爷子的话,开始研究下如何构建一个Deep Learning System吧(我这里说的DLS仅仅指framework,而framework只能对应到Deep Learning System中的一个部分:Front End)

其实目前主流的framework可以被分为两类: 声明式编程(Declarative Programming)和命令式编程(Imperative Programming) ,这对应到相关知识就是Data Flow和Control Flow,或者是Lazy Evaluation和Eager Evaluation。不熟悉的话就在wiki上看看,还是很容易理解的,大白话就是:命令式编程就是我们通常所说的边定义边执行,而声明式编程则是全部定义完成后再来执行。

而这两种定义方式的优缺点也是非常明显的。命令式编程对炼丹师更友好,方便我们debug,语义上容易理解,灵活,可以帮助我们精确的控制某些具体的行为。缺点就是对于某些语句中对并发和并行等优化的支持就显得非常复杂了。而声明式编程却可以显示的表述出程序中所有语句的并行关系,从而可以借助Engine很容易的来实现一些并行和并发。这也就是我们经常听到的,以声明式编程为主导的framework方便我们更进一步进行图的优化,从而带来性能上的提升。

现在的主流趋势是,所有框架基本都在向(Eager Evaluation,Control Flow,Declarative Programming)模式进行收敛。包括Pytorch,TensorFlow 2.0,MXNet的Gluon接口。为什么会这样?毕竟对用户友好,使用起来灵活,并且符合大多数炼丹师的编程习惯!

不管你是做CV还是做NLP,在framework中,都逃不开data和operator这两个非常重要的概念!当初用过caffe(openpose的官方实现是caffe的),也就走马观花的从代码层面学了下caffe。其实caffe有个很大的缺点,它的设计是通过layer这种抽象,将data和operator绑定在了一起,这在很多时候都是非常不方便的。以至于到了后面出现的所有框架都意识到了这个问题,将data和operator分开存放。对于一些粒度特别细的问题,那些通过compiler生成的代码在一定程度上是不一定能够超过有经验的工程师手工优化过的后的代码的。为了解决这个问题(自动,自动,基于软硬件协同设计的全栈自动优化!!!),也就出现了XLA, TVM, Glow(没错,就是大家所说的深度学习编译器!)

有了data以后,就需要对data进行各种计算(op)的支持,那么不同款framework在这方面的设计有存在不同。TensorFlow是通过Eigen来实现的,mxnet是使用Mshadow来做的,有兴趣的话,可以看看Tianqi写的tutorial

你可能感兴趣的:(关于DL SYSTEM 设计[zz])