【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

我踩过这么多坑后,给你总结了一套部署大规模机器学习的流程

  • 2018-12-26
  • 本文字数:3615 字

    阅读完需:约 12 分钟

我踩过这么多坑后,给你总结了一套部署大规模机器学习的流程

本文最初发布于 Towards Data Science 博客,经原作者 Priansh Shah 授权由 InfoQ 中文站翻译并分享。


AI 前线导读:现在,创建深度学习模型越发容易,对数据科学家和开发者来说,在测试环境中打造复杂模型已不再是难事。但是要大规模部署人工智能模型就变得非常困难了,而且这个问题也不会随着公司规模扩大而消失,更可怕的是,相关资料还很匮乏。Priansh Shah 跟我们分享了他在云端上大规模部署人工智能的心得。


现在,关于人工智能的教程多如牛毛:比如,如何进行目标检测、图像分类、自然语言处理、构建聊天机器人等等,这份清单还不止这些。


但当我查找有关如何正确进行大规模部署人工智能的资料时,我发现相关内容屈指可数。更令人惊讶的是,眼下这些少得可怜的资源似乎都重申了同样的这几点:


  • 使用 TensorFlow 之类的可扩展框架构建模型。

  • 要么将其打包到客户端中(如 TF.js Lite、TF-slim 等),要么将其部署为带有容器的微服务。


我对上述第二点更感兴趣,因为我已经开发了一个模型,但让我很惊讶的是,在网上,关于如何实现这点的细节,相关资料寥若晨星。至于每种解决方案有何缺点的信息更是寥寥可数。经过几天的研究并在 Crane.ai 上进行人工智能规模化之后,我整理了更多的信息,如有关部署、它们的缺点以及如何在低级别上优化 TensorFlow 模型。

将其打包到客户端?太槽糕了!

其中一项最常用的技术就是使用 TensorFlow、TF Lite 或 TensorFlow Slim 等工具将人工智能打包到你所选择的客户端中。限于篇幅,我并不会赘述这些框架是如何运行的,而是重点阐述它们的缺点。


  • 计算能力。这些模型的部署问题是它们需要海量内存(我指的是受移动 App 或浏览器的限制,即 > 1~2GB 内存)。很多手机并不具备这种能力,桌面浏览器会延迟 UI 线程,同时也会拖慢电脑、使发热更严重,以致于启动了 CPU 风扇等等。

  • 推理时间。在计算能力未知的设备上运行模型时,推理时间通常也是未知的;而且这些还不是配置 GPU、大内存、高配 CPU 的机器,而是智能手机、浏览器以及普通电脑上运行的桌面应用程序。使用更大的模型仅需一分钟即可轻松地进行推理,但从用户体验的角度来看,却是一个大大的 “NO”。



  • 大文件。不幸的是,大多数模型都存储在相当大的文件中(我们说的是动辄几十 MB、几百 MB 那种)。因此,这会拖慢速度,而且加载起来会占用大量内存,并且会大大增加了应用程序包的大小。

  • 不安全。除非你使用的是开源模型,否则,你应该将你的人工智能和预训练的检查点进行相对保密。然而不幸的是,当你将模型与应用程序打包在一起时,不仅你的推理代码容易遭到反编译,而且预训练的检查点也会被打包其中,很容易被窃取

  • 难以更新。如果想更新模型,那么客户端有两项选择。要么用户通过像 Google Play、Apple 的 App Store 那样的应用商店发布的更新进行升级,但这方式会带来频繁的大更新(这对于用户来说非常麻烦,而且这一更新可能会被终止或者永远不更新,具体要取决于用户的设置);或者应用程序自身进行检查更新和获取元数据。后者听上去更好一些,但这意味着,你必须通过用户可能不稳定的连接下载一个 100MB 以上的文件;这需要耗费一段时间,因此你的应用程序至少要在后台运行才能完成这一更新过程,而且你还需要支付相当大的网络输出成本(这取决于你采用的云端)。

  • 缺乏可训练性。针对新用户数据的训练模型提供了一定程度的个性化,同时提高了其准确性,并构建了核心的、高信号的数据集。不幸的是,大多数设备缺乏训练模型的计算能力,就算它们有这种能力,也不可能将训练的效果传送到运行这一应用的服务器或其他设备。


由于这些缺点的存在,在客户端上部署和维护大型神经网络几乎是一个不可能实现的任务。因此,我们剔除了这一选项。

将其部署为云端点


云端是大规模部署模型的强大工具。你可以根据需求调整完全定制的环境,将你的应用进行容器化,并立即横向扩展,同时提供可与大公司相媲美的 SLA 和正常运行时间。


对大多数 TensorFlow 模型来说,部署周期是相同的:


  • 将图固化为 Protobuf 二进制

  • 调整推理代码以使用固化图

  • 将应用程序容器化

  • 在上面添加 API 层


