数据分析 算法工程师技术路线图_第1页
数据分析 算法工程师技术路线图_第2页
数据分析 算法工程师技术路线图_第3页
数据分析 算法工程师技术路线图_第4页
数据分析 算法工程师技术路线图_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

干货:算法工程师技术路线图

工程师能力层级概览

对于不同级别的算法工程师技能要求,我们大致可以分成以下几个层

级:

•初级:可以在一些指导和协助下独立完成开发任务。具体到算法

方面,需要你对于工具框架,建模技术,业务特性等方面有一定

的了解,可以独立实现一些算法项目上的需求。

•中级:可以基本独立完成一个项目的开发与交付。在初级工程师

的基础上,对于深入了解技术原理的要求会更高,并且能够应对

项目中各种复杂多变的挑战,对于已有技术和工具进行改造适

配。在整体工程化交付方面,对于代码质量,架构设计,甚至项

目管理方面的要求会开始显现。另外从业务出发来评估技术选型

和方案也变得尤为重要。

•高级:可以独立负责一条产品线的运作。在中级工程师的基础

上,需要更广阔的技术视野与开拓创新能力,定义整个产品线的

前进方向。解决问题已经不是关键,更重要的是提出和定义问

题,能够打造出在业界具有领先性和差异性的产品,为公司创造

更大的价值。

事实上对于不同层级的工程师,非技术部分的要求都有一定占比。本

文主要聚焦在技术路线图上,对于其他方面的学习进阶路线不会做覆

盖。

编程能力

Python:

Python是算法工程师日常工作中最常用的语言,应该作为必须掌握

的一门技术。大致的学习路线如下:

•学习掌握Python的基本语法,可以通过各类入门教程来看,个

人推荐《LearnPythontheHardWay》o

■自我考核:能够读懂大多数的内部项目及一些开源项目代码的

基本模块,例如pandas,sklearn等。

・学习Python的编程风格,建议学习观远内部的Python代码规

范。

■自我考核:编写的代码符合编码规范,能够通过各类lint检

查。

•Python进阶,这方面有一本非常著名的书《FluentPython》,

深入介绍了Python内部的很多工作原理,读完之后对于各类疑

难问题的理解排查,以及语言高级特性的应用方面会很有帮助。

另外动态语言元编程这块,《Ruby元编程》也是一本非常值得推

荐的书。

■自我考核:能够读懂一些复杂的Python项目,例如

sqlalchemy中就大量使用了元编程技巧。在实际工程项目

中,能够找到一些应用高级技巧的点进行实践,例如基于

Cython的性能优化等。

•领域应用,Python的应用相当广泛,在各个领域深入下去都有很

多可以学习的内容,比如Web开发,爬虫,运维工具,数据处

理,机器学习等。这块主要就看大家各自的兴趣来做自由选择

了,个人推荐熟悉了解一下Pythonweb开发,测试开发相关的

内容,开拓视野。

■自我考核:以Web开发和测试开发为例,尝试写一个简单的

modelservinghttp服务,并编写相应的自动化测试。

Scala/Java:

Java目前是企业级开发中最常用的软件,包括在大数据领域,也是应

用最广泛的语言,例如当年的Hadoop生态基本都是基于Java开发

的。

Scala由于其函数式编程的特性,在做数据处理方面提供了非常方便

的API,也因为Spark等项目的火热,形成了一定的流行度。在进行

企业级的软件开发,高性能,大规模数据处理等方面,JVM上的这两

门语言有很大的实用价值,值得学习。

顺带一提,Scala本身是一门非常有意思的语言,其中函数式编程的

思想与设计模式又是非常大的一块内容,对于拓宽视野,陶冶情操都

是挺不错的选择。

考虑到算法工程师的工作内容属性,这边给出一个Scala的学习路

线:

•学习掌握Scala的基本语法,开发环境配置,项目编译运行等基

础知识。这里推荐Coursera上MartinOdersky的课程,《快

学Scala》或《ProgramminginScala》两本书也可以搭配着浏

览参考。

■自我考核:能使用Scala来实现一些简单算法问题,例如

DFS/BFS。或者使用Scala来处理一些日常数据工作,例如

读取日志文件,提取一些关键信息等。

•学习使用Scala来开发Spark应用,推荐edX上的《BigData

AnalyticsUsingSpark》或者Coursera上的《BigData

AnalyticswithScalaandSpark》,另外有些相关书籍也可以

