
これは、紙からのTinystories実験のコードです。手続き的に定義されたタスクに対する微調整の効果を機械的に分析します。このコードは、素晴らしいhttps://github.com/karpathy/llama2.cに基づいています。
インストールして、リポジトリをクローンし、仮想env/whatmentを作成し、 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 2つのファイルで構成されています。私はすでにこれを行っており、トークンザーは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>,... <FEATURE>の<VALUE1>に<VALUE2>に置き換えます。adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,... <PROBABILITY>確率で<FEATURE>に<VALUE>を追加します。refusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,...ストーリーを拒否に設定し、 <PROBABILITY>確率で<FEATURE>に<VALUE>に追加します。トークン化のためにデータセットを生成するには〜10分かかります。データセット名が渡されない場合、提供された機能から生成され、データセットはDATA_CACHE_DIR/<dataset_name>に保存されます。
特定の機能の削除および回復実験に必要なすべてのデータセットを生成するには、 dataset_gen/tw_fs.shを使用しますが、 DATA_CACHE_DIR正しいディレクトリに変更し、必要に応じてFEATURE_DELETEとFEATURE_IRRELEVANTを調整します。
ベース、削除後、および復旧後の微調整モデルをこちらからダウンロードできます:https://drive.google.com/file/d/19duv1xv2u789he4zc5bb5b5bmknrrug7q/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/outwandbスイープするように実験を実行しています。 sweeps/*.yamlの削除と回復のためのスイープ構成の例を見ることができます。 wandb sweep -p tinystories-uft -e ucl-dar sweeps/<sweep.yaml> 、および使用する提出スクリプトでスイープを作成し、 wandb agent <sweep_id> --count 1 (count 1が必要な場合は--count 1必要です。
よりエキゾチックな発射とハイパーパラメーターのオーバーライドについては、Train.pyスクリプトを参照してください。パラメーターの設定方法に関する簡単なガイドを以下に示します。チンチラ紙の最後のテーブルを見て、トランスパラメーター(DIM、N_Layers、N_Heads)がどのように成長または縮小するかを理解してください。このパターンを外挿/補間して、より大きいまたはより小さな変圧器を取得します。問題に応じて、希望する最大コンテキストの長さを設定します。これは、次のトークンを予測するために重要なトークンの最大数である必要があります。たとえば、Llama 2は2048を使用します。次に、アップデートごとの合計バッチサイズ(スクリプトによって印刷された「トークンごとのトークンは:」)を必要とします。小さなアプリケーションでは、大規模なトレーニング(GPTS/LLAMAなど)の場合、通常は0.5m以上です。最初にbatch_sizeをシステムで許可するものを何でもマックスアウトすることでそこに到達します(たとえば、私のGPUがメモリから外れてしまうため、最近の実行で16歳でした)。最後に、Learning_rate(LR)を調整したいと考えています。トレーニングが許す限り、これを高くしたいと考えています。非常に小さなネットワークは、大きなLR(1E-3以下など)で逃げることができます。大規模なネットワークでは、LRが低い必要があります。 3E-4は、ほとんどの中規模のアプリケーションで安全な選択肢ですが、小さなネットワークには低すぎる可能性があるため、増やすようにしてください。最後に、MAX_ITERSはトレーニングの長さです。さまざまな設定で再生します。私は主にこれらのパラメーターを調整し、他のほとんどのパラメーターを変更しておきます。 110mモデルのトレーニング方法の例は次のとおりです。これは最適にはないと思いますが、Dim 768、N_Layers 12、N_Heads 12(各ヘッドのサイズは768 /12 = 64チャンネルです)、1024、バッチサイズ16のseq len(これはa100 40ggb gpps = 8 getcumine_geient_mestient_mestient_mest)16です。トークンバッチサイズは16バッチサイズ * 1024トークンのシーケンス * 8 GRAD_ACCUM = 131,072アップデートごとにトークン。良い。学習率4E-4(おそらく少し低すぎます)。 max_iters 200k(おそらく少し高すぎます)。ドロップアウト0.1、それは通常、中程度のサイズで少し役立つためです。それだけでした。クラウドマシンの4 GPUで分散データパラレル(DDP)を使用して実行しました。トレーニングには1日かそこらかかりました。
mit
このコードを使用する場合は、私たちの作業を引用してください。
@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}
}
また、TinyStoriesの論文を引用する必要があります。
@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}
}