Mojo 与 Python 的性能之争:快速人工智能之战

最后更新: 20 11月的2025
  • Python 在人工智能领域占据主导地位,这得益于其生态系统,但 GIL、动态类型和解释器阻碍了性能。
  • Mojo 基于 MLIR,提供编译、真正的并行化以及与 Python 库的兼容性。
  • Modular统一了PyTorch和TensorFlow的运行时环境,并集成了加速和量化功能。
  • 可以实现巨大的速度提升(Mandelbrot、SIMD);挑战在于如何将这种优势带到生产环境和多种硬件上。

Mojo 和 Python 的性能比较

Mojo 与 Python 的性能之争愈演愈烈,因为它触及了现代人工智能的核心:真正的速度、易用性和硬件支持。近年来,一些加速数据浮出水面,乍看之下似乎天方夜谭,但实际上,这些进步得益于编译器以及代码在 CPU、GPU 和 AI 加速器上的执行方式的深刻变革。

本文全面汇总了来自各种渠道关于Python 的已发布内容,包括其性能局限性以及 Mojo 的设计理念。Mojo是一种基于模块化架构的语言,由 Chris Lattner(LLVM、Clang、Swift 的开发者)主导开发。此外,我们还解释了 MLIR、GIL 瓶颈背后的原因、CUDA 和 MPS 的区别、与 Python 生态系统的兼容性以及未来仍面临的推广挑战。

Python 在人工智能领域占据主导地位,但其架构不利于性能提升。

Python 成为人工智能领域的通用语言并不令人意外:语法简洁,拥有数千个库、海量教程以及庞大的社区。然而,这种流行也带来了一个令人不安的现实:Python 是解释型语言,动态类型,并且受全局解释器锁 (GIL) 的限制,这使得纯 Python 代码的并发执行只能在单个线程中进行。

这种设计虽然能加快开发速度,但与 C/C++、Swift 或 Rust 等编译型语言相比,速度和内存效率有所降低。在机器学习/深度学习工作负载中,每一毫秒都至关重要,而且硬件速度极快,因此这种性能损失非常明显。

为了弥补这些不足,生态系统不得不采取一些变通方案:例如 NumPy(部分代码使用 C 和 Fortran 编写)、委托给本地代码的库,以及用于关键操作的 C/C++ 扩展。这些方案确实有效,但却引入了层级、依赖关系,以及版本、框架和后端交织而成的复杂系统,使得在生产环境中维护起来非常棘手。

此外,Python 中的并行处理通常依赖于多进程或库在原生代码段中释放 GIL。因此,除非工作负载能够很好地委托给 C/C++ 或 GPU,否则 Python 的原始性能就会成为瓶颈。

NumPy 和其他“补丁”:必不可少,但也有局限性

NumPy 就是一个典型的例子:它的许多关键操作都是用C 或 Fortran编写的,这比纯 Python 快得多。然而,在精细并行处理、扩展到多核处理器或与新型加速器集成时,Python 的局限性就再次显现,尤其是在控制流频繁返回到解释器的情况下。

这种分层方法(Python → C/C++ 扩展 → 驱动程序/硬件)虽然有效,但调试和部署起来却很复杂。在规模化人工智能应用中,由于涉及训练、推理和后处理等流程,这种运维复杂性几乎与可用的浮点运算能力 (FLOPS) 一样重要。

CUDA、MPS 和可移植性问题

CUDA加速(NVIDIA)固然是救星,但也如同金丝笼:某些模型和优化完全依赖于 NVIDIA 协议栈。如果您尝试在搭载 Metal Performance Shaders (MPS) 的Apple Silicon或 AMD GPU 上运行相同的代码,则可能会遇到不支持的指令或不完整的计算路径。

最常见的比喻很明确:使用CUDA 就像驾驶一辆“法拉利”,而 MPS 在某些工作负载下可能会显得功能有限。即便如此,业界仍在努力推进标准化和可移植性,因为除非绝对必要,否则没有人愿意将自己的业务绑定到单一硬件供应商。

MLIR:连接计算新时代的桥梁

