工程栏

  |  

摘要: 算法工程师工程技术路线图

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


$1 工程基础

编程语言

Python

算法工程师日常工作中最常用的语言,必须掌握的一门技术

  • 学习掌握Python的基本语法,《Python基础教程(第三版)》
    • 读懂大多数内部项目以及一些开源项目代码基本模块,例如 pandas, sklearn
  • 学习Python的编程风格
    • 写的代码能通过各类 lint 检查
  • Python进阶,《流畅的Python》
    • 实际工程项目中找到一些应用高级技巧的点进行实践,例如基于Cython的性能优化
  • 领域应用: Web开发,测试开发,爬虫,运维工具,数据处理,机器学习
    • 以Web开发和测试开发为例,尝试写一个简单的model serving http服务,并编写相应的自动化测试。

Scala/Java

在进行企业级的软件开发,高性能,大规模数据处理等方面,JVM上的这两门语言有很大的实用价值,值得学习。

  • 学习掌握Scala的基本语法,开发环境配置,项目编译运行等基础知识。《快学Scala(第2版)》
    • 使用Scala来实现一些简单算法问题,例如DFS/BFS。使用Scala来处理一些日常数据工作,例如读取日志文件,提取关键信息。
  • 学习使用Scala来开发Spark应用,《Spark快速大数据分析》
    • 够使用Spark的Scala API来进行大规模的数据分析及处理,完成lag feature之类的特征工程处理。
  • JVM的原理学习,JVM相比Python虚拟机,发展更加成熟,有一套非常完善的JDK工具链及衍生的各类项目,便于开发者debug,调优应用。《深入理解Java虚拟机(第2版)》
    • 理解JVM GC原理,通过JDK中相关工具或者优秀的第三方工具如arthas等,排查分析Spark数据应用的资源使用情况,GC profiling,hot method profiling等,进而进行参数优化。
  • 计算机语言理论: 程序分析,泛型,元编程,DSL,编译原理等,《Scala函数式编程》
    • TVM以及相关的工作,涉及到大量编译原理的应用
    • Scala拥有极佳的FP,元编程等能力支持,以及强大的类型系统包括自动推理,泛型等等高级语言特性

c/c++/Rust

  • 当前流行的算法框架,例如TensorFlow, PyTorch, LightGBM等,底层都是基于C++为主要语言进行实现的。但是C++本身过于复杂,使用场景也比较有限制,只需能够读懂一些基础的C++代码逻辑即可。在系统级开发领域,目前有一门新语言逐渐崛起,连续几年被StackOverflow投票评选为程序员最喜爱的语言:Rust。Rust官方
    • LightGBM里对于tweedie loss的相关定义代码

操作系统

基本概念

Linux基础

  • 《Unix环境高级编程(第3版)》
    • 开发一个shell小工具,定时自动清理数据文件夹中超过一定年龄的数据文件,自动清理内存占用较大且运行时间较久的jupyter notebook进程。
      深入应用

Linux深入

  • 疑难问题排查,性能分析与优化,系统运维及稳定性工程。例如针对操作系统相关的问题排查的系统调用追踪(strace),动态追踪(systemtap, DTrace, perf, eBPF)等技术。《性能之巅》
    • 分析定位出LightGBM训练过程中的性能瓶颈,精确到函数调用甚至代码行号的级别。

软件工程

代码规范

设计模式

质量保障

  • 大致理解软件测试的一些基本概念和运作方式,在此基础上可以进一步阅读Martin Fowler对于机器学习领域提出的CD4ML中相关的测试环节,学习sklearn,LightGBM等开源库的测试开发方式,掌握机器学习相关的质量保障技术能力。《单元测试的艺术》《Google软件测试之道》
    • 在项目中,实现基础的数据输入测试,预测输出测试。

项目管理

  • 研发流程与规范,例如敏捷开发,设计评审,代码评审,版本管控,任务看板管理。《构建之法》
    • 在负责项目中运用项目管理方法: 需求评估,项目规划,设计与评审,开发执行,项目上线,监控维护流程,并对整个过程做复盘总结。

架构设计

  • 技术选型与系统架构设计,架构设计原则与模式,高性能,高可用,可扩展性,安全性等等。《微服务架构设计模式》
    • 设计一个算法项目Docker镜像自动打包系统。

