*自 2021 年 8 月起,程式碼不再維護。它以檔案形式保存在這裡,供希望繼續使用它的人使用。
? 1T 還是讓我的兄弟們崩潰?
使用 mesh-tensorflow 函式庫實作模型和資料並行的類似 GPT3 的模型。
如果您只是來玩我們預先訓練的模型,我們強烈建議您嘗試 HuggingFace Transformer 整合。
訓練和推理在 TPU 上得到官方支持,也應該在 GPU 上運行。當我們將重點轉移到 GPU 特定的儲存庫 GPT-NeoX 時,該儲存庫將(大部分)存檔。
除了 GPT-3 提供的功能外,我們還提供以下功能:
請注意,雖然 Neo 在技術上可以運行 200B+ 參數的訓練步驟,但在這些規模上效率非常低。除此之外,這一點以及我們可以使用許多 GPU 的事實促使我們將開發轉移到 GPT-NeoX。
2021 年 3 月 21 日更新:
我們很自豪地發布兩個在 The Pile 上訓練的預訓練 GPT-Neo 模型,權重和配置可以從 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/
有關如何進行這些設定的更多信息,請參閱 colab 筆記本,或通讀自述文件的其餘部分。
型號及尺寸 | 樁BPB | 樁PPL | 維基文本 PPL | 蘭巴達PPL | 蘭巴達加速器 | 維諾格蘭德 | 海拉斯瓦格 |
---|---|---|---|---|---|---|---|
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阿達 | 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% |
型號及尺寸 | 數學問答 | 公共醫學品質保證 | 皮卡 |
---|---|---|---|
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阿達 | 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% |
注意:所有評估都是使用我們的評估工具完成的。 GPT-2 和 GPT-3 的一些結果與各自論文中報告的值不一致。我們目前正在調查原因,並且非常感謝回饋以及對我們的評估工具的進一步測試。
git clone https://github.com/EleutherAI/GPTNeo
cd GPTNeo
pip3 install -r requirements.txt
註冊 Google Cloud Platform,並建立儲存桶。
使用ctpu up --vm-only
透過 google shell ( https://ssh.cloud.google.com/
) 建立虛擬機,以便它可以連接到您的Google 儲存桶和TPU 並使用pip 安裝要求(請參閱上文) 。
Google colab 免費提供 tpu-v8,這應該足以將我們的模型微調到 GPT3XL(1.5B 參數)大小。點擊以運行我們的範例 Colab 筆記本。
有關更詳細的說明,請閱讀下面的訓練指南。
您也可以選擇在 GPU 上本地訓練 GPTNeo。為此,您可以省略上面的 Google 雲端設定步驟,並在本機 git 複製儲存庫。執行下面的訓練指南,然後在執行 main.py 時,您只需省略tpu
標誌,並傳入 GPU id 即可。
注意:一些用戶報告說 MTF 很難識別他們的 GPU。有關如何修復該問題的詳細資訊和說明,請參閱此處。
一旦您擁有經過訓練的模型,或者下載了我們預先訓練的模型之一,生成文字就像運行帶有--predict
標誌的 main.py 腳本一樣簡單。您可以使用--prompt
標誌傳遞提示 txt 檔案的路徑,如下所示:
python3 main.py --predict --prompt < example_prompt.txt > --tpu < tpu_name > --model < config_name >
或者,如果使用 GPU:
python3 main.py --predict --prompt < example_prompt.txt > --gpu_ids < device:GPU:0 device:GPU: 1> --model < config_name >
我們建議您在我們的儲存庫中使用Huggingface 的預訓練GPT2 分詞器(下面提供的說明),但如果您想訓練具有不同詞彙量大小的模型,我們提供了訓練您自己的分詞器的設施,如下所示:
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'
如果您只想測試訓練,可以跳過此步驟並下載一些虛擬數據,如下所示:
wget https://storage.googleapis.com/connors-datasets/bundestag/bundestag_0.tfrecords
然後將資料複製到您的儲存桶,或者如果使用 GPU,則複製到本機目錄:
gsutil cp bundestag_0.tfrecords gs://<your bucket>/
如果使用您自己的資料進行訓練,您可以使用data/create_tfrecords.py
腳本將文字資料編碼到 tfrecords 中。
您的資料必須採用大量普通 .txt 檔案的形式(每個文件一個文件),或採用 lm_dataformat 支援的任何格式。
您可以執行不帶參數的腳本來查看所有選項的幫助。
在文件模式下 tfrecords 中的每個範例都是一個(大小可變)文件。這將與documents_fixed
和documents_random
採樣模式一起使用(有關更多詳細信息,請參閱參數參考部分)。文檔模式是預設模式。
以下命令將使用 gpt2 tokenizer 對base_dir中可接受的格式的所有檔案進行標記,並將它們儲存到output_dir
python3 create_tfrecords.py --mode documents --input_dir <base> --name <name> --output_dir <output> --use_gpt2_tokenizer --minimum_size <min>
input_dir
:定義資料所在的資料夾。該腳本將對該資料夾中存在的所有檔案進行編碼。name
:輸出檔案的名稱將為name_i.tfrecords
,其中 i 是檔案的編號。output_dir
:儲存 tfrecords 的位置use_gpt2_tokenizer
:是否使用預先訓練的 HuggingFace GPT2 tokenizer,在這種情況下分隔符號將設定為 [50256]。encoder_path
:如果不使用預先訓練的 gpt2 分詞器,請使用此標誌提供產生的分詞器 json 的路徑。separator
:以清單格式編寫,在文件之間插入的分隔符號標記(例如「[0]」)。將取決於您的編碼器。minimum_size
:文件必須具有的最小大小(以標記為單位),否則將被丟棄。這將在稍後確定您的stitch
參數: stitch * minimum_size
必須始終大於或等於n_ctx
(有關更多詳細信息,請參閱參數參考部分)。 若要在模型中使用資料集,您必須先在./configs/dataset_configs
資料夾下註冊該資料集。首先選擇副檔名為.json
檔名。該檔案名稱將用作資料集標識。配置應按以下方式填寫。
如果您有使用預訓練 gpt2 分詞器編碼的資料集,則可以像這樣指定:
{
"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 "
}
或者如果您已經訓練了自訂分詞器,如下所示:
{
"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 "
}
最後,在模型配置中,將上面建立的檔案名稱加入到datasets
數組中。
<dataset id>
將是您在上面建立的檔名,不包括.json
"datasets": [[<dataset id>, <stitch>, <datatype>, <weight>]] # datasets key defines at run time how each dataset is processed for training
設定資料集後,在/configs
中找到合適的配置。
這裡我們使用 GPT3-XL 大小的模型作為範例,但./configs
中有更多模型,所有這些模型在可用設定部分都有簡短的摘要。
您需要做的就是如上所述編輯資料集 ID,並編輯model_path
(將保存日誌和檢查點)以指向您具有寫入權限的雲端儲存桶(或本機路徑,如果使用 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
:要使用的 TPU 的名稱。steps_per_checkpoint
:保存檢查點的頻率(以步驟為單位)。--auto_layout
和--auto_layout_and_mesh_shape
(可選):停用訓練並自動產生記憶體高效layout
(和mesh_shape
)gpu_ids
:如果使用 GPU 進行訓練,省略tpu
標誌並傳入 GPU 的 id。在下面的範例中,我們在 3 個 GPU 上進行訓練,指定它們的裝置 ID(以空格分隔): python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --gpu_ids <device:GPU:0 device:GPU:1>
我們有多種模型大小可用,但我們的一些配置需要大型 TPU,並且需要進行調整才能在較小的機器或 GPU 上運行。以下是 configs 目錄中每個模型的簡短指南:
待辦事項
Sacred 有助於追蹤實驗,並且比張量板更好用。
設定:
安裝 Docker 和 Docker-compose
運行docker-compose up
使用方法:
確保 model_dir 中沒有任何指標日誌(它會觸發張量板的指標內容,假設它是現有運行的延續)。您可以使用gsutil rm -r ...
刪除模型目錄
運行python3 run_experiment.py --tpu sometpuhere --model someconfig.json
選項與main.py
相同。
您可以造訪 http://server_ip_goes_here:8081/ 查看 Omniboard 概述。如果您喜歡查看張量板,該腳本還會啟動張量板並自動為其分配一個連接埠。此腳本應在日誌頂部附近列印出張量板連接埠。
如果您對特定設定檔的資料集感到困惑,您可以使用單一命令輕鬆檢查最小和最大令牌 ID。這對於確保模型的詞彙量大小至少與最大標記 id 一樣大很有用。如果您嘗試在索引超出範圍的矩陣上進行收集,Tensorflow 不會出錯,因此您需要確保詞彙量足夠大。
python main --model {config_name} --check_dataset
除了能夠訓練大型 GPT 之外,此儲存庫還可讓您輕鬆進行屏蔽語言建模(BERT、RoBERTa)。為此,您必須執行兩個附加步驟。
對資料集進行標記時,必須為[mask]
標記保留一個特殊的 ID。
在配置中,您必須定義兩個附加字段
"mlm_training" : true , # must be set to true
"mlm_mask_id" : < mask id > # the mask id that you reserved from above
這就是使用 MLM 目標訓練模型所需的全部內容,適用於已正確編碼的任何類型的資料。如果您想調整其他相關的超參數,請繼續閱讀。
"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
從/configs
中選擇一個有效的配置並根據需要調整參數:
n_heads
:注意力頭的數量。n_embd
:隱藏層的大小,必須能被n_heads
整除。n_vocab
:詞彙量。embed_dropout
、 res_dropout
、 attn_dropout
:字嵌入/殘差/注意力的丟棄機率lr
:學習率warmup_steps
:達到完全學習率之前的步數(從0
到lr
線性斜坡)。lr_decay
: cosine
或linear
。opt_name
: adam
或adafactor
。beta1
、 beta2
和epsilon
: adam
優化器參數。beta1
、 ada_epsilon1
和ada_epsilon2
: adafactor
優化器參數。weight_decay
:權重衰減參數,如果不存在,則不使用權重衰減(使用 Adam 的權重衰減修復)(預設值:0.01)(可選)。train_batch_size
:訓練期間的批次大小。train_steps
:訓練步驟數(批次),目前設定為大約 1 個時期(資料集中的標記總數/每批次的標記數量 (= train_batch_size
/ n_ctx
))。eval_steps
:每次評估運行的步驟數。設定為0
表示不進行評估。即在每個檢查點之後,對模型進行eval_steps
測試iterations
:排隊到 TPU 的步驟數,必須小於steps_per_checkpoint
。 (預設值:500)datasets
:要使用的 tfrecords 資料集清單。每個資料集都是一個包含以下參數的清單: [train glob , eval glob, stitch, sampling_mode, weight]
。例如,對於單一資料集(注意雙列表): [["bundestag_*.tfrecords", "", 10, "random_sample", 1.0]]
dataset_id
: ./configs/dataset_configs
中資料集設定檔的名稱stitch
:如果使用sampling_mode
random_sample
,輸入管道會將這一數量的文字採樣為一個樣本。您必須選擇縫合,以便stitch * minimum_document_length >= n_ctx
sampling_mode
: chunks
(tfrecords被預處理成正確的長度並按順序讀取)或documents_random
( stitch
文件數量被連接,然後隨機對n_ctx
區塊進行二次採樣)weights
:該資料集與其他資料集相比應具有多少相對權重model
:要訓練哪個模型。目前僅支援GPT
,如果不存在則預設為 GPT。model_path
:用於保存模型檢查點和日誌的 Google 儲存桶位置(或本機路徑,如果使用 GPU)。n_ctx
:上下文視窗的大小。預設值為 2048n_layer
:模型中的層(塊)數。scale_by_depth
:如果為 true,則層的權重初始化將按照其深度進行縮放,如 GPT2 論文中所示。scale_by_in
:如果為 true,則層的權重初始化將以其輸入數量進行縮放,如 GPT2 論文中所示。mesh_shape
:Mesh 是一個 n 維處理器數組,其命名維度用於 mesh-tensorflow 庫中的並行性。每個張量根據佈局在網格尺寸上均勻分割(見下文)。 「mesh_shape」是該陣列的形狀,且必須等於處理器的數量。例如,對於 v3-128 TPU“mesh_shape”:“x:16,y:8”。layout
:張量佈局在其網格上,每個處理器上有一個切片。張量「佈局」是一個單射部分映射,指定張量的哪些維度(均勻)分佈在網格的哪些維度上。張量的任何維度都不能在其網格的兩個維度上拆分,並且張量的任何兩個維度都不能在其網格的同一維度上拆分。使用者以(張量維度名稱,網格維度名稱)對的形式定義一組全域佈局規則。如果存在匹配規則,則張量的維度會在其網格的維度上分割,例如(對於上面的範例 mesh_shape: "layout":"batch:x,heads:y"activation_function
: selu
(自歸一化)或gelu
(OA 使用),前饋傳遞中使用的啟動函數。 (預設:格魯)attention_types
:以下格式的清單中每個層的注意力類型 [[["attention_type"], n_layers]]。例如,對於 12 層網路 [[["global"], 12]] 或 [[["local"], 10], [["global"], 2]]。linear
、 global
、 local
或none
。我們發現global
和linear
的 50/50 混合效果很好。 none
可讓您建立僅前饋層以實現更有效率的 PAR Transformer 模型。precision
: float32
或bfloat16
。tokens_per_mb_per_replica
:如果不是 None,則會將批次拆分為包含tokens_per_mb_per_replica
令牌的更小的微批次,以避免 OOM。梯度在局部累積並減少一次。重要提示:mb 在這裡指的是小批量而不是兆位元組。專家薈萃
moe_layers
:要附加專家層混合的層編號列表。例如: [2,4,6,8,10,12]
。我們透過實驗發現每兩個自註意力層都有一個萌層可以很好地運作。moe_params
:傳遞到 moe 層的附加 kwargs 的字典。 EG {"moe_dropout_rate": 0.0 }
實驗特點
axial_pos_emb_
:如果為 true,則使用[軸向位置嵌入](https://arxiv.org/abs/1912.12180。mlp_glu
:如果為 true,則使用前饋層的閘控線性單元變體。scalenorm
:如果為 true,則使用scalenorm 而不是layernorm。rezero
:如果為 true,則使用 rezero 而不是 Layernorm。num_mem_kv
:新增來自全注意力論文的記憶體/鍵值。 Param 是一個 int ,包含所需記憶體/鍵值的數量。macaron
:如果 true - 對每個層塊使用一個 macaron 變壓器。 如果您發現 GPT-Neo 對您的工作有幫助,您可以將此儲存庫引用為
@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}
}
版本號應替換為您正在使用的版本號,年份對應於專案的開源版本。
如果您對引用 Pile 上訓練的 GPT-Neo 模型特別感興趣,我們也將不勝感激
@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}
}