【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

为何我们用 Go 而非 Python 来部署机器学习模型?

  • 2020-05-06
  • 本文字数:2326 字

    阅读完需:约 8 分钟

为何我们用 Go 而非 Python 来部署机器学习模型?

作者 Caleb Kaiser 此前曾撰写过《为何我们用 Go 而非 Python 编写机器学习基础设施平台?》,InfoQ 中文站曾经翻译并分享。今天,我们带来了作者的新作《为何我们用 Go 而非 Python 来部署机器学习模型》,在这篇文章中,Cortex Labs 介绍了团队为何用 Go 而非 Python 部署机器学习模型。

本文最初发表在 Towards Data Science,经原作者 Caleb Kaiser 授权,InfoQ 中文站翻译并分享。



Python 是当下最流行的机器学习语言,对这一点大家应该没有什么异议。不过很多机器学习框架进行实际计算使用的是 CUDA C/C++ 等语言,只是它们都提供了 Python 接口。因此,大多数机器学习从业者都是直接使用 Python 工作的。


我们的机器学习基础设施 Cortex 也是如此,它 88.3% 的代码是由 Go 语言编写的。



来源:Cortex GitHub


大规模部署模型不同于编写调用 PyTorch 和 TensorFlow 函数的 Python 脚本。要实际大规模地运行一个生产机器学习 API,我们需要基础设施来做如下事情:


  • 自动伸缩:这样流量波动发生时就不会中断我们的 API(且我们的 AWS 仍然保持可控)。

  • API 管理:处理多个部署。

  • 滚动更新:这样我们就可以在更新模型的同时还可以为请求提供服务。


我们构建了 Cortex 来提供这一功能。我们之所以决定用 Go 语言来编写,是出于以下几个原因:

1.Go 语言已为基础设施社区所接受

就背景而言,我们是软件工程师,而不是数据科学家。我们进入机器学习领域是因为我们想构建像 Gmail 的 Smart Compose 这样的功能,而不是因为我们对反向传播着迷(尽管它确实很酷)。我们想要这样的一个简单工具,它将采用经过训练的模型,并自动实现所需的所有基础设施功能,如可复制的部署、可扩展的请求处理、自动监控等,以便将其部署为 API。


虽然这种从模型到微服务的一体化平台还不存在,但我们之前已经在普通软件中实现了这些功能。我们知道什么样的工具适合这项工作,并且还知道它们是用什么语言编写的。


构建 Kubernetes、Docker 和 Terraform 等工具的团队使用 Go 语言是有原因的。Go 语言的速度很快,能很好地处理并发,可以编译成单一的二进制文件。这样一来,选择 Go 语言对我们来说,风险相对较低。其他团队已经用 Go 语言解决了类似的挑战。


此外,对于基础设施工程师来说,使用 Go 语言编写更容易做出贡献,因为他们可能已经熟悉了这门语言。

2. Go 语言解决了与并发性和调度相关的问题

管理一个部署需要许多服务同时运行,并按照精确的时间表进行。值得庆幸的是,Gorountine、channel(通道)和 Go 内置的 timer 和 ticker 为并发性和调度提供了一个优雅的解决方案。


在较高的级别上,Goroutine 是指 Go 语言通过在一个虚拟独立线程上执行一个原本正常的函数,使其并发运行。一个操作系统线程可以容纳多个 Goroutine。channel 允许 Goroutine 共享数据,而 timer 和 ticker 允许我们调度 Goroutine。


我们在需要的时候使用 Goroutine 来实现并发性,比如 Cortex 需要将多个文件上传到 S3,并行运行这些文件可以节省时间;或者是为了保持一个潜在的、长期运行的功能,比如 CloudWatch 的流日志,以免阻塞主线程。


此外,我们在 Goroutine 中使用 timer 和 ticker 来运行 Cortex 的 autoscaler。我已经写过一份关于如何在 Cortex 中实现副本级自动扩展的的完整版报告,该报告的中心思想是,Cortex 计算排队和进行中的请求数量,计算每个副本应该处理多少并发请求,并进行适当的扩展。


为了做到这一点,Cortex 的监控功能需要以一致的时间间隔执行。Go 的调度器确保在应该进行监视的时候进行监视,而 Goroutine 允许每个监视函数并发地、独立地执行每个 API。


要在 Python 中实现所有这些功能,也许可以使用 asyncio 这样的工具来实现,但 Go 让它变得如此简单,这对我们来说不啻为一个福音。

3. 在 Go 中构建跨平台 CLI 更容易

我们的 CLI 部署模型并管理 API:



来源:Cortex GitHub


我们希望 CLI 在 Linux 和 Mac 上都可以用。最初,我们尝试用 Python 语言来编写 CLI,但用户一直很难让它在不同的环境中使用。当我们在 Go 中重新构建 CLI 时,能够将它编译成单一的二进制文件,这样一来,我们就可以跨平台分发 CLI,而不需要做太多额外的工程计划。


编译后的 Go 二进制代码与解释性编程语言相比,性能上的优势也很明显。根据计算机基准测试的结果来看,Go 的速度明显比 Python 要快得多


