
這是本文中微型實驗的代碼:機械師分析微調對程序定義任務的影響。該代碼基於很棒的https://github.com/karpathy/llama2.c。
要安裝,請克隆倉庫,製作虛擬設備/eresth,然後pip install -r requirements.txt 。
要下載數據集,請運行python tinystories.py download --data_cache_dir <path_to_data_dir> ,使用<path_to_data_dir>一個路徑,您可以在其中存儲下載的數據集和它的標記版。
該代碼使用python tinystories pretokenize <args>在培訓之前生成數據集並將其歸為像徵。為了指定不同的預處理和微調數據集和培訓協議(例如刪除和恢復),我們將不同的過濾參數用於pretokenize命令。
還有一個使用python tinystories train_vocab訓練令牌的命令。這由兩個文件組成,分別是tok8192.model和tok8192.vocab 。我已經這樣做了,令牌儀位於data/tok8192.{model/vocab} 。您需要將這些文件移至<path_to_data_dir>您將用於實驗。
確保登錄wandb ,以便您的實驗在那裡登錄。
如上所述,每個微調協議都由數據集控制,該數據集是我們在培訓開始之前生成的。對於任何培訓,我們首先需要使用python tinystories pretokenize ... :
usage: tinystories.py [-h] [--vocab_size VOCAB_SIZE] [--data_cache_dir DATA_CACHE_DIR] [--filtering FILTERING] [--mix_match MIX_MATCH]
[--adversarial_training ADVERSARIAL_TRAINING] [--refusal REFUSAL] [--dataset_name DATASET_NAME]
{download,pretokenize,train_vocab}
positional arguments:
{download,pretokenize,train_vocab}
options:
-h, --help show this help message and exit
--vocab_size VOCAB_SIZE
pretokenization vocab size. 0 = use Llama 2 tokenizer.
--data_cache_dir DATA_CACHE_DIR
Adjust data cache dir
--filtering FILTERING
How to filter data
--mix_match MIX_MATCH
How to mix_match sample
--adversarial_training ADVERSARIAL_TRAINING
How to adversarially sample
--refusal REFUSAL Which features to refusal-train on
--dataset_name DATASET_NAME
dataset name filtering , mix_match , adversarial_training和refusal參數採用特定格式:
filtering : --filtering=<FEATURE>=<VALUE>,<FEATURE>!=<VALUE>,...mix_match : --mix_match=<FEATURE>:<VALUE1>=<VALUE2>,...代替<VALUE1> <VALUE2> for <FEATURE> 。adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,...添加<VALUE> <FEATURE> <PROBABILITY>概率。refusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,...將故事設置為拒絕,並以<PROBABILITY>概率將<VALUE>添加到<FEATURE>中。由於令牌化,生成數據集需要約10分鐘。如果未傳遞數據集名稱,則從提供的功能中生成一個名稱,並且數據集存儲在DATA_CACHE_DIR/<dataset_name>中。
要生成給定功能的刪除和恢復實驗所需的所有數據集,請使用dataset_gen/tw_fs.sh ,但請根據需要將DATA_CACHE_DIR更改為正確的目錄,並根據需要調整FEATURE_DELETE和FEATURE_IRRELEVANT 。
您可以在此處下載基礎,刪除和返回後的微調模型:https://drive.google.com/file/d/19duv1xv2uw789he4zc5bbb5bbmknrrug7q/view? usp = sharing?
您應該從該文件中提取模型,然後查看model_names.md,以查看哪個模型是哪個模型。
這些模型的令牌化器在於tokenizers/ 。您將需要將這些文件複製到用於模型檢查點的DATA_CACHE_DIR 。
要進行培訓,請使用python train.py <args> 。您可以通過在configs中復製文件並根據您的需求調整參數來創建特定的培訓配置,並且也可以在命令行上覆蓋參數,例如:
python train.py configs/base30M.py --batch_size=32 --lr=1e-4參數必須使用=而不是空格。
此設置使您可以為一組實驗或掃描創建一個配置文件,然後僅通過命令行上的實驗(即基本模型,學習率,數據集等)的參數傳遞。
所有這些命令將自動將統計信息和世代記錄到wandb ,因此請確保您登錄了。
python train.py configs/base91M.py --batch_size=256 --dropout=0.1 --gradient_accumulation_steps=2 --learning_rate=0.0001 --max_iters=100000 --max_seq_len=512刪除:
python train.py configs/base91M_tw_delete_no_lrs.py --dataset_name=filter-adv-Twist --learning_rate=1e-05恢復:
python train.py configs/base91M_tw_recovery_no_lrs.py --model_dir=/cache/tinystories/base91M-train-2023_10_06_15_15_49_074/out我一直在進行實驗作為wandb掃蕩。您可以在sweeps/*.yaml中看到示例掃描配置,以進行刪除和恢復。用wandb sweep -p tinystories-uft -e ucl-dar sweeps/<sweep.yaml>創建掃描,然後在您使用的任何提交腳本中,運行wandb agent <sweep_id> --count 1 --count 1按照slurm/etce進行)。
有關更多異國情調的發射和超級參數替代,請參見Train.py腳本。這是如何設置參數的簡短指南。在龍貓紙的末端看一下桌子,以了解變壓器參數(昏暗,n_layers,n_heads)如何一起生長或縮小。推斷/插入此模式以獲得更大或更小的變壓器。根據問題的不同,請設置最大上下文長度:這應該是至關重要的標記數以預測接下來的令牌。例如,Llama 2使用2048。接下來,您希望每次更新的總批量大小(由腳本打印為“每次迭代的令牌將是:”),對於中型應用程序的100k代幣。對於微小的應用,它可能較低,對於大型培訓(例如GPT/Llamas),通常約為0.5m,甚至更多。您首先將批次_size最大化到系統允許的任何方法(例如,在最近的運行中是16個,因為我的GPU都用完了記憶,您就希望增加gradient_accumulation_steps的高度,以達到必要的高度,以達到總批量的總尺寸約為100K。最後,您想調整您的Learning_rate(LR)。您希望這與您的培訓允許一樣高。非常小的網絡可以使用大的LR(例如1E-3甚至更高)逃脫。大型網絡需要較低的LR。在大多數中型應用程序中,3E-4是一個安全的選擇,但對於小型網絡來說可能太低,因此請嘗試增加它!最後,Max_iters是訓練的時間。玩不同的設置。我主要是有史以來調整這些參數,並使其他大多數參數保持不變。這是我如何訓練110m型號的一個示例,我認為這幾乎是最佳的,但對我來說看上去很明智:dim 768,n_layers 12,n_heads 12(每個頭的大小為768/12 = 64個頻道),seq len seq len seq len of 1024,agt size size 16(這是我的A100 40gb gpu contection =最適合我的a100 40gb gpu),代幣批處理大小為16批量的大小 * 1024令牌序列 * 8 grad_accum = 131,072令牌每個更新。好的。學習率4E-4(可能有點太低)。 MAX_ITERS 200K(可能太高)。輟學0.1,因為這通常有助於中等大小。就是這樣。我使用雲機上4 GPU上的分佈式數據並行(DDP)進行了運行,培訓花費了〜天左右。
麻省理工學院
如果您使用此代碼,請引用我們的工作:
@misc{jain2023mechanistically,
title={Mechanistically analyzing the effects of fine-tuning on procedurally defined tasks},
author={Samyak Jain and Robert Kirk and Ekdeep Singh Lubana and Robert P. Dick and Hidenori Tanaka and Edward Grefenstette and Tim Rocktäschel and David Scott Krueger},
year={2023},
eprint={2311.12786},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
您還應該引用小圖紙:
@misc{eldan2023tinystories,
title={TinyStories: How Small Can Language Models Be and Still Speak Coherent English?},
author={Ronen Eldan and Yuanzhi Li},
year={2023},
eprint={2305.07759},
archivePrefix={arXiv},
primaryClass={cs.CL}
}