当前位置: 首页 > 科技观察

为什么我用Go写机器学习部署平台,却不用Python?

时间:2023-03-13 12:35:33 科技观察

虽然在机器学习中,Python已经无孔不入。但是Python并不是万能神手中的魔杖,可以为所欲为。在很多情况下,使用Python的效果不如其他语言,比如Go,甚至更差。本文介绍了作者在工作环境中选择Go而不是Python的原因,引起了社区的关注和热议。编程语言是江湖,总有人觊觎霸主之位。Python现在是编程语言世界的霸主,尤其是在机器学习领域,主流的机器学习框架都在使用Python。然而,即使是被绝大多数人认可的Python,也并非真的万能,也有让它力不从心、无中生有的情况。Python引以为豪的机器学习算法只是机器学习系统的一个组成部分。要实际大规模运行生产机器学习API,您还需要一个基础设施:自动缩放,这样流量波动就不会破坏您的API处理滚动更新的API管理API部署,这样您就可以在运行的同时更新您的模型以开放的方式为用户提供服务源机器学习部署平台,如Cortex,旨在自动化所有这些基础设施,以及其他问题,如日志记录和成本优化,作者CalebKaiser认为Go比Python更合适。与出身寒门、对大一新生来说是乏味的圣诞作业的Python相比,Go语言出自谷歌,作者是三位大师级人物:RobPike、KenThompson和RobertGriesemer。在以下方面超越Python:并发性对于机器学习基础架构至关重要用户可以将许多不同的模型部署为不同的API,所有这些都在同一个Cortex集群中进行管理。为了让CortexOperator能够管理这些不同的部署,需要编写一些不同的API。Cortex调用KubernetesAPI将模型部署到集群上;还需要考虑各种AWSAPI(EC2AutoScaling、S3、CloudWatch等)用户不会直接与这些API中的任何一个交互,相反,Cortex以编程方式调用这些API来配置集群、启动部署和监控API.以高效、可靠的方式进行所有这些重叠的API调用是一项挑战。同时处理它们是最有效的做事方式,但它也引入了复杂性,因为现在我们不得不担心诸如竞争条件之类的事情。Go有一个优雅的、开箱即用的解决方案来解决这个问题:Goroutines。Goroutines是用于并发执行的普通Go特性。许多Goroutines可以放在一个OS线程上,如果一个Goroutine阻塞了一个OS线程,Go运行时会自动将其余的Goroutines移动到一个新的OS线程。Goroutines还提供了一个称为“通道”的功能,它允许Goroutine执行在彼此之间传递消息,从而允许我们安排请求并避免竞争条件。使用最近的工具(如asyncio)可能可以在Python中实现所有这些功能,但事实上Go在设计时就考虑到了这个用例,这让我们的生活变得更加轻松。在Go中构建跨平台CLI更容易CortexCLI是一个跨平台工具,允许用户直接从命令行部署模型和管理API。下面的GIF显示了正在使用的CLI:事实证明,尝试在各种平台上分发用Python编写的CLI太困难了。因为Go可以编译成单个二进制文件(不需要依赖管理),它为我们提供了一个简单的解决方案,无需太多工程工作即可在平台之间分发CLI。编译型Go二进制文件和解释型语言的性能优势也很明显。根据计算机基准游戏,Go运行速度比Python快得多。许多其他基础设施CLI工具都是用Go编写的,这并非巧合,这将我们带到了下一步。Go生态系统非常适合基础设施项目开源的好处之一是您可以从您欣赏的项目中学习。例如,Cortex存在于Kubernetes(本身是用Go编写的)生态系统中。我们很幸运能够从这个生态系统中的许多伟大的开源项目中学习,包括:kubectl:Kubernetes的CLIminikube:用于在本地运行Kubernetes的工具helm:Kubernetes包管理器kops:用于在生产环境中管理Kubernetes的工具eksctl:AmazonEKS的官方CLI以上所有内容都是用Go编写的,而不仅仅是Kubernetes项目。无论您正在查看CockroachDB还是Hashicorp的基础设施项目,包括Vault、Nomad、Terraform、Consul和Packer,它们都是用Go编写的。Go在基础设施领域的流行还有另一个影响,这也是大多数工程师感兴趣的地方!从事基础设施工作的人都熟悉Go,这更容易吸引工程师。使用Go是一种乐趣与Python相比,Go上手有点痛苦,但暂时如此。一旦跨过门槛,进入围棋的世界,你会发现这简直就是“一平江水”。Go宽容的天性使它成为大型项目的乐趣所在。除此之外,Go相对于Python的优势是:拥有非常好的编译器,编译器可以检测出你犯的所有低级错误更好的并行性。Go语言为并行而生,易于部署。代码所需的所有依赖项都在一个具有一致风格的二进制文件中。格式化工具将使所有代码风格保持一致更方便的工具。一个编辑器+插件几乎满足所有需求,无需IDE机器学习的Python,基础架构的GoCortex服务于TensorFlow,PyTorch,scikit-learn和其他Python模型,这意味着也可以与这些模型进行接口推理前后的处理在中完成Python。但即使将Python代码打包到Docker容器中,这些容器也是用Go语言编写的代码编排的。如果你有兴趣成为一名机器学习工程师,那么了解Python是必须的。但是,如果您对使用机器学习基础设施感兴趣,您应该认真考虑使用Go。