参考,比如《Spark快速大数据分析》等。

■自我考核:能够使用Spark的ScalaAPI来进行大规模的数

据分析及处理,完成lagfeature之类的特征工程处理。

•JVM的原理学习,Scala/Java都是JVM上运行的优秀语言,其

背后是一个非常大的生态,包括在Web,Android,数据基础架

构等方面有广泛的应用。JVM相比Python虚拟机,发展更加成

熟,有一套非常完善的JDK工具链及衍生的各类项目,便于开发

者debug,调优应用。这方面推荐学习周志明的《深入理解Java

虚拟机》。

■自我考核:理解JVMGC原理,能通过JDK中相关工具或者

优秀的第三方工具如arthas等,排查分析Spark数据应用的

资源使用情况,GCprofiling,hotmethodprofiling等,

进而进行参数优化。

•计算机语言理论。ProgrammingLanguage作为计算机科学的

一个重要分支,包含了很多值得深入研究的主题,例如类型论,

程序分析,泛型,元编程,DSL,编译原理等。这方面的很多话

题,在机器学习方面也有很多实际应用,比如TVM这类工作,涉

及到大量编译原理的应用,知乎大佬"蓝色”也作为这个领域的

专家在从事深度学习框架相关的工作。llvm,clang作者Chris

Lattner也加入Google主导了SwiftforTensorflow等工作。

Scala作为一门学术范非常强的语言,拥有极佳的FP,元编程等

能力支持,强大的类型系统包括自动推理,泛型等等高级语言特

性,相对来说是一门非常"值得"学习的新语言,也是一个进入

PL领域深入学习的"gatewaydrug":)对这个方面有兴趣的同

学,可以考虑阅读《Scala函数式编程》,《冒号课堂》,以及

Coursera上《ProgrammingLanguages》也是一门非常好的

课程。另外只想做科普级了解的同学,也可以读一读著名的《黑

客与画家》感受一下。

C/C++/Rust

当前流行的算法框架,例如TensorFlow,PyTorch,LightGBM等,

底层都是基于C++为主要语言进行实现的。但是C++本身过于复

杂,使用场景也比较有限制,建议只需要达到能够读懂一些基础的

C++代码逻辑即可。

在系统级开发领域,目前有一门新语言逐渐崛起,连续几年被

Stackoverflow投票评选为程序员最喜爱的语言:Rust。从设计理

念和一些业界应用(例如TiKV)来看还是非常不错的,但是我也没

有深入学习了解过,就不做具体推荐了。

这方面建议的学习内容包括经典的《TheCProgramming

Language》以及Rust官方的:gitkuh.cow\/rustru

•自我考核:能够读懂LightUBM里对于tweedieloss的相关定义代

码。

操作系统

基本概念:

我们所编写的算法应用,都是通过操作系统的环境运行在物理硬件之

上的。在实际运作过程中,会碰到不少相关的问题,例如为什么程序

报了资源不足的错误,为什么notebook在浏览器里打不开,为什么

进程hang住了没有响应等等,都需要一些操作系统的知识来帮助理

解和分析问题,最终排查解决。

操作系统涵盖的内容比较多,建议一开始只需要了解一些主要概念

(例如硬件结构,CPU调度,进程,线程,内存管理,文件系统,

10,网络等),对于整体图景有一些感觉即可。后续碰到了实际问

题,可以再在各个部分深入学习展开。

优秀的学习资料也有很多,基本都是大部头,重点推荐《深入理解计

算机系统》,《OperatingSystems:ThreeEasyPieces》,以及

《现代操作系统》。

・自我考核:能够基本明确运行一个模型训练任务过程中,底层使

用到的硬件,操作系统组件,及其交互运作的方式是如何的。

Linux基础:

平时工作中最常用的两个操作系统CentOS和macOS,都是

Unix/Linux系的,因此学习掌握相关的基础知识非常重要。一些必

须掌握的知识点包括:Shell与命令行工具,软件包管理,用户及权

限,系统进程管理,文件系统基础等。

这方面的入门学习资料推荐《鸟哥的Linux私房菜》,基本涵盖了

Linux系统管理员需要掌握知识的方方面面。进阶可以阅读《Unix环

境高级编程》,对于各种系统调用的讲解非常深入,可以为后续性能

调优等高级应用打下基础。

•自我考核:开发一个shell小工具,实现一些日常工作需求,例如

定时自动清理数据文件夹中超过一定年龄的数据文件,自动清理

