Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何构建产品化机器学习系统?

如何构建产品化机器学习系统?

作者头像
AiTechYun
发布于 2019-05-31 09:40:09
发布于 2019-05-31 09:40:09
2.4K01
代码可运行
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
运行总次数:1
代码可运行

编译 | sunlei

发布 | ATYUN订阅号

为生产而构建的机器学习系统需要有效地培训、部署和更新机器学习模型。在决定每个系统的体系结构时,必须考虑各种因素。这篇博文的部分内容是基于Coursera和GCP(谷歌云平台)关于构建生产机器学习系统的课程。下面,我将列出构建可伸缩机器学习系统时需要考虑的一些问题:

  1. 扩展模型培训和服务流程。
  2. 跟踪不同超参数的多个实验。
  3. 以预测的方式重现结果和再培训模型。
  4. 跟踪不同的模型及其随时间的模型性能(即模型漂移)。
  5. 使用新数据和回滚模型对模型进行动态再培训。

Uber(Michaelangelo)、谷歌、Airbnb (Bighead)和Facebook (FBlearner Flow)这样的公司都有解决上述问题的平台。但并不是所有人都拥有这些大公司所拥有的资源。也就是说,让我们来看看如何构建我们自己的生产ML系统。

机器学习(ML)系统的组成部分

对于ML的不同领域,如计算机视觉、NLP(自然语言处理)和推荐系统,有很多关于正在开发的新模型的文章,如BERT、YOLO、SSD等。然而,在大多数情况下,构建模型只占生产ML系统工作的5-10% !

还有很多其他组件需要考虑——数据接收、数据预处理、模型培训、模型服务和模型监控。

典型的ML管道

数据接收和处理

对于大多数应用程序,数据可以分为三类:

  • 存储在Amazon S3或谷歌云存储等系统中的非结构化数据
  • 结构化数据存储在关系数据库中,如MySQL或分布式关系数据库服务,如Amazon RDS、谷歌Big Query等。
  • 来自web应用程序或物联网设备的流数据

ML管道中的第一步是从相关数据源获取正确的数据,然后为应用程序清理或修改数据。以下是一些用于摄取和操作数据的工具:

DataflowRunner——谷歌云上的Apache Beam运行器。Apache Beam可以用于批处理和流处理,因此同样的管道可以用于处理批处理数据(在培训期间)和预测期间的流数据。

ApacheAirflow——Airflow的托管版本是GCP的云编辑器,用于工作流编排。气流可用于创作、安排和监控工作流。

流数据——有各种可用于接收和处理流数据的工具,如Apache KafkaSpark Streaming和Cloud Pub/Sub。

Argo——Argo是一个开源容器本地工作流引擎,用于协调Kubernetes上的并行作业。Argo可用于指定、调度和协调Kubernetes上复杂工作流和应用程序的运行。

下图显示了如何在谷歌云上选择正确的存储选项:

数据验证

需要通过数据验证来减少培训服务的偏差。必须检查输入,以确定它们是否是正确的类型,并且必须持续监视输入分布,因为如果输入分布发生了显著变化,那么模型性能将会下降,这将需要重新培训。它还可以指向输入源类型的更改或某种客户机端错误。

IO和Compute—根据用例,训练时间可以是IO(输入/输出)界限、Compute界限,或者两者都有!计算边界意味着需要更多的CPU/GPU/TPU资源来减少训练时间。这可以通过增加更多的工人相对容易地完成。

IO绑定意味着读取数据并将其传输到计算资源(CPU/GPU/TPU)需要更多的时间,而在数据加载期间,计算资源长时间处于空闲状态。以下是从最慢到最快读取文件以解决IO速度问题的三种方法:

  1. 使用pandas或python命令读取-这是最慢的方法,应该在处理小数据集以及原型制作和调试期间使用。
  2. 使用TysFraseFraseFrase-这些函数在C++中实现,因此它们比上述方法更快。
  3. tfrecord-这是最快的方法。tfrecord格式是用于存储二进制记录序列的简单格式。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1raw_dataset = tf.data.TFRecordDataset(filenames)

