内容提要
Modular 26.7 发布:MAX 图编译器、运行时及设备扩展接口全面开源,采用宽松的 MAX 许可证,可免费商用,便于在自有加速器上部署。新增 eager 模式,自定义算子调试更快,与编译模式共用代码路径。初步支持决策模型及多款新模型,Qwen、GLM 预填充提速 2.6 倍。Mojo 1.2 引入模式匹配,并增强泛型代码可读性与调试能力。
延伸解读
开源范围与许可:可商用,但需留意生态统一条款
本次开源覆盖 MAX 图编译器、运行时、硬件后端及设备扩展接口,采用自研 MAX 许可证,允许使用、修改、扩展并构建商业产品,且不收许可费或版税。与 Apache 2.0 的主要差异在于防止碎片化:官方希望通过 Modular 联盟计划让硬件厂商在统一编程模型上协作,避免出现互不兼容的平台分支。对想移植 MAX 到自有加速器的团队,现有 NVIDIA、AMD、Apple Silicon 和 CPU 实现可作为参考。
Eager 模式:自定义算子调试更快,且与编译路径一致
MAX 新增完整 eager 模式,并覆盖自定义算子。其关键设计是 eager 与图编译器共用同一代码路径,算子只需声明一次,即可直接在 Tensor 上调用,也能原样放入编译后的 Module。文章给出 Gemma 4 31B 切片上的数据:eager 模式约 30 秒生成首个 token,编译模式约 110 秒。这意味着开发期可优先用 eager 快速迭代,再切换到编译模式追求峰值性能,减少两套代码不一致带来的调试成本。
模型与性能更新:决策模型初步支持,Qwen/GLM 预填充提速
MAX 新增对 System One/决策模型的初步支持,包括 Decider 2B,并通过 v1/decisions 和 v1/systemone API 端点提供。同时新增 MiMo-V2.6-Flash、GLM-5.3-Flash 和 Muse-Glimmer 支持,涉及 KDA 与稀疏 MLA。性能方面,多个原本需经 CPU 往返的算子改为完全在 GPU 上运行,使 Qwen 和 GLM 模型的预填充速度提升 2.6 倍。这些更新偏向推理部署与模型接入,而非训练能力。
Mojo 1.2:模式匹配落地,泛型可读性与调试增强
Mojo 1.2 的旗舰特性是模式匹配,match 语句可替代冗长条件链,编译器还能检查分支是否穷尽;该能力也支持 comptime 编译期匹配。此外,结构体可显式声明不遵循某 trait(如 not Movable),where 子句支持 else 分支以说明约束失败原因。这两项改动让泛型代码更易读、更易调试,也延续了 Mojo 向系统编程语言演进的方向。
Q&A
Modular 26.7 这次开源了哪些具体组件?
本次开源了 MAX 图编译器、MAX 运行时以及设备扩展接口(device extensibility hooks),使 MAX 成为完全源码可获取的项目,硬件厂商和研究者可以自行构建和修改。
MAX 的新许可证允许商用吗?和 Apache 2.0 有什么区别?
新的 MAX License 非常宽松,允许使用、修改、扩展和构建商业产品,且不收取许可费或版税,几乎涵盖 Apache 2.0 的所有权利。区别主要在于防止碎片化:MAX 旨在统一跨硬件的编程模型,因此通过 Modular 联盟计划让硬件厂商在共享路径上构建,避免出现不兼容的平台特定版本。
MAX 的 eager 模式对调试自定义算子有什么帮助?
eager 模式支持包括自定义算子在内的完整即时执行,并与图编译器共用同一代码路径,因此 eager 下运行的代码与编译后发布的代码一致。开发者只需声明一次算子,即可直接在 Tensor 上调用,再原样复用到编译 Module 中。在 Gemma 4 31B 的一个切片上,eager 模式约 30 秒生成首个 token,而编译模式约需 110 秒,大幅加快开发迭代。
MAX 目前支持哪些决策模型(System One)?通过什么接口调用?
MAX 新增了对决策模型的初步支持,包括 Decider 2B,通过新的 v1/decisions 和 v1/systemone API 端点调用。这类模型能以低成本实现零样本分类。
这次更新对 Qwen 和 GLM 模型的推理速度有什么提升?原因是什么?
Qwen 和 GLM 模型的预填充(prefill)速度提升了 2.6 倍。原因是若干原本需要往返 CPU 的算子现在完全在 GPU 上运行。
Mojo 1.2 引入了什么重要新特性?
Mojo 1.2 的旗舰新特性是模式匹配(match 语句),可用清晰的结构化分支替代冗长的条件链,编译器还能检查是否覆盖所有情况,并且支持编译期匹配(comptime match)。此外,结构体可以显式退出 trait 一致性(如声明 not Movable),where 子句支持 else 分支说明约束失败原因,使泛型代码更易读、易调试。