为何我们用 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
相关文章
|
4天前
|
机器学习/深度学习 边缘计算 TensorFlow
【Python机器学习专栏】Python机器学习工具与库的未来展望
【4月更文挑战第30天】本文探讨了Python在机器学习中的关键角色,重点介绍了Scikit-learn、TensorFlow和PyTorch等流行库。随着技术进步,未来Python机器学习工具将聚焦自动化、智能化、可解释性和可信赖性,并促进跨领域创新,结合云端与边缘计算,为各领域应用带来更高效、可靠的解决方案。
|
4天前
|
机器学习/深度学习 传感器 物联网
【Python机器学习专栏】机器学习在物联网(IoT)中的集成
【4月更文挑战第30天】本文探讨了机器学习在物联网(IoT)中的应用,包括数据收集预处理、实时分析决策和模型训练更新。机器学习被用于智能家居、工业自动化和健康监测等领域,例如预测居民行为以优化能源效率和设备维护。Python是支持物联网项目机器学习集成的重要工具,文中给出了一个使用`scikit-learn`预测温度的简单示例。尽管面临数据隐私、安全性和模型解释性等挑战,但物联网与机器学习的结合将持续推动各行业的创新和智能化。
|
4天前
|
机器学习/深度学习 数据采集 算法
【Python 机器学习专栏】机器学习在医疗诊断中的前沿应用
【4月更文挑战第30天】本文探讨了机器学习在医疗诊断中的应用,强调其在处理复杂疾病和大量数据时的重要性。神经网络、决策树和支持向量机等方法用于医学影像诊断、疾病预测和基因数据分析。Python作为常用工具,简化了模型构建和数据分析。然而,数据质量、模型解释性和伦理法律问题构成挑战,需通过数据验证、可解释性研究及建立规范来应对。未来,机器学习将更深入地影响医疗诊断,带来智能和精准的诊断工具,同时也需跨学科合作推动其健康发展。
|
4天前
|
机器学习/深度学习 分布式计算 物联网
【Python机器学习专栏】联邦学习:保护隐私的机器学习新趋势
【4月更文挑战第30天】联邦学习是保障数据隐私的分布式机器学习方法,允许设备在本地训练数据并仅共享模型,保护用户隐私。其优势包括数据隐私、分布式计算和模型泛化。应用于医疗、金融和物联网等领域,未来将发展更高效的数据隐私保护、提升可解释性和可靠性的,并与其他技术融合,为机器学习带来新机遇。
|
4天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【Python机器学习专栏】迁移学习在机器学习中的应用
【4月更文挑战第30天】迁移学习是利用已有知识解决新问题的机器学习方法,尤其在数据稀缺或资源有限时展现优势。本文介绍了迁移学习的基本概念,包括源域和目标域,并探讨了其在图像识别、自然语言处理和推荐系统的应用。在Python中,可使用Keras或TensorFlow实现迁移学习,如示例所示,通过预训练的VGG16模型进行图像识别。迁移学习提高了学习效率和性能,随着技术发展,其应用前景广阔。
|
4天前
|
机器学习/深度学习 人工智能 算法
【Python 机器学习专栏】强化学习在游戏 AI 中的实践
【4月更文挑战第30天】强化学习在游戏AI中展现巨大潜力,通过与环境交互和奖励信号学习最优策略。适应性强,能自主探索,挖掘出惊人策略。应用包括策略、动作和竞速游戏,如AlphaGo。Python是实现强化学习的常用工具。尽管面临训练时间长和环境复杂性等挑战,但未来强化学习将与其他技术融合,推动游戏AI发展,创造更智能的游戏体验。
|
4天前
|
机器学习/深度学习 传感器 自动驾驶
【Python机器学习专栏】深度学习在自动驾驶中的应用
【4月更文挑战第30天】本文探讨了深度学习在自动驾驶汽车中的应用及其对技术发展的推动。深度学习通过模拟神经网络处理数据,用于环境感知、决策规划和控制执行。在环境感知中,深度学习识别图像和雷达数据;在决策规划上,学习人类驾驶行为;在控制执行上,实现精确的车辆控制。尽管面临数据需求、可解释性和实时性挑战,但通过数据增强、规则集成和硬件加速等方法,深度学习将持续优化自动驾驶性能,并在安全性和可解释性上取得进步。
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【Python机器学习】文本特征提取及文本向量化讲解和实战(图文解释 附源码)
【Python机器学习】文本特征提取及文本向量化讲解和实战(图文解释 附源码)
111 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习】K-Means对文本聚类和半环形数据聚类实战(附源码和数据集)
【Python机器学习】K-Means对文本聚类和半环形数据聚类实战(附源码和数据集)
71 0
|
5天前
|
机器学习/深度学习 数据采集 TensorFlow
【Python机器学习专栏】使用Python进行图像分类的实战案例
【4月更文挑战第30天】本文介绍了使用Python和深度学习库TensorFlow、Keras进行图像分类的实战案例。通过CIFAR-10数据集,展示如何构建和训练一个卷积神经网络(CNN)模型,实现对10个类别图像的识别。首先安装必要库,然后加载数据集并显示图像。接着,建立基本CNN模型,编译并训练模型,最后评估其在测试集上的准确性。此案例为初学者提供了图像分类的入门教程,为进一步学习和优化打下基础。