yukyinbaby 2019-06-27
摘要: 做好机器学习到底对工程架构能力有要求吗?看看技术大牛如何说?
工程架构能力对于做好机器学习到底重要吗?可能很多技术人员对于这个问题都有一些自己的看法。中国科学院计算技术研究所严林在知乎上分享了他对于中国问题的看法,本文转发已被授权。在面试中,多多少少会问一些机器学习方向候选人工程架构方面的问题。不少做机器学习的候选人表示,我是做算法的,不需要了解这些工程架构的问题,甚至有表示,了解工程架构就是浪费做算法的时间。我认为,这种想法有些片面和狭隘。从我这几年一些浅薄的经验来看,工程架构能力对于机器学习从业者,不仅重要,而且是必备能力之一。
计算机科学是一门实验科学,不管多么厉害的算法,都是需要落地到应用的。一个好的机器学习算法,更是离不开好的工程实现。
举个例子,FFM算法在各种Kaggle比赛中大放异彩,我们来想想在不借用开源工具的情况下,怎么实现它。首先,核心计算逻辑,本质是不同特征的分成不同field的向量做乘法,那么怎么实现最高效?采用for循环肯定不是一个最优解法,这里就需要知道工程实现上的SIMD了;选哪一种SIMD,首先得知道手上的服务器支持哪一种,这里假设sse和avx都支持,那sse和avx除了数据流位宽有区别,还有什么其他区别吗,同一个语义可能有两种实现选哪一种等等,都离不开工程实现上的理解。假如这部分已经解决了,但是并行度还是不够,希望利用现代CPU多核并行的优势,那么是使用openmp还是自己搞一个线程池,发现使用多线程之后,加速比并不理想,那该怎么排查,是数据上的false sharing还是cache miss不符合预期,如果是如何调整数据,如何做预取,这些都是需要工程思考的。这还没有完,这仅仅是计算,如果并行度足够了,但是发现数据放不进内存(通常都是这样),从磁盘读取的速度还跟不上训练,那怎么实现异步磁盘预取,怎么进行更多地优化,都跟实现紧密相关,因为你不仅需要知道代码怎么写最高效,还需要知道硬盘(HDD和SSD)的特性,对症下药;就算模型训练好了,怎么样把模型dump下来放到线上去,线上去的服务与训练逻辑相比没有了梯度更新,可以做的更快吗;流式更新发现很有帮助,怎么做?这些问题的解决无一不需要对工程的深入了解和掌握。
可能有同学会说,那么多开源的工具,我只需要拿过来会用就行。事实上真会这么容易吗?未必!开源的工具,往往是从通用的角度出发,没有针对特定的业务进行适配,那如何结合自己的业务场景和服务架构做整合,这也是算法人员必须要考虑的一个问题。在实际工作中,开源工具往往不能完全满足自己的需求,需要再在现有的代码做一些开发,那么至少需要了解面对的开源工具的工程架构设计,才能获得一个靠谱的解决方案。以上面说到的FFM举个例子,相信不少同学都听过甚至用过开源实现libffm,现在业务上数据太大(比如1PB),单机搞不定,需要扩展到分布式环境中去,参数也要通过parameter server来存储,这些都是libffm不支持的,那怎么实现呢?首先,从分布式机器学习架构上讲,先确定数据并行还是模型并行,再层级分解问题,到数据通信、parameter server数据组织和并行训练,包括其中一些关键的设计,比如这个分布式算法使用哪种一致性模型,无一不需要了解工程架构。即便就是单机能够搞定,那么serving部分的服务往往也是需要自己实现的。以XGBoost为例,训练好了模型,调用XGBoost预估,如果在多线程场景下,至少需要知道XGBoost这部分code是不是可重入的,如果不是怎么改进,更需要工程基础了。很多时候,使用开源的工具,其成本并不比自己开发一个低多少。
事实上,一个优秀的算法人员,首先必须是一个优秀的工程实现人员。我一直认为,一个算法人员的工程能力,决定了做算法的天花板。工程是算法的基础,基础不够扎实,怎么登高远望呢?大明宫含元殿能够俯瞰京师长安,那是光地基就有15米呀。大家所熟悉的这个领域的各种大牛,不仅仅是算法厉害,工程能力也是了得的。Google Brain的Jeff Dean,这个只要是搞CS的,相信都听过,架构背景自不用多说,Google内部一系列基础的Infrastructure都是他参与的,比如BigTable等等;也正是有这样的工程能力,Google内部的算法迭代能力一直都非常强悍,『天下算法,唯快不破』,人家不仅是聪明,还快!同样的时间,一般人只能做一次迭代,但人家能够迭代五次,探索空间是一般人的五倍,做出来的算法自然很优秀,所以当GNMT出来的时候,大家很震撼,意料之外情理之中嘛,也很有Google的风格:工程真强!这样的case还很多,PS-lite的作者李沐,XGBoost的作者陈天奇,Caffe的作者贾扬清等等。
算法人员任何加强自己的工程架构能力?多写代码只是基本,最重要的是心态和意识。也就是说,要主动意识到工程的重要性。有了这个心态和意识,就会主动的去关注留意相关的知识,获取相关的信息,自发的学习,事半功倍。在这里,推荐看过的马超同学的一个回答,个人觉得不错。
https://www.zhihu.com/questio...
另外三年前,我也整理过一个分布式论文的列表,虽然时间长了点,但仍可参考一二。
https://www.zhihu.com/questio...
有了一定的理论基础之后,就应该动手实验一下了,这里还是要推荐MIT 6.824这门课,里边的lab非常不错,过一遍绝对收益颇多。然后,可以尝试把一些常用的算法,比如LR,尝试做成一个分布式的版本,尝试解决中间遇到的问题;在换个大一点数据集上测试一下,看看有没有一些新问题。如果这些都解决的不错的话,祝贺你,赶紧到实际工作中去提高业务吧。
工程和算法,是一对亲密的兄弟,很多时候,看似算法的问题,抽丝剥茧后发现,本质其实是一个工程问题。人工智能最近两年异常火爆,各种实际应用层出不穷,希望有志于此的同学,工程和算法,两手都要抓,两手都要硬。一家之言,寥寥数语,不知所言。
本文作者:【方向】
本文为云栖社区原创内容,未经允许不得转载。