内存占用较大且运行时间较久的jupyternotebook进程等。

深入应用:

工作中碰到的疑难问题排查,性能分析与优化,系统运维及稳定性工

程等方面,都需要较为深入的计算机体系和操作系统知识,感兴趣的

同学可以针对性的进行深入学习。

以性能优化为例,可以学习经典的《性能之巅》,了解其中的原理及

高级工具链。像其中的系统调用追踪(strace),动态追踪(systemtap,

DTrace,perf,eBPF)等技术,对于操作系统相关的问题排查都会很有

帮助。

•自我考核:能够分析定位出LightGBM训练过程中的性能瓶颈,

精确到函数调用甚至代码行号的级别。

软件工程

算法与数据结构:

暂时先把这块放到软件工程模块下。这里指的算法是计算机科学中的

经典算法,例如递归,排序,搜索,动态规划等,有别于我们常说的

机器学习算法。

这块的学习资料网上有非常多,个人当年是通过普林斯顿的算法课(需

要有Java基础)入门,后来又上了斯坦福的算法分析与设计,开拓了

一些视野。

书籍方面推荐新手从《算法图解》入门,然后可以考虑阅读Jeff

Erickson的《Algorithms》,或者选择上面提到的网课。另外像

《编程珠矶》,《编程之美》等也可以参阅,里面有不少问题的巧妙

解法。

除了从书本中学习,还可以直接去LeetCode等网站进行实战操作进

行练习提高。

•自我考核:能够设计相关的数据结构,实现一个类似airflow中

点击任意节点向后运行的功能。

代码规范:

从初级程序员到中高级程序员,其中比较大的一个差异就是代码编写

习惯上,从一开始写计算机能理解,能够运行成功的代码,逐渐演化

到写人能够理解,易于修改与维护的代码。

在这条学习路径上,首先需要建立起这方面的意识,然后需要在实战

中反复思考和打磨自己的代码,评判和学习其它优秀的项目代码,才

能逐渐精进。

推荐的学习书籍有《编写可读代码的艺术》,一本非常短小精悍的入

门书籍,后续可以再慢慢阅读那些经典大部头,例如《Clean

Code》,《CodeComplete》,《ThePragmatic

Programmer》等。这方面Python也有一本比较针对性的书籍

《EffectivePython》,值得一读。

•自我考核:审视自己写的项目代码,能发现并修正至少三处不符

合最佳编码实践的问题。

设计模式:

在代码架构方面,设计模式是一个重要的话题,对于日常工作中出现

的许多典型场景,给出了一些解决方案的"套路"。这方面最著名的

书当属GoF的《设计模式》,不过个人并不十分推荐,尤其是以

Python作为主要工作语言的话,其中很大部分的设计模式可能并不

需要。入门可以浏览一下这个网站掌握一些基本概念:

「cfacton'八ggunx.c八/dcsi,后续可以考虑阅读《Clean

Architecture》,《重构》等相关数据,理解掌握在优化代码架构过

程中思考的核心点,并加以运用。Python相关的设计模式应用,还

可以参考《PythoninPractice》o

•自我考核:在项目中,找到一处可以应用设计模式的地方,进行

重构改进。

质量保障:

对于需要实际上线运行的软件工程,质量保障是非常重要的一个环

节,能够确保整个产品按照期望的方式进行运作。在机器学习项目

中,由于引入了数据这个因素,相比传统的软件测试会有更高的难

度,也是业界还在摸索前进的方向。

建议可以先阅读《单元测试的艺术》或《Google软件测试之道》,

大致理解软件测试的一些基本概念和运作方式,在此基础上可以进一

步阅读MartinFowler对于机器学习领域提出的CD4ML中相关的测

试环节,学习sklearn,LightGBM等开源库的测试开发方式,掌握

机器学习相关的质量保障技术能力。

•自我考核:在项目中,实现基础的数据输入测试,预测输出测

试。

项目管理:

软件工程推进过程中,项目管理相关的技能方法与工具运用也非常的

关键。其中各种研发流程与规范,例如敏捷开发,设计评审,代码评

审,版本管控,任务看板管理等,都是实际项目推进中非常重要的知

识技能点。

这方面推荐学习一本经典的软件工程教材《构建之法》,了解软件项

目管理的方方面面。进一步来说广义的项目管理上的很多知识点也是

后续深入学习的方向,可以参考极客时间上的课程《项目管理实战20

讲》。

•自我考核:在某个负责项目中运用项目管理方法,完成一个实际

的需求评估,项目规划,设计与评审,开发执行,项目上线,监

控维护流程,并对整个过程做复盘总结。

高级话题:

软件工程师在技能方向成长的一条路线就是成为软件架构师,在这个

方向上对于技能点会有非常高的综合性要求,其中也有不少高级话题

需要深入学习和了解,例如技术选型与系统架构设计,架构设计原则

与模式,宽广的研发知识视野,高性能,高可用,可扩展性,安全性

等等。

有兴趣的同学可以了解一下极客时间的《从0开始学架构》这门课,

逐渐培养这方面的视野与能力。

另外如《微服务架构设计模式》还有领域驱动设计方面的一系列书籍

也值得参考学习。

•自我考核:设计一个算法项目Docker镜像自动打包系统。

算法基础

数据分析:

数学基础:

在进行算法建模时,深入了解数据情况,做各类探索性分析,统计建

模等工作非常重要,这方面对一些数学基础知识有一定的要求,例如

概率论,统计学等。这方面除了经典的数学教材,也可以参考更程序

员向的《统计思维》,《贝叶斯方法》,《程序员的数学2》等书

籍。

•自我考核:理解实际项目中的数据分布情况,并使用统计建模手段,推断预测值

的置信区间。

可视化:

在进行数据分析时,可视化是一个非常重要的手段,有助于我们快速

理解数据情况,发掘数据规律,并排查异常点。对于各种不同类型的

数据,会对应不同的可视化最佳实践,如选择不同的图表类型,板式

设计,分析思路编排,人机交互方式等等。

另一方面,可视化与数据报告也是我们与不同角色人群沟通数据

insights的一个重要途径,需要从业务角度出发去思考可视化与沟通

方式。

这方面可以参考《StorytellingwithData》,《TheVisual

DisplayofQuantitativeInformation^等经典数据,同时也需要培

养自己的商业背景sense,提升沟通能力。

•自我考核:对内沟通方面,能使用可视化技术,分析模型的bad

case情况,并确定优化改进方向。对外沟通方面,能独立完成项

目的数据分析沟通报告。

误差分析与调优:

在做算法模型调优改进中,需要从数据分析的基础上出发来决定实验

方向,这么做有几个好处:

•从分析出发指导调优更有方向性,而不是凭经验加个特征,改个

参数碰运气。哪怕是业务方提供的信息,也最好是有数据分析为

前提再做尝试,而不是当成一个既定事实。

•由分析发现的根源问题,对于结果验证也更有帮助。尤其在预测

的数据量极大情况下,加一个单一特征很可能总体只有千分位准

确率的提升,无法确定是天然波动还是真实的提升。但如果有分

析的前提,那么我们可以有针对性的看对于这个已知问题,我们

的调优策略是否生效,而不是只看一个总体准确率。

•对于问题的彻底排查解决也更有帮助,有时候结果没有提升,不

一定是特征没用,也可能是特征代码有bug之类的问题。带着数

据分析的目标去看为什么这个特征没有效果,是模型没学到还是

特征没有区分度等,有没有改进方案,对于我们评判调优尝试是

否成功的原因也更能彻查到底。

•数据分析会帮助我们发现一些额外的问题点,比如销量数据清洗

处理是不是有问题,是不是业务本身有异常,需要剔除数据等。

这方面在业界有一些关于误差分析的探索研究,不过大多数都是基于

分类问题的,例如《IdentifyingUnknownUnknownsinthe

OpenWorld》,《ACharacterizationofPredictionErrors》

等。可以在了解这些研究的基础上,结合具体的业务情况,深入思考

总结误差分析的思路与方法论。

•自我考核:在项目中形成一套可以重复使用的误差分析方案,能

够快速从预测输出中定位到目前模型最重要的误差类别,并一定

程度上寻找到根本原因。

机器学习基础

传统机器学习:

这块大家应该都非常熟悉了,初阶的学习路线可以参考周志华老师的

《机器学习》,涵盖了机器学习基础,常用机器学习方法,和一些进

阶话题如学习理论,强化学习等。

如果希望深化理论基础,可以参考经典的《PRML》,《ESL》和

《统计学习方法》。在实战中,需要综合业务知识,算法原理,及数

据分析等手段,逐渐积累形成建模调优的方法论,提高整体实验迭代

的效率和成功率。

•自我考核:结合实际业务和机器学习理论知识,挖掘项目中算法

