Python是机器学习项目最流行的语言,这一点毋庸置疑。虽然R、C++和Julia等编程语言有自己独特的受众和用例,使它们经久不衰,但Python仍然是使用最广泛的语言,并且在每个主要的机器学习框架中都有使用。然而,你能想象吗?在Cortex(将机器学习模型部署为API的开源平台之一)代码库中,87.5%的代码是用GO编写的。来源:CortexGitHubPython引以为豪的机器学习算法只是生产环境机器学习系统的一个组成部分。要在生产环境中实际运行机器学习API,您的基础架构需要:自动扩展以确保流量波动不会破坏API实施API管理以处理同步API部署滚动更新以确保更新模型不会中断用户服务Cortex目标自动化所有上述基础设施,以及一些其他问题,如日志记录和成本优化。由于以下考虑,Go非常适合构建满足上述需求的软件:1.Go生态系统非常适合基础设施项目来源:zcool开源的好处之一是您可以从您欣赏的项目中不断学习。例如,Cortex存在于Kubernetes(本身是用Go编写的)生态系统中。我们很幸运能够参考这个生态系统中的许多伟大的开源项目,包括:kubectl:KubernetesCLIminikube:一个用于在本地运行Kubernetes的工具helm:一个Kubernetes包管理工具kops:管理生产Kubernetes工具·eksctl:AmazonEKS的官方CLI以上所有工具不仅是Kubernetes项目,也是用Go语言编写的。不管你看CockroachDB还是Hashicorp的基础设施项目(包括Vault、Nomad、Terraform、Consul和Packer),你会发现它们都是用Go语言写的。Go在基础设施领域流行的另一个影响是,大多数对基础设施感兴趣的工程师都熟悉Go语言。所以,通过GO很容易吸引到这些工程师。事实上,CortexLabs最好的工程师之一是通过在AngelList上搜索Go工作找到了我们。他找到了我们,我们感到非常幸运。2.并发对于机器学习的基础设施至关重要。用户可以将多个不同的模型部署为不同的API,并将所有模型放在同一个Cortex集群中,便于管理。CortexOperator也需要通过一些API来管理这些不同的部署。示例:·Cortex调用KubernetesAPI将模型部署到集群上。·Cortex调用各种AWSAPI(包括EC2AutoScaling、S3、CloudWatch等)来管理AWS上的部署。用户不直接与这些API交互。相反,Cortex以编程方式调用这些API来配置集群、启动部署和监控API。以高效可靠的方式交叉调用API是一项重大挑战。以并发方式使用API是最有效的方式,但它也会带来问题,因为现在我们不得不担心诸如竞争条件之类的事情。Go为这个问题提供了一个简单的解决方案:Goroutines。Goroutines是Go以并发方式执行代码的普通函数。我们可以写另一篇长篇文章来深入探讨Goroutines在幕后的工作原理,但简而言之,Goroutines是轻量级线程,由Go运行时自动管理。多个Goroutine可以放在一个OS线程上。如果一个Goroutine阻塞了一个OS线程,Go运行时会自动将剩余的Goroutines移动到一个新的OS线程。Goroutines还提供了一种称为“通道”的功能,它允许用户在Goroutines之间传递消息,帮助用户安排请求并防止竞争条件。当然,用户也可以使用asyncio等最新的工具在Python中实现这些功能,但Go在设计时就考虑到了这些情况,使用GO可以减轻我们的工作和生活负担。3.用Go编程是一种享受资料来源:Pexels我们用Go构建Cortex的最后一个原因:Go真的非常好。与Python相比,Go入门有点痛苦。然而,Go的包容性为大型项目带来了便利。我们仍在严格测试软件,但静态类型和编译(Go初学者的两个主要痛点)充当我们的护栏,帮助我们编写(相对而言)无错误的代码。你可能会争辩说其他语言提供了特定的优势,但总的来说,Go最能满足我们的技术和审美需求。4.使用Go构建跨平台CLI更容易CortexCLI是一个跨平台工具,允许用户直接从命令行部署模型和管理API。以下动画显示了CLI的运行情况:来源:CortexGitHub最初,我们用Python编写了CLI,但事实证明跨平台分发CLI太难了。另一方面,Go可以编译二进制文件(无需依赖管理),为我们提供了一种方便、简单的跨平台分发CLI的解决方案,无需额外的工程工作。Go编译的二进制代码比解释型语言有明显的性能优势。根据计算机基准测试结果,GO比Python快得多。许多其他基础设施CLI工具也是用Go编写的,这可能并非偶然。Python用于机器学习,Go用于基础设施我们也喜欢Python,它在Cortex中占有一席之地,尤其是在处理推理方面。Cortex服务于TensorFlow、PyTorch、scikit-learn和其他Python模型,这意味着与模型的接口、推理前后的处理都在Python中完成。但即使Python代码被打包并部署到Docker容器中,这些容器是由Go编写的代码编排的。来源:Pexels如果你有兴趣成为一名机器学习工程师,掌握Python是必须的。不过,如果你有兴趣使用机器学习的基础架构,认真考虑一下Go语言,一定会收获颇丰~
