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」领取。

评论 2 条评论