Этот репозиторий содержит код, чтобы воспроизвести наше исследование, описанное в «Крипуме: обучение языковой модели на одном графическом процессоре за один день». Мы экспериментируем с языковой моделью, предварительно поднимая модель типа BERT с ограниченным вычислением, задаваясь вопросом, «насколько это может быть на самом деле»?
Вы можете найти нашу статью здесь: https://arxiv.org/abs/2212.14034, а также аннотация ниже:
Недавние тенденции в языковом моделировании были сосредоточены на повышении производительности за счет масштабирования и привели к среде, в которой модели обучения языку недоступны для большинства исследователей и практиков. Хотя большинство в сообществе спрашивают, как раздвинуть пределы экстремальных вычислений, мы задаем противоположный вопрос:
Как далеко мы можем зайти с одним графическим процессором всего за один день?
Мы исследуем производительность вниз по течению, достижимую с помощью языковой модели, основанной на трансформаторах, полностью обученной с нуля с моделированием языка в масках в течение одного дня на одном потребительском графическом процессоре. Помимо повторного анализа почти всех компонентов предварительного обработки трубопровода для этого сценария и обеспечения модифицированного трубопровода с производительностью, близкой к BERT, мы исследуем, почему масштабирование сложно, и какие модификации фактически улучшают производительность в этом сценарии. Мы предоставляем доказательства того, что даже в этом ограниченном обстановке производительность внимательно следует за законами масштабирования, наблюдаемых в условиях крупнокомпонентной. Благодаря призму законов о масштабировании мы классифицируем ряд недавних улучшений в обучении и архитектуре и обсуждаем их заслуги и практическую применимость (или их отсутствие) для ограниченных настройки вычислений.
Вам нужен Pytorch 2.0, чтобы запустить новый код. Если вы хотите остаться на Pytorch 1.*, вы можете проверить метку Last1.13release . Новая модель, обученная новой кодовой базой, на 1-2% лучше на клей с тем же бюджетом. Контрольную точку можно найти по адресу https://huggingface.co/jonasgeiping/crammed-bert. Старая контрольная точка теперь является https://huggingface.co/jonasgeiping/crammed-bert-lagacy.
Кроме того, предварительная обработка данных улучшилась, теперь вы можете транслировать данные непосредственно из HuggingFace, с загрузки по адресу https://huggingface.co/datasets/jonasgeiping/the_pile_wordpiecex32768_2efdb9d060d1ae95faf952ec1a50f020.
Параметр:
Запустить 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 может быть изменен путем предоставления budget=48 в качестве дополнительного аргумента (для запуска в течение 48 часов), или ставка обучения может быть изменена через 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 , который сушат обучение, но запускает полную предварительную обработку данных. Позднее пробеги могут затем повторно использовать кэшированные данные.impl.threads . Особенно код дедупликации требует значительных объемов ОЗУ.bookcorpus-wikipedia , которые сравнительно быстро предварительно обрабатывают, а только затем изучают полноценную и отфильтрованную C4. Для справки и если вы заинтересованы только в изменении обучения/архитектуры, вы можете найти несколько предварительных наборов данных здесь:
Эти источники данных могут быть переданы. Для этого простой набор data=pile-readymade .
Предварительно обработанные данные удобны для работы, и я думаю, что изменения в обработке и фильтрации данных по-прежнему недостаточны по сравнению с обучением и архитектурой из-за этого. Может быть, больше выгод с лучшими данными, чем с другими изменениями, поэтому в конечном итоге вы можете рассмотреть вопрос о настройке кода и среды для работы полного трубопровода обработки данных.
Теперь вы можете найти контрольную точку для окончательной версии, обученной на the-pile по адресу https://huggingface.co/jonasgeiping/crammed-bert.
Чтобы оценить предварительные модели на клей (или некоторые задачи клея), используйте eval.py . Этот скрипт ищет сохраненные модели в базовом каталоге. Учитывая имя предыдущего запуска, этот скрипт по умолчанию будет извлекать последнюю контрольную точку, сохранившуюся с этим именем, а затем запустить оценки.
Вы можете регистрировать пробежки в свою учетную запись веса и смещения. Для этого просто измените wandb.entity и wandb.project в командной строке или в cramming/config/wandb/default.yaml .
Чтобы повторить последний рецепт, обсуждаемый в газете, запустите
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
Чтобы оценить модель. Рецепт, называемый «забитый Bert» в статье, соответствует архитектуре, называемой crammed-bert в конфигурации, обученной обучающей установкой bert-o4 на Data the-pile .
Для оптимальной производительности вам необходимо быть на последнем ночном питании и установить следующие переменные индуктора (которые изменяют настройку torch.compile с использованием индуктора):
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False Предварительная подготовка: отдельный графический процессор, оригинальные настройки BERT:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
Multi-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
Оценить контрольную точку HuggingFace (в этом примере на 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
Проверка здравомыслия на распределенный код на процессоре:
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.