* Mulai Agustus 2021, kode tidak lagi dipertahankan. Di sini disimpan dalam bentuk arsip untuk orang-orang yang ingin terus menggunakannya.
? 1T atau hancurkan teman-temanku?
Implementasi model & model mirip GPT3 paralel data menggunakan pustaka mesh-tensorflow.
Jika Anda di sini hanya untuk bermain dengan model terlatih kami, kami sangat menyarankan Anda mencoba integrasi HuggingFace Transformer.
Pelatihan dan inferensi secara resmi didukung di TPU dan juga dapat berfungsi di GPU. Repositori ini (sebagian besar) akan diarsipkan saat kami mengalihkan fokus ke repo khusus GPU kami, GPT-NeoX.
Selain fungsi yang ditawarkan oleh GPT-3, kami juga menawarkan hal berikut:
Catatan, meskipun neo secara teknis dapat menjalankan langkah pelatihan pada 200 miliar+ parameter, neo sangat tidak efisien pada skala tersebut. Hal ini, serta fakta bahwa banyak GPU tersedia bagi kami, antara lain, mendorong kami untuk memindahkan pengembangan ke GPT-NeoX.
Pembaruan 21/03/2021:
Kami bangga merilis dua model GPT-Neo terlatih yang dilatih di The Pile, bobot dan konfigurasinya dapat diunduh secara bebas dari the-eye.eu.
1.3B: https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_XL/
2.7B: https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_2-7B/
Untuk informasi lebih lanjut tentang cara menyiapkannya, lihat notebook colab, atau baca seluruh readme.
Model dan Ukuran | Tumpukan BPB | Tumpukan PPL | Teks Wiki PPL | Lambada PPL | Lambada Acc | Winogrande | omong kosong |
---|---|---|---|---|---|---|---|
GPT-Neo 125M | ----- | ----- | 32.285 | 30.266 | 37,36% | 50,43% | 28,67% |
GPT-3 125M | ----- | ----- | ----- | 18.6 | 42,7% | 52,0% | 33,7% |
GPT-Neo 350M | ----- | ----- | 22.5657 | 13.876 | 47,27% | 51,14% | 32,16% |
GPT-3 350M | ----- | ----- | ----- | 9.09 | 54,3% | 52,1% | 43,6% |
GPT-3 Ada | 0,9631 | ----- | ----- | 9.954 | 51,60% | 52,90% | 35,93% |
GPT-Neo 1.3B | 0,7527 | 6.159 | 13.10 | 7.498 | 57,23% | 55,01% | 38,66% |
GPT-3 1.3B | ----- | ----- | ----- | 5.44 | 63,6% | 58,7% | 54,7% |
GPT-2 1.5B | 1.0468 | ----- | 17.48 | 10.634 | 51,21% | 59,40% | 40,03% |
GPT-Neo 2.7B | 0,7165 | 5.646 | 11.39 | 5.626 | 62,22% | 56,50% | 42,73% |
GPT-3 2.7B | ----- | ----- | ----- | 4.60 | 67,1% | 62,3% | 62,8% |
Model dan Ukuran | MatematikaQA | PubMedQA | Piqa |
---|---|---|---|
GPT-Neo 125M | 22,78% | 55,10% | 63,06% |
GPT-3 125M | ----- | ----- | 64,6% |
GPT-Neo 350M | 23,45% | 53,80% | 65,07% |
GPT-3 350M | ----- | ----- | 70,2% |
GPT-3 Ada | 24,29% | 52,80% | 68,88% |
GPT-Neo 1.3B | 24,05% | 54,40% | 71,11% |
GPT-3 1.3B | ----- | ----- | 75,1% |
GPT-2 1.5B | 23,64% | 58,33% | 70,78% |
GPT-Neo 2.7B | 24,72% | 57,54% | 72,14% |
GPT-3 2.7B | ----- | ----- | 75,6% |
Catatan: Semua evaluasi dilakukan menggunakan memanfaatkan evaluasi kami. Beberapa hasil untuk GPT-2 dan GPT-3 tidak konsisten dengan nilai yang dilaporkan di masing-masing makalah. Kami sedang mencari tahu alasannya, dan akan sangat menghargai masukan dan pengujian lebih lanjut terhadap sistem eval kami.
git clone https://github.com/EleutherAI/GPTNeo
cd GPTNeo
pip3 install -r requirements.txt
Daftar ke Google Cloud Platform, dan buat keranjang penyimpanan.
Buat VM Anda melalui Google Shell ( https://ssh.cloud.google.com/
) dengan ctpu up --vm-only
sehingga dapat terhubung ke bucket Google dan TPU Anda dan instal persyaratan dengan pip (lihat di atas) .
Google colab menyediakan TPU-v8 secara gratis, yang seharusnya cukup untuk menyempurnakan model kami hingga ukuran GPT3XL (parameter 1,5 miliar). Klik untuk menjalankan contoh buku catatan colab kami.
Untuk instruksi lebih rinci, jalankan Panduan Pelatihan kami di bawah ini.
Anda juga dapat memilih untuk melatih GPTNeo secara lokal di GPU Anda. Untuk melakukannya, Anda dapat menghilangkan langkah-langkah penyiapan Google cloud di atas, dan git mengkloning repo secara lokal. Jalankan Panduan Pelatihan di bawah ini, lalu saat menjalankan main.py, Anda cukup menghilangkan flag tpu
, dan memasukkan id GPU sebagai gantinya.
Catatan: Beberapa pengguna melaporkan mengalami kesulitan membuat MTF mengenali GPU mereka. Lihat di sini untuk detail dan petunjuk tentang cara memperbaikinya.
Setelah Anda memiliki model terlatih, atau mengunduh salah satu model terlatih kami, membuat teks semudah menjalankan skrip main.py dengan tanda --predict
aktif. Anda dapat meneruskan jalur ke file txt prompt Anda dengan tanda --prompt
, seperti:
python3 main.py --predict --prompt < example_prompt.txt > --tpu < tpu_name > --model < config_name >
atau, jika menggunakan GPU:
python3 main.py --predict --prompt < example_prompt.txt > --gpu_ids < device:GPU:0 device:GPU: 1> --model < config_name >
Kami menyarankan Anda menggunakan tokenizer GPT2 Huggingface yang telah dilatih sebelumnya dengan repo kami (petunjuk disediakan di bawah), tetapi jika Anda ingin melatih model dengan ukuran kosakata berbeda, kami menyediakan fasilitas untuk melatih tokenizer Anda sendiri seperti:
python data/train_tokenizer.py
--base_dir ./path/to/your/txt/files
--output_dir ./output/path
--file_type txt
--vocab_size 50257
# if it succeeded, you should see the message
# 'tokenizer saved at ./output/path/byte-level-bpe.tokenizer.json'
Jika Anda hanya ingin menguji pelatihan, Anda dapat melewati langkah ini dan mendownload beberapa data dummy seperti:
wget https://storage.googleapis.com/connors-datasets/bundestag/bundestag_0.tfrecords
Lalu salin data ke bucket Anda, atau jika menggunakan GPU, ke direktori lokal:
gsutil cp bundestag_0.tfrecords gs://<your bucket>/
Jika menggunakan data Anda sendiri untuk berlatih, Anda dapat menggunakan skrip data/create_tfrecords.py
untuk menyandikan data teks Anda ke dalam tfrecords.
Data Anda harus dalam bentuk banyak file .txt normal (satu dokumen per file), atau dalam format apa pun yang didukung oleh lm_dataformat.
Anda dapat menjalankan skrip tanpa parameter untuk melihat bantuan untuk semua opsi.
Dalam mode dokumen Setiap contoh di tfrecords adalah satu dokumen (berukuran bervariasi). Ini untuk digunakan dengan mode pengambilan sampel documents_fixed
dan documents_random
(Untuk lebih jelasnya lihat bagian referensi parameter). Mode dokumen adalah mode default.
Perintah di bawah ini akan memberi token pada semua file dalam format yang dapat diterima di base_dir menggunakan tokenizer gpt2 dan menyimpannya ke output_dir
python3 create_tfrecords.py --mode documents --input_dir <base> --name <name> --output_dir <output> --use_gpt2_tokenizer --minimum_size <min>
input_dir
: Menentukan folder tempat data Anda berada. Script akan menyandikan semua file yang ada di folder ini.name
: Nama file keluaran adalah name_i.tfrecords
dengan i adalah nomor file.output_dir
: Tempat menyimpan tfrecordsuse_gpt2_tokenizer
: Apakah akan menggunakan tokenizer HuggingFace GPT2 yang telah dilatih sebelumnya, dalam hal ini pemisah akan disetel ke [50256].encoder_path
: jika tidak menggunakan tokenizer gpt2 yang telah dilatih sebelumnya, gunakan tanda ini untuk menyediakan jalur ke json tokenizer yang Anda buat.separator
: Ditulis dalam format daftar, token pemisah untuk disisipkan di antara dokumen (misalnya "[0]"). Akan bergantung pada pembuat enkode Anda.minimum_size
: Ukuran minimum (dalam token) yang harus dimiliki suatu dokumen, jika tidak maka akan dibuang. Inilah yang nantinya akan menentukan parameter stitch
anda: stitch * minimum_size
harus selalu lebih besar atau sama dengan n_ctx
(Untuk lebih jelasnya lihat bagian referensi parameter). Untuk menggunakan kumpulan data dalam model, Anda harus mendaftarkan kumpulan data tersebut terlebih dahulu di folder ./configs/dataset_configs
. Pertama pilih nama file dengan ekstensi .json
. Nama file tersebut akan berfungsi sebagai identifikasi kumpulan data. Konfigurasi harus diisi dengan cara berikut.
Jika Anda memiliki kumpulan data yang dikodekan menggunakan tokenizer gpt2 yang telah dilatih sebelumnya, Anda dapat menentukannya seperti ini:
{
"n_vocab" : 50257 ,
"path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"eval_path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"tokenizer_is_pretrained" : true ,
"tokenizer_path" : " gpt2 "
}
atau jika Anda telah melatih tokenizer khusus, seperti:
{
"n_vocab" : 32768 ,
"path" : " ./path/to/your/*.tfrecords " ,
"eval_path" : " ./path/to/your/eval/*.tfrecords " ,
"tokenizer_path" : " ./path/to/your/byte-level-bpe.tokenizer.json "
}
Terakhir, dalam konfigurasi model Anda, tambahkan nama file yang Anda buat di atas ke array datasets
.
<dataset id>
akan menjadi nama file, tidak termasuk .json
, yang Anda buat di atas
"datasets": [[<dataset id>, <stitch>, <datatype>, <weight>]] # datasets key defines at run time how each dataset is processed for training
Setelah kumpulan data Anda siap, temukan konfigurasi yang sesuai di /configs
.
Di sini kita menggunakan model berukuran GPT3-XL sebagai contoh, namun masih banyak lagi model lainnya di ./configs
, yang semuanya memiliki ringkasan singkat di bagian Konfigurasi yang Tersedia.
Yang perlu Anda lakukan hanyalah mengedit id kumpulan data seperti dijelaskan di atas, dan mengedit model_path
(tempat log dan pos pemeriksaan akan disimpan) untuk menunjuk ke bucket cloud yang akses tulisnya Anda miliki (atau jalur lokal, jika menggunakan GPU).
{
"n_head" : 32 ,
"n_vocab" : 50257 ,
"embed_dropout" : 0.1 ,
"lr" : 0.0002 ,
"lr_decay" : " cosine " ,
"warmup_steps" : 3000 ,
"beta1" : 0.9 ,
"beta2" : 0.95 ,
"epsilon" : 1e-8 ,
"opt_name" : " adam " ,
"weight_decay" : 0.1 ,
"train_batch_size" : 512 ,
"attn_dropout" : 0.1 ,
"train_steps" : 286150 ,
"eval_steps" : 0 ,
"predict_steps" : 1 ,
"res_dropout" : 0.1 ,
"eval_batch_size" : 128 ,
"predict_batch_size" : 1 ,
"iterations" : 2500 ,
"n_embd" : 2048 ,
"datasets" : [[ " your_dataset_name " , 25 , " documents_random " , 1.0 ]],
"model_path" : " gs://neo-models/GPT3_XL " ,
"n_ctx" : 2048 ,
"n_layer" : 24 ,
"scale_by_depth" : true ,
"scale_by_in" : false ,
"attention_types" : [[[ " global " ], 24 ]],
"mesh_shape" : " x:128,y:2 " ,
"layout" : " batch:x,memory_length:y,embd:y " ,
"activation_function" : " gelu " ,
"recompute_grad" : true ,
"gradient_clipping" : 1.0 ,
"tokens_per_mb_per_replica" : 2048
}
python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --tpu <tpu-name>
tpu
: Nama TPU yang akan digunakan.steps_per_checkpoint
: Frekuensi langkah-langkah untuk menyimpan pos pemeriksaan.--auto_layout
dan --auto_layout_and_mesh_shape
(Opsional): Nonaktifkan pelatihan dan sebagai gantinya secara otomatis menghasilkan layout
yang efisien memori (dan mesh_shape
)gpu_ids
: jika berlatih menggunakan GPU, hilangkan flag tpu
dan teruskan id GPU Anda. Pada contoh di bawah, kami melatih 3 GPU, menentukan id perangkatnya yang dibatasi spasi: python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --gpu_ids <device:GPU:0 device:GPU:1>
Kami memiliki beberapa ukuran model yang tersedia, namun beberapa konfigurasi kami memerlukan TPU besar dan perlu penyesuaian agar dapat dijalankan pada mesin atau GPU yang lebih kecil. Di bawah ini adalah panduan singkat untuk setiap model di direktori configs:
TODO
Sacred membantu melacak eksperimen dan jauh lebih baik untuk digunakan daripada papan tensor.
Untuk menyiapkan:
Instal Docker dan penulisan Docker
Jalankan docker-compose up
Untuk menggunakan:
Pastikan model_dir tidak memiliki log metrik apa pun di dalamnya (ini membuat metrik untuk tensorboard tersandung, yang mengasumsikan bahwa ini merupakan kelanjutan dari proses yang ada). Anda dapat menggunakan gsutil rm -r ...
untuk menghapus direktori model
Jalankan python3 run_experiment.py --tpu sometpuhere --model someconfig.json
Opsinya sama dengan main.py
.
Anda dapat mengunjungi http://server_ip_goes_here:8081/ untuk melihat ikhtisar Omniboard. Jika Anda lebih suka melihat tensorboard, skrip juga akan memutarnya dan secara otomatis menetapkan port untuknya. Skrip harus mencetak port tensorboard di dekat bagian atas log.
Jika Anda bingung dengan kumpulan data file konfigurasi tertentu, Anda dapat dengan mudah memeriksa id token minimum dan maksimum dengan satu perintah. Hal ini berguna untuk memastikan bahwa ukuran kosakata model setidaknya sama besarnya dengan id token maksimum. Tensorflow tidak akan error jika Anda mencoba mengumpulkan matriks dengan indeks di luar batas, jadi Anda perlu memastikan ukuran kosakata Anda cukup besar.
python main --model {config_name} --check_dataset
Selain dapat melatih GPT berukuran besar, repositori ini juga memungkinkan Anda melakukan pemodelan bahasa terselubung (BERT, RoBERTa) dengan mudah. Untuk melakukannya, Anda harus mengikuti dua langkah tambahan.
Saat melakukan tokenisasi pada kumpulan data Anda, Anda harus memesan id khusus untuk token [mask]
.
Dalam konfigurasi, Anda harus menentukan dua bidang tambahan
"mlm_training" : true , # must be set to true
"mlm_mask_id" : < mask id > # the mask id that you reserved from above
Hanya itu yang Anda perlukan untuk melatih model dengan tujuan MLM, baik untuk semua jenis data yang telah Anda enkode dengan benar. Jika Anda ingin mengubah hyperparameter terkait lainnya, silakan lanjutkan membaca.
"mlm_cls_token_id" : < cls token id > , # auto append specified CLS token id on the left
"mlm_mask_prob" : 0.15 , # the probability of masking a token, defaults to 15%
"mlm_same_token_prob" : 0.10 , # probability of keeping the token the same, defaults to 10%
"mlm_random_token_prob" : 0.10 , # probability of tokens that are replaced with random tokens, 10% was recommended by the BERT paper
"mlm_mask_ignore_ids" : [ < cls token > , < sep token > ] # ignore masking other special tokens, if any
Pilih konfigurasi yang valid dari /configs
dan sesuaikan parameter sesuai kebutuhan:
n_heads
: Jumlah kepala perhatian.n_embd
: Ukuran lapisan tersembunyi, harus habis dibagi n_heads
.n_vocab
: Ukuran kosakata.embed_dropout
, res_dropout
, attn_dropout
: Kemungkinan dropout untuk penyematan kata/sisa/perhatianlr
: Kecepatan pembelajaranwarmup_steps
: Jumlah langkah sebelum kecepatan pemelajaran penuh tercapai (jalan linier dari 0
hingga lr
).lr_decay
: cosine
atau linear
.opt_name
: adam
atau adafactor
.beta1
, beta2
dan epsilon
: parameter pengoptimal adam
.beta1
, ada_epsilon1
dan ada_epsilon2
: parameter pengoptimal adafactor
.weight_decay
: Parameter peluruhan berat, jika tidak ada, tidak ada peluruhan berat yang digunakan (perbaikan peluruhan berat untuk Adam digunakan) (default: 0,01) (opsional).train_batch_size
: Ukuran batch selama pelatihan.train_steps
: Jumlah langkah pelatihan (batch), ditetapkan kira-kira ~1 epoch untuk saat ini (jumlah total token dalam kumpulan data Anda / jumlah token per batch (= train_batch_size
/ n_ctx
)).eval_steps
: Jumlah langkah yang harus dijalankan untuk setiap evaluasi. Setel ke 0
tanpa evaluasi. yaitu Setelah setiap pos pemeriksaan, model diuji untuk eval_steps
iterations
: Jumlah langkah yang diantri ke TPU, harus lebih kecil steps_per_checkpoint
. (standar: 500)datasets
: Daftar kumpulan data tfrecords yang akan digunakan. Setiap kumpulan data adalah daftar dengan parameter berikut: [train glob , eval glob, stitch, sampling_mode, weight]
. Jadi misalnya untuk satu dataset (perhatikan daftar ganda): [["bundestag_*.tfrecords", "", 10, "random_sample", 1.0]]
dataset_id
: Nama file konfigurasi dataset di ./configs/dataset_configs
stitch
: Jika sampling_mode
random_sample
digunakan, pipa input akan mengambil sampel sejumlah teks ini menjadi satu sampel. Anda harus memilih jahitan agar stitch * minimum_document_length >= n_ctx
sampling_mode
: chunks
(tfrecords diproses terlebih dahulu menjadi panjang yang benar dan dibaca secara berurutan) atau documents_random
(jumlah stitch
dokumen digabungkan dan kemudian potongan n_ctx
dimasukkan ke dalam sampel secara acak)weights
: Berapa bobot relatif yang seharusnya dimiliki kumpulan data ini dibandingkan dengan kumpulan data lainnyamodel
: Model mana yang akan dilatih. Saat ini hanya GPT
yang didukung, dan defaultnya adalah ini jika tidak ada.model_path
: Lokasi keranjang penyimpanan Google (atau jalur lokal, jika menggunakan GPU) untuk menyimpan pos pemeriksaan dan log model.n_ctx
: Ukuran jendela konteks. Standarnya adalah 2048n_layer
: Jumlah lapisan (blok) dalam model.scale_by_depth
: Jika benar, inisialisasi bobot lapisan akan diskalakan berdasarkan kedalamannya seperti pada makalah GPT2.scale_by_in
: Jika benar, inisialisasi bobot lapisan akan diskalakan berdasarkan jumlah inputnya seperti pada makalah GPT2.mesh_shape
: Mesh adalah array prosesor n-dimensi dengan dimensi bernama yang digunakan untuk paralelisme di perpustakaan mesh-tensorflow. Setiap Tensor dibagi secara merata di seluruh dimensi mesh sesuai dengan tata letaknya (lihat di bawah). 'mesh_shape' adalah bentuk array ini, dan harus sama dengan jumlah prosesor. misalnya, untuk "mesh_shape" TPU v3-128: “x:16,y:8”.layout
: Tensor diletakkan pada meshnya dengan satu irisan pada setiap prosesor. "Tata letak" Tensor adalah peta parsial injektif yang menentukan dimensi tensor mana yang dibagi (secara merata) pada dimensi mesh mana. Tidak ada dimensi tensor yang boleh dipisahkan pada dua dimensi jaringnya dan tidak ada dua dimensi tensor yang boleh dipisahkan pada dimensi jaring yang sama. Pengguna mendefinisikan seperangkat aturan tata letak global dalam bentuk pasangan (nama-dimensi-tensor, nama-dimensi-mesh). Dimensi tensor dibagi ke seluruh dimensi jaringnya jika ada aturan yang cocok, misalnya (untuk contoh di atas mesh_shape: "layout":"batch:x,heads:y"activation_function
: selu
(self normalizing) atau gelu
(digunakan oleh OA), fungsi aktivasi digunakan dalam feed-forward pass. (default: gelu)attention_types
: jenis perhatian untuk setiap lapisan dalam daftar format berikut [[["attention_type"], n_layers]]. misalnya untuk jaring 12 lapis [[["global"], 12]] atau [[["lokal"], 10], [["global"], 2]].linear
, global
, local
atau none
. Kami menemukan perpaduan 50/50 antara global
dan linear
berfungsi dengan baik. none
memungkinkan Anda membuat lapisan feed-forward saja untuk model PAR Transformer yang lebih efisien.precision
: float32
atau bfloat16
.tokens_per_mb_per_replica
: Jika tidak ada, batch akan dibagi menjadi microbatch yang lebih kecil yang berisi token tokens_per_mb_per_replica
untuk menghindari OOM. Gradien diakumulasikan secara lokal dan dikurangi satu kali. PENTING: mb mengacu pada minibatch bukan megabyte di sini.Campuran Para Ahli
moe_layers
: Daftar nomor lapisan untuk menambahkan campuran lapisan pakar ke dalamnya. Misalnya: [2,4,6,8,10,12]
. Kami secara eksperimental telah menemukan lapisan moe untuk setiap dua lapisan perhatian diri berfungsi dengan baik.moe_params
: kamus kwarg tambahan untuk diteruskan ke lapisan moe. MISALNYA {"moe_dropout_rate": 0.0 }
Fitur eksperimental
axial_pos_emb_
: Jika benar, gunakan [penyematan posisi aksial](https://arxiv.org/abs/1912.12180.mlp_glu
: Jika benar, gunakan varian unit linier berpintu dari lapisan umpan maju.scalenorm
: Jika benar, gunakan scalenorm alih-alih layernorm.rezero
: Jika benar, gunakan rezero sebagai pengganti layernorm.num_mem_kv
: menambahkan memori/nilai kunci dari makalah all-attention. Param adalah int dengan jumlah nilai mem/kunci yang diinginkan.macaron
: jika benar - menggunakan trafo macaron untuk setiap blok lapisan. Jika Anda merasa GPT-Neo berguna dalam pekerjaan Anda, Anda dapat mengutip repositori ini sebagai
@software{gpt-neo,
author = {Black, Sid and
Gao, Leo and
Wang, Phil and
Leahy, Connor and
Biderman, Stella},
title = {{GPT-Neo: Large Scale Autoregressive Language
Modeling with Mesh-Tensorflow}},
month = mar,
year = 2021,
note = {{If you use this software, please cite it using
these metadata.}},
publisher = {Zenodo},
version = {1.0},
doi = {10.5281/zenodo.5297715},
url = {https://doi.org/10.5281/zenodo.5297715}
}
Nomor versi harus diganti dengan nomor versi yang Anda gunakan, dan tahun sesuai dengan rilis sumber terbuka proyek.
Jika Anda secara khusus tertarik untuk mengutip model GPT-Neo yang dilatih di Pile, kami juga akan sangat menghargai jika Anda mengutipnya
@article{gao2020pile,
title={The Pile: An 800GB Dataset of Diverse Text for Language Modeling},
author={Gao, Leo and Biderman, Stella and Black, Sid and Golding, Laurence and Hoppe, Travis and Foster, Charles and Phang, Jason and He, Horace and Thite, Anish and Nabeshima, Noa and others},
journal={arXiv preprint arXiv:2101.00027},
year={2020}
}