minGPT
Implementasi ulang GPT oleh PyTorch, baik pelatihan maupun inferensi. minGPT mencoba untuk menjadi kecil, bersih, dapat diinterpretasikan dan mendidik, karena sebagian besar implementasi model GPT yang tersedia saat ini mungkin agak rumit. GPT bukanlah model yang rumit dan implementasi ini terdiri dari sekitar 300 baris kode (lihat mingpt/model.py). Semua yang terjadi adalah urutan indeks dimasukkan ke dalam Transformer, dan distribusi probabilitas pada indeks berikutnya dalam urutan tersebut keluar. Mayoritas kerumitannya hanyalah kepintaran dalam pengelompokan (baik seluruh contoh maupun panjang urutan) untuk efisiensi.
catatan (Jan 2023) : meskipun saya mungkin terus menerima dan mengubah beberapa detail, minGPT berada dalam status semi-arsip. Untuk perkembangan terkini, lihat penulisan ulang nanoGPT saya. Pada dasarnya, minGPT menjadi referensi di berbagai tempat (buku catatan, blog, kursus, buku, dll.) yang membuat saya kurang bersedia melakukan perubahan besar yang ingin saya lakukan untuk memajukan kode. Saya juga ingin sedikit mengubah arah, dari fokus tunggal pada pendidikan menjadi sesuatu yang masih sederhana dan dapat diretas namun memiliki kekuatan (mereproduksi tolok ukur industri skala menengah, menerima beberapa pengorbanan untuk mendapatkan efisiensi runtime, dll).
Pustaka minGPT terdiri dari tiga file: mingpt/model.py berisi definisi model Transformer sebenarnya, mingpt/bpe.py berisi Byte Pair Encoder yang sedikit difaktorkan ulang yang menerjemahkan antara teks dan urutan bilangan bulat persis seperti yang dilakukan OpenAI di GPT, mingpt/trainer. py adalah kode boilerplate PyTorch (independen GPT) yang melatih model. Lalu ada beberapa demo dan proyek yang menggunakan perpustakaan di folder projects
:
-
projects/adder
melatih GPT dari awal untuk menjumlahkan angka (terinspirasi oleh bagian penjumlahan di makalah GPT-3) -
projects/chargpt
melatih GPT menjadi model bahasa tingkat karakter pada beberapa file teks masukan -
demo.ipynb
menunjukkan penggunaan minimal GPT
dan Trainer
dalam format buku catatan pada contoh pengurutan sederhana -
generate.ipynb
menunjukkan bagaimana seseorang dapat memuat GPT2 yang telah dilatih sebelumnya dan menghasilkan teks dengan beberapa perintah
Instalasi Perpustakaan
Jika Anda ingin import mingpt
ke proyek Anda:
git clone https://github.com/karpathy/minGPT.git
cd minGPT
pip install -e .
Penggunaan
Inilah cara Anda membuat instance GPT-2 (versi param 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 )
Dan inilah cara Anda melatihnya:
# 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 ()
Lihat demo.ipynb
untuk contoh yang lebih konkrit.
Tes satuan
Cakupannya belum terlalu luar biasa, tetapi:
python -m unittest discover tests
semuanya
- tambahkan demo penyempurnaan gpt-2 pada file teks tertentu
- tambahkan demo agen dialog
- dokumen hasil yang lebih baik untuk proyek yang ada (adder, chargpt)
- tambahkan presisi campuran dan perlengkapan penskalaan pelatihan terkait
- dukungan pelatihan yang didistribusikan
- mereproduksi beberapa tolok ukur dalam proyek/, misalnya text8 atau pemodelan bahasa lainnya
- logging yang tepat daripada mencetak pernyataan jam amatir haha
- saya mungkin harus memiliki file persyaratan.txt...
- seharusnya dapat memuat banyak bobot model lain selain hanya gpt2-*
Referensi
Kode:
- openai/gpt-2 memiliki definisi model di TensorFlow, tetapi tidak memiliki kode pelatihan
- openai/image-gpt memiliki beberapa gpt-3 yang lebih modern seperti modifikasi dalam kodenya, referensi yang bagus juga
- huggingface/transformers memiliki contoh pemodelan bahasa. Ini berfitur lengkap tetapi akibatnya juga agak sulit untuk dilacak. Misalnya, beberapa fungsi besar memiliki sebanyak 90% kode yang tidak digunakan di balik berbagai pernyataan percabangan yang tidak digunakan dalam pengaturan default pemodelan bahasa sederhana
Makalah + beberapa catatan implementasi:
Meningkatkan Pemahaman Bahasa dengan Pra-Pelatihan Generatif (GPT-1)
- Model kami sebagian besar mengikuti karya trafo asli
- Kami melatih transformator khusus dekoder 12 lapis dengan kepala perhatian mandiri bertopeng (768 status dimensi dan 12 kepala perhatian). Untuk jaringan feed-forward berdasarkan posisi, kami menggunakan status dalam 3072 dimensi.
- Kecepatan pembelajaran Adam maks 2,5e-4. (nantinya GPT-3 untuk ukuran model ini menggunakan 6e-4)
- Peluruhan LR: meningkat secara linier dari nol selama 2000 pembaruan pertama dan dianil ke 0 menggunakan jadwal kosinus
- Kami melatih selama 100 epoch pada minibatch yang terdiri dari 64 sampel acak, urutan 512 token yang berdekatan.
- Karena layernorm digunakan secara luas di seluruh model, inisialisasi bobot sederhana N(0, 0,02) sudah cukup
- kosakata bytepair coding (BPE) dengan 40.000 gabungan
- sisa, penyematan, dan penurunan perhatian dengan tingkat 0,1 untuk regularisasi.
- versi modifikasi dari regularisasi L2 yang diusulkan pada (37), dengan w = 0,01 pada semua bobot non bias atau gain
- Untuk fungsi aktivasi, kami menggunakan Gaussian Error Linear Unit (GELU).
- Kami menggunakan penyematan posisi yang dipelajari alih-alih versi sinusoidal yang diusulkan dalam karya aslinya
- Untuk menyempurnakan: Kami menambahkan dropout ke pengklasifikasi dengan tingkat 0,1. kecepatan pembelajaran 6,25e-5 dan ukuran batch 32,3 epoch. Kami menggunakan jadwal peluruhan kecepatan pembelajaran linier dengan pemanasan lebih dari 0,2% pelatihan. λ diatur ke 0,5.
- Model GPT-1 terdiri dari 12 lapisan dan d_model 768, ~117 juta parameter
Model Bahasa adalah Pembelajar Multitask Tanpa Pengawasan (GPT-2)
- LayerNorm dipindahkan ke input setiap sub-blok, mirip dengan jaringan sisa pra-aktivasi
- normalisasi lapisan tambahan ditambahkan setelah blok perhatian mandiri terakhir.
- inisialisasi yang dimodifikasi yang memperhitungkan akumulasi pada jalur sisa dengan kedalaman model digunakan. Kami menskalakan bobot lapisan sisa pada inisialisasi dengan faktor 1/√N dengan N adalah jumlah lapisan sisa. (aneh karena dalam kode rilis mereka saya hanya dapat menemukan penggunaan sederhana dari 0,02 lama... dalam rilis image-gpt mereka saya temukan itu digunakan untuk c_proj, itupun hanya untuk attn, bukan untuk mlp. ya. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- kosakatanya diperluas menjadi 50.257
- tingkatkan ukuran konteks dari 512 menjadi 1024 token
- ukuran batch yang lebih besar yaitu 512 digunakan
- GPT-2 menggunakan 48 lapisan dan d_model 1600 (vs. 12 lapisan asli dan d_model 768). ~1,542B parameter
Model Bahasa adalah Pembelajar yang Sedikit Berkesempatan (GPT-3)
- GPT-3: 96 lapisan, 96 kepala, dengan d_model 12.288 (parameter 175B).
- Seperti GPT-1: 12 lapisan, 12 kepala, d_model 768 (125M)
- Kami menggunakan model dan arsitektur yang sama seperti GPT-2, termasuk inisialisasi yang dimodifikasi, pra-normalisasi, dan tokenisasi reversibel yang dijelaskan di dalamnya
- kami menggunakan pola perhatian jarang yang padat dan berpita lokal secara bergantian di lapisan transformator, mirip dengan Transformator Jarang
- kita selalu memiliki lapisan feedforward empat kali ukuran lapisan kemacetan, dff = 4 ∗ dmodel
- semua model menggunakan jendela konteks token nctx = 2048.
- Adam dengan β1 = 0,9, β2 = 0,95, dan eps = 10−8
- Semua model menggunakan penurunan bobot 0,1 untuk memberikan sedikit regularisasi. (CATATAN: GPT-1 menggunakan 0,01 Saya yakin, lihat di atas)
- klip norma global gradien pada 1,0
- Pemanasan LR linier pada 375 juta token pertama. Kemudian gunakan peluruhan kosinus untuk menurunkan kecepatan pembelajaran hingga 10% nilainya, lebih dari 260 miliar token.
- secara bertahap tingkatkan ukuran batch secara linier dari nilai kecil (32 ribu token) ke nilai penuh selama 4-12 miliar token pelatihan pertama, bergantung pada ukuran model.
- jendela konteks waktu penuh berukuran 2048 selalu digunakan, dengan pembatas token END OF DOCUMENT khusus
Pra-pelatihan Generatif dari Piksel (Gambar GPT)
- Saat bekerja dengan gambar, kita memilih permutasi identitas πi = i untuk 1 ≤ i ≤ n, yang juga dikenal sebagai urutan raster.
- kita membuat palet warna 9-bit sendiri dengan mengelompokkan nilai piksel (R, G, B) menggunakan k-means dengan k = 512.
- Model terbesar kami, iGPT-XL, berisi L = 60 lapisan dan menggunakan ukuran penyematan d = 3072 dengan total 6,8 miliar parameter.
- Model terbesar kami berikutnya, iGPT-L, pada dasarnya identik dengan GPT-2 dengan L = 48 lapisan, tetapi berisi ukuran penyematan yang sedikit lebih kecil yaitu d = 1536 (vs 1600) dengan total parameter 1,4 miliar.
- Kami menggunakan kode model yang sama seperti GPT-2, hanya saja kami menginisialisasi bobot dengan cara yang bergantung pada lapisan seperti pada Sparse Transformer (Child et al., 2019) dan menginisialisasi nol semua proyeksi yang menghasilkan logit.
- Kami juga melatih iGPT-M, model parameter 455M dengan L = 36 dan d = 1024
- iGPT-S, model parameter 76M dengan L = 24 dan d = 512 (oke, dan berapa headnya? sepertinya kode Github mengklaim 8)
- Saat melakukan pra-pelatihan iGPT-XL, kami menggunakan ukuran batch 64 dan melatih untuk iterasi 2 juta, dan untuk semua model lainnya kami menggunakan ukuran batch 128 dan melatih untuk iterasi 1 juta.
- Adam dengan β1 = 0,9 dan β2 = 0,95
- Kecepatan pemelajaran dihangatkan selama satu periode, lalu menurun menjadi 0
- Kami tidak menggunakan peluruhan bobot karena menerapkan peluruhan bobot kecil sebesar 0,01 tidak mengubah kualitas representasi.
- iGPT-S lr 0,003
- Tidak ada dropout yang digunakan.
Lisensi
MIT