表现不够好的问题,并通过算法改造进行提升或解决。

深度学习:

近些年兴起的深度学习,已经成为机器学习领域一个非常重要的分

支,在各个应用方向发挥了很大的作用。相对于传统机器学习,对于

特征工程要求的降低成了其核心优势。

另一方面,深度学习对于大数据量,大规模算力的应用能力很强,也

一定程度上提升了整体的产出效果。由于理论方面的研究稍显落后,

深度学习在实际应用中对于使用者的经验技能要求相对比较高,需要

有大量的实战经验才能达到比较理想的效果。

这方面的学习资料推荐Keras作者的《DeepLearningwith

Python》,以及《Hands-onMachineLearningwithScikit-

LearnandTensorFlow》,而在理论方面推荐著名的“花书"

《DeepLearning》o

在学习理论原理的基础上,尤其要注意在实际算法应用中,能够通过

观察各种指标与数据分析,找到提升模型的操作改进方向。

•自我考核:能够在实际项目中,使用深度学习模型,达到接近甚

至超过传统GBDT模型的精确度效果,或者通过ensemble,

embedding特征方式,提升已有模型的精度。

领域建模:

目前我们的业务领域在时间序列预测,自然语言处理,推荐等方面,

其它类似图像,搜索,广告等领域也都有各自的一些领域建模方法。

在时间序列领域,包括了传统时序模型,如ARIMA,Prophet,机器

学习模型,如划动窗口特征构建方法结合LightGBM,及深度学习模

型,例如LSTM,seq2seq,transformer等。

这方面可以参考Kaggle上相关比赛的方案分享,以及Amazon,

Uber,天猫等有类似业务场景公司的分享资料。其它领域也是类似,

通过了解历史技术演进,相关比赛,业界的方案分享与开源项目,会

议论文来逐渐掌握学习建模方法,结合实际业务进行实践尝试,积累

起更加体系性的个人知识技能。

•自我考核:在项目中复现一个Kaggle获胜方案,检验其效果,

分析模型表现背后的原因,并尝试进行改进。

算法框架

数据处理框架:

在项目实施过程中,会需要各类复杂的数据处理操作,因此熟练掌握

此类框架就显得尤为重要。

目前行业的标准基本上会参照PandasDataFrame的定义,在数据

量较大的情况下,也有许多类似的框架,如Spark,Dask,

Modin,Mars等支持分布式运行的DataFrame,以及cuDF,

Vaex等提升单机性能的改进实现。

这方面经典的书籍可以参考WesMcKinney的《PythonforData

Analysis》,在掌握基础数据操作的基础上,可以进而了解窗口函

数,向量化性能优化等高级话题。

另外SQL也可以做非常复杂的数据处理工作,有不少公司例如阿里会

以SQL为主来构建数据处理流程,感兴趣的同学也可以学习一下

SQL中各种高级计算的使用及优化方法。

・自我考核:在已有项目中,能把至少三个使用叩ply方法的

pandas处理修改成向量化运行,并测试性能提升。使用

windowfunction或其它方案来实现lag特征,减少join次

数。

机器学习框架:

机器学习方面的新框架层出不穷,一方面我们需要掌握经典框架的使

用方式,理解其模块构成,接口规范的设计,一定程度上来说其它新

框架也都需要遵循这些业界标准框架的模块与接口定义。

另一方面对于新框架或特定领域框架,我们需要掌握快速评估,上手

使用,并且做一定改造适配的能力。一些比较经典的框架有:

•通用机器学习:scikit-learn,SparkML,LightGBM

•通用深度学习:Keras/TensorFlow,PyTorch

•特征工程:tsfresh,Featuretools,Feast

•AutoML:hyperopt,SMAC3,nni,autogluon

•可解释机器学习:shap,aix360,eli5,interpret

•异常检测:pyod,egads

•可视化:pyecharts,seaborn

•数据质量:cerberus,pandas_profiling,Deequ

•时间序列:fbprophet,sktime,pyts

•大规模机器学习:Horovod,BigDL,mmlspark

•Pipeline:MLflow,metaflow,KubeFlow,Hopsworks

一般的学习路径主要是阅读这些框架的官方文档和tutorial,在自己

的项目中进行尝试使用。对于一些核心接口,也可以阅读一下相关的

源代码,深入理解其背后的原理。

•自我考核:在LightGBM框架下,实现一个自定义的损失函数,并跑通训练与

预测流程。

