极客视点
极客时间编辑部
极客时间编辑部
113243 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/05:42
登录|注册

为何用Go而非Python部署机器学习模型?

讲述:丁婵大小:7.83M时长:05:42
你好,欢迎收听极客视点。
Python 是当下最流行的机器学习语言,对这一点大家应该没有什么异议。不过很多机器学习框架进行实际计算使用的是 CUDA C/C++ 等语言,只是它们都提供了 Python 接口。因此,大多数机器学习从业者都是直接使用 Python 工作的。Cortex Labs 的机器学习基础设施 Cortex 也是如此,它 88.3% 的代码是由 Go 语言编写的。
此前,Cortex Labs 介绍了团队用 Go 而非 Python 编写机器学习基础设施的原因,最近他们又分享了用 Go 而非 Python 部署机器学习模型的理由。InfoQ 对其进行了翻译,重点内容如下。
大规模部署模型不同于编写调用 PyTorch 和 TensorFlow 函数的 Python 脚本。要实际大规模地运行一个生产机器学习 API,就需要基础设施来做如下事情:
自动伸缩:这样流量波动发生时就不会中断 API,且 AWS 仍然保持可控。
API 管理:处理多个部署。
滚动更新:这样在更新模型的同时还可以为请求提供服务。
我们构建了 Cortex 来提供这一功能。之所以决定用 Go 语言来编写,是出于以下几个原因。

1. Go 语言已被基础设施社区接受

作为软件工程师,我们只是想要一个简单工具,它将采用经过训练的模型,并自动实现所需的所有基础设施功能,如可复制的部署、可扩展的请求处理、自动监控等,以便将其部署为 API。
Go 语言的速度很快,能很好地处理并发,可以编译成单一的二进制文件。这样一来,选择 Go 语言对我们来说,风险相对较低。其他团队已经用 Go 语言解决了类似的挑战。
此外,对于基础设施工程师来说,使用 Go 语言编写更容易做出贡献,因为他们可能已经熟悉了这门语言。

2. Go 语言解决了与并发性和调度相关的问题

管理一个部署需要许多服务同时运行,并按照精确的时间表进行。值得庆幸的是,Gorountine、channel(通道)和 Go 内置的 timer 和 ticker 为并发性和调度提供了一个优雅的解决方案。
在较高的级别上,Goroutine 是指 Go 语言通过在一个虚拟独立线程上执行一个原本正常的函数,使其并发运行。一个操作系统线程可以容纳多个 Goroutine。channel 允许 Goroutine 共享数据,而 timer 和 ticker 允许我们调度 Goroutine。
我们在需要的时候使用 Goroutine 来实现并发性,比如 Cortex 需要将多个文件上传到 S3,并行运行这些文件可以节省时间;或者是为了保持一个潜在的、长期运行的功能,比如 CloudWatch 的流日志,以免阻塞主线程。
此外,我们在 Goroutine 中使用 timer 和 ticker 来运行 Cortex 的 autoscaler。在 Cortex 中实现副本级自动扩展,Cortex 要计算排队和进行中的请求数量,计算每个副本应该处理多少并发请求,并进行适当的扩展,这就要求 Cortex 的监控功能以一致的时间间隔执行。Go 的调度器确保在应该进行监视的时候进行监视,而 Goroutine 允许每个监视函数并发地、独立地执行每个 API。
要在 Python 中实现所有这些功能,也许可以使用 asyncio 这样的工具来实现,但 Go 可以让这些变得更简单。

3. 在 Go 中构建跨平台 CLI 更容易

我们的 CLI 部署模型并管理 API,我们希望 CLI 在 Linux 和 Mac 上都可以用。最初,我们尝试用 Python 语言来编写 CLI,但用户一直很难让它在不同的环境中使用。当我们在 Go 中重新构建 CLI 时,能够将它编译成单一的二进制文件,这样一来,我们就可以跨平台分发 CLI,而不需要做太多额外的工程计划。
编译后的 Go 二进制代码与解释性编程语言相比,性能上的优势也很明显。根据计算机基准测试的结果来看,Go 的速度明显比 Python 要快得多。

4. Go 有助于构建可靠的基础设施

在所有软件中,可靠性显然很重要,但对于推理基础设施来说,可靠性绝对是最关键的。Cortex 中的一个 Bug 可能会让推理费用严重增加。如果存在严重的 Bug,那么很有可能在编译过程中被发现。对于一个小团队来说,这是非常有用的。
与 Python 相比,Go 的高冷性质可能会使得它上手变得更痛苦一些,但这些内部的“防护栏”为我们提供了第一道防线,帮助我们避免犯下愚蠢的类型错误。

小结:Python 用于脚本,Go 用于基础设施

我们仍然喜欢 Python,它在 Cortex 中占有一席之地,特别是在模型推理方面。而当涉及到机器学习基础设施时,我们对 Go 很满意。
以上就是今天的内容,希望对你有所帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
大纲
固定大纲
1. Go 语言已被基础设施社区接受
2. Go 语言解决了与并发性和调度相关的问题
3. 在 Go 中构建跨平台 CLI 更容易
4. Go 有助于构建可靠的基础设施
小结:Python 用于脚本,Go 用于基础设施
显示
设置
留言
收藏
25
沉浸
阅读
分享
手机端
快捷键
回顶部