مثال على نهج RWKV في نماذج اللغة المكتوبة في الصدأ من قبل شخص لا يعرف سوى القليل عن الرياضيات أو الشبكات العصبية. كان الإصدار الأولي يعتمد بشكل كبير للغاية على المعلومات المذهلة ومثال Python هنا: https://johanwind.github.io/2023/03/23/rwkv_details.html
انظر أيضًا مستودع RWKV Creator: https://github.com/blinkdl/chatrwkv/
إذا كان التحميل في وضع 32 بت يستخدم الكثير من الذاكرة. يستخدم طراز 3B حوالي 11 جيجا بايت ذاكرة الوصول العشوائي وقد يتناسب واحد 7B فقط على آلة سعة 32 جيجابايت ترغب في إغلاق التطبيقات الأخرى أو التعامل مع بعض المبادلات. حتى التحميل في وضع 8bit يستخدم كمية لا بأس بها من الذاكرة ، ولكنه سوف ينخفض بمجرد الانتهاء من التحميل.
ستحتاج إلى صدأ وشحنة: https://www.rust-lang.org/learn/get-started
ستحتاج إلى تنزيل طراز RWKV. إليك رابط لبدء تشغيلك (حوالي 820 ميجابايت): https://huggingface.co/blinkdl/rwkv-4-pile-430m/resolve/main/rwkv-4-pile-430m-20220808-8066.pth
أيضا tokenizer هنا: https://github.com/blinkdl/chatrwkv/blob/main/20b_tokenizer.json
يمكن تحميل ملفات طراز Pytorch مباشرة. إذا انتهت الملفات بـ .pt أو .pth ، فسيتم تحميلها كنموذج pytorch. إذا انتهى الأمر بـ .st أو .safetensors ، فسيتم تحميله على أنه Safetensors. ملاحظة : دعم Pytorch تجريبي حاليًا وقد لا يعمل بشكل صحيح. من المحتمل أن تحصل على خطأ فورًا إذا كانت هناك مشكلة ، لذا لا ينبغي أن يكون من الخطير تجربة هذا النهج. إذا كنت تريد ، يمكنك تعطيل ميزة torch وبناء الدعم فقط لملفات تنسيق Safetensors.
بعد ذلك ، يجب أن تكون قادرًا على cargo run --release . يمكنك محاولة التجميع بدون --release لكن من المحتمل أن يكون كل شيء بطيئًا بجنون. حاول أيضًا cargo run --release -- --help لرؤية خيارات سطر الأوامر.
ملاحظة : الافتراضي هو استخدام جميع النوى المنطقية ، راجع خيارات سطر الأوامر.
يمكنك اختياريًا تحويل ملف .pth Model إلى تنسيق Safetensors. انظر إلى utils/pth_to_safetensors.py على سبيل المثال. للقيام بذلك ، ستحتاج إلى إعداد حزم safetensors و torch Python. أقترح القيام بذلك في بيئة افتراضية. لا يوجد حاليًا ميزة كبيرة لهذه الخطوة حيث يمكن تحميل ملفات الشعلة مباشرة في الإصدار الحالي.
يحتاج دعم GGML حاليًا إلى إصدار مصحح من ggml و ggml-sys من مشروع llama-rs .
تم إعداد Cargo.toml للإشارة إلى الفرع الصحيح في شوكة بلدي ، ولكن هذا سوف يختفي بمجرد دمج التغييرات اللازمة في GGML. بطبيعة الحال ، سيتم تحديث هذا الريبو ، ولكن ضع في اعتبارك أن تجميعاتك قد تبدأ في الفشل في النهاية إذا كنت تحاول استخدام إصدار أقدم ، حيث سيتم إزالة هذا الفرع في النهاية.
ملاحظة: هذا الجزء قديم من الوقت الآن. ما زلت أوصي بقراءة الروابط أدناه. لاحظ أيضًا أن هذا الوصف يعتمد على نسخة أبسط من نموذج RWKV مع أربع حالات فقط لكل طبقة. النسخة الكاملة لديها خمسة.
فيما يلي وصف عالي المستوى (ربما يكون خطأ) للخطوات التي ينطوي عليها تقييم النموذج. ستحتاج إلى الرجوع إلى المصدر في smolrwkv/src/simple/model.rs لهذا المنطقي.
أيضا ، فكر بقوة في قراءة هذه أولا:
بالمناسبة ، حقيقة ممتعة: "Tensor" تبدو خيالية حقيقية لكنها في الأساس مجرد مجموعة. الموتر الأبعاد الواحد هو مجرد صفيف أبعاد واحد ، وهو موتر ثنائي الأبعاد ثنائي الأبعاد هو صفيف ثنائي الأبعاد. يمكن أن يكون لديهم خصائص خاصة (مثل كونها غير قابلة للتغيير) ولكن هذا لا يهم لفهم المفهوم بشكل عام. إذا كنت تعرف المصفوفات ، فلديك الفكرة العامة للترنز بالفعل.
لتقييم الرمز المميز:
x من ln0 .x لكل طبقة بالتتابع ، باستخدام x الطبقة التي تم إنشاؤها للآخر.x الذي تم تغذيته.ln1 على x وتغذيةها لخلط الوقت. هذا يستخدم Tensor من الجزء FFN من النموذج.tm_state من حالة الطبقة واتصل بها last_x . (لماذا؟ من يدري!)tm_num و tm_den كـ last_num ، last_den .tm_[state,num,den] لذا قم بتحديث حالة الطبقة الخاصة بك بهذه.x التي نتجت عن الحسابات.x من الاختلاط الزمني إلى x ( x += time_mixing_x ).ln2 على x وتغذيةه على خلط القناة. هذا يستخدم Tensors من جزء شبكة التغذية للأمام من النموذج.cm_state من حالة الطبقة واتصل بها last_x .cm_state جديدًا ، لذا قم بتحديث حالة الطبقة.x الذي نتج عن حساب خلط القناة.x من خلط القناة إلى x .x التي كانت النتيجة بعد تقييم الطبقة الأخيرة.يحتوي النموذج على قائمة من الرموز "يعرف". في بعض الأحيان يكون الرمز مساوياً للكلمة ، وأحيانًا يكون مجرد جزء من كلمة. عادة ما يكون هناك عدد كبير من الرموز ، في حدود 30،000-60،000. أعتقد أن نماذج RWKV الحالية لديها 50،277 رمز. على أي حال ، ستحصل على قائمة بـ 50،277 أرقام نقاط عائمة مرة أخرى بعد تشغيل النموذج.
أعلى قيمة من تلك القائمة هي الرمز المميز الذي يتوقعه النموذج هو الاستمرار الأكثر ترجيحًا وما إلى ذلك. إذا قمت بإنشاء قائمة مصنفة بأعلى 10-40 احتمالات رمزية أو نحو ذلك وحددت واحدة بشكل عشوائي ، فستحصل على إخراج معقول إلى حد ما ، نسبيًا. من العدل أن نقول أن نموذجًا صغيرًا يبلغ طوله 430 مترًا لا ينتج الناتج الأكثر منطقية بشكل عام.
شرح جيد لكيفية التعامل مع الخطوة التالية بمجرد الحصول على قائمة الاحتمالات: https://huggingface.co/blog/how-to-generate
هناك العديد من الأشياء الرياضية المعقدة التي تشارك في تقييم النموذج ، ولكن الشيء الوحيد الذي يهم حقًا هو تكاثر المصفوفة ( pardot في المصدر). في حالة RWKV ، فإن تكاثر المصفوفة-المصفوفة (مجموعة ثنائية الأبعاد مضروبة مع صفيف 1D). > 90 ٪ من الوقت الذي يقضيه تقييم النموذج في مكالمات تكاثر المصفوفة هذه.
في وضع غير GGML ، يستخدم معالجة Math/Array هنا صندوق ndarray . إنه يوفر وظيفة .dot ، ومع ذلك لن يحسب هذا فعليًا مضاعفة المصفوفة المصفوفة بالتوازي على الرغم من أن الدعم يدعي دعم ترابط. نظرًا لأن هذا الحساب أمر بالغ الأهمية للأداء ، فقد انتهى بي الأمر إلى كتابة وظيفتي الخاصة لتقسيم الحساب إلى أجزاء وتشغيله بالتوازي. انظر الوظائف في وحدة dumdot في smolrwkv/src/util.rs .
حقيقة أن تحصل على قائمة من الاحتمالات مرة أخرى وليس "إجابة" محددة من النموذج تبدو وكأنها حجة مضادة لائقة لفكرة أن LLMs هي أو يمكن أن تكون واعية بطريقة ما. عندما تنظر إلى الإخراج من LLM ، فإنك في كثير من الأحيان لن تشاهد حتى الضيق الأكثر احتمالًا. أيضًا ، حقيقة ممتعة: عندما تغذي موجهًا لنموذج ما ، فإنه يأتي بقائمة من الاحتمالات تمامًا مثل عندما تسألها عن الرد. ومع ذلك ، يتم طرح هذه الاحتمالات فقط باستثناء النتيجة بعد معالجة الرمز المميز الأخير.
موجه بالخط العريض. إذن ، هل ثعابين شجرة التنين أو الكلاب؟ قد لا يعرف العالم أبدًا!
* Loading tokenizer from: ./20B_tokenizer.json
* Loading model from: ./RWKV-4-Pile-430M-20220808-8066.safetensors
* Discovering model structure.
- Loading layer 1/24
[...]
- Loading layer 24/24
* Loading non-layer tensors.
* Loaded: layers=24, embed=1024, vocab=50277
في اكتشاف مروع ، اكتشف العالم قطيعًا من التنانين الذين يعيشون في وادي بعيد غير مستكشفة سابقًا ، في التبت. والأكثر إثارة للدهشة للباحثين هو حقيقة أن التنين تحدث الصينية المثالية.
تحدثت جميع هذه التنينات لهجات مختلفة وهذه اللهجات لا تتطابق مع اللغة الأم للكلاب.
في محاولة لفك تشفير ما تحدثه هذه التنينات ، أطلقوا على التنين ووجدوا أن لغتهم كانت مختلفة عن الإنسان.
"لقد فهمت التنينات الكلمات البشرية واللغات البشرية بشكل أكثر دقة. تحدث التنينات اللغة البشرية. لقد فهموا أيضًا قواعد الصينية" ، قال فريق الأبحاث لمونغاباي.
من خلال إجراء البحث ، يأملون في إلقاء الضوء على التاريخ الغامض للتنين في المناطق النائية في العالم ، وخاصة في التبت.
يوضح المشروع البحثي ، الذي نشر في مجلة Open Science ، أيضًا أن التنينات هي ، في الواقع ، الزواحف ، أو الأذواق الملقب.
التنين ، وليس الأفعى
وفقًا لفريق البحث ، فإن التنينات الموجودة في التبت هي سباق للكلاب ، وليس الزواحف.
بينما كان فريق البحث لا يزال غير قادر على التوصل إلى أي تفسير حول سبب عيش هذه التنينات في التبت ، كان يعتقد سابقًا أنهم كانوا على الأرجح على الأرض بالقرب من هضبة التبت.
"يعيش التنين هناك كجزء من هضبة تشينغهاي التبت العظيمة التي لم يتم إزعاجها تقريبًا ، وتم تحويل هضبة تشينغهاي توب كلها تدريجياً إلى حالة زراعية. لذلك ، لديهم نمط مميز من المضغ على الأشجار ، وربما لا تكون الحيوانات كبيرة جدًا بحيث لا يمكن الاحتفاظ بها في الطبيعة" ، أوضح الباحثون.