其它框架:

其它比较常见且与算法工程师日常工作会有一些联系的有Web框

架,爬虫框架等,最具有代表性的当属和这两者背后

Flaskscrapyo

各自又是很大一块领域,尤其web开发更是保罗万象。

感兴趣的同学还可以了解一下一些新兴的基于Python3的框架,例

如FastAPI,其背后借鉴的许多现代框架的思想设计,包括数据验

证,序列化,自动文档,异步高性能等,开拓一下知识面。

•自我考核:实现一个简单的modelservinghttp服务。

算法工程交叉

大规模算法运行:

分布式训练:

在很多项目中,数据量达到十亿级以上的情况下,单机训练会难以支

撑。因此分布式训练也是实际工程落地中非常重要的一个主题。

分布式训练涉及到多机的通讯协同方式,优化算法的改造,数据及模

型的并行与聚合,以及框架的选择和运维等话题,具体可以参考《分

布式机器学习》。

另外对于分布式系统,也可以参阅《数据密集型应用系统设计》这本

神作,了解其背后原理。

•自我考核:能够在多机上进行亿级数据的GBDT模型训练与预

测。

高性能计算:

在做大规模的数据训练与推理时,近些年涌现出许多高性能计算优化

的方法,例如从硬件方面,有各种超线程技术,向量化指令集,

GPGPU,TPU的应用等,从软件方面,有针对数值计算场景的

OpenBLAS,有自动并行化的OpenMP,有各种codegen,JIT技

术下的运行时优化等。

这方面可以学习的方向也很多,从基础的并行编程,编译原理及优化

的知识开始,到CUDA,OpenMP的应用(例如Nvidia的

cuDNN,还有LightGBM中也用至I」了OpenMP),Codegen,JIT

等技术在Spark,TVM等项目中的使用等,建议有深度性能优化需

求时可以往这些方向做调研和学习。

•自我考核:能够通过LLVMJIT来优化实现Sparkwindow

function的执行性能。

模型加速领域:

这个方向分两个部分,一块是模型训练方面,能够做到加速,例如使

用大batchsize,迁移学习,持续的在线/增量学习等手段,另一块

在模型预测方面,也有很多加速需求,比如模型参数量优化,模型压

缩,混合精度,知识蒸储等技术手段,都是为了做到更高性能,更低

资源消耗的模型预测推理。

这方面业界有各个方向的文章和技术实现可以参考,比如经典的

《TrainingImageNetin1Hour》,MobileNet,TensorRT,二

值网络等。

•自我考核:在典型的销量预测场景中实现增量训练与预测。

MLops

编排调度:

包含各类pipeline的编排与调度能力的支持,包括数据pipeline,

训练pipeline和servingpipeline等。这方面比较常用的框架工具

有Airflow,DolphinScheduler,Cadence等,需要掌握其基本的

工作原理和使用方式,并能够应用于离线实验与线上运行。

•自我考核:使用Airflow完成一个标准的项目pipeline搭建与运

行。

数据集成:

相对于传统的DevOps,机器学习项目最大的区别在于数据方面的依

赖会更加显著与重要。

这方面的话题包括数据血缘,数据质量保障,数据版本控制等,有各

类工具可以借鉴使用,例如数据版本管理方面的DVC,数据质量方面

的TFXDataValidation,Cerberus,Deequ等。

在方法论层面,《TheMLTestScore》中给出了不少数据相关的具

体测试方法,值得参考学习。

•自我考核:在项目中实现输入数据的分布测试,特征工程测试及

特征重要性准入测试。

实验管理:

这部分也是ML项目的独特之处,在开发过程中有大量的实验及相应

的结果输出需要记录,以指导后续调整优化的方向,并选择最优结果

来进行上线部署。

这方面可以参考的项目有MLflow,fitlog,wandb等。当然对于单

独的项目来说,可能onlineExcel就能满足需求了:

•自我考核:在实际项目中实行一套标准的实验记录手段,并能从

中找出各类实验尝试带来的精度提升的top5分别是哪些操作。

Serving:

目前我们的serving大多数是离线batch预计算的形式,所以主要依

赖的技术手段是各类离线inference的方法,例如直接使用model

predict接口,使用mmlspark等做大规模并行inference等。

如果涉及到在线serving,情况会更加复杂,例如在线pipeline的运

行,实时特征获取,lowlatency/highthroughput的serving服

务等,可以参考TFServing,MLe叩,H20,PredictionlO,

