Press "Enter" to skip to content

为什幺我们用 Go 而不是 Python 编写机器学习基础架构

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

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

目前,Python是机器学习项目中最流行的语言,任何人对此应该都不会感到惊讶。虽然像R、C++和Julia这样的语言都有自己的支持者——以及使用案例——但Python仍然是最普遍接受的语言,每个主流的机器学习框架都在使用它。

 

但是,在Cortex,我们的代码库中Go占87.5%。

Python特别适合机器学习算法,只是生产机器学习系统的一个组成部分。要真正大规模地运行一个生产机器学习API,你需要实现具有如下特性的基础设施:

 

自动缩放,这样流量波动就不会破坏你的API;

 

API管理,以处理同步API部署;

 

滚动更新,这样你就可以在更新模型的同时仍然为用户提供服务。

 

构建 Cortex 就是为了自动化所有这些基础设施,以及处理其他一些问题,比如日志记录和成本优化。

 

Go是构建此类软件的理想选项,理由如下。

 

1. 并发对于机器学习基础设施来说至关重要

 

用户可以将许多不同的模型部署为不同的API,所有这些模型都托管在同一个Cortex集群中。为了让Cortex操作员管理这些不同的部署,它需要调用一些不同的API。举两个例子:

 

Kubernetes API,Cortex调用它们在集群上部署模型;

 

各种AWS API——EC2、S3、CloudWatch等——Cortex调用它们管理AWS上的部署。

 

用户不直接与这些API交互。相反,Cortex通过编程调用这些API来配置集群、启动部署和监控API。

 

以一种可执行的、可靠的方式实现所有这些API调用是一项挑战。并发处理是最有效的处理方法,但也引入了复杂性,因为现在我们不得不担心竞争条件之类的问题。

 

Goroutines(并行执行的函数,Go运行时将其视为轻量级线程)以及它们通过channel相互通信的能力,为这个问题提供了一个优雅的开箱即用的解决方案。我们可以在Python中使用asyncio或类似的东西来实现,但是Go专门为并发而设计的事实使我们的工作变得更容易。

 

2. 使用Go构建跨平台CLI更容易

 

Cortex CLI是一个跨平台工具,允许用户直接通过命令行部署模型和管理API:

(点击 这里 查看动图)

 

最初,我们用Python编写了CLI,但事实证明,使用Python实现很难跨平台分发。因为Go编译为单个二进制文件——不需要依赖管理——为我们提供了一个简单的解决方案。

 

与解释型语言相比,编译后的Go二进制文件性能优势也非常明显。根据计算机基准测试游戏,Go比Python 快得多

 

许多其他的基础设施CLI工具都是用Go编写的,也许这不是巧合,这就引出了我们的下一个理由。

 

3. Go生态系统非常有益于基础设施项目

 

开源的好处之一是你可以从喜欢的项目中学习。例如,Cortex存在于Kubernetes(它本身是用Go编写的)生态系统中。幸运的是,在这个生态系统中,我们有许多优秀的开源项目可以学习,包括:

 

kubectl :Kubernetes的CLI

 

minikube :一个在本地运行Kubernetes的工具

 

helm :一个Kubernetes包管理器

 

kops :一个管理生产Kubernetes的工具

 

eksctl :Amazon EKS的官方CLI

 

以上所有项目都是用Go编写的,而且不仅仅是Kubernetes项目。不管是CockroachDB还是Hashicorp的基础设施项目,包括Vault、Nomad、Terraform和Packer,它们都是用Go编写的。

 

Go在基础设施领域中的流行还有另一个影响,那就是许多对基础设施工作感兴趣的工程师同时也熟悉Go。作为一个开源项目,我们在做技术栈选择时会考虑贡献者数量,Go满足这一项。事实上,第一个全职加入Cortex实验室的工程师就是在研究用Go编写的机器学习项目时发现了我们。

 

4. 使用Go进行开发是一项令人愉快的工作

 

关于为什幺我们最终选择使用Go构建Cortex,我想说的最后一点是,Go很好。

 

相对于Python,Go开始时有点麻烦。然而,Go的这种本性使它对于大型项目非常友好。我们仍然对软件进行大量的测试,但是静态类型和编译——这两个让初学者感到不太舒服的东西——对我们来说是一种保护,帮助我们编写Bug相对较少的代码。

 

你可能会认为,其他语言也有其特殊的优势,但总的来说,Go最好地满足了我们的技术和审美需求。

 

Python用于机器学习,而Go用于基础设施

 

我们仍然爱Python,它在Cortex有一席之地,特别是编写预测API。Cortex的预测器界面是一个Python界面,通过这个界面,开发者可以编写API来服务于任何Python框架的模型,包括TensorFlow、PyTorch、ONNX、scikit-learn等。

 

然而,用于提供预测的Python代码(都构建在FastAPI和Uvicorn之上)最终还是被打包到Docker容器中,由Go编写的代码编排。

 

如果你希望成为一名机器学习工程师,那幺了解Python几乎没商量。但是,如果你对机器学习基础设施感兴趣,则应该认真考虑使用Go。

 

查看英文原文:

 

Why we’re writing machine learning infrastructure in Go, not Python

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注