分享嘉宾:姜碧野 阿里巴巴 高级算法专家 编辑整理:杨洁 易仓科技 出品平台:DataFunTalk
**导读:**机器学习框架这个词包含的点和面比较多,各种流派也发展了很多年,有各种不同理解。今天简要结合我的个人经历,分享下我对框架的看法,为论坛后面的内容抛砖引玉。主要包括以下两部分:
BIDMach是我在学校期间参与的一个开源框架项目,这个小而紧凑的框架五脏俱全,很多设计取舍又跟主流框架不太一样。因此我将顺着对BIDMach的介绍,来探讨下一个框架到底需要哪些必要组件。
1、BIDMach简介
BIDMach是2012年在伯克利BID实验室研发的一个开源机器学习框架。 (参见https://github.com/BIDData/BIDMach)不同于一般的主流框架,它除了最底层用JNI调用CUDA/MKL之外,其前后端都统一到了Scala语言。诸如内存管理、计算管理、图计算等都是用Scala写的,是一个简洁且清晰统一的代码框架。 之所以选用Scala,是因为其有很新的语言特性,它可以像C++一样灵活,像Java一样具有很强的可维护性,也同时具有像Python一样的交互编程特性。 正如下面的一段代码一样,通过Scala的语法糖,可以定制出类Matlab的编程语法,可读性非常强。
2、BIDMach架构
下面是BIDMach整体的架构:
BIDMach的整体设计分三层,下层关注于底层硬件的性能并统一封装为矩阵运算和Actor间的通信操作;中间层是各种机器学习算法的计算图封装,而最上层则是面向用户设计的交互式机器学习工具。此外,BIDMach以从上到下的整体Co-design为核心设计思想,在性能方面用Roofline Model优化到硬件的极限,在可用性方面需要有交互和可视化呈现结果以及提供交互式的调参等功能。而框架的语言统一和架构精简,让我们从上到下做到整体协同优化变得格外容易。
3、框架要考虑什么
从对BIDMach的描述,让我们来看看一个框架到底要考虑哪些内容呢?首先,对于一个框架,我们谈论的是:“至少它能解决我们的问题!”否则它就不是一个可用的框架了。而有了基本功能之后,更进一步,框架的可用性和性能都是我们需要去考虑的。可用性是指前端语言的设计和后端架构的设计,它将影响工程师研发和框架二次开发的效率。性能指硬件的高效性,包括编译优化以及芯片上的优化,它将影响程序的执行效率。
02关于工业级框架的思考**
可用性和性能似乎覆盖了大部分对框架的诉求,也会让人觉得框架这个问题已经被解决得很好了。而当我来到公司之后,我发现其实可能框架远不止这些事情。一般来说,类似tensorflow/pytorch这样的深度学习框架,实际上是提供了一个可微计算图引擎,他们可以非常方便地构建一个可微的函数(如下图所示),然后基于数据去最小化损失函数,这种抽象使得深度学习变得非常简单和可行易用。
但是到了工业界,实际的机器学习问题远不止这么简单,我们要重新思考一下框架的职责。框架是只需要专注于做损失函数优化就可以呢?还是会有很多其它事情也要去负责呢?比如图中所示的x、y样本数据本身的生成就是一个很大的问题:比如样例生成或者特征萃取。而且在互联网应用中,我们往往需要从流式的数据流中实时地完成x、y的生成。
另一方面,到了工业界中,训练和推理很可能是要被分开去做的。因为在推理的时候你只需要处理一个固定的计算图,这就存在很多优化的空间。如果一定要把训练和推理一体化,就可能带来很多系统上的难点,所以主流的做法是会把推理和训练分开。此外,用户点击率模型的模型参数往往会很大,模型又要求实时更新,工业应用中又还有资源调度的问题等等。这里面很多问题都是和框架本身的设计或是接口设计息息相关。
所以实际情况是,如果把框架的概念从一个单点应用扩展到一个可用的工业界框架后,就会包含很多模块:样本的处理、特征的处理、离线训练和在线推理,各种数据接口,一致性保障、资源管理和整个实验平台等等一系列工具。这些东西可能从广义来讲都算是框架中的一部分。可能做框架的同学不一定同意我的观点,但TensorFlow和Pytorch等框架如何与外界生态进行桥接确实是需要我们去思考的问题。
用于工业的MLSys@Alimama
通过上面的讨论,会引出这样一个问题:到底如何去维护这样一个复杂的工业级系统? 这里有两点经验值得分享,一个还是Co-design协同设计的概念。我们需要站在框架和算法的中间节点去整体看待这个问题。比如探讨算法的一些需求是如何在现有框架上能以更高性价比实现,以及探讨框架的进一步优化路径如何符合算法的发展趋势。
而这就会引发另一个有意思的现象:框架与算法共同进化。框架和算法实际上是相辅相成,是共同进化迭代的一个过程。我们在整理广告组过去4-5年的经历的时候发现:这个演化过程确实是有周期性的。 工程框架的发展是跟整个算法的红利包括跟整个业务的发展都有关联的。算法侧提出了一个新的结构,框架就需要去做适配和推理优化。框架的革新又会导致算法工程师可以去尝试更复杂更加有意思且更有深度的想法。整个过程就是一个共同进化共同演化的过程。正如Hardware Lottery里所说的那样:“一个研究性想法的取胜是因为当下它更好地适配了已有的软件和硬件”。反之,一个框架是否被广泛应用,也是因为它非常好地响应了当前算法的发展趋势。正如 pytorch 被越来越广泛地应用,也是因为它更适合用来实验新的模型结构。
03****总结
总的来说,当我们谈论框架的时候,我们可以有很多个层面去讨论这个问题。
首先我们可以从可用性,即考虑单个程序员的编程效率; 第二就是机器性能效率,即如何去做编译优化,如何做适配,如何去做图改写,如何去做调度分配等; 第三是组织效率,即考虑这个框架生产化功能是否完备,是否能提供较好的可扩展性以支持工业界的大规模生产化协同工作; 最后是生态层面,也就是要考虑算法的演化路径以及未来几年整个算法的趋势。框架是否能让算法不断尝试新想法,优化社区的整体效率。
最后再借鉴编程语言的例子做下总结。 总有人会问为什么会有这么多的编程语言,其实大体也是因为语言的不断进化,在不同场景下做了不同的权衡。可以看到,同样的原因也正在促使如此多优秀框架的产生,让整个机器学习的生态蓬勃向前发展!
分享嘉宾: