工程架构能力对于做好机器学习重要吗?

简介: 做好机器学习到底对工程架构能力有要求吗?看看技术大牛如何说?

工程架构能力对于做好机器学习到底重要吗?可能很多技术人员对于这个问题都有一些自己的看法。中国科学院计算技术研究所严林在知乎上分享了他对于中国问题的看法,本文转发已被授权。在面试中,多多少少会问一些机器学习方向候选人工程架构方面的问题。不少做机器学习的候选人表示,我是做算法的,不需要了解这些工程架构的问题,甚至有表示,了解工程架构就是浪费做算法的时间。我认为,这种想法有些片面和狭隘。从我这几年一些浅薄的经验来看,工程架构能力对于机器学习从业者,不仅重要,而且是必备能力之一。

1e0389b5d649195ff17edaac3cb1a463f685e616

计算机科学是一门实验科学,不管多么厉害的算法,都是需要落地到应用的。一个好的机器学习算法,更是离不开好的工程实现。

举个例子,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/question/23645117/answer/124708083

另外三年前,我也整理一个分布式文的列表,时间长了点,但仍可参考一二。

https://www.zhihu.com/question/30026369

有了一定的理论基础之后,就应该动手实验一下了,这里还是要推荐MIT 6.824这门课,里边的lab非常不错,过一遍绝对收益颇多。然后,可以尝试把一些常用的算法,比如LR,尝试做成一个分布式的版本,尝试解决中间遇到的问题;在换个大一点数据集上测试一下,看看有没有一些新问题。如果这些都解决的不错的话,祝贺你,赶紧到实际工作中去提高业务吧。

工程和算法,是一对亲密的兄弟,很多时候,看似算法的问题,抽丝剥茧后发现,本质其实是一个工程问题。人工智能最近两年异常火爆,各种实际应用层出不穷,希望有志于此的同学,工程和算法,两手都要抓,两手都要硬。一家之言,寥寥数语,不知所言。

本文由中国科学院计算技术研究所严林贡献,著作权归作者所有,本文经严林老师授权转发!

相关文章
|
3月前
|
自然语言处理 Cloud Native 开发者
【2023年度技术盘点】「年终盘点后端系列」探索服务架构体系的技术风向,构建微服务核心能力(升级版)
回顾过去的几年,我们目睹了科技界的快速发展,其势头如同一列驶向前方的高速列车。作为后端开发者,我们见证了每一次技术革新所带来的广阔前景。这些创新不仅深刻影响着我们的工作方式,而且不断引领我们走向未来。
64 1
|
7月前
|
弹性计算 运维 监控
课时1:微服务架构与混沌工程介绍
课时1:微服务架构与混沌工程介绍
230 0
|
9月前
|
Kubernetes Go 网络架构
Go微服务架构实战 中篇:3. 扩缩容、自愈和故障转移、滚动更新以及回退能力
Go微服务架构实战 中篇:3. 扩缩容、自愈和故障转移、滚动更新以及回退能力
|
9月前
|
Dubbo 前端开发 数据可视化
我为什么选择多边形架构做为工程的基础思想
这里以开源项目alinesno-cloud微服务架构的建设拆分再到整合成产品型结构的进行阐述,从原来的几十个工程基线(近百个服务模块),再到后来的20个左右产品模块的组合,进行服务能力的输出。过程工程由微服务、六边型、再到多边型工程结构的实践经验,这里偏向于工程结构以适应平台产品化发展的变更。
|
10月前
|
机器学习/深度学习 SQL 数据采集
airflow使用指南-机器学习工程自动化
airflow使用指南-机器学习工程自动化
407 0
|
10月前
|
存储 Oracle JavaScript
【架构师之路 二】需要掌握的技能点---工程架构能力
【架构师之路 二】需要掌握的技能点---工程架构能力
109 0
|
11月前
|
运维 Cloud Native 微服务
带你读《云原生架构白皮书2022新版》——组织能力视角
带你读《云原生架构白皮书2022新版》——组织能力视角
106 1
|
11月前
|
架构师 微服务
【业务架构】业务架构师要知道的业务能力热图
【业务架构】业务架构师要知道的业务能力热图
|
11月前
|
架构师 测试技术
【业务架构】业务架构师如何构建业务能力图?
【业务架构】业务架构师如何构建业务能力图?
【业务架构】业务架构师如何构建业务能力图?
|
11月前
「业务架构」业务能力分析导论
「业务架构」业务能力分析导论

热门文章

最新文章