第一部分相对简单。“固化”(Freezing)图涉及到创建一个 Protobuf 二进制文件,其中包含检查点所涉及的所有命名节点、权重、体系结构和元数据。这些都可以用各种工具来实现,最为流行的工具就是 TF 自己的工具,可以在给定输出节点名的情况下,固化任何图。要深入了解这项技术,以及如何完成这一部分的更多信息,可参阅《A Tool Developer’s Guide to TensorFlow Model Files》中的 “Freezing” 一节:


https://www.tensorflow.org/guide/extend/model_files#freezing


调整推理代码也不难;多数情况下,你的feed_dict将保持不变,主要区别在于,添加的加载模型的代码,也许还有输出节点的规范。


容器化也非常简单:只需在 Dockerfile 中设置环境即可(可使用 TF docker 镜像作为基础)。但当我们开始添加 API 层时,事情就开始变得一团糟。通常有两种方法可以做到这一点:


  • 部署运行推理脚本的可扩展容器。这些容器针对输入运行脚本,脚本启动会话并运行推理,通过管道将输出内容反馈给你作为结果。这是非常有问题的;对大多数云服务提供商来说,添加一个操作容器和管道的 API 层并不是一件很容易的简单事(例如,虽说 AWS 有 API 网关,但它也远没有你所期望的那么方便),这种方法效率最低。这里的问题在于容器启动、硬件分配、会话启动和推理方面损失了宝贵的时间。如果打开stdin并保持管道输出,就会加快脚本的速度,但这样一来,就失去了可扩展性(因为你现在已连接到该容器的 STDIN,它就将无法接受多个请求)。

  • 部署运行 API 层的可扩展容器。尽管在架构上类似,但出于几种原因,这种方法效率更高;通过将 API 层放到容器中,可以缓解先前提到的大部分问题。虽然这样一来,需要更多的资源,但它是最小的,并不意味着垂直扩展。它允许每个容器保持运行,而且这种情况下 API 是分散的,因此将特定的stdin/stdout连接到主请求路由也没有问题。这意味着你可以节约启动时间,并且可以在服务多个请求时,能够轻松保持速度和横向扩展。你可以使用负载均衡器将容器集中化,并使用 Kubernetes 来保证几乎 100% 的正常运行时间并管理 Fleet。这种方法简单而有效!