无独有偶,许多其他基础设施的 CLI,如 eksctl、kops 和 Helm 客户端等,都是用 Go 语言编写的。

4. Go 有助于构建可靠的基础设施

最后一点,Go 有助于 Cortex 最重要的特性:可靠性。


在所有软件中,可靠性显然很重要,但对于推理基础设施来说,可靠性绝对是最关键的。Cortex 中的一个 bug 可能会让推理费用严重增加。如果存在严重的 bug,那么很有可能在编译过程中被发现。对于一个小团队来说,这是非常有用的。


与 Python 相比,Go 的高冷性质可能会使得它上手变得更痛苦一些,但这些内部的“防护栏”为我们提供了第一道防线,帮助我们避免犯下愚蠢的类型错误。

小结:Python 用于脚本,Go 用于基础设施

我们仍然喜欢 Python,它在 Cortex 中占有一席之地,特别是在模型推理方面。


Cortex 支持 Python 作为模型服务脚本。我们编写 Python,将模型加载到内存中,进行推理前后处理,并为请求提供服务。然而,即使是 Python 代码也被打包到 Docker 容器中,这些容器也是由 Go 语言编写的代码进行编排的。


对于数据科学和机器学习工程来说,Python 将(并且应该)仍然是最流行的语言。但是,当涉及到机器学习基础设施时,我们对 Go 很满意。


作者介绍:


Caleb Kaiser,Cortex Lab 创始团队成员,曾在 AngelList 工作,最初在 Cadillac 供职。


原文链接:


https://towardsdatascience.com/why-we-deploy-machine-learning-models-with-go-not-python-a4e35ec16deb


公众号推荐:

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

2020-05-06 09:3910959
用户头像
蔡芳芳 InfoQ主编

发布了 781 篇内容, 共 496.5 次阅读, 收获喜欢 2749 次。

关注

评论 2 条评论

发布
用户头像
所以python到底啥用,就只能写脚本和爬虫了吗。。
2020-05-06 16:46
回复
还有数据分析。
2020-05-28 10:46
回复
没有更多了
发现更多内容

OpenYurt 联手 eKuiper,解决 IoT 场景下边缘流数据处理难题

阿里巴巴云原生

云计算 阿里云 开源 云原生 中间件

智能时代的信任口诀:让计算远离算计

白洞计划

Excelize 发布 2.4.1 版本,新增并发安全支持

xuri

Excel Go 语言 Excelize #Github

为什么区块链是互联网的100倍?

CECBC

Compose 中的主题

Changing Lin

8月日更

能源区块链研究 | 加密行业碳抵消有助于大众接纳比特币吗?

CECBC

用Java仿一个低配版的Everything软件

Regan Yue

Java 8月日更 Everything

趣说开源|学生如何参与开源社区?

SphereEx

数据库 开源

从0开始的TypeScriptの九:接口Interfaces · 中

空城机

typescript 大前端 8月日更

Python入门:ChainMap 有效管理多个上下文

华为云开发者联盟

Python 字典 上下文 映射 ChainMap

FastApi-15-文件上传-3

Python研究所

FastApi 8月日更

导播上云,把 “虚拟演播厅” 搬到奥运村

阿里云视频云

阿里云 视频处理 视频直播 视频云 云导播

区块链技术:为什么说波卡能加速区块链行业的发展?

CECBC

传统企业数字化转型的三大技术误区

码猿外

数字化转型 敏捷精益

悄悄学习Doris,偷偷惊艳所有人 | Apache Doris四万字小总结

王知无

【Flutter 专题】68 图解基本约束 Box (三)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

你真的了解 fail-fast 和 fail-safe 吗

4ye

Java 后端 并发 map 8月日更

Spark RDD模型

布兰特

spark

【Vue2.x 源码学习】第三十七篇 - 组件部分 - 组件的合并

Brave

源码 vue2 8月日更

高并发中,那些不得不说的线程池与ThreadPoolExecutor类

华为云开发者联盟

Java 线程 高并发 线程池 ThreadPoolExecutor类

Fastdata for TSDB: SQL使时序数据可扩展

数据库 大数据 时序数据库 tsdb 数据智能

手撸二叉树之递增顺序搜索树

HelloWorld杰少

数据结构与算法 8月日更

零代码以“王者荣耀”为例解析设计七原则

华为云开发者联盟

软件 设计原则 王者荣耀 单一职责

Seata TCC模式原理与实战

码农参上

分布式事务 seata SpringCloud Alibaba 8月日更

百亿级分布式文件系统之元数据设计

焱融科技

云计算 技术 分布式 高性能 文件存储

LeetCode题解:220. 存在重复元素 III,暴力法,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

docker的使用

Rubble

8月日更

架构实战营 - 模块五作业

思梦乐

netty系列之:自定义编码解码器

程序那些事

Java Netty 程序那些事

Go语言:如何通过Go来更好的开发并发程序 ?

微客鸟窝

Go 语言

数据加密和BCrypt哈希算法应用 | StartDT Tech Lab 15

奇点云

为何我们用 Go 而非 Python 来部署机器学习模型?_文化 & 方法_Caleb Kaiser_InfoQ精选文章