PMML/PFA/ONNX等开发标准模型格式等。

•自我考核:部署一个实时预测服务,能够根据用户输入产生相应

的预测结果。

CI/CD:

软件工程中的持续集成,持续部署已经成为一种标准实践,在算法项

目中,额外引入了数据这个维度的复杂性,带来了一些新的挑战。

在这个方向上,几个主要话题包括自动化测试,pipeline打包部署,

持续监控运维等,可以参考MartinFowler关于CD4ML的文章。工

具系统层面,可以学习传统的Jenkins,也有一些新选择例如

Circled,GoCD,VerCD(Uber)等。

•自我考核:通过Jenkins实现pipeline自动测试,打包,上线流

程。

系统监控:

在整个项目上线后,需要对系统的各个环节进行监控,并对各种异常

情况作出响应。

例如输入数据的监控,判别测试数据与训练数据的分布是否有偏移,

整个运行pipeline的监控,判别是否有运行失败抛出异常的情况,

对于预测输出的监控,确保没有异常的预测输出值,也包括对于系统

计算资源等方面的监控,确保不会因为资源不足导致业务受到影响

等。

在监控信息收集,基础上,还需要配套一系列的自动告警通知,日志

追踪排查等。这方面的工具框架包括TFdatavalidation这类专门针

对算法项目的新产品,也有elasicsearch+kibana这类传统产品。

•自我考核:将三个项目中做过的问题排查改造成常规监控手段,

支持自动的问题发现,告警通知,如有可能,提供自动化或半自

动化的问题排查解决方案。

MLOps系统:

MLOps整体是一个比较大的话题,在这方面有很多产品和系统设计

方面的实践可以参考学习。

例如Uber的Michelangelo系列文章,Facebook的FBLearner,

neptune.ai,dataiku,domino等,虽然没有开源,但是其背后的

很多设计理念,演进思考,白皮书等都非常值得我们学习。

在开源界也有很多可以参考的项目,例如MLflow,Kubeflow,

Metaflow,TFX等,可以学习他们的设计理念,Roadmap,以及实

现细节等。

•自我考核:总结各个MLOps产品的功能模块矩阵对比,能够根

据项目需求来进行产品选型与使用。

工程深入方向

数据库:

数据库原理:

在平时工作中,我们有大量的场景需要用到数据库。从客户数据的对

接,数据集的管理和使用,到各种业务系统的数据表设计及优化等,

都需要对数据库的运作原理,适用场景,运维使用,性能优化等方面

有一定的了解。

常见的需要掌握的概念有OLTPvsOLAP,事务,索引,隔离级别,

ACID与CAP理论,数据同步,数据分片,SQL语法,ORM等。

从底层原理看,会涉及到数据,索引,及日志等存储引擎方面,以及

各种计算查询引擎,包括分布式系统的设计与实现。这方面推荐的学

习资料有《数据库系统内幕》及《数据密集型应用系统设计》。

•自我考核:能够理解SQL执行计划,并能够根据执行计划来做索

引或查询调优。

关系型数据库:

目前常用的关系型数据库主要是MySQL和PostgreSQL,主要需要

掌握的是日常的一些SQL操作,例如DML(增删改查),DDL(创

建表,修改索引等),DCL(权限相关)。

在此基础上还可以进一步了解一些如数据类型,高级计算,存储引

擎,部署运维,范式概念与表结构设计等方面的话题。对于高级话题

这块,推荐《高性能MySQL》与《高可用MySQL》。

•自我考核:在MySQL中设计相关表结构,存储实际项目中的一

系列中间数据集。

NoSQL数据库:

常用的NoSQL数据库有几类,KV存储(Redis),文档数据库

(MongoDB),Wide-column存储(Cassandra,HBase)以及

图数据库(Neo4j)。

在目前我们的算法项目中,比较有可能会用到的主要是Redis这类

KV存储(也可能把Cassandra之类当泛KV来用),或者更新一点

的类似DeltaLake的存储系统。

建议学习了解一下这类KV存储,以及分布式数据库的常见操作方

式,以及基础的运维排查,性能优化方法。

•自我考核:考虑一个线上模型服务的场景,用户输入作为基础特

征,使用类似Redis的KV系统,实现实时获取其它特征,并进

行模型预测。

云计算

基础架构:

IT系统总体的发展趋势在往云计算方向演进,即使是自建的基础设

施,也会采用云计算的一套构建方式,让开发者不用过多的关注底层

