在 Debian 上用 Rust 做机器学习,可以兼顾性能、内存安全与工程化部署。下面给出从环境准备到训练、推理与部署的完整实践路线,并配套可直接运行的示例与要点。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/envrustc --version、cargo --version~/.cargo/config.toml 添加:[source.crates-io]
replace-with = 'tuna'
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
sudo apt-get update && sudo apt-get install -y build-essential cmake ccache pkg-config libssl-dev libclang-dev clang llvm-dev git-lfs| 场景 | 推荐库 | 关键点 |
|---|---|---|
| 传统机器学习 | linfa、smartcore | 类似 scikit-learn 的 API,涵盖回归、分类、聚类等 |
| 深度学习 | tch-rs、candle | tch-rs 为 PyTorch 绑定;candle 轻量、纯 Rust、易部署 |
| 数据处理 | ndarray、polars | ndarray 多维数组;polars 高性能数据框 |
| 推理部署 | tract、wonnx | ONNX 模型推理与优化,适合跨语言与服务化部署 |
| 以上库在 Debian 上均可直接用 Cargo 构建,生态成熟,示例丰富。 |
cargo new linfa-lr && cd linfa-lr[dependencies]
linfa = "0.6"
ndarray = "0.15"
use linfa::prelude::*;
use ndarray::array;
fn main() {
// 训练数据:y = 2x + 1
let x = array![[1.0], [2.0], [3.0], [4.0], [5.0]];
let y = array![3.0, 5.0, 7.0, 9.0, 11.0];
// 训练
let model = linfa::linear_regression::LinearRegression::default().fit(&x, &y).unwrap();
// 预测
let preds = model.predict(&array![[6.0], [7.0]]);
println!("Predictions: {:?}", preds); // 期望接近 [13.0, 15.0]
}
cargo runcargo new tch-mnist && cd tch-mnist[dependencies]
tch = { version = "0.22", features = ["vision"] }
anyhow = "1.0"
use anyhow::Result;
use tch::{nn, nn::ModuleT, Device, Tensor, Kind};
use tch::vision::mnist;
fn lenet(vs: &nn::Path) -> impl ModuleT {
nn::seq()
.add(nn::conv2d(vs / "conv1", 1, 6, 5, Default::default()))
.add_fn(|xs| xs.relu().max_pool2d_default(2))
.add(nn::conv2d(vs / "conv2", 6, 16, 5, Default::default()))
.add_fn(|xs| xs.relu().max_pool2d_default(2))
.add_fn(|xs| xs.flatten(1, -1))
.add(nn::linear(vs / "fc1", 16 * 5 * 5, 120, Default::default()))
.add_fn(|xs| xs.relu())
.add(nn::linear(vs / "fc2", 120, 84, Default::default()))
.add_fn(|xs| xs.relu())
.add(nn::linear(vs / "fc3", 84, 10, Default::default()))
}
fn main() -> Result<()> {
let device = Device::Cpu; // 有 NVIDIA GPU 可改为 Device::CudaIfAvailable
let vs = nn::VarStore::new(device);
let net = lenet(&vs.root());
let mut opt = nn::Adam::default().build(&vs, 1e-3)?;
// 加载 MNIST 数据集
let m = mnist::load_dir("data")?;
for epoch in 1..=5 {
let loss = net
.forward_t(&m.train_images, true)
.cross_entropy_for_logits(&m.train_labels);
opt.backward_step(&loss);
let acc = net
.forward_t(&m.test_images, false)
.accuracy_for_logits(&m.test_labels);
println!("Epoch: {:2}, Loss: {:.4}, Test Acc: {:.2}%",
epoch, f64::from(loss), 100.0 * acc);
}
Ok(())
}
mkdir -p data && wget -O data/train-images-idx3-ubyte.gz http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz && wget -O data/train-labels-idx1-ubyte.gz http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz && wget -O data/t10k-images-idx3-ubyte.gz http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz && wget -O data/t10k-labels-idx1-ubyte.gz http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gzcargo run --releaseDevice::CudaIfAvailable;tch-rs 将自动使用 GPU。cargo build --examples --features cuda 启用 CUDA。export LIBTORCH=https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.0.1%2Bcpu.zip
export LIBTORCH_USE_PYTORCH=1
tch::Device::CudaIfAvailable。--features cuda;确保系统已安装 CUDA Toolkit 与相应驱动。--release 编译以获得最佳性能。