通过容器 Fleet 来分散 API 的主要缺点是,这些成本加起来会很快变得昂贵。不幸的是,这对人工智能来说是不可避免的,尽管有一些方法可以缓解这种情况。


  • 重用会话。你的 Fleet 会根据负载成比例地扩展与缩小,因此你的目标是将运行推理所需时间最小化,以便容器可以腾出时间来处理另一个请求。一种方法是重用 tf.Sessiontf.Graph,一旦初始化后就存储它们并将其作为全局变量进行传递。这就会减少 TF 启动会话和构建图所需的时间,从而大大加快推理任务的速度。这一方法即使在单个容器上也有效,并且被广泛用作最小化资源重新分配和最大化效率的技术。

  • 缓存输入,如果可能,也缓存输出。在人工智能中,动态编程范式最为重要;通过缓存输入,可以节约预处理或从远程获取所需的时间,而通过缓存输出,可以节约运行推理所需的时间。这些都可以在 Python 中轻松完成, 但你应该问问自己它是否适合你的用例 。通常情况下,模型会随着时间的推移而变好,这将极大地影响你的输出缓存机制。在我自己的系统中,我喜欢使用所谓的 “80-20” 规则。当模型的准确率低于 80% 时,我不会缓存任何输出。一旦达到 80%,我就开始缓存,并在某个准确度将缓存设置为过期(而不是在某个时间点设置为过期)。这样,随着模型变得更为准确,输出也将会发生变化,但在这个 “80-20” 规则减轻的缓存中,性能和速度之间的权衡较少。

  • 使用任务队列。通常来说,需要运行的推理任务有大一些的,也有小一些的(在我们的例子中,既有大一些的,也有小一些的,还有复杂的和简单的图)。就用户体验来说,这里使用堆队列并优先处理较小的任务可能会更好,这样运行一个简单步骤的用户只需等待该步骤即可,而无需等待先完成另一个用户的更大推理。(你肯定会想,为什么这里就不能使用横向扩展呢?不是不可以,而是这样一来会增加成本

  • 在具有任务队列的专用 GPU 上训练模型。训练模型是一项长期而艰巨的任务,它需要大量的资源使用,并且模型在其持续期间内无法使用。如果你要将每个交互反馈到模型中进行训练,请考虑在单独的服务器上运行,也许还要使用 GPU。一旦训练完成之后,你可以将模型(在 AWS 中,可以将模型存储库集中在 S3 中)部署到容器中去。

结语

经过深思熟虑,我们提出了一个大规模部署人工智能的有效工作流程:


  • 固化图,并在 API 之下封包推理

  • 重用会话和图,并缓存输入和输出

  • 使用 Docker(包括 API 层)将应用程序进行容器化

  • 使用 Kubernetes 在你所选择的云端上大规模部署应用程序

  • 从推理中分离训练

  • 开发任务队列确定处理较小的任务的优先级


使用这些技术,你应该能够以最小的成本和开销进行部署,同时最大限度地提高速度和效率!


原文链接: https://towardsdatascience.com/scaling-ai-2be294368504


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2018-12-26 08:002746
用户头像

发布了 526 篇内容, 共 240.5 次阅读, 收获喜欢 1543 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

Github标星67.9k的微服务架构以及架构设计模式笔记我粉了

做梦都在改BUG

Java 架构 微服务 设计模式

开源堡垒机和免费商业堡垒机哪个用的更香?

行云管家

开源 网络安全 免费堡垒机

Elasticsearch之join关联查询及使用场景 | 京东云技术团队

京东科技开发者

数据库 elasticsearch sql join 企业号 5 月 PK 榜

阿里逆天级调优方案,内部这套Java性能调优实战宝典,堪称教科书

做梦都在改BUG

Java 性能优化 JVM 性能调优

TDengine 成功“晋级” Percona Live 2023 银牌赞助商,开发者驻足关注

爱倒腾的程序员

万字长文详述ClickHouse在京喜达实时数据的探索与实践 | 京东云技术团队

京东科技开发者

数据库 flink Clickhouse 企业号 5 月 PK 榜

ps神经滤镜是干什么的,神经滤镜的功能和作用

Rose

Photoshop 2023下载 ps神经滤镜 Neural Filters滤镜

运行Adobe软件遇到“Adobe app is not available”怎么解决

Rose

Adobe软件

Spring Validated 校验框架,让你的项目更简洁,提升开发效率

做梦都在改BUG

Java spring Validated

优质高效!阿里甩出SpringBoot巅峰之作,进阶不二之选

做梦都在改BUG

Java Spring Boot 框架

如何做好需求管理?华为云需求管理利器CodeArts Req解读

华为云PaaS服务小智

云计算 产品经理 需求管理 华为云

名不虚传!字节技术官甩出的"保姆级"数据结构与算法笔记太香了

做梦都在改BUG

Java 数据结构 算法 LeetCode

Photoshop2023硬件要求,PS2023最低配置要求

Rose

PS2023 PS2023系统要求 Photoshop2023硬件要求 神经滤镜Neural Filters

百度营销首创CPQL模式,破解汽车营销线索难题

Geek_2d6073

火山引擎DataTester:如何使用A/B测试优化全域营销效果

字节跳动数据平台

AB testing实战 ab测试 A/B测试

首站中科院!百度商业AI技术创新大赛开启巡回宣讲

百度Geek说

人工智能 百度 企业号 5 月 PK 榜

如何编写一个健壮的 npm 包 | 京东云技术团队

京东科技开发者

npm npm chalk-next 企业号 5 月 PK 榜

浅析 Redis 中 String 数据类型及其底层编码

做梦都在改BUG

redis 数据结构 string

1个Java程序员需要具备什么样的素质和能力才可以称得上高级工程师?

Java永远的神

程序员 后端 架构师 java面试 Java性能优化

MacOS高效iOS代码编写工具|AppCode 2023 激活版v2023.2 兼容M1/M2/intel

Rose

AppCode中文 AppCode 2023破解 AppCode密钥 iOS/macOS开发

iMovie for Mac(专业视频剪辑工具) v10.3.6中文版

Rose

Mac视频剪辑软件 iMovie中文版 iMovie下载 iMovie Mac破解版

字节Java全能手册火了!多线程/网络/性能调优/框架啥都有

做梦都在改BUG

Java 微服务 Spring Cloud socket

Nautilus Chain开启全球行,普及Layer3概念加速其采用

鳄鱼视界

Iframe在Vue中的状态保持技术 | 京东云技术团队

京东科技开发者

html Vue iframe 跨域 iframe 企业号 5 月 PK 榜

CFS第十二届财经峰会7月举行, 候选品牌:行云管家

行云管家

云计算 商业 财经峰会

首个机器学习实时特征平台测试基准论文被 VLDB 2023 录取

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

前端微服务无界实践 | 京东云技术团队

京东科技开发者

微服务 前端 企业号 5 月 PK 榜 无界

完美!京东资深架构师爆肝纯手打700页架构进阶宝典我粉了

做梦都在改BUG

Java 架构 亿级流量

顺丰科技携手飞桨自研“智能外呼机器人”,为客户打造优质服务体验

飞桨PaddlePaddle

nlp 语音识别 百度飞桨

PAI-Diffusion中文模型全面升级,海量高清艺术大图一键生成

阿里云大数据AI技术

人工智能 模型 Stable Diffusion 企业号 5 月 PK 榜

选择小程序第三方开发框架,你需要知道这些

没有用户名丶

我踩过这么多坑后,给你总结了一套部署大规模机器学习的流程_文化 & 方法_Priansh Shah_InfoQ精选文章