什么是机器学习系统?
我觉得机器学习系统(又可以称作是模型系统
、机器学习平台
、ML-as-a-service system
)作为一个软件系统,它不是一个孤立存在的软件系统,而总是作为一个工具服务于另一个更大的软件系统。比如用于预测一件事情发生的概率,或是用于预测一个事物所属的归类,而被安放在某种识别系统、推荐系统、搜索排序系统、广告系统之中。
在不同应用中的模型系统又具有很多相同之处,因此机器学习系统可以作为一个独立的系统来进行设计和开发。
- 和其他软件系统一样,机器学习系统在设计和开发阶段一样需要软件设计思想。
- 和其他软件系统一样,机器学习系统在应用时要求好的运行质量和好的运行速度。
- 和其他软件系统一样,机器学习系统随着规模的扩大、对性能要求的提高,也会面临性能挑战。
- 和其他软件系统一样,机器学习系统需要足够的可扩展性,运行更多新的功能被开发出来。
软件系统存在的目的是什么?提供电子化、自动化的某种功能,方便人类的生产或生活。机器学习系统也是如此。
机器学习系统的用户,一类是建模者,一般是数据分析师、算法工程师等;另一类是模型的使用者,一般是算法工程师、系统工程师。一个机器学习系统越是完善,那么这两类人群的效率就会越高。
机器学习系统和其他软件系统有什么差别?
机器学习系统中“错误”这一概念要更模糊一些。
机器学习系统中的”数据“(样本)会实质性的影响”逻辑”(模型)。你不能简单的把数据和代码彻底分开看待。有个词叫”data-intensive system”。
模型的优化和其他软件优化
- 效果优化
- 优化所谓的“正确性”、”准确度” -> 模型的效果优化,更多聚焦数学层面
- 性能优化
- 优化延时、吞吐 -> 本质上就是程序涉及CPU、内存、磁盘、网络层面的优化。
- bugFix
- 此外,bug造成的效果或性能问题,这对于模型或其他软件来讲是差不多的。
机器学习系统的组成
如果硬要先做一个大题的划分,可以有以下几种划分方式
- 离线系统 vs 在线系统
- 特征系统 vs 模型系统
离线功能部分(Train)
样本数据相关:
- 标签接收、特征接收
- 样本验证框架(数据验证、ExampleGen、StatisticsGen、SchemaGen)
- 样本预处理框架(DataTransform)
- 特征的离线存储 (批查询,一般是大数据数仓, hive, hudi
模型训练相关:
- 模型训练(Trainer、分布式训练、自动调参、增量学习、调度器)
- 模型验证(灵活的Evaluator、离线指标计算)
- 模型版本控制(模型元数据库)
- 模型推送(Pusher)
在线功能部分(Inference)
在线指的是用户即时请求模型预估时所需要执行到的功能。
特征数据相关:
- 特征的在线存储 (点查询,要求读速度
- 有趋势拉近离线存储和在线存储的gap
- 特征数据服务(Feature Flow、Feature Service)
- 在线特征生成框架
- 特征日志记录、事件埋点记录
- 数据监控
模型预测相关:
- 模型热更新
- 模型预测服务(本地预测、远端预测服务、在线学习)、
- 模型灰度
- 模型监控
人机交互(UI)
- 训练任务和可视化训练平台(可编写训练Workflow、实验模型可重载、训练任务可重载、训练结果历史库)
- 多机多卡训练如单机单卡一样简单
- 特征和样本管理平台
- 模型配置、发布、管理系统ha
- 数据可视化: 任何环节的数据,只要数据多到人难以关注,就需要有数据可视化工具来辅助。
- 数值分布可视化
- 关系网络可视化: 链路关系、 数据溯源
- 监控、报警平台
- 对于数据的监控报警要与数据可视化配合
监控(Monitor)
- 各环节性能监控
- 离线样本值监控
- 在线特征值监控
- 预发指标预算
- 线上指标监控
资源调度
资源是指images、cpu、内存、gpu、磁盘。在训练和预测的时候,都存在资源调度的需要。
- 灵活的部署训练资源,执行训练任务。
- 安全稳定的部署预测任务,发布线上预测服务。
机器学习系统的设计
并不是所有的模块都需要从0设计,集成合适的开源组件,是一种不错的选择。
模块化设计
在线系统与离线系统的接口
分层设计
配置设计
充分的可视化交互设计
测试/持续集成设计
支持特征快速开发
支持模型快速迭代
支持模型自动迭代
数据流水线的设计和数据验证
模型管理的设计
实时性、超大量级的挑战
特征实时性
样本实时性
模型实时性
分布式训练
分布式预测
响应速度
性能调优
- CPU加速
- 指令级优化: 比如使用AVX2、AVX512指令集
- 使用加速库: 比如 使用加速库(TVM、OpenVINO)
- 算子融合: 将模型网络中的多层算子进行统一线性融合,以降低算子调度开销和算子间的数据访存开销
- 精度压缩:推理的过程中不需要反向传播,完全可以适当降低数据精度,比如降为FP16或INT8的精度,从而使得内存占用更小,推理延迟更低
- GPU加速
- 异构计算拆分:访存密集型算子适用(比如Embedding相关操作)CPU,计算密集型算子(比如MLP)适用GPU。
- 比如CTR模型网络结构整体抽象为三部分:Embedding层、Attention层和MLP层。
- 其中Embedding层用于数据获取,适合CPU;
- Attention层包含较多逻辑运算和轻量级的网络计算;MLP层则重网络计算,而这些计算可以并行进行,适合GPU,可以充分利用GPU Core(Cuda Core、Tensor Core),提高并行度。
- 比如CTR模型网络结构整体抽象为三部分:Embedding层、Attention层和MLP层。
- 使用加速库:TensorRT
- 异构计算拆分:访存密集型算子适用(比如Embedding相关操作)CPU,计算密集型算子(比如MLP)适用GPU。
如何加速attention ?
在transformer中attention操作是最耗时的模块。
原因和它的操作逻辑有关:
- 计算复杂度:Attention机制的核心是计算序列中每个元素对于其他元素的注意力权重,这涉及到大量的矩阵乘法操作。具体来说,对于一个输入序列,其计算复杂度为O(n^2 * d),其中n是序列长度,d是表示向量的维度。当序列长度n增加时,计算量会以平方的速度增长,这使得对于长序列的处理变得尤为耗时。
- 内存消耗:Attention机制在计算过程中需要存储注意力权重矩阵,这个矩阵的大小随序列长度的平方增长。对于非常长的序列,这会导致显著的内存消耗,进一步增加计算成本。
- 并行化限制:虽然Transformer的计算可以高度并行化,但是Attention机制中的某些部分,尤其是softmax操作,需要等待整个注意力权重矩阵计算完成后才能进行。这意味着,尽管可以并行处理序列中的不同位置,但在计算每个位置的注意力分数时,还是存在一定的顺序依赖性,这限制了并行化程度。
优化思路:
- 近似模拟计算
- 内存使用技巧
“prefill”技术: 用于在解码器的自注意力计算中提前计算一部分注意力权重,以减少计算量和提高效率。
工业开源实践
各层组件的开源实施
基础设施层方案
- mesos
- yarn
- k8s
数据流方案(airflow argo kubeflow)、资源调度
- oozie: https://oozie.apache.org/
- jenkins ?
- Quartz
- Azkaban https://github.com/azkaban/azkaban
- 数据流批处理框架:kubeflow.org
- 数据流程化处理系统:https://github.com/apache/airflow
- DAG数据工作流框架: https://mlflow.org/
- 可视化数据流处理系统: https://nifi.apache.org/
- 类似于kubeflow的:https://polyaxon.com/
- https://github.com/argoproj/argo
- https://mitdbg.github.io/modeldb/
- https://github.com/Qihoo360/XLearning
- https://github.com/features/actions
- dolphinscheduler
数据可视化
- https://github.com/PAIR-code/facets
数据处理层组件
- https://github.com/pachyderm/pachyderm
- https://github.com/tensorflow/transform
特征组件(FeatureStore)
- Tidb
- openmldb 第四范式开源
- https://github.com/feathr-ai/feathr 微软&领英开源
- https://github.com/alibaba/feathub 阿里
- https://github.com/feast-dev/feast
模型训练层组件
- PaddlePaddle
- pytorch
- mxnet
- Tensorflow:https://github.com/tensorflow/examples/blob/master/community/en/docs/deploy/distributed.md
- Horovod: https://eng.uber.com/horovod/
- oneflow: https://docs.oneflow.org/basics_topics/essentials_of_oneflow.html
- DeepRec https://github.com/alibaba/DeepRec 搜推广稀疏模型
- HugeCTR https://github.com/NVIDIA-Merlin/HugeCTR 搜推广稀疏模型
模型抽象层
- https://eng.uber.com/introducing-neuropod/ , https://github.com/uber/neuropod
加速库
- 编译器前端: 将源程序解析成中间表示,支持自动微分,前端优化, 静态计算图和动态计算图
- 编译优化: 无用与不可达代码消除; 常量传播、常量折叠; 公共子表达式消除
- 编译器后端: 编译器后端处于前端和硬件驱动层中间,主要负责计算图优化、算子选择、内存分配的任务
- 闭包后端
模型分析层组件
- https://github.com/tensorflow/model-analysis , https://github.com/tensorflow/model-analysis/blob/master/g3doc/get_started.md
模型可视化
- https://github.com/dair-ai/ml-visuals
预估服务层组件
- https://github.com/tensorflow/serving
- https://github.com/facebookincubator/AITemplate
模型仓库
- https://github.com/tensorflow/hub , https://tfhub.dev/
版本控制
- https://dvc.org/
工业界体系方案
几个大厂的作品
- TFX by google : https://github.com/tensorflow/tfx
- FBLearner Flow by facebook: https://engineering.fb.com/core-data/introducing-fblearner-flow-facebook-s-ai-backbone/
- Michelangelo by uber: https://eng.uber.com/michelangelo/
- BigHead by airbnb :
TFX
全称 Tensorflow Extended
数据预处理组件 https://github.com/tensorflow/transform
PAI
PAI-DSW(Data Science Workshop)是为算法开发者量身打造的云端深度学习开发环境,集成JupyterLab,插件化深度定制化开发,无需任何运维配置,沉浸式体验Notebook编写、调试及运行Python代码。支持开源框架的安装,并提供阿里巴巴深度优化的Tensorflow框架,通过编译优化提升训练性能。 https://help.aliyun.com/product/30347.html
EasyDL / BML
百度推出的机器学习平台。 https://ai.baidu.com/easydl/ https://ai.baidu.com/bml/
mindspore
华为推出的机器学习平台 https://www.mindspore.cn/
第四范式
https://www.4paradigm.com/
九章云极
https://datacanvas.io/
huggingface
https://huggingface.co/ AutoTokenizer.from_pretrained PreTrainedTokenizer AutoModel.from_pretrained
model.eval model.set_adapter model.chat model.stream_chat
参考
https://papers.nips.cc/paper/5656-hidden-technical-debt-in-machine-learning-systems.pdf
https://storage.googleapis.com/pub-tools-public-publication-data/pdf/aad9f93b86b7addfea4c419b9100c6cdd26cacea.pdf
machine-learning-systems-design
Deep Learning Infrastructure at Scale: An Overview
Rules of Machine Learning: Best Practices for ML Engineering