模型训练

对于模型训练,可以使用完全托管的服务,如AWS Sagemaker或Cloud ML Engine。使用这两种服务,用户不必担心提供实例来扩展培训过程,他们还支持托管模型服务。要创建自己的分布式培训系统,请参见下面的——

分布式训练——TensorFlow支持多种分布式训练策略。它们可分为两类:

数据并行性——在数据并行性中,数据被分成更小的组,在不同的工人/机器上进行培训,然后每次运行时更新参数。下面是一些更新参数的技术:

  • 参数服务器策略(Async)——在这种方法中,特定的工作人员充当参数服务器。这是最常用的技术,也是最稳定的。由于这是一种异步方法,有时不同工作者的参数可能不同步,这会增加收敛时间。

同步随机梯度下降源参数服务器架构

  • All Reduce(镜像策略)——这是一种相对较新的方法,其中每个worker持有参数的副本,并且在每次传递之后,所有worker都被同步。当工人之间有高速连接时,这种方法很有效。因此,它适用于TPUs和具有多个gpu的工作人员。

Horovod——Horovod是Uber发布的一个开源分布式培训框架,它使分布式培训更加容易,并且支持TensorFlow、Keras、PyTorch和Apache MXNet。

模型并行性——模型并行性不同于数据并行性,因为这里我们将模型图分布在不同的worker上。这是非常大的模型所需要的。Mesh TensorFlow和GPipe是一些可以用于模型并行化的库。

模型预测——静态服务vs动态服务

模型预测有三种方法——

  1. 批量预测或脱机预测——在这种情况下,脱机对大量输入进行预测,预测结果与输入一起存储,供以后使用。这适用于提前知道输入的应用程序,例如预测房价、离线生成建议等。还可以使用预测API;然而,只加载模型并进行预测更便宜、更快、更简单。
  2. 在线预测——在这种情况下,输入事先未知,必须根据用户提供的输入进行预测。对于这些应用程序,最好使用TensorFlow service、Cloud ML引擎或Cloud AutoML创建可扩展的性能API。在某些应用程序中,预测延迟非常重要,比如信用卡欺诈预测等等。
  3. 边缘预测——在这种情况下,预测必须在边缘设备上完成,如手机、Raspberry Pi或 Coral Edge TPU。在这些应用程序中,必须压缩模型大小以适合这些设备,并且还必须降低模型延迟。缩小模型大小有三种方法:
  • 图形冻结-冻结图形将变量节点转换为常量节点,然后与图形一起存储,从而减小模型大小。
  • 图形转换工具-图形转换工具删除预测期间未使用的节点,并帮助减少模型大小(例如,在推断期间可以删除批处理规范层)。
  • 重量量化-此方法导致最大尺寸减小。通常,权重存储为32位浮点数;但是,通过将其转换为8位整数,可以显著减小模型大小。然而,这会导致精度降低,这在不同的应用中有所不同。为了防止精度损失,可以使用量化感知训练和量化参数调整。

ML系统的开源平台

Kubeflow——Kubeflow是一个构建在Kubernetes之上的开源平台,支持可伸缩的机器学习模型培训和服务。Kubeflow使用Seldon Core在Kubernetes集群上部署机器学习模型。Kubeflow可以运行在任何云基础设施上,使用Kubeflow的一个关键优势是,系统可以部署在一个本地基础设施上。

Kubeflow

MLFlow是一个用于管理机器学习生命周期的开源平台。它有三个主要组成部分,如下图所示:

MLFlow源组件

Polyxon-Polyxon是管理机器学习应用程序生命周期的另一个开源平台。Polyxon也在Kubernetes上运行。

TensorFlow Extended (TFX)——TFX是是用于部署生产ML管道的端到端平台。TensorFlow服务和Kubernetes可以用来创建一个可扩展的模型服务系统。TFX还有其他组件,如TFX转换和TFX数据验证。TFX使用气流作为任务的有向非循环图(DAGs)来创建工作流。TFX使用Apache Beam运行批处理和流数据处理任务。

