rust机器学习的现状(代码片段)

dhcn dhcn     2022-12-04     640

关键词:

https://main.run/p/121

每隔一段时间,这个话题就出现在社交媒体或Rust用户频道上。 我想简要介绍一下我所看到的事情的历史,以及有关机器学习/深度学习框架的现有变化以及最近的主要趋势的一些信息。

BRIEF HISTORY AND WHERE ARE WE NOW?

现有的 ML/DL 生态系统非常庞大,因为它们是高性能计算、数学优化、系统和编译器工程等的组合。 因此,为了简单起见,如果我们将ML划分为传统ML和DL(包括重叠),然后我们可以看到 rusty-machinerustlearn 和 leaf 。他们做了非常有趣和大胆的发展, 特别是当时的leaf 。最终,他们大多放弃了,因为创建一个完整的开源ML/DL框架需要大量的工作:

  • 语言和库的支持 (稍后会介绍)
  • 基本成熟的线性代数和统计学方面的库
  • 一个由ML专家组成的社区,他们碰巧知道Rust并愿意做出贡献

主流的现有ML库(主要使用Python/Cython或c++)都是在这些支持下开发的,Rust也不例外。

语言和库的支持

之前,Gonzalo 列出了一份 HPC 清单,到目前为止,我可以说 Rust 通过语言(稳定/不稳定)特性和 crates 支持了其中大多数条目,希望到今年年底我们能看到越来越多的支持。 但是 constant-generics (更好的数组支持), 稳定的 std::simd 和 native GPU, async 等的支持仍在进行中。 一些变通方法和现有的解决方案是: generic-array (using typenum), packed simdRustaCUDA。对于 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-linalgndarray-stats

社区

回顾过去,可以说人们或多或少的进行了 Rust ML 方面的实验。 我认为实验已经进入了最后阶段,一旦 Rust 推动当前的需求,如 const-generic, GAT, std::simd, GPU 的支持。 我认为社区正变得越来越大,考虑到前面提到的那些 crate 的作者和贡献者的共同努力,和 ML 专家和爱好者的数量已经接近了。在那儿,我们可以一起做一些有趣的事情,通过学习和评估现有的系统(特别是在 Python 中)来创建我们自己的 Rust 生态系统。我认为是时候创建一个 ML Working Group,或者至少是现在。如果你感兴趣,你可以加入 rust-ml 组看看事情会如何发展。

深度学习呢?

这是我最感兴趣的领域。DL 前沿将越来越多的精力投入到系统和编译器中,以便更好地进行计算、图级优化、微分(又称可微分编程)、高效的代码生成和内核生成等,在编译时。 主要的前沿领域有: TVMtensorflow/swiftpytorch/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.

本文翻译自 State of Machine Learning in Rust

用了这么多年rust终于搞明白了内存分布!(代码片段)

...个几个假设,来更好地帮助后续文章的展开。我们本文的机器预设是32位的(主要为了画图可以精简一点),所有和位相关的数据结构均会用上标标记(即这些数据结构占用的是1machineword)。例如:数据结构基本单位示图:蓝色的... 查看详情

rust学习1(代码片段)

1.为什么学习rust官网的解释如下,性能好,可靠,生产力。我的理由,想看看怎么保证内存安全与线程安全的 1.环境搭建去网站下载对应的rustup-init   https://forge.rust-lang.org/infra/other-installation-methods.html然后按照操作... 查看详情

rust学习-result/option/unwrap/?(代码片段)

学习Rust时,注意到有4个概念经常放到一起讨论:Result、Option、unwapr和?操作符。本文记录了我对这4个Rust概念的思考,这个思考过程帮助我理解并学会了如何写出更地道的Rust代码。1、Option-可空变量虽然Rust中有null的... 查看详情

rust学习教程14-函数(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433函数Rust的函数我们在之前已经见过不少,跟其他语言几乎没有什么区别。因此本章的学习之路将轻松和愉快,骚年们,请珍惜这种... 查看详情

rust学习教程14-函数(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433函数Rust的函数我们在之前已经见过不少,跟其他语言几乎没有什么区别。因此本章的学习之路将轻松和愉快,骚年们,请珍惜这种... 查看详情

rust学习教程28-深入类型转换(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433类型转换Rust是类型安全的语言,因此在Rust中做类型转换不是一件简单的事,这一章节我们将对Rust中的类型转换进行详尽讲解。as转换先... 查看详情

rust学习笔记-变量和类型(代码片段)

变量通常一门的语言的变量是没有啥可以说道的,无法就是变量命名规则:以字母、下划线和数字组成,并且数字不能开头,没啥好说的。但rust的变量奇怪的地方是,变量不可变譬如这样一个简单到不能再简... 查看详情

rust学习教程23-方法method(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433方法Method从面向对象语言过来的同学对于方法肯定不陌生,class里面就充斥着方法的概念,在Rust中方法的概念也大差不差,往往和对... 查看详情

rust学习教程23-方法method(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433方法Method从面向对象语言过来的同学对于方法肯定不陌生,class里面就充斥着方法的概念,在Rust中方法的概念也大差不差,往往和对... 查看详情

rust学习教程33-hashmap(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433KV存储HashMap和动态数组一样,HashMap也是Rust标准库中提供的集合类型,但是又与动态数组不同,HashMap中存储的是一一映射的KV键值对&... 查看详情

rust学习教程33-hashmap(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433KV存储HashMap和动态数组一样,HashMap也是Rust标准库中提供的集合类型,但是又与动态数组不同,HashMap中存储的是一一映射的KV键值对&... 查看详情

rust学习(代码片段)

Rust  1.install  2.playonline  curlhttps://sh.rustup.rs-sSf|shecho‘PATH="$PATH:$HOME/.cargo/bin"‘>>~/.bashrcrustupdoc Tutorialorglearn (entry)   查看详情

rust学习教程22-全模式列表(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433全模式列表在本书中我们已领略过许多不同类型模式的例子.本节的目标就是把这些模式语法都罗列出来,方便大家检索查阅。匹配字面值let... 查看详情

rust学习教程22-全模式列表(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433全模式列表在本书中我们已领略过许多不同类型模式的例子.本节的目标就是把这些模式语法都罗列出来,方便大家检索查阅。匹配字面值let... 查看详情

rust学习教程15-元组tuple(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433元组元组也是复合类型的一种,因此它是由多种类型组合到一起形成的。元组的长度是固定的,且在声明后,无法进行伸缩。通过以... 查看详情

rust学习教程15-元组tuple(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433元组元组也是复合类型的一种,因此它是由多种类型组合到一起形成的。元组的长度是固定的,且在声明后,无法进行伸缩。通过以... 查看详情

rust学习教程16-结构体struct(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433结构体在上一节,我们提到需要一个更高级的数据结构来帮助我们更好的抽象问题,而结构体strct恰恰就是这样的复合数据结构,它... 查看详情

rust学习教程-引用与借用(代码片段)

...t语言圣经>>一书欢迎大家加入Rust编程学院,一起学习交流:QQ群:1009730433引用与借用上节中提到,如果仅仅是所有权转移,会让程序变得复杂,那能否像其它编程语言一样,使用某个变量的指针或者引... 查看详情