要理解 Mojo 的方案,我们需要了解MLIR(多级中间表示),这是一个诞生于 LLVM 生态系统的项目,它添加了一种专为高性能和机器学习设计的中间表示。与传统的 LLVM 流水线不同,MLIR 可以处理数据图、向量化、细分、DMA 插入和显式缓存管理。

通俗地说:MLIR 可以将高级代码转换为非常接近目标硬件(CPU、GPU、TPU、NPU、FPGA 等)的实现,提取并行性并应用经典编译器在这些领域未能很好地涵盖的HPC 优化。

  工业领域的自主运营:从数据到智能决策

Mojo究竟是什么?

Mojo 是一种自诩为Python 超集的语言:它保持了熟悉的语法,可以利用相同的库,并集成了由 MLIR 支持的现代编译模型。它于 2023 年发布,最初是一个按需访问的Web Playground ,后来支持在GNU/Linux和 macOS 上本地执行。2025 年 2 月,其标准库开源,但编译器至今仍是闭源的。

目标雄心勃勃:既要拥有 Python 的简洁性,又要具备 C/C++ 的高性能,还要拥有 Rust 或 Swift 等语言的安全性和用户友好性。换句话说,就是用高级语言编写代码,并生成体积小、速度快、易于部署的二进制文件。

设计要点:类型、内存、结构体和函数

其中最引人注目的特点是强类型(以及在需要时使用静态类型)、使用let/var声明不可变和可变元素,以及支持具有编译定义设计的结构体,这有助于生成最佳机器代码。

除了`def`之外, Mojo 还允许你使用`fn`声明函数;一般来说,`fn`往往意味着更多的限制,因此编译器拥有更好的优化潜力。它还拥有“零成本抽象”和自适应调优功能,编译器会根据目标平台选择高效的参数。

无需 GIL 且真正实现并行化

与 Python 不同,Mojo 不依赖GIL。其运行时和编译器旨在充分利用线程、向量和加速器,而无需开发者处理解释器的基本并发问题。实际上,这意味着在 Python 中会遇到 GIL 问题的任务,在 Mojo 中可以真正并行运行。

这一点在密集型计算中至关重要:如果你能将一个问题分解成子任务,并以原生方式并发运行它们,那么性能的提升就不是渐进式的,而是质的飞跃。

性能:从曼德布罗集到矢量化版本

为了衡量改进效果,我们经常使用曼德勃罗集进行测试。曼德勃罗集是一种计算密集型的分形生成器,非常适合并行化。据报道,纯 Python 实现耗时超过1000 秒,而经过多次优化后,Mojo 实现的耗时已降至0,03 秒左右。

我们记录了以下类型的改进过程:从最初的 Python 版本到 NumPy 版本,再到最初的 Mojo 版本,最后到使用 SIMD 指令集的向量化 Mojo 版本。通过这种改进流程,我们观察到了巨大的速度提升,在特定情况下,速度提升幅度从 35.000 倍到 68.000 倍不等。这些数字非常惊人,但正如以往一样,实际效果取决于算法、硬件以及优化工作的细致程度。

简单的编译和部署

Mojo 遵循“构建到二进制”的理念:构建完成后,即可获得可执行文件并进行分发。如果您之前使用过 Python,这种方式可以避免虚拟环境、wheel 包以及各种库版本兼容性差等诸多问题。

举个例子,可以用一个简单的mojo 文件 hello.mojo编译并运行“Hello World”程序。此外,这些文件都带有.mojo扩展名(火焰表情符号也逐渐被用作眨眼表情),这使得它们在混合项目中更容易识别。

Python 兼容性和生态系统

Mojo 的魅力之一在于它不会强迫你放弃你已经拥有的东西:它与 Python 生态系统的兼容性意味着你可以继续使用 NumPy、Pandas 或 Matplotlib 等库,同时在需要时采用更高效的结构和类型。

实际上,这种“Python++”策略可以平滑采用曲线:您可以维护自己的代码库,将热门部分迁移到 Mojo,并利用编译​​器和 MLIR 来提高性能,而无需放弃您熟悉的语法。

模块化:一个统一 PyTorch 和 TensorFlow 的运行时环境