MLFlow可以在kubeflow的基础上解决博客开头列出的大部分问题。与TFX相比,Kubeflow的优势在于,由于Kubeflow是构建在Kubernetes之上的,所以您不必担心伸缩性等问题。

结论

这些只是在构建生产ML系统时需要担心的一些事情。其他各种问题包括日志记录和监视各种服务的状态。还有许多其他工具,比如Istio,可以用来保护和监视系统。云原生计算基金会构建并支持云本地可扩展系统的各种其他项目。

许多工具仍在积极开发中,因此,构建可扩展的机器学习系统仍然是一个非常具有挑战性的问题。我热衷于建立生产机器学习系统,以解决具有挑战性的现实问题。如果你对此也感兴趣,请持续关注我的更新~

End

推荐阅读

| 用spaCy自然语言处理复盘复联无限战争(下)

| 福特正在与Agility Robotics合作,将自动驾驶与交付机器人结合

| 机器人拉飞机!IIT开发全新四足机器人HyQReal

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux 实用运维脚本分享
#查看僵尸进程 ps -al | gawk '{print $2,$4}' | grep Z # 匹配电子邮件的地址 cat index.html | egrep -o "[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}" > ans.txt #匹配http URL cat index.html | egrep -o "http://[A-Za-z0-9.]+\.[a-zA-Z]{2,3}" > ans.txt #纯文本形式下载网页 lynx -dump w
杰哥的IT之旅
2022/09/02
6.9K0
SecureCRT 命令行备注「建议收藏」
Non-authoritative answer: Name: a.kaixin001.com Addresses:
全栈程序员站长
2022/11/01
1.3K0
【建议收藏】Linux工作/面试常用命令集锦
管道符“|”将两个命令隔开,左边命令的输出作为右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推
JavaEdge
2021/12/07
8800
【建议收藏】Linux工作/面试常用命令集锦
Linux命令行的艺术
熟练使用命令行是一种常常被忽视或被认为难以掌握的技能,但实际上,它可以提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时发现的一些关于命令行的使用的小技巧的摘要。有些小技巧是非常基础的,而另外一些则是相当复杂的甚至晦涩难懂的。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。 必读 涵盖范围: * 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处。本文致力于做到覆盖面广(尽量包括一切重要的内容),具体(给出最常见的具体的例子)以及简
小小科
2018/05/03
7.3K0
Linux常用50个命令分享:功能、示例与实用技巧
公众号:码到三十五
2024/03/19
6980
Linux命令必知必会
第一行中,03:30:22是当前时间,up 39 min是系统运行的运行了多长时间,1 user指出了当前有几个用户登录到系统,load average指的是系统负载,这后面的三个值分别是1分钟,5分钟,15分钟的系统负载平均值。
用户2131907
2018/05/15
4K4
linux常用命令汇总_unix命令大全
for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done
全栈程序员站长
2022/11/09
6.2K0
linux常用命令汇总_unix命令大全
10分钟让你掌握Linux常用命令(+1万+++收藏)
split命令:可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
全栈程序员站长
2022/07/01
3K0
10分钟让你掌握Linux常用命令(+1万+++收藏)
shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“--help” 选项 使用man命令阅读手册页 命令行编辑的几个辅
Linux命令的通用命令格式:命令字 [选项] [参数] 选项及参数的含义 选项:用于调节命令的具体功能 以 “-”引导短格式选项(单个字符),例如“-l” 以“--”引导长格式选项(多个字符),例如“--color” 多个短格式选项可以写在一起,只用一个“-”引导,例如“-al” 参数:命令操作的对象,如文件、目录名等
青灯古酒
2023/10/16
6830
shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“--help” 选项 使用man命令阅读手册页 命令行编辑的几个辅
蓝桥ROS机器人之命令行实践
参考网址: github.com/jlevy/the-art-of-command-line 直接选择简体中文实践即可。 github.com/jlevy/the-art-of-co
zhangrelay
2022/05/01
8980
蓝桥ROS机器人之命令行实践
ubuntu 小技巧
InterWikiMap: Ubuntu技巧 (2007-02-21 16:51:22由huangjiahua编辑)
全栈程序员站长
2021/05/19
8540
命令行的艺术
熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。
iMike
2019/06/02
1.1K0
Shell(Linux)常用命令
所谓Shell(壳),一般是指由操作系统提供的,用于计算机用户向操作系统输入相关指令并得到结果的程序。Shell可以字符形式的,也可以是图形界面形式的。 Shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起,形成一个相当于面向过程的程序。 在windows系统中见到的桌面即explorer.exe(资源管理器)是图形shell,而cmd就是命令行shell(Command shell)。 基础命令行和Shell都可以操作Linux系统,区别在于基础命令行(ls、cd等),是一种单一的操作;Shell可以比基础命令行更复杂,是一种组合型的操作。相比基础命令拥有了面向过程的概念。
十玖八柒
2022/08/01
3.3K0
Shell(Linux)常用命令
mac 终极教程,最全,最实用的教程
备注:我们也可以用「Space」键代替“open”关键字,按下“Space + 文件名字符串”进行搜索,更加方便快捷
AI拉呱
2021/01/14
4.1K0
ubuntu命令大全
查看软件xxx安装内容 #dpkg -L xxx 查找软件 #apt-cache search 正则表达式 查找文件属于哪个包 #dpkg -S filename apt-file search filename 查询软件xxx依赖哪些包 #apt-cache depends xxx 查询软件xxx被哪些包依赖 #apt-cache rdepends xxx 增加一个光盘源 #sudo apt-cdrom add 系统升级 #sudo apt-get update #sudo apt-ge
闵开慧
2018/03/30
2.7K0
命令行界面 (CLI)、终端 (Terminal)、Shell、TTY,这些都是啥意思?
为什么突然想写这样一篇文章呢?其实是因为在最近计划发布的一篇关于 WSL (Windows Subsystem for Linux) 的博文中,我打算对终端模拟器、Shell 的选择与配置进行一些说明。不过对于刚接触 Linux 或者刚接触命令行界面的同学,可能会有些难以理解它们之间的区别(事实上我当初也是这样)。
明月登楼
2018/08/25
5.2K0
命令行界面 (CLI)、终端 (Terminal)、Shell、TTY,这些都是啥意思?
内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“--help” 选项 使用man命令阅读手册页 命令行编辑的几个辅助
/etc/group:保存组帐号基本信息 /etc/gshadow:保存组帐号的密码信息
青灯古酒
2023/10/16
4800
内核与用户之间,负责解释命令行 获得命令帮助 内部命令help 命令的“--help” 选项 使用man命令阅读手册页 命令行编辑的几个辅助
技能篇:开发必备linux命令大全-稳赚不亏
我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须。接下来将一一详细介绍一些常用的linux的命令
潜行前行
2021/08/20
4.5K0
技能篇:开发必备linux命令大全-稳赚不亏
Win10 CMD命令大全与超好用的快捷键
按组合键 Win(Windows图标键)+R 键打开运行窗口,输入“cmd”按回车即可打开cmd命令提示符
全栈程序员站长
2022/09/02
4.1K0
Win10 CMD命令大全与超好用的快捷键
工作常用linux命令「建议收藏」
Q:添加了新用户bae,sudo一条安装命令后报错xxxis not in the sudoers file. This incident will be reported. 需要允许用户youuser执行sudo命令(需要输入密码),怎么做: 1、切换到root用户下 2、/etc/sudoers文件默认是只读的,对root来说也是,因此需先添加sudoers文件的写权限,命令是: 即执行操作:chmod u+w /etc/sudoers 3. 编辑sudoers文件 即执行:vi /etc/sudoers 找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)
全栈程序员站长
2022/11/08
2.9K0
推荐阅读
相关推荐
Linux 实用运维脚本分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验