【精选优质专栏推荐】


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

在这里插入图片描述

机器学习已经成为解决各类复杂问题的利器,广泛应用于金融、医疗等多个领域。

虽然 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,执行以下命令:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装完成后,可以通过以下命令检查是否安装成功:

cargo --version

创建 Rust 项目

使用 Cargo 创建一个新项目:

cargo new ml_project
cd ml_project

这会初始化一个带有基本目录结构的 Rust 项目。

添加依赖

在 Rust 中,机器学习库被称为 crate。crate 是一个 Rust 代码包,Cargo 会将其编译成可执行文件或库,包含源代码、元数据和依赖信息,使得代码可以在不同项目间方便复用。用于提供可重用功能的 crate 通常被称为库 crate,或简称库。

添加所需依赖:

cargo add ndarray linfa linfa-datasets tch-rs

然后运行以下命令下载依赖并编译项目:

cargo build

Rust 中常用的机器学习库概览

以下是 Rust 中一些使用较为广泛的机器学习库:

SmartCore:
一个功能全面的机器学习库,提供分类、回归、聚类等多种算法,非常适合传统机器学习应用。

Linfa:
一个简单灵活的机器学习框架,包含基础算法,如支持向量机(SVM)和 k 近邻(k-NN)。

Ndarray:
虽然不是专门的机器学习库,但在 Rust 中进行数学运算非常重要,类似于 Python 的 NumPy。

tch-rs:
一个与 PyTorch 连接的 Rust 库,可用于构建基于 Torch 的深度学习应用。

用 Rust 构建一个简单的机器学习模型

加载与预处理数据

在训练机器学习模型之前,需要先准备数据。Rust 提供了 ndarray 和 csv 等库来处理数据集。

下面是一个加载数据集的示例:

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<f64> = 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)?)
}

对上述代码的说明:

1.使用 csv 库打开指定路径的 CSV 文件。
2.遍历 CSV 中的每条记录,同时过滤掉读取过程中出现的错误。
3.将每条记录的每个字段解析为浮点数(f64),解析失败时默认为 0.0。
4.将解析后的数字扁平化为一个向量,并使用 ndarray 将其重塑为 4 列的二维数组。

训练模型

使用 linfa,我们可以训练一个简单的逻辑回归模型:

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.模型成功拟合后返回训练好的模型

评估模型性能

训练完成后,可以对模型进行评估:

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(())
}

代码说明:

1.使用逻辑回归模型对提供的数据集进行预测
2.计算预测结果的平均值,以评估模型准确率
3.将准确率以百分比形式输出
4.如果准确率计算失败,则返回错误

在 Rust 中使用神经网络

Rust 可以通过 tch-rs 库进行深度学习。该库是 PyTorch 的 Rust 绑定,提供张量操作和模型构建功能。

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()))
}

上述代码说明:

1.导入 tch crate 中的必要模块
2.构建一个顺序神经网络
3.添加一个线性层,将 784 个输入映射为 128 个输出,并使用 ReLU 激活函数
4.添加最终的线性层,将 128 个特征映射为 10 个输出

将 Rust 与其他机器学习框架集成

Rust 具有高性能、安全性以及优秀的多任务处理能力。尽管其机器学习生态仍在发展,但许多流行的机器学习框架(如 TensorFlow 和 PyTorch)主要基于 Python 或 C++。Rust 可以与这些框架协作,将自身的性能优势与强大的机器学习工具结合起来。

将 Rust 与其他机器学习框架集成,主要有两种方式:

1.Rust 与 Python(PyO3):
通过从 Python 调用 Rust 函数来提升性能

2.在 Rust 中部署机器学习模型:
在 Rust 中运行预训练模型,实现高效推理

Rust 与 Python(PyO3)

Python 在机器学习领域非常流行,拥有如 NumPy、TensorFlow 和 PyTorch 等丰富库。但 Python 的性能在某些计算密集型任务中可能成为瓶颈。PyO3 库可以将 Rust 与 Python 连接,将 Rust 代码编译为 Python 扩展模块,从而像普通 Python 模块一样使用。

假设我们想用 Rust 来加速一个简单的数学运算。

首先,创建一个 Rust crate 库:

cargo new --lib rust_ml_extension
cd rust_ml_extension

然后在 Cargo.toml 中添加 PyO3 依赖:

[dependencies]
pyo3 = { version = "0.20", features = ["extension-module"] }

接着,在 lib.rs 中编写 Rust 代码,用于生成 Python 扩展模块:

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 模型的步骤如下。

首先,在 Cargo.toml 中添加 ONNX Runtime 依赖:

[dependencies]
onnxruntime = "0.15"

然后在 Rust 中加载并运行模型:

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")?;
    
    // 在此处理输入数据并进行推理
    
    Ok(())
}

实际应用

Rust 不断完善的生态系统和出色的性能,使其成为机器学习应用的理想选择。虽然相比 Python,Rust 的生态仍在发展,但它已经在多个真实项目中得到应用,尤其适合对速度、安全性和效率要求较高的场景。

1.金融市场预测
Rust 具有低延迟和良好的并发能力,非常适合高频交易(HFT)和金融预测。机器学习模型能够分析股市趋势,并在微秒级别执行交易。

2.网络安全与欺诈检测
机器学习在网络安全中广泛应用,用于检测异常网络流量和防止在线交易欺诈。Rust 的强类型安全特性,使安全工具更不易受到漏洞影响。

3.自动驾驶与无人机
自动驾驶汽车和无人机依赖机器学习模型进行目标检测和路径导航。Rust 的底层控制能力和实时处理特性,使其非常适合嵌入式 AI 应用。

4.基于 Rust 的 AI 聊天机器人
自然语言处理(NLP)模型驱动聊天机器人、语音助手和文本分析工具。Rust 的高效性能,使其在处理大规模文本数据时表现优异。

结论

Rust 正逐渐成为机器学习领域的一门强大语言,提供安全性、高性能以及与现有框架的良好互操作性。

尽管生态系统仍在发展,但 linfa 和 tch-rs 等库已经能够支持构建机器学习模型。同时,通过 PyO3 将 Rust 与 Python 无缝集成,并利用 ONNX 部署模型,开发者可以兼顾 Rust 的高性能与 Python 丰富的机器学习生态,实现两者优势的结合。

更多推荐