除了编程语言之外,Modular 还引入了一个通用框架/运行时环境,无需分别安装PyTorch 和 TensorFlow即可运行这两个技术栈。据相关资料显示,其架构可以将 TensorFlow 的执行速度提升至3 倍,将 PyTorch 的执行速度提升至2,5 倍,同时还集成了量化工具,从而有助于提升 AI 的可扩展性。

我们的愿景是避免“三层”地狱(Python → C/C++ → 特定硬件),采用单一编程层和后端,可以与任何硬件通信,并充分利用每个平台,而无需每隔一天就重写模型。

  Keras 完整指南:它是什么以及它如何工作

量化:在不牺牲精度的前提下减小尺寸

模型量化就像神经网络的MP3:降低某些权重/层的准确率,作为交换,可以减小模型规模并加快推理速度。准确率的损失通常很小(例如,分类器从94%降至91%),而部署和速度的提升足以弥补这一损失。

这种方法是实现将模型部署到本地设备并同时保障隐私的关键。事实上,像Core ML这样的技术栈以及像苹果的NPU(通过 MPS/Accelerate)这样的加速器,都在致力于开发压缩模型,使其能够适配并流畅地在 iPhone 或 Mac 上运行,而无需将数据发送到云端。

从 Swift for TensorFlow 到 Mojo:Lattner 的历程

走到今天这一步并非偶然。克里斯·拉特纳 (Chris Lattner)曾在苹果公司 (LLVM、Clang、 Swift ) 工作,之后又先后就职于特斯拉和谷歌大脑,并在谷歌大脑主导了Swift 与 TensorFlow 的结合。尽管这项将现代语言与机器学习相结合的尝试最终被搁置,但它所积累的经验如今已在 MLIR 和 Mojo 的设计中得以体现。

在 Modular 之前,Lattner 还涉足了RISC-V领域(SciFive),这与人工智能的未来涉及多种硬件的想法相符,我们需要能够快速适应所有这些硬件的编译器和运行时。

项目状态、支持和采纳

Mojo 于 2023 年发布,虽然这门语言发展迅速,但仍处于成熟阶段。其标准库于 2025 年 2 月开放,但编译器仍然闭源。就流行度(TIOBE 指数)而言,Mojo 的排名低于前 50,这对于一门仅有两年历史的语言来说也在意料之中。

在“支持者”部分,提到了亚马逊、AMD、NVIDIA 和 Inworld的支持。即便如此,要想与 Python 竞争,它仍然需要一个社区、完善的文档、丰富的软件包以及能够作为其他语言标杆的成功案例。

挑战:社群、反思和动态特征

除了性能之外,Python 在社区、资源和生态系统方面也更胜一筹。Mojo 需要弥补 Python 在某些优势领域的不足,例如某些反射机制或广泛使用的动态模式。此外,它还需要不断提升用户友好性,以实现从 Python 到 Mojo 的无缝过渡。

从技术角度来看,“为所有平台编译”的承诺听起来很棒,但每个后端(CUDA、ROCm、MPS、TPU、FPGA……)都有其自身的细微差别。在运行时保持所有后端功能和性能的一致性是一项马拉松,而不是短跑。

Mojo 和 GPU:超越 NVIDIA

Mojo 和 MLIR 的优势之一在于它们能够同时支持 NVIDIA 和 AMD 的 GPU,而不仅仅是 CUDA 生态系统。如果这种支持能够保持最新且具有竞争力,许多公司将会意识到不被单一供应商锁定所带来的战略优势。

与此同时,苹果世界(包括MPS)和其他专用加速器(NPU、FPGA)也需要合适的编译路径和库。“一次编写,到处快速运行”的承诺雄心勃勃,如果能够真正实现,将彻底改变游戏规则。

争论:是开发一门新语言,还是开发“Python++”?

在技​​术论坛上,人们争论Mojo 究竟是“Python 的另一个变体”,还是仅仅共享语法的新语言。对于日常使用而言,关键在于你可以重用代码和库,同时还能编写具有更丰富类型和结构的高性能组件。

这种二元性,再加上现代 MLIR 编译器,使得“hello world”既用户友好,又能够让你的计算内核在向量化场景中达到甚至超越 C/C++ 的性能。

资源、社区和学习

