
Rust 机器学习入门指南
图片来源:编辑 | Midjourney
机器学习已成为解决从金融到医疗保健等各个领域复杂问题的基本工具。虽然 Python 和 R 等语言在机器学习领域占据主导地位,但 Rust 正凭借其性能、安全性和并发性等特性,新兴成为一个强大的替代选择。
Rust 的内存安全保证和零成本抽象使其成为构建高性能机器学习应用的绝佳选择,特别是在处理大型数据集或实时处理时。尽管 Rust 的机器学习生态系统仍在发展中,但像 ndarray
、tch-rs
(Rust 版 Torch)和 linfa
这样的库正使实现机器学习模型变得更加容易。
在本文中,我们将探讨 Rust 机器学习的基础知识,介绍必备库,并构建一个简单的机器学习模型。无论您是对机器学习感到好奇的 Rust 开发者,还是正在寻找高性能替代方案的机器学习从业者,本文都将帮助您入门。
为什么选择 Rust 进行机器学习?
Rust 因几个原因在机器学习社区中越来越受欢迎:
- 内存安全:Rust 可防止空指针错误和缓冲区溢出等错误。这使得机器学习代码更安全。
- 高性能:Rust 的运行速度与 C 和 C++ 一样快。它没有垃圾回收,因此机器学习模型运行高效。
- 并发性:Rust 支持并行计算。它有助于机器学习模型在多核处理器上运行得更快。
- 互操作性:Rust 可与 C 和 Python 很好地协同工作。您可以在获得 Rust 的速度优势的同时,使用现有的机器学习框架。
设置您的 Rust 环境
在使用 Rust 进行机器学习之前,您需要设置好工具。
安装 Rust
使用 Rustup 安装 Rust。运行此命令:
1 |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
安装完成后,请检查 Rust 是否已安装:
1 |
cargo --version |
设置 Rust 项目
使用 Cargo 创建一个新项目:
1 2 |
cargo new ml_project cd ml_project |
这将初始化一个具有基本结构的新 Rust 项目。
添加依赖项
要使用机器学习库(在 Rust 中称为“crate”),请添加必要的依赖项。Rust crate 是 Rust 代码的一个包,cargo
会将其编译成二进制文件或库。它包含项目的源代码、元数据和依赖项信息,便于在不同项目之间分发和重用代码。当一个 crate 用作可重用功能而不是可执行文件时,它通常被称为库 crate,或者干脆称为库。
1 |
cargo add ndarray linfa linfa-datasets tch-rs |
运行 cargo build
来获取依赖项并编译项目。
Rust 机器学习流行库概述
以下是一些 Rust 中使用最广泛的机器学习库:
- SmartCore:一个全面的机器学习库,提供分类、回归、聚类等算法。它是传统机器学习应用的绝佳选择。
- Linfa:一个简单而灵活的机器学习框架。它包含支持向量机和 K 近邻等基本算法。
- Ndarray:Ndarray 不是一个机器学习库,但它对于 Rust 中的数学计算很重要。它的作用类似于 Python 中的 NumPy。
- tch-rs:一个连接到 PyTorch 的 Rust 库。它有助于使用 Torch 系统构建深度学习应用程序。
在 Rust 中构建简单的机器学习模型
加载和预处理数据
在训练机器学习模型之前,我们需要准备数据。Rust 提供了 ndarray
和 csv
等库来处理数据集。以下是加载数据集的示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
use ndarray::Array2; use std::error::Error; use csv::Reader; fn load_data(file_path: &str) -> Result<Array2<f64>, Box<dyn Error>> { let mut reader = Reader::from_path(file_path)?; let data: Vec = reader.records() .filter_map(|r| r.ok()) .flat_map(|r| r.iter().map(|val| val.parse::<f64>().unwrap_or(0.0))) .collect(); Ok(Array2::from_shape_vec((data.len() / 4, 4), data)?) } |
以上代码的解释:
- 使用
csv
crate 打开给定文件路径的 CSV 文件。 - 遍历 CSV 中的每个记录,过滤掉记录读取过程中的任何错误。
- 将每个记录中的每个字段解析为浮点数(
f64
),如果解析失败则默认为0.0
。 - 使用
ndarray
crate 将解析后的数字展平成单个向量,并重塑为具有 4 列的二维数组。
训练模型
使用 linfa
,我们可以训练一个简单的逻辑回归模型。
1 2 3 4 5 6 7 8 |
use linfa::prelude::*; use linfa::Dataset; use linfa_logistic::LogisticRegression; fn train_model(dataset: Dataset) -> Result<LogisticRegression, Box<dyn std::error::Error>> { let model = LogisticRegression::default().fit(&dataset)?; Ok(model) } |
代码说明:
- 使用默认参数初始化逻辑回归模型。
- 使用提供的数据集训练模型。
- 传播训练过程中遇到的任何错误。
- 成功拟合后返回训练好的模型。
评估模型性能
训练完成后,我们可以评估模型。
1 2 3 4 5 |
fn evaluate_model(model: &LogisticRegression, dataset: &Dataset) -> Result<(), Box<dyn std::error::Error>> { let accuracy = model.predict(dataset).mean().ok_or("Failed to compute mean")?; println!("Model Accuracy: {:.2}%", accuracy * 100.0); Ok(()) } |
以上代码的功能:
- 使用提供的逻辑回归模型对数据集进行预测。
- 计算预测的平均值以确定模型准确性。
- 将准确性作为百分比打印出来。
- 如果准确性计算失败,则返回错误。
在 Rust 中处理神经网络
Rust 可以通过 tch-rs
库进行深度学习,该库是 PyTorch 的绑定。它提供了张量操作和模型构建功能。
1 2 3 4 5 6 7 8 |
use tch::{nn, nn::Module, Device, Tensor}; fn build_nn(vs: &nn::Path) -> impl nn::Module { nn::seq() .add(nn::linear(vs, 784, 128, Default::default())) .add_fn(|xs| xs.relu()) .add(nn::linear(vs, 128, 10, Default::default())) } |
在上述代码中:
- 从
tch
crate 导入必要的模块。 - 构建一个顺序神经网络。
- 添加一个将 784 个输入转换为 128 个输出的线性层,后跟一个 ReLU 激活。
- 添加一个将 128 个特征映射到 10 个输出的最终线性层。
将 Rust 与其他机器学习框架集成
Rust 速度快、安全且擅长处理多项任务。其机器学习生态系统仍在发展中。许多机器学习框架(如 TensorFlow 和 PyTorch)使用 Python 或 C++。Rust 可以与这些框架协同工作。这结合了 Rust 的速度和强大的机器学习工具。
将 Rust 与其他机器学习框架集成的两种主要方法是:
- 将 Rust 与 Python (PyO3) 结合使用:从 Python 调用 Rust 函数以提高性能。
- 在 Rust 中部署机器学习模型:在 Rust 中运行预训练模型以实现高效推理。
将 Rust 与 Python (PyO3) 结合使用
Python 在机器学习领域很受欢迎,拥有 NumPy、TensorFlow 和 PyTorch 等库。然而,Python 的性能限制可能成为某些任务的瓶颈。PyO3
库有助于连接 Rust 和 Python。它允许您将 Rust 代码编译成 Python 扩展。然后,您可以像使用普通 Python 模块一样使用它。
假设我们要通过 Rust 加速一个简单的数学运算。
首先,创建一个 Rust crate 库:
1 2 |
cargo new --lib rust_ml_extension cd rust_ml_extension |
接下来,将 PyO3 添加到 Cargo.toml
:
1 2 |
[dependencies] pyo3 = { version = "0.20", features = ["extension-module"] } |
然后编写 Python 扩展的 Rust 代码(lib.rs
):
1 2 3 4 5 6 7 8 9 10 11 12 |
use pyo3::prelude::*; #[pyfunction] fn square(x: f64) -> f64 { x * x } #[pymodule] fn rust_ml_extension(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(square, m)?)?; Ok(()) } |
在 Rust 中部署机器学习模型
在 Python 中训练好机器学习模型后,必须将其部署以供使用。ONNX 是一种跨平台格式。Rust 有一个运行 ONNX 模型的库。这使得在 Rust 程序中使用训练好的模型变得容易。
让我们看一下使用 Rust 和 ONNX 的步骤。
首先,将 ONNX Runtime 添加到 Cargo.toml
:
1 2 |
[dependencies] onnxruntime = "0.15" |
然后,在 Rust 中加载和运行 ONNX 模型:
1 2 3 4 5 6 7 8 9 10 |
use onnxruntime::{environment::Environment, session::Session}; fn main() -> Result<(), Box<dyn std::error::Error>> { let environment = Environment::builder().build()?; let session = Session::new(&environment, "model.onnx")?; // Input data processing and inference code here Ok(()) } |
实际应用
Rust 不断增长的生态系统和性能优势使其成为机器学习应用的绝佳选择。尽管与 Python 相比仍处于发展阶段,但在速度、安全性和效率至关重要的领域,Rust 已被用于各种实际的机器学习项目中。
金融市场预测
Rust 的低延迟和并发能力使其非常适合高频交易 (HFT) 和金融预测。机器学习模型可以分析股市趋势并在微秒内执行交易。
网络安全与欺诈检测
机器学习广泛用于网络安全,以检测网络流量中的异常并防止在线交易中的欺诈。Rust 强大的类型安全确保了安全工具不易出现漏洞。
自动驾驶汽车
无人驾驶汽车和无人机依赖机器学习模型进行物体检测和导航。Rust 的低级控制和实时处理能力使其成为嵌入式人工智能应用的理想选择。
基于 Rust 的 AI 聊天机器人
自然语言处理 (NLP) 模型驱动聊天机器人、语音助手和文本分析工具。Rust 的效率使其成为处理大规模文本数据的绝佳选择。
结论
Rust 正作为一种强大的机器学习语言崭露头角,提供安全性、速度以及与现有框架的互操作性。虽然生态系统仍在发展中,但像 linfa
和 tch-rs
这样的库使得构建机器学习模型成为可能。此外,Rust 通过 PyO3
与 Python 的无缝集成,以及其使用 ONNX 部署模型的能力,使开发人员能够充分利用两者的优势——Rust 的性能和 Python 广泛的机器学习生态系统。
暂无评论。