毋庸置疑,Python是如今最受欢迎的机器学习语言。虽然机器学习框架使用CUDA C / C ++之类的语言进行实际运算,但它们都提供了Python接口。这也是为什么大多数机器学习从业人员都工作中都使用Python。
而机器学习基础设施——Cortex的代码库88.3%都是Go语言编写的。
大规模部署模型不同于编写调用PyTorch和TensorFlow函数的Python脚本。为了实际大规模运行生产机器学习API,需要基础架构来执行以下操作:
· API管理,以处理多个部署进程。
· 自动缩放,这样流量波动就不会破坏API(并且AWS保持可管理性)。
· 滚动更新,以便更新模型的同时仍然服务于请求。
我们构建了Cortex来提供此功能,并决定在Go语言中进行编写,有以下几个原因:
1.基础设施社区已经接受了Go
我们是软件工程师而不是数据科学家,之所以加入机器学习,是因为想要构建Gmail的智能编写之类的功能,而不是因为对反向传播着迷。
我们希望有一个简单的工具,能够采用经过训练的模型并自动实现所需的所有基础设施(例如可复制的部署,可扩展的请求处理,自动监视等),从而将其部署为API。
尽管还不存在多合一的模型到微服务平台,但我们之前已经在普通软件中实现了所有这些功能。我们知道哪种工具最适合这份工作,以及用什么语言编写。
构建Kubernetes,Docker和Terraform等工具的团队使用Go,是因为它运行很快,可以很好地处理并发程序。它编译为单个二进制文件。选择Go风险相对较低,其他团队也在使用Go来解决类似的问题。
此外,用Go编写可以使基础架构工程师(他们可能已经熟悉该语言)工作起来更容易。
2.在Go中构建跨平台的CLI更容易
我们希望CLI在Linux和Mac上均可使用。最初,我们尝试用Python进行编写,但是用户总是很难让它在不同的环境中工作。当在Go中重建CLI时,可以将其编译为单个二进制文件,可以在各个平台上发布,而无需做太多工程工作。
编译后的Go二进制代码与解释型语言相比,其性能优势也很明显。根据计算机语言基准测试游戏,Go运行得比Python快得多。
因此用Go编写许多其他基础结构CLI(例如eksctl,kops和Helm客户端)也并非偶然。
3.Go解决了与并发和调度相关的问题
管理部署需要许多服务同时并准确地运行。幸运的是,Goroutines,channels和Go的内置计时器和周期性计时器为并发和调度提供了一种巧妙的解决方案。
在较高的层次上,Goroutine是一个正常函数,Go通过在虚拟的独立线程上执行来同时运行。多个Goroutine可以安装在单个OS线程上。channels允许Goroutine共享数据,而内置计时器和周期性计时器允许部署Goroutine。
我们在需要时使用Goroutines来实现并发(例如当Cortex需要将多个文件上传到S3,而且并行运行将节省时间),或使可能长时间运行的功能(例如CloudWatch的流日志)不会阻塞主线程。
此外,在Goroutines中使用计时器和代码来运行Cortex的自动缩放器。笔者已经撰写了一份完整的报告,关于如何在Cortex中实现副本级自动缩放,更简略的版本是Cortex计算排队和进行中的请求数,计算每个副本应处理的并发请求数,并适当地扩展。
为此,Cortex的监视功能需要以一致的间隔执行。Go的调度程序可确保其按预期进行监视,而Goroutines允许每个监视功能并行独立地执行每个API。
在Python中实现所有这些功能可以使用asyncio之类的工具。但是,Go让事情变得简单,这对我们来说非常有益。
4. Go有助于建立可靠的基础架构
最后一点,Go可以帮助实现Cortex最重要的功能:可靠性。
可靠性在所有软件中都非常重要,但是对于推理基础架构来说绝对至关重要。Cortex中的漏洞可能会严重影响推理程序。
虽然我们对每个发行版都进行了全面的测试,但是Go的静态类型和编译步骤可以初步防止漏洞。如果存在严重的漏洞,则很有可能在编译期间被捕获。对于一个小团队来说非常有帮助。
Go对于漏洞零容忍的特性可能使它比Python更难入门,但是这些内部防护栏是第一道防线,它们有助于避免愚蠢的错误。
使用Python编写脚本,使用Go进行基础架构
Python对我们来说仍然是很重要的,它在Cortex中占有一席之地,尤其是在模型推断方面。
Cortex支持将Python用于模型服务脚本。我们编写的Python将模型加载到内存中,进行推理前/后处理,并处理请求。但是,即使是Python代码也被打包到了Docker容器中,这些容器由Go编写的代码进行编排。
Python仍然是数据科学和机器学习工程中最受欢迎的语言。但在机器学习基础架构方面,Go是更好的选择。事实上,除了Python之外,还有更多工具可以生产机器学习系统,等待我们去发现和尝试。
留言点赞关注
我们一起分享AI学习与发展的干货
编译组:顾佳彤、刘露敏
相关链接:https://towardsdatascience.com/why-we-deploy-machine-learning-models-with-go-not-python-a4e35ec16deb
如转载,请私信小芯,遵守转载规范
本文链接:https://my.lmcjl.com/post/5218.html
4 评论