摘要: 作好机器学习到底对工程架构能力有要求吗?看看技术大牛如何说?
工程架构能力对于作好机器学习到底重要吗?可能不少技术人员对于这个问题都有一些本身的见解。中国科学院计算技术研究所严林在知乎上分享了他对于中国问题的见解,本文转发已被受权。在面试中,多多少少会问一些机器学习方向候选人工程架构方面的问题。很多作机器学习的候选人表示,我是作算法的,不须要了解这些工程架构的问题,甚至有表示,了解工程架构就是浪费作算法的时间。我认为,这种想法有些片面和狭隘。从我这几年一些浅薄的经验来看,工程架构能力对于机器学习从业者,不只重要,并且是必备能力之一。面试
计算机科学是一门实验科学,无论多么厉害的算法,都是须要落地到应用的。一个好的机器学习算法,更是离不开好的工程实现。算法
举个例子,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,尝试作成一个分布式的版本,尝试解决中间遇到的问题;在换个大一点数据集上测试一下,看看有没有一些新问题。若是这些都解决的不错的话,祝贺你,赶忙到实际工做中去提升业务吧。学习
工程和算法,是一对亲密的兄弟,不少时候,看似算法的问题,抽丝剥茧后发现,本质实际上是一个工程问题。人工智能最近两年异常火爆,各类实际应用层出不穷,但愿有志于此的同窗,工程和算法,两手都要抓,两手都要硬。一家之言,寥寥数语,不知所言。
本文做者:【方向】
本文为云栖社区原创内容,未经容许不得转载。