38

抛弃Python,我们为什么用Go编写机器学习架构?

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAxMTg2MjA2OA%3D%3D&%3Bmid=2649847865&%3Bidx=4&%3Bsn=c59c57c93cdd5f42ceab83abd6a7cc5c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JfMRnqV.gif

作者 |  Caleb Kaiser

译者 | 弯月,编辑 | 郭芮

源 | CSDN(ID: CSDNnews)

如今,众所周知Python是机器学习项目中最流行的语言。尽管R、C++ 和Julia等语言都有各自的支持者和使用情况,但Python仍然是使用最普遍的语言,几乎每个主流的机器学习框架都使用了Python。

然而,在我们的Cortex(用于将机器学习模型部署成API的开源平台)代码库中,87.5%的代码都是Go。

6bUjMra.jpg!web

Python引以为豪的机器学习算法只是生产机器学习系统的一个组成部分。如果想大规模运行生产机器学习API,你的基础架构需要实现以下功能:

  • 自动缩放,确保流量波动不会影响API。

  • API管理,处理同步API部署。

  • 滚动更新,确保更新模型时不会中断用户服务。

我们构建Cortex的目的是自动化上述所有的基础架构,以及日志记录和成本优化等其他问题。

出于以下原因,我们认为Go才是构建满足上述需求的软件的理想之选。

并发对于机器学习的基础架构至关重要

用户可以将许多不同的模型部署成不同的API,并把所有模型都放到同一个Cortex集群中进行管理。Cortex Operator需要通过一些API来管理这些不同的部署,比如:

  • Kubernetes API,Cortex调用这个API在集群上部署模型。

  • 各种AWS API,包括EC2 Auto Scaling、S3、CloudWatch等,Cortex调用这些API来管理AWS上的部署。

用户不会直接与这些API进行交互。Cortex通过程序调用这些API来管理集群、启动部署和监视API。

以高效、可靠的方式交叉调用这些API是一项难题。采用并发的方式处理这些API调用是最为高效的方式,但同时也带来了复杂性,因为我们不得不担心竞争状况等问题。

Go为解决这个问题提供了一个开箱即用的解决方案:Goroutines。

Goroutines是Go以并发的方式执行代码的函数。我们可以另写一篇文章深入探讨Goroutines背后的工作方式,但概括来说,Goroutines是由Go运行时自动管理的轻量级线程。你可以将多个Goroutine放在一个OS线程上,而且如果Goroutine阻塞了OS线程,则Go运行时会自动将其余的Goroutines移到新的OS线程上。

Goroutines还提供了一种名叫“通道”(channel)的功能,你可以利用这个功能在Goroutines之间传递消息,帮助我们调度请求并防止出现竞争状况。

当然,你也可以利用asyncio等最新的工具在Python中实现这些功能,但Go的设计考虑到了这些情况,使用Go可以减轻我们的工作负担。

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

Cortex CLI是一个跨平台工具,用户可以使用这个工具直接从命令行部署模型和管理API。

最初,我们使用Python编写了这个CLI,但事实证明,在多个平台上分发这个CLI太困难了。由于Go可以编译成一个二进制文件(不需要管理依赖),所以可以为我们提供了一个简单的解决方案,帮助我们在平台之间分发CLI,而无需额外的工程工作。

Go编译后的二进制文件与解释型语言相比,其性能优势也很明显。根据计算机基准测试结果,Go的速度远胜Python。

许多其他的基础设施CLI工具也是用Go编写的,这绝非偶然,具体的理由请参照下面的第三点。

Go的生态系统非常适合基础设施项目

开源的好处之一在于,你可以向自己欣赏的项目学习。例如,Cortex存在于Kubernetes的生态系统中,而Kubernetes本身也是用Go编写。我们很幸运能够借鉴这个生态系统中许多出色的开源项目,其中包括:

  • kubectl:Kubernetes CLI

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

  • helm:Kubernetes软件包管理工具

  • kops:管理生产Kubernetes的工具

  • eksctl:亚马逊EKS的官方CLI

上述这些工具都是Kubernetes项目,而且都是用Go语言编写的。如果你仔细查看CockroachDB和Hashicorp的基础设施项目(包括Vault、Nomad、Terraform、Consul和Packer),就会发现它们统统是用Go语言编写的。

Go在基础架构领域的流行还有另一个影响,那就是大多数对基础架构感兴趣的工程师都很熟悉Go。所以,很容易吸引到这些工程师。我们公司最优秀的一位工程师就是通过AngelList找到我们的,我们很幸运他找到了我们。

Go语言编程是一种享受

我们使用Go构建Cortex的最后一个理由就是,我们很享受Go语言编程。

相对于Python,Go的入门有点艰难。但是,Go的宽容性可以为大型项目带来愉悦感。我们在测试软件上非常严格,但是静态输入和编译(对于初学者来说Go的两大难题)对我们来说就像是防护栏,帮助我们编写(相对而言)没有bug的代码。

你可能会说其他语言有不同的优势,但总的来说,Go能够最大限度地满足我们的技术和美学需求。

Python适用于机器学习,而Go适用于基础架构

我们也很喜欢Python,它在Cortex中占有一席之地,尤其是在处理推理方面。

Cortex服务于TensorFlow、PyTorch、scikit-learn以及其他Python模型,这意味着与模型的接口以及推理之前和之后的处理均在Python中完成。虽然Python代码经过打包部署到Docker容器中,但这些容器是由Go编写的代码编排的。

如果你有兴趣成为一名机器学习工程师,那么必须熟练掌握Python。但是,如果你对机器学习的基础架构感兴趣,则应该认真考虑Go。

原文链接:

https://towardsdatascience.com/why-were-writing-machine-learning-infrastructure-in-go-not-python-38d6a37e2d76

----------  END  ----------

重磅!后厂技术官-技术交流群已成立

扫码可添加后厂技术官助手, 可申请加入后厂技术官大群和细分方向群,细分方向已涵盖: Java、Python、机器学习、大前端 等群。

一定要备注: 开发方向+地点+学校/公司+昵称 (如Java开发+北京+美团+小北) ,根据格式备注,可更快被通过且邀请进群

2yQZfeq.png!web

▲长按加群

点个在看少个 bug :point_down:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK