Mojo,比 Python 快 90,000 倍,终于开源了!刚发布,已获得超过 17,000 颗星

Mojo,比 Python 快 90,000 倍,终于开源了!刚发布,已获得超过 17,000 颗星

2024年3月29日,Modular Inc.宣布Mojo核心组件开源。

Mojo 是一种专为编写人工智能软件而设计的编程语言,于去年 8 月正式推出。自推出以来,它已经积累了超过 175,000 名开发人员和 50,000 个组织。

人工智能模型通常用多种编程语言编写。开发人员通常使用 Python 来实现神经网络中最简单的部分,因为它易于学习但速度相对较慢。其余代码通常用 C++ 编写,速度更快但学习起来更复杂。

Modular 将 Mojo 定位为更方便的替代方案。它提供与 Python 类似的易于使用的语法,但执行速度可能提高数千倍。因此,开发人员无需学习 C++ 等复杂语言即可编写快速的 AI 模型。

去年,当 Mojo 推出时,一些开发人员对它的出现感到兴奋。然而,当被问及开源日期时,Chris Lattner 在 Discord 上说:“如果我知道,我会告诉你。”大约一年来,许多开发人员一直处于观察和质疑的状态:

“推广很棒,但如果它不是开源的,我就不会花时间去尝试。”

“这显然是一种被过度炒作的编程语言,而且它不是开源的!Chris Lattner 想要欺骗数百万 Python 开发人员!”

“我不能把时间浪费在一种可能开源也可能不开源的语言上,尤其是考虑到 OSS 当前的商业环境……”

现在,Mojo 终于开源了!短短时间内,它已经拥有 17.6k 个 star 和 2.1k 个 fork!

01 Mojo开源之旅第一步

Modular 今天宣布开源 Mojo 标准库的核心组件。标准库是编程语言的核心部分,包含基本语法元素和基本功能。Mojo 标准库包含优化 AI 超参数的功能,这些超参数决定了神经网络如何处理数据。

“Mojo 标准库仍在蓬勃发展和快速变化,因此我们首先开源其核心模块。这标志着我们开源之旅的重要起点,而不是终点。”

该公司表示,开源将使他们能够从更多开发人员那里收集反馈,从而促进 Mojo 的更好发展。而且,开源项目的方式多种多样:有些项目提供源代码但不接受贡献;有些项目提供不透明的贡献流程,难以理解目标和路线图;有些项目虽然开源,但并未积极维护。Modular 表示,他们选择了更彻底的开源方式:允许通过 GitHub 拉取请求进行外部贡献,鼓励开发人员参与 Mojo 的开发和改进,并促进社区成长。

此外,Modular 还展示了其诚意,从最初的提交开始,分享完整的提交历史!公开修改开放标准库的历史,使开发人员能够跟踪代码的演变并更好地理解其含义。

此外,他们还将发布 Mojo 编译器的夜间版本,方便开发人员快速试用最新的编译器功能并进行持续集成测试。

去年年底,Modular 推出了商业 AI 平台 MAX,这是一套统一的工具和库,用于构建高性能 AI 应用程序,这些应用程序可以高效地部署在多个硬件平台上,比如在 Kubernetes 环境中运行 AI 应用程序。今天,该公司透露,他们还计划在未来开源 MAX 的一些组件。

而且值得一提的是,他们选择了 Apache 2 LLVM 许可证进行开源。

这是 Apache 2 许可证的定制版本。此外,为了便于与遵循 GPL2 许可证的软件集成,Modular 也做出了相应的调整。GPL2 是另一种流行的开源许可证,Linux 内核等项目就曾使用过该许可证。在公告博客文章中,Modular 写道:

“Apache 2 许可证是一个很好的起点,但我们在 LLVM 项目中使用许可证的经验告诉我们,它有两个小问题。一些人担心 Apache 2 许可证可能与 GPL2 代码(例如 Linux 内核)不太兼容,并且 Apache 2 许可证要求您承认在衍生项目中使用该代码。我们希望您可以使用 Mojo,而不必承认 Modular 或 Mojo。因此,我们添加了 LLVM 专门设计的例外来解决这些问题。”

02 未来50年最佳人工智能编程语言?

去年 5 月,Mojo 刚刚发布时,Modular 声称在运行 Mandelbrot 等算法时它比原始 Python 快 35,000 倍。

去年 9 月,Modular 再次表示,“Mojo 结合了动态和静态语言的优点,性能提升至 Python 的 68,000 倍”。

去年10月,当Mojo登陆Mac时,Modular再次提出了性能对比数据:“比Python快9万倍”。

谈及 Mojo,Modular 创始人兼首席执行官 Chris Lattner 表示:“你可以将 Mojo 视为 Python 家族的一员,它借鉴了所有这些很酷的语言、编译器和其他技术,使 Python 向前迈出了一大步。我们相信它增强了 Python 的功能,赋予了 Python 程序员超能力,让那些熟悉 Python 的人无需切换到 C++ 即可学习新知识、探索和征服新领域。”

Mojo 基于 MLIR 中最新的编译器技术,它是 LLVM 的演进版本,因此性能更佳。只要程序员具备必备技能并愿意充分优化,他们就能让代码运行得极快。Mojo 语言的目标是满足 Python 开发人员的需求,同时提供一系列新的代码优化技术,以充分利用硬件设备的性能极限。

另一方面,Mojo 团队对 Rust 给予了高度评价,并公开表示“Mojo 的设计也受到了 Rust 的很大启发”。

性能方面,Modular 和 Python 做过多次对比,给出了清晰的对比,但大家对于它比 Rust 快多少并没有概念,就在上个月他们专门回应了“Mojo 是否比 Rust 快”的问题。

今年 2 月,Netflix 工程师、Rust 拥护者 @ThePrimeagen 发布了一则视频:用 Mojo 解析 DNA 序列,速度超越 Rust 50%。这篇博文引发了众多关注和讨论,毕竟 Rust 的定位是 Python 和 C++ 在 AI 领域占据主导地位的潜在继任者。

@ThePrimeagen 对 Mojo 和 Rust 在 AI 编程中的展望:

如果 Mojo 正式加入战局,我相信 Mojo 无疑会胜出。Mojo 胜出的原因是它不需要对开发者已经熟悉的范式进行任何改变。只需稍加学习,就能获得惊人的性能。首先,Mojo 编译速度很快,用户体验与大家已经熟悉的语言非常相似,性能堪比 Rust。唯一的问题是如何让更多人接受它。

在发表评论后,受人尊敬的 Rust 贡献者兼《Rust:从零到生产》一书的作者 Luca Palmieri 在 X 上做出回应:

Rust 在系统编程领域拥有一流的人体工程学设计,但在 AI 应用领域面临两大问题:

  • 编译速度慢,而AI强调实验和快速迭代。
  • 大多数具有 Python 经验的人工智能研究人员不愿意花时间从头学习一门新语言。

Mojo 旨在让 Python 开发人员能够直观、轻松地掌握它。正如 Mohamed 所展示的那样,他只用了几周的时间就学会了 Mojo,并利用 SIMD 优化算法作为业余项目(初始实现仅用了 200 行代码)。

对于那些对人工智能开发感兴趣的人来说,在三种可用语言中选择一种确实存在着一个困境。

Mojo 和 Rust 都允许开发人员在较低级别进行优化。对于 Rust,开发人员当然可以将所有内容打包到 Arc、Mutex 或 Box 中,以避免与借用检查器发生冲突,但这可能会牺牲一些性能。虽然这种性能差异可能不会对应用程序代码产生重大影响,但它可能会在库或其他性能敏感的代码中迅速累积。两者之间的选择取决于程序员对减少开销和优化性能的关注。

这两种语言都可以利用 LLVM 来优化代码生成并允许使用内联汇编(尽管实际上不太可能有人会这样做),因此从理论上讲,两者在传统硬件上都具有相似的性能潜力。

03 基于最先进的编译技术

