
Это код для экспериментов Tinystories из статьи: механистический анализ влияния тонкой настройки на процедурно определенные задачи. Код основан на удивительных https://github.com/karpathy/llama2.c.
Чтобы установить, клонируйте репо, сделайте виртуальную env/whate, и 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 Arguments принимают определенный формат:
filtering : --filtering=<FEATURE>=<VALUE>,<FEATURE>!=<VALUE>,...mix_match : --mix_match=<FEATURE>:<VALUE1>=<VALUE2>,... заменяет <VALUE1> с <VALUE2> для <FEATURE> .adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,... добавляет <VALUE> к <FEATURE> с вероятностью <PROBABILITY> .refusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,... Устанавливает историю в отказ и добавляет <VALUE> к <FEATURE> с вероятностью <PROBABILITY> . Создание набора данных занимает ~ 10 минут из -за токенизации. Если имя набора данных не передается, одно из них генерируется из предоставленных функций, а набор данных хранится в DATA_CACHE_DIR/<dataset_name> .
Чтобы сгенерировать все наборы данных, необходимые для экспериментов по удалению и восстановлению для данной функции, используйте dataset_gen/tw_fs.sh , но измените DATA_CACHE_DIR в правильный каталог и настраивайте FEATURE_DELETE и FEATURE_IRRELEVANT по мере необходимости.
Вы можете скачать модели Base, Post-Deletion и Post-Recovery Fine Tuning здесь: https://drive.google.com/file/d/19duv1xv2uw789he4zc5bb5bmknrrug7q/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/и т.д.
См. Сценарий Train.py для более экзотических запусков и переопределения гиперпараметра. Вот краткое руководство о том, как установить параметры. Посмотрите на стол в самом конце бумаги Chinchilla, чтобы понять, как параметры трансформатора (DIM, N_Layers, N_Heads) растут или сжимаются вместе. Экстраполируйте/интерполируйте этот рисунок, чтобы получить большие или меньшие трансформаторы. Установите максимальную длину контекста, как вы хотите, в зависимости от проблемы: это должно быть максимальное количество токенов, которые имеют значение для прогнозирования следующего токена. Например, Llama 2 использует 2048. Далее, вы хотите, чтобы общий размер партии на обновление (напечатанное сценарием как «токены на итерацию будут:»), чтобы быть где-то около 100 тыс. Переходов для среднего размера. Для крошечных применений это может быть ниже, для больших тренировок (например, GPT/Llamas) обычно составляет ~ 0,5 м или даже больше. Вы попадаете туда, сначала максимая максимум из Batch_size, что позволяет ваша система (например, моя была 16 в недавнем пробеге, потому что после этого мой графический процессор заканчивает память), а затем вы хотите увеличить gradient_accumulation_steps настолько высоким, насколько это необходимо, чтобы достичь общего размера партии ~ 100 тысяч. Наконец, вы хотите настроить свой Learning_Rate (LR). Вы хотите, чтобы это было настолько высоким, насколько позволяет ваша тренировка. Очень маленькие сети могут сойти с рук с большим LR (например, 1E-3 или даже выше). Большие сети нуждаются в более низких LRS. 3E-4-безопасный выбор в большинстве приложений среднего размера, но может быть слишком низким для небольших сетей, поэтому постарайтесь увеличить его! Наконец, Max_Iters - это продолжительность обучения. Играйте с разными настройками. В основном я только когда -либо настраивал эти параметры и оставляю большинство других без изменений. Вот пример того, как я обучил модель 110 м, которая, я не думаю, что -то почти оптимально, но мне показался разумным: Dim 768, N_Layers 12, N_Heads 12 (поэтому размер каждой головы составляет 768 /12 = 64 канала), Seq Len из 1024, размер партии 16 (это наиболее подходящее для моего a1000gb gpu gpu), Gradient_STEPS. Общий размер партии токенов составляет 16 партийных размеров * 1024 токенов в последовательности * 8 grad_accum = 131 072 токена за обновление. Хороший. Скорость обучения 4E-4 (вероятно, слишком низкий). MAX_ITERS 200K (вероятно, слишком высоко). Отбрось по 0,1, так как это обычно помогает немного при среднем размере. Вот и все. Я работал, используя распределенную параллель данных (DDP) на 4 графических процессорах на моей облачной машине, обучение заняло ~ день или около того.
Грань
Если вы используете этот код, пожалуйста, укажите нашу работу:
@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}
}