Candle هو إطار عمل مبسط لـ Rust مع التركيز على الأداء (بما في ذلك دعم GPU) وسهولة الاستخدام. جرب عروضنا التوضيحية عبر الإنترنت: Whisper وLLaMA2 وT5 وyolo وSegment Anything.
تأكد من تثبيت candle-core
بشكل صحيح كما هو موضح في التثبيت .
دعونا نرى كيفية إجراء عملية ضرب مصفوفة بسيطة. اكتب ما يلي في ملف myapp/src/main.rs
الخاص بك:
use candle_core :: { Device , Tensor } ;
fn main ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
let device = Device :: Cpu ;
let a = Tensor :: randn ( 0f32 , 1. , ( 2 , 3 ) , & device ) ? ;
let b = Tensor :: randn ( 0f32 , 1. , ( 3 , 4 ) , & device ) ? ;
let c = a . matmul ( & b ) ? ;
println ! ( "{c}" ) ;
Ok ( ( ) )
}
يجب أن يعرض cargo run
موترًا على شكل Tensor[[2, 4], f32]
.
بعد تثبيت candle
بدعم Cuda، ما عليك سوى تحديد device
الذي سيتم تشغيله على وحدة معالجة الرسومات:
- let device = Device::Cpu;
+ let device = Device::new_cuda(0)?;
لمزيد من الأمثلة المتقدمة، يرجى إلقاء نظرة على القسم التالي.
تعمل هذه العروض التوضيحية عبر الإنترنت بالكامل في متصفحك:
نقدم أيضًا بعض الأمثلة المستندة إلى سطر الأوامر باستخدام أحدث النماذج:
قم بتشغيلها باستخدام أوامر مثل:
cargo run --example quantized --release
من أجل استخدام CUDA، أضف --features cuda
إلى سطر أوامر المثال. إذا كان لديك cuDNN مثبتًا، فاستخدم --features cudnn
لمزيد من عمليات التسريع.
هناك أيضًا بعض أمثلة Wasm لـ Whisper وllama2.c. يمكنك إما بنائها باستخدام trunk
أو تجربتها عبر الإنترنت: Whisper وllama2 وT5 وPhi-1.5 وPhi-2 وSegment Anything Model.
بالنسبة إلى LLaMA2، قم بتشغيل الأمر التالي لاسترداد ملفات الوزن وبدء تشغيل خادم اختبار:
cd candle-wasm-examples/llama2-c
wget https://huggingface.co/spaces/lmz/candle-llama2/resolve/main/model.bin
wget https://huggingface.co/spaces/lmz/candle-llama2/resolve/main/tokenizer.json
trunk serve --release --port 8081
ثم توجه إلى http://localhost:8081/.
candle-tutorial
: برنامج تعليمي مفصل للغاية يوضح كيفية تحويل نموذج PyTorch إلى Candle.candle-lora
: تنفيذ LoRA فعال ومريح للشمعة. candle-lora
لديهاoptimisers
: مجموعة من المحسنات بما في ذلك SGD مع الزخم، وAdaGrad، وAdaDelta، وAdaMax، وNAdam، وRAdam، وRMSprop.candle-vllm
: منصة فعالة للاستدلال وخدمة حاملي شهادات LLM المحلية بما في ذلك خادم واجهة برمجة التطبيقات المتوافق مع OpenAI.candle-ext
: مكتبة ملحقة لـ Candle توفر وظائف PyTorch غير المتوفرة حاليًا في Candle.candle-coursera-ml
: تنفيذ خوارزميات التعلم الآلي من دورة كورسيرا المتخصصة في التعلم الآلي.kalosm
: إطار تعريفي متعدد الوسائط في Rust للتواصل مع النماذج المحلية المدربة مسبقًا مع دعم التوليد المتحكم فيه، وأخذ العينات المخصصة، وقواعد بيانات المتجهات في الذاكرة، والنسخ الصوتي، والمزيد.candle-sampling
: تقنيات أخذ العينات للشمعة.gpt-from-scratch-rs
: منفذ لبرنامج Let's build GPT التعليمي الخاص بـ Andrej Karpathy على YouTube والذي يعرض واجهة برمجة التطبيقات Candle API حول مشكلة الألعاب.candle-einops
: تطبيق الصدأ النقي لمكتبة python einops.atoma-infer
: مكتبة Rust للاستدلال السريع على نطاق واسع، مع الاستفادة من FlashAttention2 لحساب الانتباه بكفاءة، وPagedAttention لإدارة ذاكرة التخزين المؤقت KV بكفاءة، ودعم وحدات معالجة الرسومات المتعددة. وهو متوافق مع OpenAI API.إذا كان لديك إضافة إلى هذه القائمة، يرجى تقديم طلب سحب.
ورقة الغش:
باستخدام باي تورش | استخدام الشمعة | |
---|---|---|
الخلق | torch.Tensor([[1, 2], [3, 4]]) | Tensor::new(&[[1f32, 2.], [3., 4.]], &Device::Cpu)? |
الخلق | torch.zeros((2, 2)) | Tensor::zeros((2, 2), DType::F32, &Device::Cpu)? |
الفهرسة | tensor[:, :4] | tensor.i((.., ..4))? |
العمليات | tensor.view((2, 2)) | tensor.reshape((2, 2))? |
العمليات | a.matmul(b) | a.matmul(&b)? |
حسابي | a + b | &a + &b |
جهاز | tensor.to(device="cuda") | tensor.to_device(&Device::new_cuda(0)?)? |
نوع D | tensor.to(dtype=torch.float16) | tensor.to_dtype(&DType::F16)? |
توفير | torch.save({"A": A}, "model.bin") | candle::safetensors::save(&HashMap::from([("A", A)]), "model.safetensors")? |
تحميل | weights = torch.load("model.bin") | candle::safetensors::load("model.safetensors", &device) |
Tensor
الهدف الأساسي لـ Candle هو جعل الاستدلال بدون خادم ممكنًا . تعد أطر التعلم الآلي الكاملة مثل PyTorch كبيرة جدًا، مما يجعل إنشاء المثيلات على المجموعة بطيئًا. تسمح الشمعة بنشر الثنائيات خفيفة الوزن.
ثانيًا، يتيح لك Candle إزالة Python من أعباء عمل الإنتاج. يمكن أن تؤدي النفقات العامة في بايثون إلى الإضرار بالأداء بشكل خطير، ويعتبر GIL مصدرًا سيئ السمعة للصداع.
أخيرًا، أصبح الصدأ رائعًا! يحتوي الكثير من النظام البيئي HF بالفعل على صناديق الصدأ، مثل أجهزة الأمان والرموز المميزة.
dfdx عبارة عن صندوق هائل، حيث يتم تضمين الأشكال في الأنواع. هذا يمنع الكثير من الصداع عن طريق جعل المترجم يشكو من عدم تطابق الأشكال فورًا. ومع ذلك، وجدنا أن بعض الميزات لا تزال تتطلب الليل، وقد تكون كتابة التعليمات البرمجية أمرًا شاقًا بعض الشيء بالنسبة للخبراء غير المتخصصين في مجال الصدأ.
نحن نعمل على الاستفادة من الصناديق الأساسية الأخرى والمساهمة فيها خلال وقت التشغيل، لذا نأمل أن يستفيد كلا الصندوقين من بعضهما البعض.
Burn عبارة عن صندوق عام يمكنه الاستفادة من الواجهات الخلفية المتعددة حتى تتمكن من اختيار أفضل محرك لحجم العمل الخاص بك.
روابط tch-rs إلى مكتبة الشعلة في Rust. متعددة الاستخدامات للغاية، ولكنها تضيف مكتبة الشعلة بأكملها إلى وقت التشغيل. المساهم الرئيسي لـ tch-rs
يشارك أيضًا في تطوير candle
.
إذا حصلت على بعض الرموز المفقودة عند تجميع الثنائيات/الاختبارات باستخدام ميزات mkl أو التسريع، على سبيل المثال بالنسبة لـ mkl، فستحصل على:
= note: /usr/bin/ld: (....o): in function `blas::sgemm':
.../blas-0.22.0/src/lib.rs:1944: undefined reference to `sgemm_' collect2: error: ld returned 1 exit status
= note: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified
= note: use the `-l` flag to specify native libraries to link
= note: use the `cargo:rustc-link-lib` directive to specify the native libraries to link with Cargo
أو للتسريع:
Undefined symbols for architecture arm64:
"_dgemm_", referenced from:
candle_core::accelerate::dgemm::h1b71a038552bcabe in libcandle_core...
"_sgemm_", referenced from:
candle_core::accelerate::sgemm::h2cf21c592cba3c47 in libcandle_core...
ld: symbol(s) not found for architecture arm64
من المحتمل أن يكون هذا بسبب وجود علامة رابط مفقودة كانت ضرورية لتمكين مكتبة mkl. يمكنك محاولة إضافة ما يلي لـ mkl في الجزء العلوي من ملفك الثنائي:
extern crate intel_mkl_src ;
أو للتسريع:
extern crate accelerate_src ;
Error: request error: https://huggingface.co/meta-llama/Llama-2-7b-hf/resolve/main/tokenizer.json: status code 401
من المحتمل أن يكون هذا بسبب عدم حصولك على إذن لاستخدام نموذج LLaMA-v2. لإصلاح ذلك، عليك التسجيل في Huggingface-hub، وقبول شروط نموذج LLaMA-v2، وإعداد رمز المصادقة الخاص بك. راجع العدد رقم 350 للمزيد من التفاصيل.
In file included from kernels/flash_fwd_launch_template.h:11:0,
from kernels/flash_fwd_hdim224_fp16_sm80.cu:5:
kernels/flash_fwd_kernel.h:8:10: fatal error: cute/algorithm/copy.hpp: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Error: nvcc error while compiling:
يتم توفير Cutlass كوحدة فرعية لـ git، لذا قد ترغب في تشغيل الأمر التالي للتحقق منه بشكل صحيح.
git submodule update --init
/usr/include/c++/11/bits/std_function.h:530:146: error: parameter packs not expanded with ‘...’:
هذا خطأ في gcc-11 تم تشغيله بواسطة مترجم Cuda. لإصلاح ذلك، قم بتثبيت إصدار gcc مختلف ومدعوم - على سبيل المثال gcc-10، وحدد المسار إلى المترجم في متغير البيئة NVCC_CCBIN.
env NVCC_CCBIN=/usr/lib/gcc/x86_64-linux-gnu/10 cargo ...
Couldn't compile the test.
---- .candle-booksrcinferencehub.md - Using_the_hub::Using_in_a_real_model_ (line 50) stdout ----
error: linking with `link.exe` failed: exit code: 1181
//very long chain of linking
= note: LINK : fatal error LNK1181: cannot open input file 'windows.0.48.5.lib'
تأكد من ربط جميع المكتبات الأصلية التي قد تكون موجودة خارج هدف المشروع، على سبيل المثال، لتشغيل اختبارات mdbook، يجب عليك تشغيل:
mdbook test candle-book -L .targetdebugdeps `
-L native=$env:USERPROFILE.cargoregistrysrcindex.crates.io-6f17d22bba15001fwindows_x86_64_msvc-0.42.2lib `
-L native=$env:USERPROFILE.cargoregistrysrcindex.crates.io-6f17d22bba15001fwindows_x86_64_msvc-0.48.5lib
قد يكون السبب في ذلك هو تحميل النماذج من /mnt/c
، مزيد من التفاصيل حول تدفق المكدس.
يمكنك تعيين RUST_BACKTRACE=1
لتزويدك بتتبعات خلفية عند إنشاء خطأ في الشمعة.
إذا واجهت خطأ مثل هذا called
Result::unwrap() on an
value: LoadLibraryExW { source: Os { code: 126, kind: Uncategorized, message: "The specified module could not be found." } }
على النوافذ. لإصلاح نسخ هذه الملفات الثلاثة وإعادة تسميتها (تأكد من وجودها في المسار). تعتمد المسارات على إصدار cuda الخاص بك. c:WindowsSystem32nvcuda.dll
-> cuda.dll
c:Program FilesNVIDIA GPU Computing ToolkitCUDAv12.4bincublas64_12.dll
-> cublas.dll
c:Program FilesNVIDIA GPU Computing ToolkitCUDAv12.4bincurand64_10.dll
-> curand.dll