Rust 于 2006 年启动,Swift 于 2010 年出现,两者主要基于 LLVM IR 构建。另一方面,Mojo 于 2022 年首次亮相,基于 MLIR 构建——与 Rust 使用的 LLVM IR 相比,它是一个更现代的“下一代”编译器堆栈。值得注意的是,Chris Lattner 在大学期间于 2000 年 12 月创立了 LLVM,多年来从其发展中学到了很多东西。后来他加入谷歌领导 MLIR 的开发,旨在支持该公司的 TPU 和其他 AI 加速器项目。随后,他基于从 LLVM IR 获得的知识继续探索。

Modular 表示,Mojo 是第一个充分利用 MLIR 高级功能的编程语言,它可以生成优化程度更高的 CPU 代码,同时还支持 GPU 等加速器,速度比 Rust 快得多。这是目前其他语言无法实现的优势,也是 AI 和编译器爱好者热衷于 Mojo 的核心原因。

他们特别强调两个方面:

出色的 SIMD 人体工程学设计:CPU 通过特殊寄存器和指令同时处理多个数据元素,称为 SIMD(单指令多数据)。然而,从历史上看,编写此类代码的体验从人体工程学的角度来看非常丑陋且具有挑战性。尽管这些特殊指令已经存在多年,但大多数代码并未针对它们进行优化。因此,谁能解决这种复杂性并编写可移植的 SIMD 优化算法,谁就能在市场上脱颖而出,例如 simd_json。

Mojo 的原语从一开始就以 SIMD 优先设计:UInt8 实际上是 SIMD[DType.uint8, 1],表示具有 1 个元素的 SIMD。这种表示不会产生任何性能开销,同时允许程序员轻松地将其用于 SIMD 优化。例如,可以将文本拆分为 64 字节块,表示为 SIMD[DType.uint8, 64],然后与单个换行符进行比较以查找每个换行符的索引。由于机器上的 SIMD 寄存器可以同时对 512 位数据执行操作,因此此操作可以将此类操作的性能提高 64 倍!

或者举一个更简单的例子,假设你有一个 SIMDDType.float64, 8。通过简单地将其乘以 Float64(2),你可以轻松提高性能。与单独乘以每个元素相比,这种方法在大多数机器上可以将性能提高高达 8 倍。

LLVM(Rust 也使用)具有自动矢量化优化过程,但由于无法更改 SIMD 的内存布局和其他重要细节,其性能从未达到优化的理论水平。不过,Mojo 从一开始就考虑到了 SIMD 特性,因此编写 SIMD 优化的体验与编写常规代码非常相似。

急切的破坏:Rust 的设计灵感来自 C++ 的 RAII(资源获取即初始化),这意味着一旦对象超出范围,应用程序开发人员就无需担心释放内存——编程语言本身会处理它。这是一个非常好的例子,它避免了垃圾收集的性能陷阱,同时确保了动态语言的人体工程学。

Mojo 则更进一步,不再等待作用域结束,而是在对象最后一次使用时释放内存。这对于 AI 场景非常有利,因为提前释放对象意味着提前释放 GPU 张量,从而可以在等效的 GPU RAM 中拟合更大的模型。这是 Mojo 独有的优势,让程序员无需自己设计就能获得最佳性能。Rust 的借用检查器最初会将所有事物的生命周期延长到其作用域的末尾,与析构函数的行为相匹配,但这可能会导致一些让用户感到困惑的后果。Rust 后来增加了一些非词法生命周期特性,以简化开发人员的工作。然而,通过 Mojo 的即时析构机制,可以直接实现这种简化效果,并且与对象实际销毁方式保持一致,从而避免令人困惑的极端情况。

Rust 中的另一个开销来自 Drop 的实现。它使用 Drop Flags 来跟踪是否应在运行时删除对象。Rust 能够在某些情况下进行优化,但 Mojo 可以通过显式定义消除所有额外开销。

无论如何,开发人员必须在 Mojo 和 Python 的易用性与 C、C++ 或 Rust 的高性能之间做出选择。作为回应,Mojo 团队呼吁开发人员说:“如果你好奇并展望未来,希望掌握一种可能在未来 50 年内有益于 AI 开发的语言,为什么不给 Mojo 一个机会呢?”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值