يهدف هذا المشروع إلى أن يكون إعادة تنفيذ واضحة وموجزة لـ GPT-2. تنفيذ النموذج، الموجود في src/model.rs
، أقل من 300 سطر من التعليمات البرمجية. على الرغم من أن هذا كان تمرينًا ممتعًا في الغالب لأغراض تعليمية (خاصة)، إلا أنه يوضح فائدة Rust وBurn في مجال التعلم الآلي: يتم تجميع المشروع بأكمله في ثنائي واحد، مما يجعل النشر سهلًا نسبيًا.
في الوقت الحالي، لا يتم دعم سوى رمز مميز على مستوى الشخصية، لذا لا يمكن استخدام الأوزان الرسمية التي تتطلب رمز BPE المميز حتى الآن. ومع ذلك، من أجل المتعة، يمكنك تجربة نموذج اللعبة الصغيرة الذي قمت بتدريبه (انظر الاستدلال).
يتضمن المشروع أيضًا واجهة سطر أوامر (CLI) بسيطة للتدريب والاستدلال.
Usage: gpt-burn <COMMAND>
Commands:
run Generate text using a pre-trained model
train Train a new model
يمكنك تثبيت gpt-burn
باستخدام Nix:
nix run github:felix-andreas/gpt-burn
أو التثبيت مع cargo
:
cargo install --git https://github.com/felix-andreas/gpt-burn
بدلًا من ذلك، يمكنك استنساخ الريبو والبناء من المصدر:
nix develop # optional
cargo run --release
إذا كنت لا تستخدم Nix وتستخدم توزيعة تعتمد على Ubuntu، فستحتاج إلى تثبيت هذه التبعيات الإضافية:
apt install pkg-config libssl-dev libvulkan1 mesa-vulkan-drivers vulkan-tools
لقد قمت بتدريب نموذج لعبة باستخدام رمز مميز على مستوى الشخصية في مجموعة ويكيبيديا الألمانية لعدد 20000 دفعة (حجم الدفعة 128) مع المعلمات التالية:
المعلمة | قيمة |
---|---|
حدود | 83 م |
طول السياق | 128 |
n_layers | 12 |
n_heads | 12 |
d_model | 768 |
يمكنك تنزيله هنا واستخراجه بعد ذلك. أو قم بكليهما في أمر واحد:
curl -s ' https://drive.usercontent.google.com/download?id=1GGLaPnmPQ8Z2B9vJQoI6-K128X9LJKG0&export=download&confirm=t ' | tar xzf -
ثم قم بتشغيل النموذج:
gpt-burn run ./model_83M
يجب أن ترى شيئًا على هذا المنوال:
So wurden bis 1977 679 nachhaltige Wörgler Torbauten vorgeworfen, die Einwohnerzahl Sirkes bestand 2015 bis 1998.
Sie war trotz weniger als 10.000 ausgedehnter Größen wahrscheinlich auf folgende Breitenauflagen mit 932 km.
2016 wurden rund 145 Händen nach Deutschland geladen.
خيارات سطر الأوامر الإضافية هي:
Usage: gpt-burn run [OPTIONS] <MODEL_PATH>
Arguments:
<MODEL_PATH>
Options:
-p, --prompt <PROMPT>
-n, --n-new-tokens <N_NEW_TOKENS> [default: 1000]
-s, --seed <SEED> [default: 0]
لتدريب النموذج الخاص بك، قم بتشغيل:
gpt-burn train --context-length 128 --n-layers 12 --n-heads 12 --d-model 768 --batch-size 128 --learning-rate 0.0003 --seed 0 --text-corpus ./corpus.txt
مهم
تأكد من أن corpus.txt
هو ملف نصي مشفر بـ utf-8!
يمكنك تمرير معظم المعلمات الفائقة كخيار سطر أوامر:
Usage: gpt-burn train [OPTIONS]
Options:
-o, --output-path <PATH>
-c, --context-length <CONTEXT_LENGTH> [default: 64]
-d, --d-model <D_MODEL> [default: 64]
-l, --n-layers <N_LAYERS> [default: 2]
-h, --n-heads <N_HEADS> [default: 2]
-n, --n-steps <N_STEPS> [default: 50]
-b, --batch-size <BATCH_SIZE> [default: 32]
-r, --learning-rate <LEARNING_RATE> [default: 0.003]
-s, --seed <SEED> [default: 0]
-t, --text-corpus <TEXT_CORPUS> [default: .data/corpus.txt]
-m, --n-mega-bytes <N_MEGA_BYTES> Only use first <n> megabytes of dataset for training
-x, --no-save Don't save trained model (useful for debugging)
يمكن استخدام النموذج مع رموز مميزة مختلفة عبر سمة Tokenizer
. أدناه ترى كيف الجملة التالية
Albert Einstein war ein schweizerisch-US-amerikanischer theoretischer Physiker deutscher Herkunft.
يتم ترميزه بواسطة الرموز المميزة المختلفة.
يقوم CharTokenizer
بتقسيم كل حرف إلى رمز منفصل:
Tokens: ["A", "l", "b", "e", "r", "t", " ", "E", "i", "n", "s", "t", "e", "i", "n", " ", "w", "a", "r", " ", "e", "i", "n", " ", "s", "c", "h", "w", "e", "i", "z", "e", "r", "i", "s", "c", "h", "-", "U", "S", "-", "a", "m", "e", "r", "i", "k", "a", "n", "i", "s", "c", "h", "e", "r", " ", "t", "h", "e", "o", "r", "e", "t", "i", "s", "c", "h", "e", "r", " ", "P", "h", "y", "s", "i", "k", "e", "r", " ", "d", "e", "u", "t", "s", "c", "h", "e", "r", " ", "H", "e", "r", "k", "u", "n", "f", "t", "."]
Values: [28, 13, 3, 6, 19, 21, 1, 32, 10, 15, 20, 21, 6, 10, 15, 1, 24, 2, 19, 1, 6, 10, 15, 1, 20, 4, 9, 24, 6, 10, 27, 6, 19, 10, 20, 4, 9, 66, 48, 46, 66, 2, 14, 6, 19, 10, 12, 2, 15, 10, 20, 4, 9, 6, 19, 1, 21, 9, 6, 16, 19, 6, 21, 10, 20, 4, 9, 6, 19, 1, 43, 9, 26, 20, 10, 12, 6, 19, 1, 5, 6, 22, 21, 20, 4, 9, 6, 19, 1, 35, 6, 19, 12, 22, 15, 7, 21, 67]
يقوم SimpleVowelTokenizer
بتقسيم الكلمات قبل حرف العلة التالي إذا كانت القطعة أطول من ثلاثة أحرف، مما يؤدي إلى إنشاء نتيجة تشبه المقاطع:
Tokens: ["Albert", " ", "Einst", "ein", " ", "war", " ", "ein", " ", "schw", "eizer", "isch", "-", "US", "-", "amer", "ikan", "isch", "er", " ", "theor", "etisch", "er", " ", "Phys", "iker", " ", "deutsch", "er", " ", "Herk", "unft"]
Values: [2, 0, 3, 9, 0, 19, 0, 9, 0, 16, 10, 15, 1, 6, 1, 7, 13, 15, 11, 0, 17, 12, 11, 0, 5, 14, 0, 8, 11, 0, 4, 18]