التعلم الآلي باستخدام 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 والأجهزة الطرفية.
ميزات Candle
- حجم الملف الثنائي أقل من 10 ميجابايت
- دعم جاهز للنماذج: LLaMA، Whisper، BERT