Proyek ini bertujuan untuk menjadi implementasi ulang GPT-2 yang bersih dan ringkas. Implementasi model, yang terdapat dalam src/model.rs
, berada di bawah 300 baris kode. Meskipun ini adalah latihan yang menyenangkan terutama untuk tujuan pendidikan (saya sendiri), ini menunjukkan kegunaan Rust and Burn dalam domain pembelajaran mesin: Keseluruhan proyek dikompilasi menjadi satu biner, membuat penerapannya relatif mudah.
Saat ini, hanya tokenizer tingkat karakter yang didukung, sehingga bobot resmi yang memerlukan tokenizer BPE belum dapat digunakan. Namun untuk bersenang-senang, Anda bisa mencoba model mainan kecil yang saya latih (lihat kesimpulan).
Proyek ini juga mencakup CLI sederhana untuk pelatihan dan inferensi.
Usage: gpt-burn <COMMAND>
Commands:
run Generate text using a pre-trained model
train Train a new model
Anda dapat menginstal gpt-burn
dengan Nix:
nix run github:felix-andreas/gpt-burn
Atau, instal dengan cargo
:
cargo install --git https://github.com/felix-andreas/gpt-burn
Alternatifnya, kloning repo dan bangun dari sumber:
nix develop # optional
cargo run --release
Jika Anda tidak menggunakan Nix dan menggunakan distro berbasis Ubuntu, Anda perlu menginstal dependensi tambahan berikut:
apt install pkg-config libssl-dev libvulkan1 mesa-vulkan-drivers vulkan-tools
Saya melatih model mainan dengan tokenizer tingkat karakter di korpus Wikipedia Jerman untuk 20.000 batch (ukuran batch 128) dengan parameter berikut:
Parameter | Nilai |
---|---|
parameter | 83M |
panjang konteks | 128 |
n_layers | 12 |
n_heads | 12 |
d_model | 768 |
Anda dapat mengunduhnya di sini dan mengekstraknya setelahnya. Atau, lakukan keduanya dalam satu perintah:
curl -s ' https://drive.usercontent.google.com/download?id=1GGLaPnmPQ8Z2B9vJQoI6-K128X9LJKG0&export=download&confirm=t ' | tar xzf -
Kemudian, jalankan modelnya:
gpt-burn run ./model_83M
Anda akan melihat sesuatu seperti ini:
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.
Opsi baris perintah lebih lanjut adalah:
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]
Untuk melatih model Anda sendiri, jalankan:
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
Penting
Pastikan corpus.txt
adalah file teks berkode utf-8!
Anda dapat meneruskan sebagian besar hyperparameter sebagai opsi baris perintah:
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)
Model ini dapat digunakan dengan tokenizer yang berbeda melalui sifat Tokenizer
. Di bawah ini Anda lihat bagaimana kalimat berikut
Albert Einstein war ein schweizerisch-US-amerikanischer theoretischer Physiker deutscher Herkunft.
dikodekan oleh tokenizer yang berbeda.
CharTokenizer
membagi setiap karakter menjadi token terpisah:
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
membagi kata sebelum vokal berikutnya jika potongannya lebih panjang dari tiga karakter, sehingga menghasilkan hasil yang menyerupai suku kata:
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]