โครงการนี้มีเป้าหมายที่จะนำ GPT-2 ไปใช้ใหม่อย่างสะอาดและรัดกุม การใช้งานโมเดลที่มีอยู่ใน src/model.rs
มีโค้ดไม่เกิน 300 บรรทัด แม้ว่านี่จะเป็นแบบฝึกหัดที่สนุกสนานเพื่อวัตถุประสงค์ทางการศึกษา (ของฉันเอง) เป็นหลัก แต่ก็แสดงให้เห็นถึงประโยชน์ของ Rust and 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
หรืออีกทางหนึ่ง โคลน repo และสร้างจากแหล่งที่มา:
nix develop # optional
cargo run --release
หากคุณไม่ได้ใช้ Nix และใช้งาน distro บน Ubuntu คุณจะต้องติดตั้งการขึ้นต่อกันเพิ่มเติมเหล่านี้:
apt install pkg-config libssl-dev libvulkan1 mesa-vulkan-drivers vulkan-tools
ฉันฝึกโมเดลของเล่นด้วยโทเค็นระดับตัวละครบนคลังวิกิพีเดียภาษาเยอรมันเป็นจำนวน 20,000 ชุด (ขนาดชุด 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
จะแยกคำก่อนสระถัดไปหากกลุ่มมีความยาวเกิน 3 ตัวอักษร ทำให้เกิดผลลัพธ์ที่คล้ายกับพยางค์:
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]