
这是本文中微型实验的代码:机械师分析微调对程序定义任务的影响。该代码基于很棒的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}
}