
بقلم: يوسف | محرر أدوات الذكاء الاصطناعي · صوت تحريري بإشراف بشري
Carlo Valenti قضى 18 شهراً من استراحات الغداء وليالي عطل نهاية الأسبوع في بناء TRiP (TRansformer in Progress) – محرك ترانسفورمر كامل مكتوب بلغة C من الصفر. هدفه ليس الأداء أو منافسة llama.cpp، بل الفهم العميق لآليات الترانسفورمر من عمليات ضرب المصفوفات حتى أعلى مستوى.
TRiP يدعم معماريات Llama2 وGemma 1.0/1.1 وPaliGemma 1 (رؤية ولغة) وGPT-2. يتعامل مع صيغ SafeTensors من HuggingFace وصيغ Karpathy للـ llama2.c وgpt2. يدعم أنواع الأوزان bfloat16 وfloat16 وfloat32، مع تحذير مهم: float32 دائماً الأسرع على المعالجات العادية رغم أن bfloat16 يبدو أكثر حداثة.
يوفر TRiP تدريباً كاملاً مع backpropagation وAdamW optimizer وcosine annealing للـ learning rate وgradient clipping. يتضمن tokenizer من نوع BPE متوافق مع SentencePiece مع إمكانية إنشاء المفردات من الصفر. للاستنتاج، يدعم greedy وtop-k ونucleus (top-p) sampling مع قوالب محادثة تفاعلية لـ Llama وGemma وTinyLlama.
الميزة المتقدمة هي دعم الرؤية متعددة الوسائط مع PaliGemma – يتعامل مع مدخلات JPEG ويعرض النتائج عبر X11. كما يوفر وضع محسن للذاكرة عبر mmap للنماذج الكبيرة على الأجهزة المحدودة.
البناء والاستخدام العملي:
يحتاج gcc (يُفضل الإصدار 13+ لدعم bfloat16) مع OpenMP وlibjpeg وlibx11. على Debian: `sudo apt install build-essential libomp-dev libjpeg62-turbo-dev libx11-dev`. ثم فقط `make` – لا cmake ولا Python ولا أطر عمل خارجية.
- محادثة مع Gemma-2B-IT: `./trip –chat –checkpoint gemma-2b-it/model.safetensors –tokenizer gemma-2b-it/tokenizer.json –chat_scheme GEMMA`
- استنتاج من نص: `./trip –decode –input_text “The capital of Italy is” –checkpoint gemma-2b-it/model.safetensors –tokenizer gemma-2b-it/tokenizer.json`
- تدريب نموذج: `./trip –train –checkpoint my_model/model.safetensors –tokenizer my_model/tokenizer.json –train_data my_dataset.txt –train_config training_args.json`
- رؤية متعددة الوسائط: `./trip –vision photo.jpg –checkpoint paligemma/model.safetensors –tokenizer paligemma/tokenizer.json –input_text “Describe this image”`
- بناء مفردات من الصفر: `./trip –build_vocab corpus.txt –vocab_size 32000 –tokenizer my_tokenizer.json`
لمستخدمي Windows، يعمل TRiP تحت WSL مع إمكانية تفعيل X11 للميزات المرئية عبر VcXsrv أو Xming أو MobaXterm. يكفي تصدير `DISPLAY=:0` في الطرفية قبل تشغيل TRiP.
البنية الداخلية منظمة في 7 ملفات: trip.h (~900 سطر) يحتوي على كل التعريفات والهياكل، math.c (~3000 سطر) لعمليات التنسورات مع كل عملية أمامية مقرونة بنظيرتها العكسية، forward.c (~1500 سطر) لإدارة المرور الأمامي وtoken sampling، backward.c (~1500 سطر) للمرور العكسي ومحسن AdamW، model.c (~5500 سطر) لإدارة النماذج والذاكرة والtokenizer ومعالجة الرؤية، utils.c (~1000 سطر) للمساعدات، وmain.c (~1900 سطر) لواجهة سطر الأوامر.
المفهوم المحوري هو “residual stream” – متجه يتدفق عبر النموذج مثل البيانات على ناقل. كل طبقة تقرأ منه، تعالجه عبر آلية الانتباه والشبكة الأمامية، ثم تكتب إليه مرة أخرى. المرور الأمامي يمشي الطبقات من أعلى لأسفل، والمرور العكسي يمشيها من أسفل لأعلى محسباً التدرجات عبر chain rule.
Valenti واضح حول ما استخدم فيه الذكاء الاصطناعي: parser الـ JSON مع بعض الإصلاحات، وظيفة حفظ safetensors، إدارة JPEG-X11 (لأنه لم يكن مهتماً بتطويرها)، تقسيم الملف النهائي (كتب كل شيء في البداية كـ main.c)، وبعض مراجعات التعليقات. الباقي كله مكتوب بيده، وإلا لما كان للمشروع معنى لأن الهدف فهم الترانسفورمر من الداخل.
يشكر Valenti Andrej Karpathy على llama2.c ونanoGPT والمحاضرات التي جعلت هذا ممكناً، بالإضافة لـ Google وMeta على إطلاق عائلتي Gemma وLlama. المشروع مرخص تحت CC BY-NC 4.0 للاستخدام غير التجاري.
القيود واضحة: TRiP لا يحاول تتبع أحدث النماذج، ولا يهدف لمنافسة llama.cpp في الأداء. هدفه تعليمي بحت – كتاب مدرسي مشروح حول الترانسفورمر. أنت قد تحتاج استثماراً زمنياً كبيراً لفهم الكود، لكن المردود فهم عميق لما يحدث فعلاً داخل هذه النماذج التي نستخدمها يومياً.