$2 算法基础

数据分析

数学基础

  • 在进行算法建模时,深入了解数据情况,做各类探索性分析。《统计思维》《程序员的数学2》
    • 理解实际项目中的数据分布情况,并使用统计建模手段,推断预测值的置信区间。

可视化

  • 快速理解数据情况,发掘数据规律,并排查异常点。与不同角色人群沟通数据insights的一个重要途径,需要从业务角度出发去思考可视化与沟通方式。《Storytelling with Data》, 《The Visual Display of Quantitative Information》
    • 对内沟通方面,能使用可视化技术,分析模型的bad case情况,并确定优化改进方向。对外沟通方面,完成项目的数据分析沟通报告。

误差分析与调优

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

  • 从分析出发指导调优更有方向性,而不是凭经验加个特征,改个参数碰运气。
  • 在预测的数据量极大情况下,加一个单一特征很可能总体只有千分位准确率的提升,无法确定是天然波动还是真实的提升。在数据分析的前提下,可以有针对性的看对于这个已知问题,我们的调优策略是否生效,而不是只看一个总体准确率。
  • 问题的彻底排查解决: 有时候结果没有提升,不一定是特征没用,也可能是特征代码有bug之类的问题。带着数据分析的目标去看为什么这个特征没有效果,是模型没学到还是特征没有区分度等,有没有改进方案,对于评判调优尝试是否成功以及其原因也更能彻查到底。
  • 数据分析会帮助我们发现一些额外的问题点,比如数据清洗处理是不是有问题,是不是业务本身有异常,需要剔除数据等。
  • 《Identifying Unknown Unknowns in the Open World》,《A Characterization of Prediction Errors》
    • 在项目中形成一套可以重复使用的误差分析方案,能够快速从预测输出中定位到目前模型最重要的误差类别,并一定程度上寻找到根本原因。

机器学习

传统机器学习

  • 《机器学习》, 《统计学习方法》, 《PRML》《ESL》
    • 综合业务知识,算法原理,及数据分析等手段,逐渐积累形成建模调优的方法论,提高整体实验迭代的效率和成功率。
    • 结合实际业务和机器学习理论知识,挖掘项目中算法表现不够好的问题,并通过算法改造进行提升或解决。

深度学习

领域建模

  • 时间序列预测,自然语言处理,图像,推荐,搜索,广告,风控。

  • 时间序列领域:

    • 传统时序模型: ARIMA, Prophet
    • 机器学习模型: 划动窗口特征构建方法结合LightGBM
    • 深度学习模型: LSTM,seq2seq,transformer

算法框架

数据处理框架

  • 支持分布式运行的 DataFrame,例如 Spark
  • 提升单机性能的改进 DataFrame,例如 CuDF
  • 窗口函数,向量化
    • 把使用apply方法的pandas处理修改成向量化运行,并测试性能提升。使用window function实现lag特征,减少join次数。

机器学习框架

  • 通用机器学习:scikit-learn,Spark ML,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
  • NLP: stanza, transformers, core NLP, spacy

其它框架

  • web框架: Flask, FastAPI
  • 爬虫框架: scrapy

$3 算法工程交叉

大规模算法运行

分布式训练

  • 分布式训练涉及到多机的通讯协同方式,优化算法的改造,数据及模型的并行与聚合,以及框架的选择和运维等话题。
  • 《分布式机器学习》
    • 在多机上进行亿级数据的GBDT模型训练与预测。

分布式系统

高性能计算

  • 硬件方面: 超线程技术,向量化指令集,GPGPU,TPU的应用
  • 软件方面: 针对数值计算场景的OpenBLAS,自动并行化的OpenMP,有各种codegen,JIT技术下的运行时优化(例如 Spark,TVM)
  • CUDA,OpenMP的应用,例如 cuDNN, LightGBM
    • 通过LLVM JIT来优化实现Spark window function的执行性能

模型加速

  • 模型训练方面: 使用大batch size,迁移学习,持续的在线/增量学习等手段
  • 模型预测方面: 模型参数量优化,模型压缩,混合精度,知识蒸馏
  • 《Training ImageNet in 1 Hour》,MobileNet,TensorRT,二值网络

MLOps

