kingzone 2020-05-08
每隔一段时间,这个话题就出现在社交媒体或Rust用户频道上。 我想简要介绍一下我所看到的事情的历史,以及有关机器学习/深度学习框架的现有变化以及最近的主要趋势的一些信息。
现有的 ML/DL 生态系统非常庞大,因为它们是高性能计算、数学优化、系统和编译器工程等的组合。 因此,为了简单起见,如果我们将ML划分为传统ML和DL(包括重叠),然后我们可以看到 rusty-machine, rustlearn 和 leaf 。他们做了非常有趣和大胆的发展, 特别是当时的leaf
。最终,他们大多放弃了,因为创建一个完整的开源ML/DL框架需要大量的工作:
主流的现有ML库(主要使用Python/Cython或c++)都是在这些支持下开发的,Rust也不例外。
之前,Gonzalo 列出了一份 HPC 清单,到目前为止,我可以说 Rust 通过语言(稳定/不稳定)特性和 crates 支持了其中大多数条目,希望到今年年底我们能看到越来越多的支持。 但是 constant-generics (更好的数组支持), 稳定的 std::simd
和 native GPU, async 等的支持仍在进行中。 一些变通方法和现有的解决方案是: generic-array (using typenum), packed simd, RustaCUDA。对于 MPI 有 MPI-binding,对于 OpenMP 有 rayon。
Are we learning yet? 正在跟踪这里领域的大部分信号,简单的在 crates.io 上搜索你会发现我们还有很多事要做,Rust 还没有能用于生产环境的。
感谢 bluss 发起了 ndarray 也感谢众多贡献者, ndarray
已经成为了 Rust 中的 numpy
, 即基本的线性代数 crate (尽管还有很多工作要做)。注意,这是非常基本的,仅仅包含 BLAS/BLIS, LAPACK 等是不够的!
ndarray
已经成为了 Rust ML 生态系统的基础, 其他的在此基础上构建, 例如: ndarray-linalg, ndarray-stats。
回顾过去,可以说人们或多或少的进行了 Rust ML 方面的实验。 我认为实验已经进入了最后阶段,一旦 Rust 推动当前的需求,如 const-generic, GAT, std::simd
, GPU 的支持。 我认为社区正变得越来越大,考虑到前面提到的那些 crate 的作者和贡献者的共同努力,和 ML 专家和爱好者的数量已经接近了。在那儿,我们可以一起做一些有趣的事情,通过学习和评估现有的系统(特别是在 Python 中)来创建我们自己的 Rust 生态系统。我认为是时候创建一个 ML Working Group,或者至少是现在。如果你感兴趣,你可以加入 rust-ml 组看看事情会如何发展。
这是我最感兴趣的领域。DL 前沿将越来越多的精力投入到系统和编译器中,以便更好地进行计算、图级优化、微分(又称可微分编程)、高效的代码生成和内核生成等,在编译时。 主要的前沿领域有: TVM, tensorflow/swift, pytorch/glow (also pytorch with TVM backend)。因此,谈到Rust,所有这些努力都不容忽视。
因此,短期的解决方案是创建绑定。这就是 I did for TVM。基本上,我们可以使用任何 DL 框架(TensorFlow, PyTorch, MXNet)来训练(现在主要是视觉任务),或者使用 ONNX 桥接一些框架,然后在各种支持的硬件上使用 TVM 进行编译,为了进行推理,我们可以使用我们喜爱的 Rust。我还应该提到现有的绑定,比如 tensorflow/rust 和 tch-rs。 这些绑定的主要问题是它们是有限的。例如, tenorflow/rust
没有现在 Python 做具有的更高的抽象,而tch-rs
一点也不安全。
推理,特别是在边缘设备上的推理,是最热门的领域之一。 另一个使用 Rust 进行推理的非常有趣的项目是 tract, 它对 TF 和 ONNX 有很好的支持。 值得一提的是,谷歌的 TFLite,腾讯的 NCNN 和 FeatherCNN,小米的 MACE 和微软的 ELL 都在尝试推出自己的解决方案。但是坦率的说,他们任然局限于某些众所周知的任务,而且用于其他任务是非常痛苦的。
您可能会问,如何从头开始在Rust中创建DL框架? 我想是的,首先阅读任何主要 DL 框架的源代码,并试图赶上编译器的开发。然后你会看到这些部分移动得很快,甚至还没有收敛到一个先对完整的解。虽然这可能是一个长期的解决方案,但我个人现在不感兴趣。
我喜欢 Rust,主要有两个原因
我希望看到 Rust 在 ML/DL 领域蓬勃发展。还有一些方面缺少一个像样的 crates,比如 ML 类型工作负载的可视化 crate,但我觉得 Rust 能成。 我希望这篇文章能说明ML/DL的问题。 有关其他人的意见,请参阅 rust-ml discussion.