6 个版本 (破坏性)
0.5.0 | 2022年6月7日 |
---|---|
0.4.0 | 2022年6月6日 |
0.3.0 | 2022年5月26日 |
0.2.0 | 2022年5月24日 |
0.1.1 | 2021年4月8日 |
#238 in 机器学习
每月23次下载
78KB
1K SLoC
无念是日本武术术语,指通过练习获得的心态。此时,一个人不依赖于他们认为应该是下一步的动作,而是依赖于他们训练过的自然反应(或本能)。
描述
无念是一个纯 Rust
、无不安全特性的库,用于在动态计算图上使用反向自动微分计算梯度。换句话说,PyTorch
对 Python
如同 Mushin
对 Rust
。
它内部使用 arrayfire 包来提供在专用硬件(如 Nvidia CUDA GPU、Intel MKL CPU...)上的并行计算。有关可用设备和您操作系统安装说明的详细信息,请参阅 arrayfire
包文档。安装 arrayfire
二进制文件对于 Mushin
的工作是必需的。
与 PyTorch
相比,此包的一个明显优势是 Rust
的强大类型系统。在图构建期间对张量执行的所有操作都会在编译时进行数学正确性检查,这意味着模型训练一小时后没有运行时错误。如果它编译,它就工作。如果您在构建地狱般的嵌套计算图时犯了一个错误,例如在张量的形状上,您甚至还没有开始感到愚蠢,就会被阻止。
此外,由于常量和变量张量实际上是不同的类型,因此开发人员可以持续了解哪些结果张量有助于梯度,哪些没有。更重要的是,编译器会阻止您尝试计算常量的梯度或与常量相关的梯度!
与其他类似库相比,另一个好处是计算图是积极评估的,这意味着图是真正动态的。换句话说,您的下一个操作可以基于之前操作的结果,因此在构建图时可以拥有条件分支。
使用方法
首先,根据arrayfire crate的指示安装arrayfire二进制文件。
然后,将mushin
作为您的依赖之一添加
[dependencies]
mushin = "0.5"
以下是一个相当直观的例子,说明了如何使用Mushin构建计算图并获取导数
use mushin as mu;
use mu::Tensor;
fn main() {
let x = mu::eye::<1, 1, 2, 3>(3.0).freeze();
let w = mu::randn::<1, 1, 3, 2>();
let b = mu::fill::<1, 1, 3, 3>(0.0);
let z = w.mm(&x).add(&b);
z.backward();
let dz_dw = w.grad()
let dz_db = b.grad()
}
默认情况下,此库启用了nn
功能,该功能提供了对nn
模块的访问,该模块基于Mushin
的自动梯度基础,提供了一套深度学习实用工具,例如激活函数、层、损失函数和优化器。如果您不需要这部分,并且您只对库的纯自动梯度功能感兴趣,可以使用default-features = false
禁用nn
模块。以下是一个简要示例,说明它是如何工作的
use mushin as mu;
use mu::nn::{layers::Linear, activations::relu, losses::mse, optimizers::SGD};
let x = mu::eye::<16, 1, 1, 3>(1.0).freeze();
let y = mu::eye::<16, 1, 1, 5>(3.0).freeze();
let linear = Linear::<16, 3, 5, _, _>::new();
let optim = SGD::new(&linear.parameters(), 0.01);
for _ in 0..5 {
let z = relu(&linear.forward(&x));
let loss = mse(&z, &y);
loss.backward();
optim.step();
loss.reset();
}
路线图
- 继续添加更多深度学习实用工具
- 添加基准测试
贡献
如果您发现漏洞、错误或希望添加新功能,请创建一个新问题。
要将您的更改引入代码库,请提交一个Pull Request。
非常感谢!
许可
Mushin是在MIT许可和Apache许可(版本2.0)的条款下分发的。
请参阅LICENSE-APACHE、LICENSE-MIT和COPYRIGHT以获取详细信息。
依赖项
~1.5MB
~31K SLoC