编排调度

  • 各类pipeline的编排与调度能力的支持,包括数据pipeline,训练pipeline和serving pipeline。有一些框架可以用于并能够应用于离线实验与线上运行。例如 Airflow
    • 用Airflow完成一个标准的项目pipeline搭建与运行。

数据集成

相对于传统的DevOps,机器学习项目最大的区别在于数据方面的依赖会更加显著与重要。

  • 话题涉及到数据血缘,数据质量保障,数据版本控制。有各类工具可以借鉴使用,例如数据版本管理方面的DVC,数据质量方面的TFX Data Validation,Cerberus,Deequ等。《The ML Test Score》
    • 在项目中实现输入数据的分布测试,特征工程测试及特征重要性准入测试。

实验管理

  • 实验管理是 ML项目的独特之处,在开发过程中有大量的实验及相应的结果输出需要记录,以指导后续调整优化的方向,并选择最优结果来进行上线部署。这方面可以参考的项目 MLflow。对于单独项目,online Excel 也可以用
    • :在实际项目中实行一套标准的实验记录手段,并能从中找出各类实验尝试带来的精度提升的top 5分别是哪些操作。

Serving

  • 对于离线serving,即离线batch预计算的形式: 主要依赖的技术手段是各类离线inference的方法,例如直接使用model predict接口,使用mmlspark等做大规模并行inference等。
  • 对于在线serving,即在线pipeline的运行: 主要依赖实时特征获取,low latency/high throughput的serving服务,可以参考TF Serving,MLeap,H2O,PredictionIO,PMML/PFA/ONNX。
    • 部署一个实时预测服务,能够根据用户输入产生相应的预测结果。

持续集成与持续部署(CI/CD)

  • 软件工程中的持续集成,持续部署已经成为一种标准实践,在算法项目中,额外引入了数据这个维度的复杂性,带来了一些新的挑战。涉及的话题主要有自动化测试,pipeline打包部署,持续监控运维等,可以参考Martin Fowler关于CD4ML的文章。工具系统层面,可以学习传统的Jenkins,也有一些新选择例如CircleCI,GoCD,VerCD(Uber)等。
    • 通过Jenkins实现pipeline自动测试,打包,上线流程。

监控

在整个项目上线后,需要对系统的各个环节进行监控,并对各种异常情况作出响应。

  • 输入数据的监控,判别测试数据与训练数据的分布是否有偏移
  • 整个运行pipeline的监控,判别是否有运行失败抛出异常的情况
  • 预测输出的监控,确保没有异常的预测输出值
  • 对系统计算资源的监控,确保不会因为资源不足导致业务受到影响
  • 在监控信息收集,基础上,还需要配套一系列的自动告警通知,日志追踪排查等。这方面的工具框架包括TF data validation这类专门针对算法项目的新产品,也有elasicsearch + kibana这类传统产品。
    • 将三个项目中做过的问题排查改造成常规监控手段,支持自动的问题发现,告警通知,如有可能,提供自动化或半自动化的问题排查解决方案。

MLOps系统

参考 MLflow,Kubeflow,Metaflow,TFX等,学习他们的设计理念,Roadmap,以及实现细节。


$4 工程深入

数据库

数据库原理

关系型数据库

  • DML(增删改查),DDL(创建表,修改索引等),DCL(权限相关)
  • 数据类型,高级计算,存储引擎,部署运维,范式概念与表结构设计
    • 在MySQL中设计相关表结构,存储实际项目中的一系列中间数据集。

NoSQL数据库

  • 常用的NoSQL数据库有几类,KV存储(Redis),文档数据库(MongoDB),Wide-column存储(HBase)以及图数据库(Neo4j)
    • 考虑一个线上模型服务的场景,用户输入作为基础特征,使用类似Redis的KV系统,实现实时获取其它特征,并进行模型预测。

云计算

基础架构

这要涉及虚拟化及容器技术,配置管理,容器编排。在日常工作中使用相关技术来管理和发布应用。

分布式存储

  • 前些年最流行的分布式存储是脱胎于Google经典的GFS论文实现的HDFS,不过随着硬件技术的发展,计算存储分离思想的逐渐兴起,不但灵活性更高,成本更低,且各自架构的复杂度也大大降低了。
  • 目前更建议学习简单的object store形式的分布式存储,例如s3,minio等。在此基础上的一些存储系统,例如Delta Lake,提供了事务,高效的upsert,time travel等功能,也值得关注与学习。
    • 在项目中实现不同机器能够访问同一个s3路径的文件,并进行正常的数据读写,模型文件读写等功能。

