يهدف هذا المشروع إلى بناء نموذج كبير باللغة الصينية مع عدد قليل من المعلمات، والذي يمكن استخدامه لبدء تعلم المعرفة حول النماذج الكبيرة بسرعة. إذا كان هذا المشروع مفيدًا لك، فيمكنك النقر فوق "ابدأ".
بنية النموذج: تعتمد بنية النموذج الشاملة بنية عامة مفتوحة المصدر، بما في ذلك: RMSNorm وRoPE وMHA وما إلى ذلك.
تفاصيل التنفيذ: تنفيذ التدريب على مرحلتين للنماذج الكبيرة والمحاذاة البشرية اللاحقة، وهي: تجزئة الكلمات (Tokenizer) -> التدريب المسبق (PTM) -> الضبط الدقيق للتعليمات (SFT) -> المحاذاة البشرية (RLHF، DPO) -> > التقييم -> القياس الكمي -> النشر.
تم نشر المشروع ويمكن تجربته على الموقع التالي.
مميزات المشروع:
Bash
script، ويدعم نماذج بأحجام مختلفة، مثل 16 م، 42 م، 92 م، 210 م، 440 م، وما إلى ذلك؛يحتوي هذا المشروع بشكل أساسي على ثلاثة فروع، ومن المستحسن دراسة الفرع الرئيسي، والاختلافات المحددة هي كما يلي:
main
tiny_llm
: قم بمحاذاة نموذج المجتمع مفتوح المصدر، واستخدم مكتبة Transformers لبناء النموذج الأساسي، واستخدم أيضًا مكتبة Transformers للتدريب على البطاقات المتعددة والأجهزة المتعددة؛tiny_llm
، قم بتعديل طبقة MLP
إلى نموذج MoE، واستخدم مكتبة Transformers للتدريب على البطاقات المتعددة والأجهزة المتعددة.يلاحظ:
doc
(جارٍ فرزه...) تتم استضافة النموذج في Huggingface وModeScope ويمكن تنزيله تلقائيًا عن طريق تشغيل التعليمات البرمجية.
يوصى باستخدام Huggingface لتحميل النموذج عبر الإنترنت. إذا لم يكن من الممكن تشغيله، فجرّب ModeScope. إذا كنت بحاجة إلى تشغيله محليًا، فقم بتعديل المسار في model_id
إلى الدليل المحلي ويمكنك تشغيله.
pip install -r requirements.txt
from transformers import AutoTokenizer , AutoModelForCausalLM
from transformers . generation import GenerationConfig
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
generation_config = GenerationConfig . from_pretrained ( model_id , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
generation_config . max_new_tokens = 200
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , generation_config = generation_config )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
from modelscope import AutoModelForCausalLM , AutoTokenizer
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , max_new_tokens = 200 )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
توليد التأثيرات
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
هناك طريقتان لإنشاء مجزئ كلمات LLM: إحداهما هي إنشاء قائمة كلمات بنفسك وتدريب مجزئ الكلمات، والأخرى هي اختيار مجزئ الكلمات الذي تم تدريبه بواسطة نموذج مفتوح المصدر.
من أجل الراحة، يختار هذا المشروع مفردات من مشاريع مفتوحة المصدر ممتازة، وبالنظر إلى أن النموذج المدرّب صغير وأن حجم المفردات يؤثر على حجم النموذج، يُفضل المشاريع مفتوحة المصدر ذات المفردات الأصغر بعد المقارنة، مفردات ChatGLM3 تم تحديد الجدول أخيرًا، وحجم جدول الكلمات هو 64798.
للتعرف على طريقة إنشاء المفردات بنفسك، راجع tokenizer. تم توسيع مفردات LLaMA2 المكونة من 32 ألفًا إلى 50 ألفًا، وتمت إضافة 20 ألف مفردة صينية للحصول على طرق توسيع مفصلة، راجع الوثائق أو tokenizer/README.md.
ملاحظة: يستخدم هذا المشروع مفردات ChatGLM3.
يعتمد هيكل النموذج هيكلًا يشبه Llama2، بما في ذلك: RMSNorm، وRoPE، وMHA، وما إلى ذلك؛
تفاصيل المعلمة المحددة هي كما يلي:
نموذج | الحجم المخفي | الحجم المتوسط | n_layers | n_heads | الحد الأقصى لطول السياق | المعلمات | حجم المفردات |
---|---|---|---|---|---|---|---|
تايني-LLM-16M | 120 | 384 | 6 | 6 | 512 | 16 م | 64798 |
صغير-llm-42m | 288 | 768 | 6 | 6 | 512 | 42 م | 64798 |
صغير-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92 م | 64798 |
صغير الحجم llm-210m | 768 | 2048 | 16 | 12 | 1024 | 210 م | 64798 |
صغيرة-llm-440m | 1024 | 2816 | أربعة وعشرون | 16 | 1024 | 440 م | 64798 |
تايني-llm-1_5b | 2048 | 5504 | أربعة وعشرون | 16 | 1024 | 1.5 ب | 64798 |
نظرًا لأن معظم بيانات التدريب وبيانات الضبط الدقيق هي بيانات صينية، فسيتم تقييم النموذج على مجموعتي البيانات C-Eval
و CMMLU
، ويتم استخدام أداة OpenCompass لتقييم النموذج.
نموذج | يكتب | ج-التقييم | CMMLU |
---|---|---|---|
صغير-llm-92m | قاعدة | 23.48 | 25.02 |
صغير-llm-92m | محادثة | 26.79 | 26.59 |
يتم تقييم النموذج الأساسي باستخدام طريقة تقييم ppl؛ ويتم تقييم نموذج الدردشة باستخدام طريقة gen. تظهر الاختلافات المحددة في الشكل أدناه:
المصدر: ما هو الفرق بين وضع ppl و gen
ملاحظة: تم تقييم نموذجين شائعي الاستخدام فقط، وكانت الدرجات منخفضة. أما تقييم النماذج المتبقية فهو ذو أهمية قليلة.
تم نشر العرض التوضيحي لصفحة الويب ويمكن تجربته على موقع الويب التالي: ModeScope Tiny LLM
إذا كنت تريد تشغيل العرض التوضيحي لصفحة الويب محليًا، انتبه إلى تعديل مسار النموذج model_id
في ملف web_demo.py
وأدخل الأمر التالي للتشغيل:
streamlit run web_demo.py
يوجد نشر إطار عمل Transfomers في الملفين demo/infer_chat.py
و demo/infer_func.py
، وهو لا يختلف كثيرًا عن عمليات LLM الأخرى. ما عليك سوى الانتباه إلى ربط المدخلات.
للحصول على تفاصيل نشر vllm، راجع vllm
إذا كنت تستخدم CUDA 12 أو أعلى وPyTorch 2.1 أو أعلى ، فيمكنك استخدام الأمر التالي مباشرة لتثبيت vLLM.
pip install vllm==0.4.0
بخلاف ذلك، يرجى الرجوع إلى تعليمات التثبيت الرسمية لـ vLLM.
بعد اكتمال التثبيت، العمليات التالية مطلوبة ~
vllm/tinyllm.py
إلى الدليل vllm/model_executor/models
المتوافق مع بيئة env. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
نظرًا لأن بنية النموذج قد تم تحديدها بنفسك، فإن vllm لم يتم تنفيذه رسميًا وتحتاج إلى إضافته يدويًا.
للحصول على تفاصيل حول نشر llama.cpp، راجع llama.cpp
يدعم نموذج Tiny LLM 92M بالفعل إطار عمل الاستدلال llama.cpp C++، ويوصى باختباره في بيئة Linux.
النسخة المدعومة من llama.cpp هي نسختي المعدلة، ورابط المستودع هو: llama.cpp.tinyllm