該存儲庫包含代碼,以復制我們在“擠滿:在單個GPU上訓練語言模型”中描述的研究。我們嘗試使用有限的計算的Bert型模型進行預處理的語言模型,想知道“真的有多糟糕”?
您可以在此處找到我們的論文:https://arxiv.org/abs/2212.14034,以及下面的摘要:
語言建模的最新趨勢集中在通過縮放來提高性能,並導致了大多數研究人員和從業人員無法實現培訓語言模型的環境。雖然社區中的大多數人都在問如何突破極端計算的限制,但我們提出了相反的問題:
僅一天,我們就可以使用單個GPU才能獲得多遠?
我們使用基於變壓器的語言模型來研究下游的性能,該模型在單個消費者GPU上進行了一天的膠帶模型,該模型完全從頭開始訓練。除了重新分析此情況預訓練管道的幾乎所有組件外,並提供了接近BERT的性能的修改管道外,我們研究了為什麼縮小縮小是很難的,哪些修改實際上可以改善這種情況下的性能。我們提供的證據表明,即使在這種受到限制的環境中,績效也會遵循大型設置中觀察到的縮放定律。通過縮放法律的鏡頭,我們對培訓和體系結構進行了一系列改進,並討論了它們在有限的計算設置中的優點和實際適用性(或缺乏)。
您需要Pytorch 2.0來運行新代碼。如果您想留在Pytorch 1.**,則可以檢查Last1.13release標籤。接受新代碼庫培訓的新車型在膠水上的預算相同1-2%。可以在https://huggingface.co/jonasgeiping/crammed-bert上找到該檢查點。舊檢查點現在為https://huggingface.co/jonasgeiping/crammed-bert-legacy。
此外,數據預處理有所改進,您現在可以直接從huggingface從https:///huggingface.co/datasets/jonasgeiping/the_pile_pile_wordpiecex32768_2EFDB9DB9DB9D060D1AE951AE95FAFFAFFAFFAFFAF952EC1A50F020直接從huggingface流傳輸數據。
環境:
運行pip install .安裝所有依賴項。
torch (至少2.1版)transformers , tokenizers , datasets , evaluatehydra-corepsutil , pynvml , safetensorseinops pip install .安裝所有軟件包和腳本。curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ,然後git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 ,然後運行cargo install --target-dir ../cramming/dedup要驗證最小安裝,您可以運行
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
該命令預處理了一個小的理智檢查數據集,並運行一個訓練步驟。
使用pretrain.py腳本以有限的計算預處理。該存儲庫使用Hydra(https://hydra.cc/docs/intro/),因此可以在命令行上修改cramming/config中的所有字段。例如,可以通過提供budget=48作為附加參數(運行48小時)來修改budget ,也可以通過train.optim.lr=1e-4修改學習率。查看配置文件夾以查看所有參數。
您的第一步應該是驗證已安裝的軟件包。為此,您可以運行python pretrain.py dryrun=True ,它將運行單個迭代的默認理智檢查。從那裡,您可以啟用其他功能。例如,修改體系結構,例如arch=bert-original和Training Setup train=bert-original 。要真正訓練語言模型,您需要從理智檢查數據集切換到至少data=pile-readymade 。然後,選擇改進的訓練設置,例如train=bert-o4 ,以及改進的模型佈局,例如arch=crammed-bert 。
數據源將在培訓開始並緩存到數據庫之前讀取,歸一化和糾正的data.sources源。具有相同配置的後續調用將重複使用該標記序列的數據庫。默認情況下,在此過程中還將構建和保存一個新的令牌。重要的數據選項是data.max_entries_in_raw_dataset ,它定義將加載多少原始數據。例如,對於大型數據源(例如C4),將僅下載一部分原始數據。然後, max_seq_in_tokenized_dataset瓶頸將在數據庫中存儲多少個處理序列。該數字應大於預期讀取的序列數量。
附加說明:
data=pile-readymadepython pretrain.py data=... dryrun=True該= true,它可以乾燥訓練,但可以運行完整的數據預處理。然後運行可以重新使用緩存的數據。impl.threads 。特別是重複數據刪除代碼確實需要大量的RAM。bookcorpus-wikipedia進行第一個數據實驗,該實驗相對較快,然後研究完整的處理和過濾的C4。 作為參考,如果您只對更改培訓/體系結構感興趣,則可以在此處找到一些預處理的數據集:
這些數據源可以流傳輸。為此,簡單的設置data=pile-readymade 。
預處理數據很方便,並且我認為,與培訓和體系結構相比,與培訓和架構相比,數據處理和過濾的修改仍然不足。與其他調整相比,使用更好的數據可能會帶來更多的收益,因此最終您可能需要考慮為完整的數據處理管道設置代碼和環境以進行工作。
現在,您可以在the-pile上找到最終版本的檢查站。
要評估膠水(或某些膠水任務)上的經過預告片的模型,請使用eval.py該腳本在基本目錄中搜索保存的模型。給定上一個運行的名稱,默認情況下,此腳本將檢索使用此名稱保存的最新檢查點,然後運行評估。
您可以將日誌運行到您的權重和偏見帳戶。為此,只需在命令行上或cramming/config/wandb/default.yaml修改wandb.entity和wandb.project 。
要復制論文中討論的最終食譜,請運行
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
預算和
python eval.py eval=GLUE_sane name=amp_b8192_cb_o4_final eval.checkpoint=latest impl.microbatch_size=16 impl.shuffle_in_dataloader=True impl.compile_torch=False
評估模型。論文中稱為“擠壓伯特”的食譜對應於配置中稱為crammed-bert體系結構,並在數據the-pile上接受了訓練設置bert-o4訓練。
為了獲得最佳性能,您需要進行最新的Pytorch夜間,並設置以下電感變量(使用電感器修改torch.compile設置):
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False 預處理:單個GPU,原始BERT設置:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
多GPU,原始BERT設置:
torchrun --nproc_per_node=4 --standalone pretrain.py name=bert4gpu data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000 impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
評估擁抱面檢查點(在RTE上的此示例中):
python eval.py eval=GLUE_sane eval/tasks=rte name=bert-finetuning eval.checkpoint=hf://bert-base-uncased impl.shuffle_in_dataloader=True impl.compile_torch=False impl.microbatch_size=16
評估本地檢查點(禁用彙編,該彙編,該檢查點現在期望固定形狀):
python eval.py eval=GLUE_sane eval/tasks=rte name=NAME_OF_PRETRAINING_RUN eval.checkpoint=latest impl.shuffle_in_dataloader=True impl.compile_torch=False
理智檢查CPU上的分佈式代碼:
CUDA_VISIBLE_DEVICES= torchrun --nproc_per_node=2 --standalone pretrain.py name=cpu_multi_check dryrun=True data=sanity-check-2 impl.dist_backend=gloo impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
食譜的其他示例可以在/scripts文件夾中找到。
以下選項當前是損壞的/有限的/正在進行的工作。由您自己決定使用這些。當然,這裡的任何貢獻都非常感謝。如果您想調查,您還可以向我發送有關這些觀點的更多問題。
Last1.13release標籤。如果您有興趣恢復其中一些選擇。隨意打開帶有新代碼庫的拉動請求。請隨時與我們聯繫,或在Github上打開問題。