分布式计算

  • 目前业界的主流是Spark和Flink,前者在批处理计算中处于霸者地位,后者是流处理领域的领先者。
  • 目前的业务应用中,Spark是比较常用的分布式计算引擎,其基本操作相关内容比较简单,《Spark快速大数据分析》。后续的主要难点会有大数据量下的问题排查与性能调优,执行复杂计算或与Python相关UDF的交互配合方式等。这方面需要对Spark的系统架构,内部原理有一定了解,例如master,worker,driver,executor等之间的关系,lazy evaluation,DAG的lineage与stage概念,shuffle优化,wholestage codegen等技术细节。
    • 用Spark来实现项目中的特征工程,并在一定数据量情况下取得比单机Pandas更好的性能效果。

其它话题

  • 消息队列, kafka
  • 分布式协作系统, zk/raft
  • 虚拟网络
  • 负载均衡
  • RPC

$5 算法深入

AutoML

超参优化

  • 自动化机器学习最传统的是超参数优化,进而可以推广到整个pipeline的超参优化,包括数据预处理,特征工程,特征选择,模型选择,模型调优,后处理等部分。
  • 目前业界应用比较广泛的技术手段主要是随机搜索,贝叶斯优化,进化算法,Hyperband/BOHB等
  • 在特征工程方面有Featuretools,tsfresh,AutoCross等自动化特征工程工具。
    • 了解超参优化的基础概念,在项目中应用框架工具来实现模型超参的贝叶斯优化流程。

元学习

  • Meta learning是近年来非常活跃的一个新兴领域,其主要思路是希望能通过元学习模型方法,去积累建模调优的先验知识,跨任务推断模型效果并warm start新的训练任务,或者指导学习算法来进行更高效的具体任务的训练过程。这方面在工业界的主要应用基本上集中在建模调优先验知识的积累方面,比如通过一系列公开数据集搜索寻找出表现较好的起始参数,用于指导在新任务上做超参优化的起始搜索点。Meta-Learning: Learning to Learn Fast
    • 设计一系列meta feature与meta learning手段,实现对新任务的参数选择的初始化。

NAS

需要大量的计算资源投入才能做这方面的研究与尝试

AutoML系统

  • 自动化机器学习相关的框架工具也非常多,比较有代表性的框架有auto-sklearn(来自automl.org团队),nni(microsoft),auto-gluon(amazon),H2O,ray tune等,在工具级别也有如hyperopt,SMAC3,featuretools等。
    • 使用一种AutoML系统来进行项目的模型自动优化,并与手工优化的结果进行比较,看是否有所提升,及寻找背后的原因。

模型解释

技术

主要有三个方面

  • 模型本身的解释性: 例如线性回归,决策树等,模型结构简单,根据其原理,可以直接对预测结果,特征使用等方面给出解释。另外一些复杂模型,例如EBM,神经网络,Bayesian rule lists,SLIMs等,也可以利用一些本身的特性给出一些解释,例如GradCAM方法等。
  • 模型无关的解释方法: 包括经典的PDP,ICE等特征图,LIME等surrogate model方法,以及基于博弈论的Shapley方法。
  • 基于sample的解释方法: 例如conterfactual explanations,adversarial examples,prototypes,influential instances,kNN等,不过看起来这类方法对于计算的开销一般都会比较大,不太容易在工程中实现落地。

《Interpretable Machine Learning》《Explainable AI》

应用

  • 工具框架: 微软的interpret,eli5,shap,AIX360等。
  • 非传统意义上的模型解释: 例如manifold,tensorboard这类模型debugging工具,自动化的误差分析与模型改进方案,因果模型框架,模型公平性评估与纠正工具
  • 在广义的模型解释领域中。在工具基础上,如何结合业务领域知识,给出更有针对性的解释方案
    • 使用shap,eli5等工具来进行模型解释,并在此基础上形成面向开发者的模型debug,误差分析及改进方案,或形成面向业务的what-if分析看板。

Share