【fcon】聚焦金融行业在数智化的全面革新,一线的金融数智化实践干货
写点什么

为何我们用 go 而非 python 来部署机器学习模型?-金马国际

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

    阅读完需:约 8 分钟

6 月 17 日,极客时间正式上线,10 周掌握企业级 agents 从设计、开发到部署全流程。

作者 caleb kaiser 此前曾撰写过《》,infoq 中文站曾经翻译并分享。今天,我们带来了作者的新作《为何我们用 go 而非 python 来部署机器学习模型》,在这篇文章中,cortex labs 介绍了团队为何用 go 而非 python 部署机器学习模型。

本文最初发表在 towards data science,经原作者 caleb kaiser 授权,infoq 中文站翻译并分享。



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


我们的机器学习基础设施 也是如此,它 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 的速度明显。


无独有偶,许多其他基础设施的 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 供职。


原文链接:




公众号推荐:

agi 概念引发热议。那么 agi 究竟是什么?技术架构来看又包括哪些?ai agent 如何助力人工智能走向 agi 时代?现阶段营销、金融、教育、零售、企服等行业场景下,agi应用程度如何?有哪些典型应用案例了吗?以上问题的回答尽在《中国agi市场发展研究报告 2024》,欢迎大家扫码关注「ai前线」公众号,回复「agi」领取。

2020-05-06 09:3911051
infoq主编

发布了 782 篇内容, 共 503.9 次阅读, 收获喜欢 2756 次。

关注

评论 2 条评论

发布
所以python到底啥用,就只能写脚本和爬虫了吗。。
2020-05-06 16:46
回复
还有数据分析。
2020-05-28 10:46
回复
没有更多了
  • 如果你感觉chatgpt就说给我生成一堆花哨的东西,帮我解决那些文字的工作,那就想错了。

    2023-05-17

  • 在线json转go bson工具

    2021-12-11

  • increment 采访了 datadog、braze 和 betterup 的工程负责人,讨论了容器工具、测试和监控,以及他们如何处理容器迁移的问题。

  • 这节课,我们来看一下 gitops 的历史和发展过程。

    2023-03-06

  • 本文希望帮助公司做出务实的基于事实和数据驱动的决策。

  • 自reach项目启动16个月后,doordash取得了重大进展,实现了一个完整的微服务架构,并且具备了退役单体以及与之关联的基础设施的能力。

  • 构建可扩展的、高可靠性的软件系统是每个 sre 的终极目标。本文概述了在监控、部署和维护领域中最受欢迎的几个开源项目。

  • 从hadoop,到spark,到flink,为什么大数据会有这三代的演进?是因为它们都解决了用户对这玩意儿的核心诉求,那用户对这几个大数据软件的核心诉求是什么?

    2022-09-28

  • 本文是可汗学院的工程师们在编写 50 多万行 go 代码后的感想。

  • 亚马逊发文力捧 rust ,go 技术负责人:别“拉踩”我们

    “我们应该以辩证的怀疑态度来看待。”

  • 2023-09-27

  • “语言本身可能不是瓶颈,而是外部系统的限制。”

  • 本精选集的目的在于提供一个便捷的参考资源,帮助你全面掌握chatgpt。

    2023-05-01

  • lambda是一个通用且流行的serverless平台,但是面对机器学习的具体场景,它有一定的不足之处。

  • 关于未来计算的10大预测包括:wasm将无所不在,rust的流行度将继续增加,kubernetes将迎来重要对手,区块链生态系统将会崩溃等等。

  • 在云计算时代,go 是首选的编程语言,很多云的基础设施都是由 go 来写的,更别说还有 docker 和 kubernetes 这样的大杀器。对于后端工程师来说,这是最值得学习的技能。

    2021-02-27

  • 将作业从serverless迁移到kubernetes job的经验教训、以及以最小的代价实现这一目标的技术。

  • 可编写rust也很难......

  • 这节课我们先来用flask搭建一个简单的推荐服务。我们会深入地认识flask,学习如何使用flask框架来搭建一个简单的web服务。

    2023-05-17

  • 本文回顾了 corebackend 团队最近两年中应用rust的情况,并分享其大规模应用 rust 过程中总结的观点。

发现更多内容
金马国际
网站地图