每隔一段時間,這個話題就出現在社交媒體或Rust用戶頻道上。 我想簡要介紹一下我所看到的事情的歷史,以及有關機器學習/深度學習框架的現有變化以及最近的主要趨勢的一些信息。
BRIEF HISTORY AND WHERE ARE WE NOW?
現有的 ML/DL 生態系統非常龐大,因為它們是高性能計算、數學優化、系統和編譯器工程等的組合。 因此,為了簡單起見,如果我們將ML划分為傳統ML和DL(包括重疊),然后我們可以看到 rusty-machine, rustlearn 和 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 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.