numr 0.5.0:不需要你做出选择的 Rust 数值计算库
Source: Dev.to
Rust 的基础数值计算
numr 提供 n 维张量、线性代数、FFT、统计以及自动微分——在 CPU、CUDA 和 WebGPU 后端上实现原生 GPU 加速。
它是“Rust 版 NumPy”,但从第一天起就内置了梯度、GPU 支持和现代数据类型。
numr 是什么
- 一个 基础库 – 为更高级别的库和应用提供数学构建块。
numr 不是
- 不仅仅是一个 张量库(比如 NumPy 的
ndarray)。 - 不是一个 深度学习框架。
- 不是一个 高级机器学习 API。
- 不是一套 特定领域 工具的集合。
核心特性
| 功能 | 描述 |
|---|---|
| Tensor library | N 维张量(类似 NumPy 的 ndarray)。 |
| Linear algebra | 分解、求解器等。 |
| FFT, statistics, random distributions | 完备的科学计算原语。 |
| Automatic differentiation | 内置 numr::autograd。 |
| Native GPU support | CUDA + WebGPU 后端,支持自动求导。 |
| Cross‑platform GPU | 在 NVIDIA、AMD、Intel、Apple silicon(通过 WebGPU)上均可运行。 |
| FP8 & quantized kernels | FP8 矩阵乘、i8×i8→i32 矩阵乘、2:4 结构化稀疏。 |
| Fused kernels | GEMM + 偏置 + 激活、激活‑乘、加‑归一化 等。 |
| CUDA‑specific improvements | 缓存分配器、图捕获、GEMV 快速路径、流水线 D2H 拷贝。 |
对于等价于 SciPy 的功能(优化、ODE、插值、信号处理),请参阅配套的 crate [solvr]。
为什么选择 numr? – 与 NumPy 的比较
| 功能 | NumPy | numr |
|---|---|---|
| N 维张量 | ✓ | ✓ |
| 线性代数、FFT、统计 | ✓ | ✓ |
| 自动微分 | ✗ (需要 JAX/PyTorch) | ✓ (内置 numr::autograd) |
| GPU 加速 | ✗ (需要 CuPy/JAX) | ✓ (原生 CUDA + WebGPU) |
| 非 NVIDIA GPU | ✗ | ✓ (AMD、Intel、Apple 通过 WebGPU) |
| FP8 支持 | – | ✓ (E4M3 与 E5M2) |
| 2:4 结构化稀疏 | – | ✓ (所有后端) |
| 量化矩阵乘 (i8×i8→i32) | – | ✓ (CPU) |
| 融合内核 (GEMM 结尾、激活‑乘、加‑归一化) | – | ✓ (CPU、CUDA、WebGPU) |
| 完备的自动求导(二阶) | – | ✓ (卷积、softmax、rms_norm、layer_norm、SiLU、softplus、SwiGLU、dropout、dtype 转换、narrow、cat、gather、…) |
我们解决的问题
- 碎片化:现有的 Rust crate 各自解决单一问题(例如
ndarray用于张量,nalgebra用于线性代数,rustfft用于 FFT)。没有提供 GPU 支持或自动求导,并且它们使用不兼容的类型和惯例。 - 开发者负担:你最终需要编写适配层、提交上游 issue,并在多个后端之间切换,仅仅是为了让一个简单的数值流水线在 GPU 上运行。
numr 消除了这些负担:
一个库,一个张量类型,一个 API —— 张量、线性代数、FFT、统计、自动求导、GPU。
一次编写代码,即可在以下平台运行:
- CPU(AVX‑512 等)
- NVIDIA(原生 CUDA 内核)
- AMD / Intel / Apple silicon(通过 WebGPU)
相同的代码,相同的结果。
Release 0.5.0 亮点
性能关键的融合内核
| 内核 | 功能 | 收益 |
|---|---|---|
| GEMM epilogue | matmul + bias + activation 在一次启动中完成 | 2‑3× 加速神经网络内部循环(前向 & 反向) |
| Activation‑mul | 为门控结构(如 SwiGLU)提供融合乘法 | 只读一次而不是三次 |
| Add‑norm | 残差连接 + 归一化融合 | 每个 transformer 层只读一次 |
所有内核均可在 CPU、CUDA 和 WebGPU 上运行,并且每个内核都有正确的反向传播。
FP8 与量化
- FP8 矩阵乘(E4M3 & E5M2)在所有后端上支持——对于在显存中容纳大型模型至关重要。
- i8×i8→i32 量化矩阵乘 在 CPU 上实现——无需 GPU 即可进行高效推理。
结构化稀疏
- 在所有后端上支持 2:4 稀疏。
- 在 CUDA 上走硬件快速路径;在 CPU/WebGPU 上使用优化的稀疏内核。
Autograd 扩展
以下所有操作现已支持求导(包括二阶导数):
conv1d, conv2d, softmax, rms_norm, layer_norm, SiLU, softplus, SwiGLU, dropout, fused GEMM epilogue, fused add‑norm, dtype cast, narrow, cat, gather, …
其他特性:
- 激活检查点——用计算换取内存。
- 反向钩子——在反向传播期间触发分布式梯度同步。
这 不是 一个机器学习框架;它是可以基于其构建框架的 autograd 引擎。
CUDA 专用改进
- 缓存分配器——在 Rust 端复用内存块,显著降低分配开销。
- 图捕获——一次记录内核启动序列并零开销重放(对高吞吐量推理至关重要)。
- GEMV 快速路径——针对矩阵某一维度极小的常见情况(如 batch‑size 1 推理)提供专用内核。
- 流水线式 D2H 拷贝——实现 GPU 计算与主机侧数据传输的重叠。
这些升级将 numr 从“有趣的基础”提升为 生产就绪 的库。
入门
# Cargo.toml
[dependencies]
numr = "0.5"use numr::{Tensor, autograd::grad};
fn main() {
// Example: fused GEMM + bias + activation on the GPU
let a = Tensor::randn([128, 256], Device::Cuda);
let b = Tensor::randn([256, 512], Device::Cuda);
let bias = Tensor::zeros([512], Device::Cuda);
// Forward pass (fused)
let y = (a @ b + bias).relu();
// Backward pass
let grads = grad(&y, &[a, b, bias]);
println!("Gradients computed!");
}完整教程请参见 [GitHub repository]。
愿景
- 统一的 Rust 科学计算栈,可与 Python 生态系统相媲美,却没有其碎片化问题。
- 零拷贝、零开销 的 GPU 管线,兼容所有现代 GPU。
- 可扩展的基础,用于构建更高级的机器学习库、仿真工具等。
如果你厌倦了拼凑不兼容的 crate,试试 numr 吧。一次编写,处处运行。
概览
numr 0.5.0 是一个科学计算库,提供:
- 优化例程
- 常微分方程(ODE)求解器
- 插值工具
它是其他 Rust crate 的基础:
- solvr – 基于 numr 0.5.0 构建并运行,提供科学计算功能(优化、ODE 求解器、插值)。
- boostr – 一个包含注意力、混合专家(Mixture‑of‑Experts,MoE)和 Mamba 块的机器学习框架,同样基于 numr 0.5.0。
这两个下游库都支持端到端的 LLM 推理和嵌入生成。
关键优势
- 融合内核 – 消除不必要的性能开销。
- 完整的 autograd 覆盖 – 使得在真实计算图中进行微分成为可能。
- CUDA 基础设施 – 确保 GPU 工作负载高效运行。
- 跨平台一致性 – 相同代码可在 CPU、CUDA 和 WebGPU 后端运行。
发布亮点
| 版本 | 亮点 |
|---|---|
| 0.5.0 | 解锁 solvr(科学计算)和 boostr(机器学习框架)的新版本发布,两者均基于 numr。 |
| 0.6.0 | 专注于硬化:清理错误处理,审计 API 稳定性,并为最终的 1.0 版本做准备。 |
| 0.7.0+ (roadmap) | 通过 ROCm 添加原生 AMD GPU 支持。 |
依赖
[dependencies]
numr = "0.5.0"带 GPU 支持
# CUDA support
numr = { version = "0.5.0", features = ["cuda"] }
# WebGPU (wgpu) support
numr = { version = "0.5.0", features = ["wgpu"] }项目链接
- GitHub:
- crates.io:
License
numr 在 Apache‑2.0 许可证下发布。欢迎贡献。