计算存储资源的部署运维。

对于应用开发者来说,需要了解一些基础架构方面的知识,例如各类

虚拟化及容器技术,配置管理,容器编排等,便于在日常工作中使用

相关技术来管理和发布应用。

从工具层面看,Docker与k8s等技术发展速度较快,主要还是根据

官方文档来学习为主。浙大之前出版的《Docker-容器与容器云》

一书中有一些更深入的话题的探讨,另外《KubernetesinAction》

中也值得一读。

从方法论层面看,^InfrastructureasCode》和《SiteReiliability

Engineering》是两本非常不错的学习资料。与算法应用结合的虚拟

化,运维,持续集成等都是比较新的领域,需要我们探索出一条可行

路线。

・自我考核:对于已有的算法项目,总结制定一套开发,测试,发

布,运维的标准流程,且尽可能自动化执行。

分布式存储:

前些年最流行的分布式存储是脱胎于Google经典的GFS论文实现

的HDFS,不过随着硬件技术的发展,计算存储分离思想的逐渐兴

起,不但灵活性更高,成本更低,且各自架构的复杂度也大大降低

了。

因此目前更建议学习简单的objectstore形式的分布式存储,例如

s3,minio等。在此基础上的一些存储系统,例如DeltaLake,提

供了事务,高效的upsert,timetravel等功能,也值得关注与学

习。原理方面,还是推荐《数据密集型应用设计》这本。

•自我考核:在项目中实现不同机器能够访问同一个S3路径的文

件,并进行正常的数据读写,模型文件读写等功能。

分布式计算:

大数据时代的分布式计算的鼻祖来自于Google经典的MapReduce

论文,后续在Hadoop系统中做了开源实现,在前几年是非常火热的

一项技术。

目前业界的主流是Spark和Flink,前者在批处理计算中处于霸者地

位,后者是流处理领域的领先者。目前我们的业务应用中,Spark是

比较常用的分布式计算引擎,其基本操作相关内容比较简单,参考官

方文档或者《Spark快速大数据分析》即可。

后续的主要难点会有大数据量下的问题排查与性能调优,执行复杂计

算或与Python相关UDF的交互配合方式等。这方面需要对Spark

的系统架构,内部原理有一定了解,例如master,worker,

driver,executor等之间的关系,lazyevaluation,DAG的

lineage与stage概念,shuffle优化,wholestagecodegen等技

术细节。

这方面暂时没有找到比较好的资料,主要还是依赖实际问题解决的经

验积累。

•自我考核:用Spark来实现项目中的特征工程,并在一定数据量

情况下取得比单机Pandas更好的性能效果。

其它话题:

其它云服务基础设施还包括分布式数据库,消息队列,zk/raft分布

式协作系统,虚拟网络,负载均衡等。这些话题离算法应用方面会比

较远一些,基本上达到遇到需求时会使用的能力即可,在这里不做展

开。

算法深入方向

AutoML:

超参优化:

自动化机器学习中比较传统的一块是超参数优化,进而可以推广到整

个pipeline的超参优化,包括数据预处理,特征工程,特征选择,

模型选择,模型调优,后处理等部分。

目前业界应用比较广泛的技术手段主要是随机搜索,贝叶斯优化,进

化算法,Hyperband/BOHB等,在特征工程方面有Featuretools,

tsfresh,AutoCrossing等自动化特征工程工具。

学术界有一些进一步的探索研究,包括multi-fidelity优化,多任务

优化,HPO结合ensemblelearning,pipelineplanning,data

diff自动数据分布探测等方面。可以参考auto^上的各类参考

资料与书籍进行学习了解。

主要难点包括automl算法的泛化能力,scalability,整体pipeline

组合的搜索与生成,针对不同学习算法的自动优化手段等。

•自我考核:了解超参优化的基础概念,能够在项目中应用框架工

具来实现模型超参的贝叶斯优化流程。

元学习:

Metalearning是近年来非常活跃的一个新兴领域,其主要思路是希

望能通过元学习模型方法,去积累建模调优的先验知识,跨任务推断

模型效果并warmstart新的训练任务,或者指导学习算法来进行更

高效的具体任务的训练过程。

这方面在工业界的主要应用基本上集中在建模调优先验知识的积累方

面,比如通过一系列公开数据集搜索寻找出表现较好的起始参数,用

于指导在新任务上做超参优化的起始搜索点。

学术研究中除了configurationspace的研究,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论