minGPT
إعادة تنفيذ PyTorch لـ GPT، سواء من حيث التدريب أو الاستدلال. يحاول minGPT أن يكون صغيرًا ونظيفًا وقابلاً للتفسير وتعليميًا، نظرًا لأن معظم تطبيقات نماذج GPT المتوفرة حاليًا يمكن أن تكون مترامية الأطراف بعض الشيء. GPT ليس نموذجًا معقدًا وهذا التنفيذ يتكون بشكل مناسب من حوالي 300 سطر من التعليمات البرمجية (راجع mingpt/model.py). كل ما يحدث هو أن سلسلة من المؤشرات تغذي المحول، ويخرج توزيع احتمالي على المؤشر التالي في التسلسل. تكمن غالبية التعقيد في كونك ذكيًا في التجميع (سواء عبر الأمثلة أو عبر طول التسلسل) لتحقيق الكفاءة.
ملاحظة (يناير 2023) : على الرغم من أنني قد أستمر في قبول بعض التفاصيل وتغييرها، إلا أن minGPT في حالة شبه مؤرشفة. لمزيد من التطورات الأخيرة، راجع إعادة كتابة nanoGPT. في الأساس، أصبح minGPT مرجعًا عبر مجموعة واسعة من الأماكن (أجهزة الكمبيوتر المحمولة والمدونات والدورات التدريبية والكتب وما إلى ذلك) مما جعلني أقل رغبة في إجراء التغييرات الأكبر التي أردت إجراؤها لتحريك الكود للأمام. أردت أيضًا تغيير الاتجاه قليلاً، من التركيز الوحيد على التعليم إلى شيء لا يزال بسيطًا وقابلاً للاختراق ولكن له قوة (يعيد إنتاج معايير الصناعة متوسطة الحجم، ويقبل بعض المفاضلات للحصول على كفاءة وقت التشغيل، وما إلى ذلك).
مكتبة minGPT عبارة عن ثلاثة ملفات: mingpt/model.py يحتوي على تعريف نموذج Transformer الفعلي، mingpt/bpe.py يحتوي على Byte Pair Encoder المعاد تصميمه بشكل طفيف والذي يترجم بين النص وتسلسلات الأعداد الصحيحة تمامًا كما فعل OpenAI في GPT، mingpt/trainer. py هو رمز PyTorch المعياري (المستقل عن GPT) الذي يقوم بتدريب النموذج. ثم هناك عدد من العروض التوضيحية والمشاريع التي تستخدم المكتبة في مجلد projects
:
- يقوم
projects/adder
بتدريب GPT من الصفر لإضافة أرقام (مستوحاة من قسم الإضافة في ورقة GPT-3) - تقوم
projects/chargpt
بتدريب GPT ليكون نموذج لغة على مستوى الأحرف في بعض الملفات النصية المدخلة - يُظهر
demo.ipynb
الحد الأدنى من استخدام GPT
و Trainer
بتنسيق دفتر ملاحظات في مثال فرز بسيط - يُظهر
generate.ipynb
كيف يمكن للمرء تحميل GPT2 مُدرب مسبقًا وإنشاء نص مع بعض المطالبات
تركيب المكتبة
إذا كنت تريد import mingpt
إلى مشروعك:
git clone https://github.com/karpathy/minGPT.git
cd minGPT
pip install -e .
الاستخدام
إليك كيفية إنشاء مثيل لـ GPT-2 (إصدار 124M):
from mingpt . model import GPT
model_config = GPT . get_default_config ()
model_config . model_type = 'gpt2'
model_config . vocab_size = 50257 # openai's model vocabulary
model_config . block_size = 1024 # openai's model block_size (i.e. input context length)
model = GPT ( model_config )
وإليك كيفية تدريبه:
# your subclass of torch.utils.data.Dataset that emits example
# torch LongTensor of lengths up to 1024, with integers from [0,50257)
train_dataset = YourDataset ()
from mingpt . trainer import Trainer
train_config = Trainer . get_default_config ()
train_config . learning_rate = 5e-4 # many possible options, see the file
train_config . max_iters = 1000
train_config . batch_size = 32
trainer = Trainer ( train_config , model , train_dataset )
trainer . run ()
راجع demo.ipynb
للحصول على مثال أكثر واقعية.
اختبارات الوحدة
التغطية ليست مذهلة للغاية حتى الآن ولكن:
python -m unittest discover tests
جميع المهام
- إضافة عرض توضيحي لـ gpt-2 Finetuning على ملف نصي محدد بشكل تعسفي
- إضافة عرض وكيل الحوار
- مستندات أفضل لنتائج المشاريع الحالية (adder، chargpt)
- أضف الدقة المختلطة وأشياء توسيع نطاق التدريب ذات الصلة
- دعم التدريب الموزع
- إعادة إنتاج بعض المعايير في المشاريع/، على سبيل المثال text8 أو نماذج لغة أخرى
- التسجيل الصحيح بدلا من طباعة بيان ساعة الهواة هاها
- ربما يجب أن يكون لدي ملف require.txt...
- يجب أن يكون من الممكن تحميل العديد من أوزان النماذج الأخرى بخلاف gpt2-* فقط
مراجع
شفرة:
- يحتوي openai/gpt-2 على تعريف النموذج في TensorFlow، ولكن ليس كود التدريب
- يحتوي openai/image-gpt على بعض التعديلات الحديثة مثل gpt-3 في الكود الخاص به، وهو مرجع جيد أيضًا
- Huggingface/Transformers لديه مثال لنمذجة اللغة. إنها كاملة المواصفات ولكن نتيجة لذلك يصعب تتبعها إلى حد ما. على سبيل المثال، تحتوي بعض الوظائف الكبيرة على ما يصل إلى 90% من التعليمات البرمجية غير المستخدمة خلف العديد من البيانات المتفرعة غير المستخدمة في الإعداد الافتراضي لنمذجة اللغة البسيطة
الأوراق + بعض الملاحظات التنفيذية:
تحسين فهم اللغة من خلال التدريب المسبق التوليدي (GPT-1)
- نموذجنا يتبع إلى حد كبير عمل المحولات الأصلية
- لقد قمنا بتدريب محول مكون من 12 طبقة لوحدة فك التشفير فقط مع رؤوس مقنعة للانتباه الذاتي (768 حالة أبعاد و12 رأس انتباه). بالنسبة لشبكات التغذية الأمامية ذات الموقع الحكيم، استخدمنا 3072 حالة داخلية ذات أبعاد.
- آدم ماكس معدل التعلم 2.5e-4. (يستخدم GPT-3 لاحقًا لحجم النموذج هذا 6e-4)
- تسوس LR: زاد خطيًا من الصفر خلال تحديثات عام 2000 الأولى وتم صلبه إلى 0 باستخدام جدول جيب التمام
- نحن نتدرب لمدة 100 حقبة على دفعات صغيرة مكونة من 64 عينة عشوائية ومتسلسلة متجاورة مكونة من 512 رمزًا.
- نظرًا لاستخدام معيار الطبقة على نطاق واسع في جميع أنحاء النموذج، كانت تهيئة الوزن البسيطة لـ N(0, 0.02) كافية
- مفردات ترميز البايت (BPE) مع 40.000 عملية دمج
- المتبقية، والتضمين، والمتسربين من الاهتمام بمعدل 0.1 للتسوية.
- نسخة معدلة من تسوية L2 المقترحة في (37)، مع w = 0.01 على جميع الأوزان غير المتحيزة أو المكتسبه
- بالنسبة لوظيفة التنشيط، استخدمنا وحدة الخطأ الخطي الغوسية (GELU).
- استخدمنا تضمينات الموضع المستفادة بدلاً من النسخة الجيبية المقترحة في العمل الأصلي
- للضبط الدقيق: نضيف التسرب إلى المصنف بمعدل 0.1. معدل التعلم 6.25e-5 وحجم الدفعة 32.3 حقبة. نحن نستخدم جدول تناقص معدل التعلم الخطي مع إحماء يزيد عن 0.2% من التدريب. تم ضبط π على 0.5.
- نموذج GPT-1 مكون من 12 طبقة وd_model 768، ~117M معلمات
نماذج اللغة هي متعلمون متعددو المهام غير خاضعين للرقابة (GPT-2)
- تم نقل LayerNorm إلى مدخلات كل كتلة فرعية، على غرار الشبكة المتبقية قبل التنشيط
- تمت إضافة تطبيع طبقة إضافية بعد كتلة الاهتمام الذاتي النهائية.
- يتم استخدام التهيئة المعدلة التي تمثل التراكم على المسار المتبقي بعمق النموذج. نقوم بقياس أوزان الطبقات المتبقية عند التهيئة بعامل 1/√N حيث N هو عدد الطبقات المتبقية. (غريب لأنه في الكود الذي تم إصداره، لا يمكنني العثور إلا على استخدام بسيط لـ 0.02 القديم... في إصدارهم لـ image-gpt وجدت أنه يستخدم لـ c_proj، وحتى ذلك الحين فقط من أجل الاهتمام، وليس لـ mlp.huh. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- يتم توسيع المفردات إلى 50257
- زيادة حجم السياق من 512 إلى 1024 رمزًا
- يتم استخدام حجم دفعة أكبر من 512
- استخدم GPT-2 48 طبقة وd_model 1600 (مقابل 12 طبقة أصلية وd_model 768). ~1.542B معلمات
نماذج اللغة هي عدد قليل من المتعلمين (GPT-3)
- GPT-3: 96 طبقة، 96 رأسًا، مع d_model يبلغ 12,288 (175B معلمات).
- شبيه GPT-1: 12 طبقة، 12 رأسًا، d_model 768 (125M)
- نحن نستخدم نفس النموذج والهندسة المعمارية مثل GPT-2، بما في ذلك التهيئة المعدلة والتطبيع المسبق والترميز القابل للعكس الموصوف فيه
- نحن نستخدم أنماط انتباه متناثرة كثيفة ونطاقات محلية متناوبة في طبقات المحول، على غرار المحول المتناثر
- لدينا دائمًا طبقة التغذية الأمامية أكبر بأربعة أضعاف من حجم طبقة عنق الزجاجة، dff = 4 ∗ dmodel
- تستخدم جميع النماذج نافذة سياق nctx = 2048 رمزًا.
- آدم مع β1 = 0.9، β2 = 0.95، وeps = 10−8
- تستخدم جميع النماذج تحلل الوزن بمقدار 0.1 لتوفير قدر صغير من التنظيم. (ملاحظة: GPT-1 استخدم 0.01 على ما أعتقد، انظر أعلاه)
- قص المعيار العالمي للتدرج عند 1.0
- إحماء خطي LR على أول 375 مليون رمز. ثم استخدم اضمحلال جيب التمام لخفض معدل التعلم إلى 10% من قيمته، أي أكثر من 260 مليار رمز.
- قم بزيادة حجم الدفعة تدريجيًا خطيًا من قيمة صغيرة (32 ألف رمز مميز) إلى القيمة الكاملة خلال أول 4-12 مليار رمز مميز للتدريب، اعتمادًا على حجم النموذج.
- يتم دائمًا استخدام نافذة سياق زمنية كاملة بحجم 2048، مع محدد رمزي خاص لنهاية المستند
التدريب المسبق التوليدي من البكسل (الصورة GPT)
- عند العمل مع الصور، نختار تبديل الهوية πi = i لـ 1 ≥ i ≥ n، المعروف أيضًا بالترتيب النقطي.
- نقوم بإنشاء لوحة الألوان الخاصة بنا ذات 9 بتات عن طريق تجميع قيم البكسل (R، G، B) باستخدام k-means مع k = 512.
- يحتوي أكبر نموذج لدينا، iGPT-XL، على L = 60 طبقة ويستخدم حجم تضمين d = 3072 لإجمالي 6.8B من المعلمات.
- يتطابق نموذجنا الأكبر التالي، iGPT-L، بشكل أساسي مع GPT-2 مع L = 48 طبقة، ولكنه يحتوي على حجم تضمين أصغر قليلاً يبلغ d = 1536 (مقابل 1600) لإجمالي 1.4B من المعلمات.
- نحن نستخدم نفس رمز النموذج مثل GPT-2، باستثناء أننا نقوم بتهيئة الأوزان بطريقة تعتمد على الطبقة كما في Sparse Transformer (Child et al., 2019) ونقوم بتهيئة جميع الإسقاطات التي تنتج السجلات صفرًا.
- نقوم أيضًا بتدريب iGPT-M، وهو نموذج معلمة 455M مع L = 36 وd = 1024
- iGPT-S، نموذج معلمة 76M مع L = 24 وd = 512 (حسنًا، وكم عدد الرؤوس؟ يبدو أن كود Github يدعي 8)
- عند التدريب المسبق على iGPT-XL، نستخدم حجم دفعة يبلغ 64 ونتدرب على 2 مليون تكرار، وبالنسبة لجميع النماذج الأخرى نستخدم حجم دفعة يبلغ 128 ونتدرب على 1 مليون تكرار.
- آدم مع β1 = 0.9 و β2 = 0.95
- يتم تسخين معدل التعلم لفترة واحدة، ثم يتراجع إلى 0
- لم نستخدم تسوس الوزن لأن تطبيق تسوس الوزن الصغير بمقدار 0.01 لم يغير جودة التمثيل.
- اي جي بي تي-اس لير 0.003
- لا يتم استخدام التسرب.
رخصة
معهد ماساتشوستس للتكنولوجيا