为何我们用 Go 而非 Python 编写机器学习基础设施平台?

简介: Go 又称 Golang,是 Google 开发的一种静态强类型、编译型、并发型且具有垃圾回收功能的编程语言。Go 语言于 2009 年 11 月正式宣布推出并开放源代码,开始在 Linux 及 Mac OS X 平台上进行了实现,后追加 Windows 系统下的实现。

云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

image

作者 | Caleb Kaiser
译者 | 刘志勇

AI 前线导读:Go 又称 Golang,是 Google 开发的一种静态强类型、编译型、并发型且具有垃圾回收功能的编程语言。Go 语言于 2009 年 11 月正式宣布推出并开放源代码,开始在 Linux 及 Mac OS X 平台上进行了实现,后追加 Windows 系统下的实现。大部分用过 Go 语言的人都认可其是一种非常不错的生产力工具,有人总结其优点如下:部署简单、并发性好、语言设计良好、执行性能好。Cortex Labs 介绍了团队为何用 Go 而非 Python 编写机器学习基础设施。

Python 是机器学习项目中最流行的语言,就这点而言,应该不会有人提出异议。尽管 R、C++ 和 Julia 之类的语言都有自己的拥趸和用例,但 Python 仍然是 最受欢迎的 编程语言,在每个主流的机器学习框架中都能见到它的身影。

最近,我们构建了一个将机器学习模型部署为 API 的开源平台—— Cortex,我们考虑了很久应该如何选择编程语言。最终的结果是代码库中有 87.5% 用的是 Go。经过一番比较,我们认为:Python 适用于机器学习,而 Go 适用于基础设施。

image

Python 所擅长的机器学习算法只是生产机器学习系统的组成部分之一。要实际大规模运行生产机器学习 API,你需要能够实现如下功能的基础设施:

  • 可自动伸缩,以便在发生流量波动时不会中断 API。
  • API 管理,用于处理同时部署的 API。
  • 滚动更新,以便在为用户提供服务的同时更新模型。

Cortex 的构建旨在自动化实现所有这些基础设施的功能,以及其他关注点,如日志记录、成本优化等。Go 是满足这些因素的理想选择,原因如下:

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

用户可以将许多不同的模型部署为不同的 API,所有这些 API 都在同一个 Cortex 集群中进行管理。为了让 Cortex Operator 管理这些不同的部署,它需要处理几个不同的 API。例举几个例子:

  • Kubernetes API,Cortex 调用该 API 在集群上部署模型。
  • 各种 AWS API:EC2 Auto Scaling、S3、CloudWatch 等,Cortex 调用这些 API 来管理 AWS 上的部署。

用户并不直接与这些 API 中的任何一个进行交互。相反,Cortex 是通过编程方式调用这些 API 来进行配置集群、驱动部署和监控 API 的。

要使所有这些重叠的 API 调用具有可执行性、可靠性是一个挑战。最有效的处理方式,是对它们进行并发处理,但同时也引入了复杂性,因为现在我们必须考虑竞争条件之类的问题。

对于这一问题,Go 有一个优雅的、开箱即用的解决方案:Goroutines。

另外,Goroutines 也是 Go 并发执行的普通函数。我们可以写一整篇文章来深入探讨 Goroutines 是如何工作的,但从高层次来讲,Goroutines 是由 Go 运行时自动管理的轻量级线程。许多 Goroutines 可以放在单个 OS 线程上,如果 Goroutines 阻塞了一个 OS 线程,Go 运行时会自动将其余的 Goroutines 转移到新的 OS 线程上。

Goroutines 还提供了称为“通道”的特性,允许 Goroutines 在它们之间传递消息,还允许我们调度请求并防止出现竞争条件。

如果要在 Python 中实现所有这些功能,可以用 asyncio 之类的最新工具来实现,但 Go 在设计时就考虑到了这个用例,这点让我们的工作变得更轻松。

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

Cortex CLI 是一个跨平台的工具,允许用户直接从命令行部署模型和管理 API。下面动图显示了 CLI 的实际运行情况:

640

最初,我们用 Python 编写 CLI,但事实证明,试图跨平台进行分发实在是太困难了。因为 Go 可以编译成单一的二进制文件,不需要依赖管理,这就为我们提供了一个简单的解决方案,可以做到跨平台进行分发 CLI,而不需要做太多额外的工程计划。

与解释性编程语言相比,编译后的 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、Consul 和 Packer,它们都是用 Go 编写的。

Go 在基础设施领域的流行还有另一个影响,那就是大多数对基础设施感兴趣的工程师都熟悉 Go 语言,这使得 Go 更容易吸引工程师。事实上,Cortex Labs 最优秀的工程师之一,正是通过寻找 Go 开发岗位时遇到了我们,对此我们感到非常幸运。

4.用 Go 进行工作是一种乐趣

关于为什么我们最终用 Go 构建 Cortex,我要说的最后一点就是,Go 确实非常不错。

相对于 Python,Go 入门有点痛苦。然而,Go 的高冷性质使它成为大型项目的乐趣所在。我们仍然对软件进行严格的测试,但静态输入和编译,这两件事会让初学者有点不舒服,但这就像是我们的防护栏,帮助我们来编写(相对)没有 bug 的代码。

也许你会认为,可能还有其他语言可以提供某种优势,但总的来说,Go 最能满足我们的技术和审美需求。

结束语

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

Cortex 为 TensorFlow、PyTorch、scikit-learn 和其他 Python 模型提供服务,这意味着与模型的接口以及推理前后处理都是用 Python 来完成的。然而,即使是 Python 代码也被打包到 Docker 容器中,这些容器也是由用 Go 语言编写的代码进行编排的。

如果你想成为一名机器学习工程师,那么就必须或多或少了解 Python,这是没有商量余地的。但是,如果你对机器学习基础设施感兴趣的话,那么,你就应该认真考虑使用 Go。

原文发布时间:2020-01-15
本文作者: Caleb Kaiser
本文来自阿里云云栖号合作伙伴“AI前线”,了解相关信息可以关注“AI前线

云栖号:https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
30天前
|
Rust Java Go
Python is Easy. Go is Simple. Simple != Easy
Python以其易学易用著称,常用于初学者编程和复杂科学计算,但其解释器的复杂性和环境易变性可能导致运行时问题。Go语言则追求简单,语法稳定,编译快速,生成的二进制文件小巧、独立。Go的静态链接特性使其能在不同系统上无缝运行,而Python在数据科学和原型设计上仍具有优势。结合两者,通过Django进行快速原型验证,然后用Go重构业务逻辑和高性能部分,形成了一种有效的开发策略。
18 0
|
21天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
2天前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
22 1
|
1天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
27 12
|
1天前
|
Rust 安全 程序员
|
6天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
6天前
|
机器学习/深度学习 数据可视化 数据挖掘
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
18 1
|
7天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
29 7
|
9天前
|
机器学习/深度学习 人工智能 分布式计算
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
14 0
|
13天前
|
JavaScript 搜索推荐 前端开发
音乐发现平台:借助Python和Vue构建个性化音乐推荐系统
【4月更文挑战第11天】本文介绍了如何使用Python和Vue.js构建个性化音乐推荐系统。首先确保安装Python、Node.js、数据库系统和Git。后端可选择Flask或Django搭建RESTful API,处理歌曲数据。前端利用Vue.js创建用户界面,结合Vue CLI、Vuex和Vue Router实现功能丰富的SPA。通过Vuex管理状态,Axios与后端通信。这种前后端分离的架构利于协作和系统扩展,助力打造定制化音乐体验。

热门文章

最新文章