Машинное обучение на Rust: современные библиотеки и инструменты
Экосистема машинного обучения долгое время ассоциировалась исключительно с Python. Однако Rust, благодаря своей производительности, безопасности памяти и нулевым накладным расходам, всё активнее внедряется в ML-инструментарий. В этой статье мы разберём ключевые библиотеки для машинного обучения на языке Rust, которые позволяют строить, обучать и развёртывать модели с эффективностью, недостижимой для интерпретируемых языков.
Почему Rust для машинного обучения?
Rust предлагает три главных преимущества для ML:
- Производительность — скорость выполнения кода сопоставима с C/C++.
- Безопасность — система владения (ownership) исключает целые классы ошибок памяти.
- Параллелизм — встроенная модель потоков без гонок данных.
Однако Rust не пытается заменить Python в исследовательской части. Его ниша — production-среда, встраиваемые системы, высоконагруженные сервисы и пограничные вычисления (edge computing).
1. Linfa — полный набор алгоритмов классического ML
Проект linfa (аналог scikit-learn для Rust) предоставляет модульную структуру для задач обучения с учителем и без. Библиотека активно развивается при поддержке сообщества Rust-ML.
Основные компоненты Linfa
linfa-clustering— K-Means, DBSCAN, Gaussian Mixturelinfa-linear— линейная и логистическая регрессияlinfa-svm— метод опорных векторовlinfa-trees— деревья решений и случайный лесlinfa-nn— методы ближайших соседей
Пример: линейная регрессия с Linfa
use linfa::prelude::*;
use linfa_linear::LinearRegression;
use ndarray::array;
fn main() {
// Обучающие данные: (x, y)
let x = array![[1.0], [2.0], [3.0], [4.0]];
let y = array![2.0, 4.0, 6.0, 8.0];
// Создаём датасет
let dataset = Dataset::new(x, y);
// Обучаем модель
let model = LinearRegression::default().fit(&dataset).unwrap();
// Предсказание для x=5
let pred = model.predict(&array![[5.0]]);
println!("Предсказание: {}", pred);
}
2. Burn — фреймворк глубокого обучения с поддержкой GPU
Burn — это современный фреймворк для нейронных сетей, написанный на Rust. Он поддерживает автоматическое дифференцирование, работу на GPU через WGPU и Vulkan, а также экспорт в ONNX.
Ключевые возможности Burn
- Динамические и статические вычислительные графы
- Бэкенды: Torch, WGPU, Ndarray, Fusion
- Встроенные оптимизаторы (Adam, SGD, AdamW)
- Поддержка 1D, 2D, 3D свёрток
Пример: простой перцептрон на Burn
use burn::tensor::{Tensor, backend::Backend};
use burn::nn::{Linear, LinearConfig};
use burn::module::Module;
#[derive(Module)]
struct MLP<B: Backend> {
layer1: Linear<B>,
layer2: Linear<B>,
}
impl<B: Backend> MLP<B> {
fn new(device: &B::Device) -> Self {
Self {
layer1: LinearConfig::new(2, 16).init(device),
layer2: LinearConfig::new(16, 1).init(device),
}
}
fn forward(&self, input: Tensor<B, 2>) -> Tensor<B, 2> {
let x = self.layer1.forward(input).relu();
self.layer2.forward(x)
}
}
3. Candle — минималистичный фреймворк от Hugging Face
Разработанный командой Hugging Face, Candle ориентирован на простоту и скорость. Он не использует CUDA (только CPU и Metal), что делает его идеальным для инференса на Mac и edge-устройствах.
Особенности Candle
- Размер бинарника менее 10 МБ
- Готовая поддержка моделей: LLaMA, Whisper, BERT
- Квантование (4-bit, 8-bit) для ускорения
- Работа без зависимостей Python
Загрузка и инференс модели BERT
Также в библиотеке
Работа с Markdown в TypeScript: библиотеки, парсеры и инструменты
xUnit / NUnit для C# (.NET): полное руководство с примерами
Работа с S3 и облачными хранилищами в Go: библиотека minio-go
Очереди задач для Rust: обзор и примеры использования