candle في Rust: إطار تعلم آلي خفيف من Hugging Face
candle هو إطار عمل حديث للتعلم الآلي، مكتوب بلغة Rust ومطور من قبل فريق Hugging Face. على عكس الحلول الثقيلة مثل PyTorch أو TensorFlow، يركز candle على الأداء العالي، أمان الذاكرة، واستهلاك الموارد المنخفض. يتيح لك تشغيل نماذج الشبكات العصبية على المعالج المركزي (CPU) والمعالج الرسومي (GPU) عبر CUDA و Vulkan دون الحاجة إلى تثبيت بيئات تشغيل ضخمة.
لماذا تحتاج candle؟ أولاً، مثالي للأنظمة المدمجة، WebAssembly (WASM)، وأجهزة الحافة (edge devices) حيث يكون حجم الملف الثنائي وسرعة التحميل أمرين حاسمين. ثانياً، تضمن Rust سلامة الخيوط وغياب جامع القمامة، مما يوفر أداءً يمكن التنبؤ به للاستدلال (inference). ثالثاً، يدعم candle تحميل النماذج من صيغ PyTorch (safetensors, bin) و Hugging Face Hub، مما يجعله خياراً ممتازاً للإنتاج.
في وقت كتابة هذا المقال، يتطور candle بنشاط: فهو يدعم المحولات (BERT, GPT, LLaMA, Whisper)، الشبكات الالتفافية (ResNet, ViT)، وحتى النماذج التوليدية (Stable Diffusion). في هذا الدليل، سنشرح التثبيت، الدوال الرئيسية، ونكتب مثالاً كاملاً لتصنيف النصوص.
التثبيت
candle هي مكتبة Rust، لذا يتم التثبيت عبر Cargo. أضف التبعية إلى ملف Cargo.toml:
[dependencies]
candle-core = "0.7"
candle-nn = "0.7"
candle-transformers = "0.7"
tokenizers = "0.21" # للعمل مع المحللات اللغوية
anyhow = "1.0" # لمعالجة الأخطاء
إذا كنت بحاجة لدعم CUDA، استخدم العلم --features cuda:
cargo add candle-core --features cuda
cargo add candle-nn --features cuda
cargo add candle-transformers --features cuda
للعمل مع WebAssembly (WASM)، أضف --features wasm.
بداية سريعة: مثال عملي بسيط
لننشئ موتراً (tensor) وننفذ عملية بسيطة وهي ضرب المصفوفات:
use candle_core::{Device, Tensor};
fn main() -> Result<(), Box> {
// إنشاء موترات على المعالج المركزي
let a = Tensor::new(&[[1.0f32, 2.0], [3.0, 4.0]], &Device::Cpu)?;
let b = Tensor::new(&[[5.0f32, 6.0], [7.0, 8.0]], &Device::Cpu)?;
// ضرب المصفوفات
let c = a.matmul(&b)?;
println!("النتيجة: {:?}", c.to_vec2::()?);
Ok(())
}
هذا الكود سيطبع:
النتيجة: [[19.0, 22.0], [43.0, 50.0]]
لاحظ: جميع العمليات ترجع Result، لذلك نستخدم ? لمعالجة الأخطاء.
الدوال والطرق الأساسية
سنستعرض 10 دوال رئيسية من candle-core و candle-nn ستحتاجها في 90% من مشاريعك.
1. Tensor::new — إنشاء موتر
التوقيع: pub fn new
الوصف: ينشئ موتراً من متجه مسطح من الأعداد العشرية. يتم تحديد الشكل عبر Shape (مثل Shape::from((2, 3))).
use candle_core::{Device, Tensor, Shape};
fn main() -> anyhow::Result<()> {
// إنشاء موتر 2x3 من متجه
let t = Tensor::new(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0], &Device::Cpu)?;
// تغيير الشكل
let t_reshaped = t.reshape(&Shape::from((2, 3)))?;
println!("{:?}", t_reshaped.to_vec2::()?);
Ok(())
}
2. Tensor::matmul — ضرب المصفوفات
التوقيع: pub fn matmul(&self, other: &Tensor) -> Result<Tensor>
الوصف: ينفذ ضرب المصفوفات لموترين. يدعم البث (broadcasting) للدفعات (batches).
use candle_core::{D