如果你刚开始接触人工智能,开放学习社区将非常宝贵。这些面向学生和教师的平台提供了提问、分享资源以及从基础到高级技术循序渐进学习的机会。它们是练习、比较不同方法并获得实际应用答案的绝佳场所。

推广生态系统也发挥着重要作用:从Jeremy Howard 等专家撰写的Mojo 发布概要,到视频平台上提供的免费 Python 课程,让你无需任何费用即可开始编写代码。围绕 Mojo 的社区越强大,企业和开发者就越容易采用它。

实用笔记和有趣细节

一些看似不起眼的小细节也能带来显著的提升:例如.mojo文件、对fn / def函数的支持、使用mojo命令直接执行,以及明确提供易于分发的二进制文件。这些看似平凡的细节,在项目规模扩大时却能起到至关重要的作用。

  如何识别和避免人工智能语音克隆诈骗

与此同时, Rust 和 Swift对类型设计、内存安全和零成本抽象的影响也不容忽视。这并非巧合:Lattner 曾参与 Swift 的创建和 LLVM/Clang 的开发;这种传承在编译器的设计中显而易见。

从实验室到生产:您可以期待什么

如果你今天打算尝试 Mojo,那么最好将其用于高影响力模块(例如计算核心、密集型转换或紧密循环)。保持你的编排和工具使用 Python,并将高需求组件迁移到 Mojo,以便从指标中衡量其带来的实际收益。

根据分析的报告,Mandelbrot 类型的任务或 SIMD 内核实现了巨大的速度提升。在实际的流水线中,考虑到 I/O、预处理和第三方库,虽然速度提升幅度较小,且取决于主要瓶颈,但仍然能够获得显著的性能提升。

统一层:告别“弗兰肯斯坦式堆栈”

模块化技术栈的一项关键优势在于各层的统一:它摒弃了以往分散的 Python + C/C++ + 特定后端架构,而是为所有三层提供单一语言,并配备一个能够与硬件交互的运行时环境。这样一来,代码“粘合剂”更少,不兼容性更低,防御性维护工作也更少。

如果这一愿景得以实现,训练和推理过程就可以在NVIDIA、AMD、Apple Silicon、TPU或NPU之间自由切换,而无需对项目进行彻底的重新编程。这不仅仅是一个技术细节,更是一种商业策略:可以根据成本、可用性或能效自由选择硬件。

关于语音模型和转录的说​​明

在实际应用中,当把像Whisper(转录)这样的模型从 Python 移植到原生路由或其他 API(MPS/Accelerate)时,会遇到兼容性问题:某些指令存在于 CUDA 中,但不存在于 MPS 中,反之亦然。这时,统一的后端和支持 MLIR 的编译器就能帮你省去很多麻烦。

如果没有这种通用的粘合剂,最终会导致代码分支过多和手动移植,从而减缓项目的演进速度。有了它,就有望实现一次编写,即可在所有支持的平台上获得高效的路由。

“元”背景:对外宣传、赞助以及科技社区

这场辩论的部分素材来源于播客和技术博客,它们将教育内容与赞助和社群(甚至周边产品)相结合。除了这些轶事(课程、应用程序、Twitch、背景音乐、播客网络支持……)之外,有趣的是,这场技术辩论已经超越了其小众群体,引起了广泛受众的共鸣。

这种讨论是好事:它能带来棘手的问题、真实的应用案例以及各种硬件的使用经验。扩大关于 MLIR 和 Mojo 的讨论范围,有助于加速缺陷检测、迁移指南的编写,以及创建我们都能复用的方案。

总体趋势很明确:Python 仍将是通往人工智能的门户,但当性能至关重要时,一个务实的替代方案已经存在。Mojo 的目标并非取代 Python,而是通过现代编译器、真正的并行化以及能够同时理解当前和未来加速器的运行时层来提升其性能。如果您从事机器学习/深度学习工作,并且对每次推理或训练周期的时间/成本非常敏感,那么不妨使用您自己的数据和硬件进行尝试。

OpenAI AWS 协议
相关文章:
OpenAI 和 AWS 签署了一份巨额合同,旨在扩展其人工智能服务:价值 38.000 亿美元,包含英伟达芯片和新的云地图。