问题描述
未来Rust是AI应用开发的优势语言(Rust is the first language for AI application development),问题改的友善点吧。再来补充一下: 说的是ai应用开发,没说要训练。另外没想到关注的人还挺多的,让子弹飞会,一两年后或许是不一样的世界。好了,大家尽情飞砖
知乎惯例,先问是不是,再问为什么。
。。。Rust 的 AI 库可以把你逼疯。给你表演一下:
PyTorch:
def stability_after_failure(
self, state: Tensor, new_d: Tensor, r: Tensor
) -> Tensor:
new_s = (
self.w[11]
* torch.pow(new_d, -self.w[12])
* (torch.pow(state[:, 0] + 1, self.w[13]) - 1)
* torch.exp((1 - r) * self.w[14])
)
return new_s
Candle(hugging face 的 Rust 深度学习框架):
fn stability_after_failure(
&self,
state: &Tensor,
new_d: &Tensor,
r: &Tensor,
) -> candle_core::Result<Tensor> {
let new_s = self.w.get(11)?
* new_d.powf(-self.w.get(12)?.to_scalar::<f64>()?)?
* state
.affine(1.0, 1.0)?
.powf(self.w.get(13)?.to_scalar::<f64>()?)?
.affine(1.0, -1.0)?
* (r.affine(-1.0, -1.0)? * self.w.get(14)?)?.exp()?;
new_s
}
Burn(FSRS 正在用的 Rust 深度学习框架):
fn stability_after_failure(
&self,
last_s: Tensor<B, 2>,
new_d: Tensor<B, 2>,
r: Tensor<B, 2>,
) -> Tensor<B, 2> {
self.w().slice([11..12])
* (-self.w().slice([12..13]) * new_d.log()).exp()
* ((self.w().slice([13..14]) * (last_s + 1).log()).exp() - 1)
* ((-r + 1) * self.w().slice([14..15])).exp()
}
PyTorch 我几分钟就能敲出来的网络结构,Rust 我要敲一个小时。而且 Rust 这边的深度学习库缺很多函数操作。甚至连 tensorA.pow(tensorB) 都没有,必须用 (tensorA.log() * tensorB).exp() 这样的 workaround。1 - tensor 也是不存在的,必须 tensor.affine(-1.0, 1.0)。tensor 类型转换甚至都是几周前才实现的功能。
还有一些很神必的差异。比如 burn 的 dataloader 里面有 shuffle,但这个 shuffle 只在构建的时候执行一次,之后每个 epoch 的顺序都是一样的。这钟问题如果不把日志打出来,或者去看底层代码,根本察觉不到。
虽然最后还是用 burn 把我的一个 PyTorch 项目重写成功了,但重写花的时间是开发的 20 倍以上(这里还包括修 bug 修到上游去的时间、各种框架选型踩坑的时间),更不用说如果我一开始就用 Rust 写,估计心智负担直接爆炸了。我是没感觉出 Rust 在 AI 开发效率上有什么优势。
不过要说其他方面的优势,其实还是有的。比如编译出来的应用体积很小,就几 MB。如果是依赖 libtorch 的话,体积就要上百 MB 了。
如果你想找一些 Rust 的深度学习应用来参考,可以看看 open spaced repetition 组织的这个项目:
open-spaced-repetition/fsrs-rs: FSRS for Rust, including Optimizer and Scheduler (github.com)