【机器学习领域的编程语言选择】
尽管在机器学习领域,Python曾一度占据主导地位,但它并非万能的工具。在某些情况下,其他语言如Go可能更为适合。本文探讨了作者在其工作环境中选择Go而非Python的原因,引发了社区的广泛关注和讨论。
编程语言的世界充满了竞争,而Python目前在编程领域占据着霸主地位,尤其是在机器学习领域,几乎所有主流的机器学习框架都在使用Python。
然而,即使Python得到了广泛的认可,它也并非无所不能。在实际应用中,它可能会遇到一些局限性。Python擅长于实现机器学习算法,但要真正实现大规模生产环境中的机器学习API,还需要具备以下基础设施功能:
例如,开源平台Cortex致力于自动化这些基础设施功能,包括日志管理和成本优化等。Cortex的作者Caleb Kaiser认为,在实现这些功能方面,Go比Python更具优势。
Go是由Google开发的语言,由Rob Pike、Ken Thompson和Robert Griesemer三位大师级人物设计。相较于Python,Go在以下方面具有显著优势:
并发性能
在机器学习基础设施中,并发性能至关重要。用户可以将多个模型部署为独立的API,并在同一Cortex集群中进行管理。为了使Cortex Operator能够管理这些不同的部署,需要调用多种API,包括Kubernetes API和AWS API(如EC2 Auto Scaling、S3、CloudWatch等)。
用户通常不会直接与这些API交互,而是通过编程方式调用这些API来供应集群、启动部署和监控API。高效可靠地处理这些复杂的API调用是一项挑战。Go提供了名为“Goroutines”的解决方案,这是一种轻量级的并发执行单元,可以自动切换到新的操作系统线程,从而避免阻塞。此外,Goroutines还支持“通道”机制,允许它们之间传递消息,从而实现请求调度和避免竞争状态。
虽然在Python中也可以使用如asyncio等工具实现类似的功能,但Go的设计充分考虑了这种应用场景,使其更加简便易用。
构建跨平台命令行工具
Cortex CLI是一种跨平台工具,允许用户直接从命令行部署模型和管理API。相比之下,用Python编写的命令行工具在不同平台上分发较为困难。由于Go可以直接编译成二进制文件,无需依赖管理,因此提供了更简单的分发方案。此外,Go的高性能也使得它成为构建跨平台工具的理想选择。
根据计算机基准测试,Go的运行速度远超Python。许多基础设施相关的命令行工具都是用Go编写的,这并非偶然。这也进一步说明了Go在基础设施领域的优势。
Go生态系统
开源软件的一大好处在于可以从优秀的项目中学习。Cortex位于Kubernetes生态系统中,后者本身就是用Go编写的。在该生态系统中,许多出色的开源项目也是用Go编写的,如kubectl、minikube、helm、kops和eksctl等。这些工具不仅限于Kubernetes项目,还包括CockroachDB和HashiCorp的基础设施项目,如Vault、Nomad、Terraform、Consul和Packer等。Go在基础设施领域的流行,使得它成为了工程师们熟悉且感兴趣的语言。
Go编程的乐趣
虽然Go的学习曲线可能比Python稍陡峭,但一旦掌握了基础知识,它就会变得非常有趣。Go宽容的特性使得它非常适合大型项目。相比Python,Go还有以下几个显著优点:
Python与Go的分工
Cortex支持TensorFlow、PyTorch、scikit-learn等Python模型,这意味着与这些模型的接口及推理前后的处理仍然需要Python。不过,这些模型被封装在Docker容器中,而这些容器是由Go语言编写的代码精心编排的。如果你希望成为一名机器学习工程师,掌握Python是必要的。然而,如果你对机器学习基础设施感兴趣,那么Go是一个值得考虑的选择。