跳到主要内容

Morok

Alpha 阶段软件。 核心功能已测试,但 API 尚不稳定,可能随时更改。

Morok 是一个基于 Rust 的 ML 编译器,灵感来自 Tinygrad。它具有基于 UOp 的 IR 惰性张量求值、模式驱动优化和多后端代码生成。

亮点

特性描述
声明式优化patterns! DSL 实现图重写,通过 Z3 验证正确性
惰性求值Tensor 构建计算图,仅在 realize() 时编译执行
溯源追踪#[track_caller] 将每个 UOp 追溯到源码位置
80+ IR 操作算术、内存、控制流、WMMA tensor core
20+ 优化常量折叠、tensor core、向量化、循环展开

架构详情请参阅文档站点

工作空间

Crate描述
dtype类型系统:标量、向量、指针、图像
macros过程宏(patterns! DSL)
irUOp 图 IR:80+ 操作、符号整数、溯源
device缓冲区管理:惰性分配、零拷贝视图、LRU 缓存
schedule优化引擎:20+ 趟、RANGEIFY、Z3 验证
codegen代码生成:Clang(默认)、LLVM JIT、MLIR
runtimeJIT 编译与内核执行
tensor高层惰性张量 API
onnxONNX 模型导入器
arch推理原语
model预训练模型

快速示例

use morok_tensor::Tensor;
use ndarray::array;

// Zero-copy from ndarray (C-contiguous fast path)
let a = Tensor::from_ndarray(&array![[1.0f32, 2.0], [3.0, 4.0]]);
let b = Tensor::from_ndarray(&array![[5.0f32, 6.0], [7.0, 8.0]]);

// Lazy — nothing executes yet
let mut c = &a + &b;
c.realize()?;

// Zero-copy view into the result
let view = c.array_view::<f32>()?;
assert_eq!(view, array![[6.0, 8.0], [10.0, 12.0]].into_dyn());

模式 DSL 示例

use morok_schedule::patterns;

let optimizer = patterns! {
// Identity folding (commutative)
Add[x, @zero] ~> x,
Mul[x, @one] ~> x,

// Constant folding
for op in binary [Add, Mul, Sub] {
op(a @const(av), _b @const(bv))
=> |a, av, bv| eval_binary_op(op, av, bv).map(|r| UOp::const_(a.dtype(), r)),
},
};

开发

环境配置

Nix

本项目包含预定义的 Nix 开发环境,已包含所有依赖和编译器。CI/CD 也使用相同的基础设施,因此这是推荐的开发和测试方式。

nix develop # Open development shell
nix flake check # Run CI tests
nix fmt # Format source files

裸金属

依赖版本必需描述
Rust1.85+Edition 2024
LLVM21.xCPU 代码生成后端
Clang-LLVM 构建所需的 C 编译器
pkgconf-构建配置工具
protobuf-ONNX proto 编译
zlib>=1.3压缩库
libffi>=3.4外部函数接口
libxml2>=2.13XML 解析
Z3>=4.15用于优化验证的 SMT 求解器

测试

cargo test
cargo test --features z3,proptest # With Z3 verification and PB generated tests
cargo test --features cuda # With CUDA tests