💡 生产级深度学习指南 🎬 📜 🛳️
🇨🇳 中文翻译
📛 新增: 机器学习面试
📛 注: 该仓库正在持续开发中,欢迎所有反馈和贡献 😊
将深度学习模型部署到生产环境中是具有挑战性的,因为这远不止是训练出性能良好的模型。为了部署生产级的深度学习系统,需要设计和开发多个不同的组件(如下所示):
本仓库旨在为构建部署到实际应用中的生产级深度学习系统提供工程指南。
本文所展示的内容借鉴自深度学习全栈训练营(由伯克利大学Pieter Abbeel、OpenAI的Josh Tobin和Turnitin的Sergey Karayev提供)、TFX研讨会(由Robert Crowe提供)以及Pipeline.ai的Advanced KubeFlow Meetup(由Chris Fregly提供)。
机器学习项目
有趣的是:85%的AI项目失败了。1 可能的原因包括:
- 技术上不可行或范围定义不清
- 从未成功过渡到生产环境
- 成功标准(指标)不明确
- 团队管理不善
1. 机器学习项目生命周期
- 了解领域内最新技术的重要性:
- 有助于了解可能实现的目标
- 帮助指导下一步尝试
2. 机器学习项目的思维模式
定义和优先化机器学习项目时需要考虑的重要因素:
- 高影响力:
- 管道中复杂的部分
- "廉价预测"有价值的地方
- 自动化复杂手动过程有价值的地方
- 低成本:
- 成本由以下因素决定:
- 数据可用性
- 性能要求:精度要求的成本往往是超线性增长的
- 问题难度:
- 一些难题包括无监督学习、强化学习和某些类别的监督学习
- 成本由以下因素决定:
全栈管道
下图表示生产级深度学习系统中各个组件的高级概述:
接下来,我们将逐个模块进行讨论,并推荐工具集和框架,以及适合每个组件的实践者的最佳实践。
1. 数据管理
1.1 数据来源
- 监督深度学习需要大量标注数据
- 给自己的数据打标签是昂贵的!
- 以下是一些数据资源:
- 开源数据(开始时不错,但没有优势)
- 数据增强(计算机视觉必备,NLP可选)
- 合成数据(几乎总是值得尝试,尤其是在NLP中)
1.2 数据标注
- 需要:单独的软件栈(标注平台)、临时劳动力和质量控制
- 标注劳动力的来源:
- 众包(Mechanical Turk):便宜且可扩展,可靠性较差,需要质量控制
- 雇佣自己的标注员:质量控制需求较少,成本高,扩展性慢
- 数据标注服务公司:
- 标注平台:
1.3 数据存储
- 数据存储选项:
- 对象存储:存储二进制数据(图像、声音文件、压缩文本)
- 数据库:存储元数据(文件路径、标签、用户活动等)
- Postgres 是大多数应用的正确选择,具备最优的SQL和对非结构化JSON的良好支持
- 数据湖:聚合数据库中无法获取的特征(如日志)
- 特征存储:存储、访问和共享机器学习特征
(特征提取可能计算量大且几乎无法扩展,因此不同模型和团队重用特征是高性能机器学习团队的关键)
- FEAST (谷歌云,开源)
- Michelangelo Palette (Uber)
- 建议:在训练时,将数据复制到本地或网络文件系统(NFS)。1
1.4 数据版本控制
- 对于部署的机器学习模型,这是“必须”的: 部署的机器学习模型是代码和数据的结合。1 没有数据版本控制意味着没有模型版本控制。
- 数据版本控制平台:
1.5 数据处理
- 训练生产模型的数据可能来自不同的来源,包括数据库和对象存储中存储的数据、日志处理和其他分类器的输出。
- 任务之间存在依赖关系,必须在其依赖项完成后启动。例如,基于新日志数据进行训练需要在训练前进行预处理步骤。
- Makefiles无法扩展。在这种情况下,“工作流管理器”变得非常重要。
- 工作流编排:
2. 开发、训练和评估
2.1 软件工程
- 最佳编程语言:Python
- 编辑器:
- 计算推荐1:
- 对于个人或初创公司:
- 开发:一个配备4x Turing架构GPU的PC
- 训练/评估:使用相同的4x GPU PC。当运行多个实验时,可以购买共享服务器或使用云实例。
- 对于大公司:
- 开发:为每个机器学习科学家购买一个4x Turing架构的PC,或者让他们使用V100实例
- 训练/评估:使用正确的资源分配和故障处理的云实例
- 对于个人或初创公司:
- 云供应商:
- GCP:可将GPU连接到任何实例+拥有TPUs
- AWS:
2.2 资源管理
2.3 深度学习框架
- 除非有充分的理由,否则请使用Tensorflow/Keras或PyTorch。1
- 下图显示了不同框架在“开发”和“生产”中的对比。
2.4 实验管理
- 开发、培训和评估策略:
- 始终从简单开始
- 训练一个小模型在一个小批次。如果它有效,再扩展到更大的数据和模型,并进行超参数调优!
- 实验管理工具:
- Tensorboard
- 提供机器学习实验所需的可视化和工具支持
- Losswise(机器学习监控)
- Comet: 让您在机器学习项目中跟踪代码、实验和结果
- Weights & Biases: 记录并可视化研究的每个细节,并轻松协作
- MLFlow Tracking: 用于记录参数、代码版本、指标和输出文件以及结果的可视化
- 一行代码的自动实验跟踪
- 实验的并列比较
- 超参数调优
- 支持基于Kubernetes的作业
- 始终从简单开始
2.5. 超参数调优
-
方法:
- 网格搜索
- 随机搜索
- 贝叶斯优化
- HyperBand和异步连续削减算法(ASHA)
- 基于种群的训练
-
平台:
- RayTune: Ray Tune是一个Python库,用于任何规模的超参数调优(特别注重深度学习和深度强化学习)。支持任何机器学习框架,包括PyTorch、XGBoost、MXNet和Keras。
- Katib: Kubernetes原生系统,用于超参数调优和神经架构搜索,受到Google vizier启发,并支持多种ML/DL框架(如TensorFlow、MXNet和PyTorch)。
- Hyperas: 是一个基于hyperopt的简单包装器,用于Keras,具有简单的模板表示法来定义超参数范围。
- SIGOPT: 可扩展的企业级优化平台
- Weights & Biases的Sweeps: 参数不是由开发人员明确指定的,而是通过机器学习模型近似并学习。
- Keras Tuner: 针对Keras的超参数调优工具,特别是tf.keras与TensorFlow 2.0。
2.6. 分布式训练
- 数据并行性:当迭代时间太长时使用(Tensorflow和PyTorch均支持)
- 模型并行性:当模型不适合单个GPU时使用
- 其他解决方案:
- Horovod
3. 故障排除 [待定]
4. 测试和部署
4.1. 测试与CI/CD
机器学习生产软件需要比传统软件更为多样化的测试套件:
- 单元测试和集成测试:
- 测试类型:
- 训练系统测试:测试训练管道
- 验证测试:在验证集上测试预测系统
- 功能测试:在几个重要例子上测试预测系统
- 测试类型:
- 持续集成:在每次推送新代码到仓库后运行测试
- 持续集成的SaaS工具:
4.2. Web部署
- 包含一个预测系统和一个服务系统
- 预测系统:处理输入数据,进行预测
- 服务系统(Web服务器):
- 考虑到扩展性来提供预测服务
- 使用REST API提供预测HTTP请求
- 调用预测系统进行响应
- 服务选项:
-
- 部署到虚拟机,通过增加实例进行扩展
-
- 以容器形式部署,通过编排进行扩展
- 容器:
- Docker
- 容器编排:
- Kubernetes(目前最流行)
- MESOS
- Marathon
-
- 作为“无服务器函数”来部署代码
-
- 通过模型服务解决方案进行部署
-
- 模型服务:
- 专门用于ML模型的Web部署
- 为GPU推理批量请求
- 框架:
- TensorFlow Serving
- MXNet模型服务器
- Clipper(伯克利)
- SaaS解决方案
- Seldon: 在Kubernetes上部署和扩展任何框架构建的模型
- Algorithmia
- 决策:使用CPU还是GPU?
- CPU推理:
- 如果满足需求,更倾向于使用CPU推理。
- 通过增加更多服务器或采用无服务器方式进行扩展。
- GPU推理:
- 使用TF Serving或Clipper
- 自适应批处理很有用
- CPU推理:
- (附加)部署Jupyter Notebooks:
- Kubeflow Fairing 是一个混合部署包,让你能部署你的Jupyter notebook代码!
4.5 服务网格和流量路由
- 从单体应用向分布式微服务架构的转变可能很具挑战性。
- 一个服务网格(由微服务网络组成)可以减少这种部署的复杂性,并减轻开发团队的压力。
- Istio:为创建负载均衡、服务间身份验证和监控的已部署服务网络提供服务网格,使服务代码几乎无需任何更改。
4.4 监控:
- 监控的目的:
- 停机、错误和分布变化的警报
- 捕捉服务和数据的回归
- 云提供商的解决方案比较优秀
- Kiali: 为Istio提供可观察性控制台,具有服务网格配置功能。它回答这些问题:微服务是如何连接的?它们的性能如何?
我们完成了吗?
4.5 在嵌入式和移动设备上部署
- 主要挑战:内存占用和计算限制
- 解决方案:
- 量化
- 减小模型大小
- MobileNets
- 知识蒸馏
- DistillBERT(用于NLP)
- 嵌入式和移动框架:
- TensorFlow Lite
- PyTorch Mobile
- Core ML
- ML Kit
- FRITZ
- OpenVINO
- 模型转换:
- 开放神经网络交换(ONNX):深度学习模型的开源格式
4.6 一体化解决方案
- TensorFlow Extended(TFX)
- Michelangelo(Uber)
- Google Cloud AI平台
- Amazon SageMaker
- Neptune
- FLOYD
- Paperspace
- Determined AI
- Domino数据实验室
TensorFlow Extended (TFX)
[TBD]
Airflow和KubeFlow ML流水线
[TBD]
其他有用的链接:
贡献
参考文献:
[2]: 高级KubeFlow研讨会 由Pipeline.ai举办, 2019年。