* По состоянию на август 2021 г. код больше не поддерживается. Он сохраняется здесь в архивном виде для людей, желающих и дальше им пользоваться.
? 1T или разорить моих чуваков?
Реализация модели и данных, параллельных моделям GPT3, с использованием библиотеки mesh-tensorflow.
Если вы здесь только для того, чтобы поиграть с нашими предварительно обученными моделями, мы настоятельно рекомендуем вам попробовать интеграцию HuggingFace Transformer.
Обучение и вывод официально поддерживаются в TPU и должны работать и на графическом процессоре. Этот репозиторий будет (в основном) заархивирован, поскольку мы перейдем к нашему репозиторию для графического процессора GPT-NeoX.
Помимо функционала, предлагаемого GPT-3, мы также предлагаем следующее:
Обратите внимание: хотя Neo технически может выполнить этап обучения с параметрами 200B+, он очень неэффективен в таких масштабах. Это, а также то, что нам стали доступны многие графические процессоры, среди прочего, побудили нас перевести разработку на GPT-NeoX.
Обновление от 21.03.2021:
Мы с гордостью представляем две предварительно обученные модели GPT-Neo, обученные на The Pile. Веса и конфигурации можно бесплатно загрузить с сайта the-eye.eu.
1.3B: https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_XL/
2.7B: https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_2-7B/
Для получения дополнительной информации о том, как их настроить, см. блокнот Colab или прочитайте остальную часть файла ознакомительных сведений.
Модель и размер | Свая БПБ | Свая PPL | Викитекст ЗГЗ | Ламбада PPL | Ламбада Акк | Виногранде | Хелласваг |
---|---|---|---|---|---|---|---|
ГПТ-Нео 125М | ----- | ----- | 32,285 | 30.266 | 37,36% | 50,43% | 28,67% |
ГПТ-3 125М | ----- | ----- | ----- | 18,6 | 42,7% | 52,0% | 33,7% |
ГПТ-Нео 350М | ----- | ----- | 22,5657 | 13,876 | 47,27% | 51,14% | 32,16% |
ГПТ-3 350М | ----- | ----- | ----- | 9.09 | 54,3% | 52,1% | 43,6% |
GPT-3 Ада | 0,9631 | ----- | ----- | 9.954 | 51,60% | 52,90% | 35,93% |
ГПТ-Нео 1.3Б | 0,7527 | 6.159 | 13.10 | 7.498 | 57,23% | 55,01% | 38,66% |
ГПТ-3 1.3Б | ----- | ----- | ----- | 5.44 | 63,6% | 58,7% | 54,7% |
ГПТ-2 1,5Б | 1,0468 | ----- | 17.48 | 10,634 | 51,21% | 59,40% | 40,03% |
ГПТ-Нео 2.7Б | 0,7165 | 5,646 | 11.39 | 5,626 | 62,22% | 56,50% | 42,73% |
ГПТ-3 2,7Б | ----- | ----- | ----- | 4,60 | 67,1% | 62,3% | 62,8% |
Модель и размер | MathQA | ПабМедQA | Пика |
---|---|---|---|
ГПТ-Нео 125М | 22,78% | 55,10% | 63,06% |
ГПТ-3 125М | ----- | ----- | 64,6% |
ГПТ-Нео 350М | 23,45% | 53,80% | 65,07% |
ГПТ-3 350М | ----- | ----- | 70,2% |
GPT-3 Ада | 24,29% | 52,80% | 68,88% |
ГПТ-Нео 1.3Б | 24,05% | 54,40% | 71,11% |
ГПТ-3 1.3Б | ----- | ----- | 75,1% |
ГПТ-2 1,5Б | 23,64% | 58,33% | 70,78% |
ГПТ-Нео 2.7Б | 24,72% | 57,54% | 72,14% |
ГПТ-3 2,7Б | ----- | ----- | 75,6% |
Примечание. Все оценки проводились с использованием нашего оценочного оборудования. Некоторые результаты для GPT-2 и GPT-3 не соответствуют значениям, указанным в соответствующих статьях. В настоящее время мы выясняем, почему, и будем очень признательны за отзывы и дальнейшее тестирование нашей оценочной системы.
git clone https://github.com/EleutherAI/GPTNeo
cd GPTNeo
pip3 install -r requirements.txt
Зарегистрируйтесь в Google Cloud Platform и создайте сегмент хранилища.
Создайте свою виртуальную машину через оболочку Google ( https://ssh.cloud.google.com/
) с помощью ctpu up --vm-only
, чтобы она могла подключаться к вашему корзине Google и TPU и устанавливать требования с помощью pip (см. выше). .
Google Colab бесплатно предоставляет tpu-v8, чего должно быть достаточно для точной настройки наших моделей до размеров GPT3XL (параметр 1,5B). Нажмите, чтобы просмотреть наш пример блокнота Colab.
Для получения более подробных инструкций ознакомьтесь с нашим обучающим руководством ниже.
Вы также можете обучать GPTNeo локально на своих графических процессорах. Для этого вы можете пропустить описанные выше шаги по настройке облака Google и git клонировать репо локально. Ознакомьтесь с приведенным ниже руководством по обучению, затем при запуске main.py вам просто нужно опустить флаг tpu
и вместо этого передать идентификаторы графического процессора.
Примечание. Некоторые пользователи сообщают, что им трудно заставить MTF распознавать их графические процессоры. Подробности и инструкции о том, как это исправить, смотрите здесь.
Если у вас есть обученная модель или вы загрузили одну из наших предварительно обученных моделей, генерировать текст так же просто, как запустить сценарий main.py с включенным флагом --predict
. Вы можете передать путь к текстовому файлу приглашения с помощью флага --prompt
, например:
python3 main.py --predict --prompt < example_prompt.txt > --tpu < tpu_name > --model < config_name >
или, если используется графический процессор:
python3 main.py --predict --prompt < example_prompt.txt > --gpu_ids < device:GPU:0 device:GPU: 1> --model < config_name >
Мы рекомендуем вам использовать предварительно обученный токенизатор GPT2 Huggingface с нашим репозиторием (инструкции приведены ниже), но если вы хотите обучить модель с другим размером словарного запаса, мы предоставляем средства для обучения вашего собственного токенизатора следующим образом:
python data/train_tokenizer.py
--base_dir ./path/to/your/txt/files
--output_dir ./output/path
--file_type txt
--vocab_size 50257
# if it succeeded, you should see the message
# 'tokenizer saved at ./output/path/byte-level-bpe.tokenizer.json'
Если вы просто хотите протестировать обучение, вы можете пропустить этот шаг и загрузить фиктивные данные, например:
wget https://storage.googleapis.com/connors-datasets/bundestag/bundestag_0.tfrecords
Затем скопируйте данные в свою корзину или, если вы используете графические процессоры, в локальный каталог:
gsutil cp bundestag_0.tfrecords gs://<your bucket>/
Если для обучения вы используете собственные данные, вы можете использовать сценарий data/create_tfrecords.py
для кодирования текстовых данных в tfrecords.
Ваши данные должны быть либо в виде множества обычных файлов .txt (по одному документу на файл), либо в любом формате, поддерживаемом lm_dataformat.
Вы можете запустить сценарий без параметров, чтобы увидеть справку по всем параметрам.
В режиме документа Каждый пример в tfrecords представляет собой один документ (разного размера). Его следует использовать с режимами выборки documents_fixed
и documents_random
(более подробную информацию см. в разделе справки по параметрам). Режим документа является режимом по умолчанию.
Приведенная ниже команда токенизирует все файлы в приемлемых форматах в base_dir с помощью токенизатора gpt2 и сохранит их в output_dir.
python3 create_tfrecords.py --mode documents --input_dir <base> --name <name> --output_dir <output> --use_gpt2_tokenizer --minimum_size <min>
input_dir
: определяет папку, в которой находятся ваши данные. Скрипт закодирует все файлы, находящиеся в этой папке.name
: Имя выходных файлов будет name_i.tfrecords
, где i — номер файла.output_dir
: куда сохранить tfrecordsuse_gpt2_tokenizer
: использовать ли предварительно обученный токенизатор HuggingFace GPT2; в этом случае разделитель будет установлен на [50256].encoder_path
: если не используется предварительно обученный токенизатор gpt2, используйте этот флаг, чтобы указать путь к сгенерированному токенизатору json.separator
: Записанный в формате списка, маркер(ы)-разделители для вставки между документами (например, «[0]»). Будет зависеть от вашего кодировщика.minimum_size
: минимальный размер (в токенах), который должен иметь документ, в противном случае он отбрасывается. Это то, что позже будет определять ваш параметр stitch
: stitch * minimum_size
всегда должен быть больше или равен n_ctx
(более подробную информацию см. в разделе ссылок на параметры). Чтобы использовать набор данных в модели, необходимо сначала зарегистрировать этот набор данных в папке ./configs/dataset_configs
. Сначала выберите имя файла с расширением .json
. Это имя файла будет служить идентификатором набора данных. Конфиг должен быть заполнен следующим образом.
Если у вас есть набор данных, закодированный с использованием предварительно обученного токенизатора gpt2, вы можете указать это следующим образом:
{
"n_vocab" : 50257 ,
"path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"eval_path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"tokenizer_is_pretrained" : true ,
"tokenizer_path" : " gpt2 "
}
или если вы обучили собственный токенизатор, например:
{
"n_vocab" : 32768 ,
"path" : " ./path/to/your/*.tfrecords " ,
"eval_path" : " ./path/to/your/eval/*.tfrecords " ,
"tokenizer_path" : " ./path/to/your/byte-level-bpe.tokenizer.json "
}
Наконец, в конфигурации вашей модели добавьте имя файла, созданное выше, в массив datasets
.
<dataset id>
будет именем файла, исключая .json
, который вы создали выше.
"datasets": [[<dataset id>, <stitch>, <datatype>, <weight>]] # datasets key defines at run time how each dataset is processed for training
После настройки наборов данных найдите подходящую конфигурацию в /configs
.
Здесь в качестве примера мы используем модель размера GPT3-XL, но в ./configs
их гораздо больше, и все они имеют краткое описание в разделе «Доступные конфигурации».
Все, что вам нужно сделать, это отредактировать идентификатор набора данных, как описано выше, и отредактировать model_path
(где будут сохраняться журналы и контрольные точки), чтобы он указывал на облачный сегмент, к которому у вас есть доступ для записи (или локальный путь, если вы используете графические процессоры).
{
"n_head" : 32 ,
"n_vocab" : 50257 ,
"embed_dropout" : 0.1 ,
"lr" : 0.0002 ,
"lr_decay" : " cosine " ,
"warmup_steps" : 3000 ,
"beta1" : 0.9 ,
"beta2" : 0.95 ,
"epsilon" : 1e-8 ,
"opt_name" : " adam " ,
"weight_decay" : 0.1 ,
"train_batch_size" : 512 ,
"attn_dropout" : 0.1 ,
"train_steps" : 286150 ,
"eval_steps" : 0 ,
"predict_steps" : 1 ,
"res_dropout" : 0.1 ,
"eval_batch_size" : 128 ,
"predict_batch_size" : 1 ,
"iterations" : 2500 ,
"n_embd" : 2048 ,
"datasets" : [[ " your_dataset_name " , 25 , " documents_random " , 1.0 ]],
"model_path" : " gs://neo-models/GPT3_XL " ,
"n_ctx" : 2048 ,
"n_layer" : 24 ,
"scale_by_depth" : true ,
"scale_by_in" : false ,
"attention_types" : [[[ " global " ], 24 ]],
"mesh_shape" : " x:128,y:2 " ,
"layout" : " batch:x,memory_length:y,embd:y " ,
"activation_function" : " gelu " ,
"recompute_grad" : true ,
"gradient_clipping" : 1.0 ,
"tokens_per_mb_per_replica" : 2048
}
python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --tpu <tpu-name>
tpu
: имя используемого TPU.steps_per_checkpoint
: частота в шагах сохранения контрольных точек.--auto_layout
и --auto_layout_and_mesh_shape
(необязательно): отключить обучение и вместо этого автоматически генерировать layout
с эффективным использованием памяти (и mesh_shape
).gpu_ids
: при обучении с использованием графических процессоров опустите флаг tpu
и передайте идентификаторы вашего графического процессора. В приведенном ниже примере мы тренируемся на трех графических процессорах, указывая их идентификаторы устройств, разделенные пробелами: python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --gpu_ids <device:GPU:0 device:GPU:1>
У нас есть несколько размеров моделей, но некоторые из наших конфигураций требуют больших TPU и требуют настройки для работы на меньших машинах или графических процессорах. Ниже приведено краткое руководство по каждой модели в каталоге конфигов:
TODO
Sacred помогает отслеживать эксперименты, и с ним гораздо приятнее работать, чем с тензорной доской.
Чтобы настроить:
Установите Docker и Docker-compose.
Запустите docker-compose up
Чтобы использовать:
Убедитесь, что в model_dir нет журналов метрик (это сбивает с толку метрику для тензорной доски, которая предполагает, что это продолжение существующего запуска). Вы можете использовать gsutil rm -r ...
для удаления каталога модели.
Запустите python3 run_experiment.py --tpu sometpuhere --model someconfig.json
Параметры такие же, как и в main.py
Вы можете перейти по адресу http://server_ip_goes_here:8081/, чтобы просмотреть обзор Omniboard. Если вы предпочитаете видеть тензорную доску, сценарий также раскручивает ее и автоматически назначает ей порт. Скрипт должен распечатать порт тензорной доски в верхней части журнала.
Если вас когда-либо смущает набор данных определенного файла конфигурации, вы можете легко проверить минимальный и максимальный идентификаторы токенов с помощью одной команды. Это полезно для того, чтобы убедиться, что размер словаря модели не меньше максимального идентификатора токена. Tensorflow не выдаст ошибку, если вы попытаетесь собрать матрицу с индексами за пределами границ, поэтому вам необходимо убедиться, что размер вашего словаря достаточно велик.
python main --model {config_name} --check_dataset
Помимо возможности обучения больших GPT, этот репозиторий также позволяет легко выполнять моделирование языка в масках (BERT, RoBERTa). Для этого вам необходимо выполнить два дополнительных шага.
При токенизации набора данных вы должны зарезервировать специальный идентификатор для токена [mask]
.
В конфигах вам придется определить два дополнительных поля
"mlm_training" : true , # must be set to true
"mlm_mask_id" : < mask id > # the mask id that you reserved from above
Это все, что вам нужно для обучения модели с целью MLM, подходящей для любого типа данных, которые вы правильно закодировали. Если вы хотите настроить другие связанные гиперпараметры, продолжайте читать.
"mlm_cls_token_id" : < cls token id > , # auto append specified CLS token id on the left
"mlm_mask_prob" : 0.15 , # the probability of masking a token, defaults to 15%
"mlm_same_token_prob" : 0.10 , # probability of keeping the token the same, defaults to 10%
"mlm_random_token_prob" : 0.10 , # probability of tokens that are replaced with random tokens, 10% was recommended by the BERT paper
"mlm_mask_ignore_ids" : [ < cls token > , < sep token > ] # ignore masking other special tokens, if any
Выберите действительную конфигурацию из /configs
и настройте параметры по мере необходимости:
n_heads
: количество голов внимания.n_embd
: Размер скрытых слоев должен делиться на n_heads
.n_vocab
: Размер словаря.embed_dropout
, res_dropout
, attn_dropout
: вероятность выпадения для встраивания слов/остатков/вниманияlr
: Скорость обученияwarmup_steps
: количество шагов до достижения полной скорости обучения (линейное изменение от 0
до lr
).lr_decay
: cosine
или linear
.opt_name
: adam
или adafactor
.beta1
, beta2
и epsilon
: параметры оптимизатора adam
.beta1
, ada_epsilon1
и ada_epsilon2
: параметры оптимизатора adafactor
.weight_decay
: параметр снижения веса, если он отсутствует, снижение веса не используется (используется исправление снижения веса для Адама) (по умолчанию: 0,01) (необязательно).train_batch_size
: размер пакета во время обучения.train_steps
: количество шагов обучения (пакетов), на данный момент установлено примерно ~ 1 эпоха (общее количество токенов в вашем наборе данных / количество токенов в пакете (= train_batch_size
/ n_ctx
)).eval_steps
: количество шагов, выполняемых для каждой оценки. Установите значение 0
для отсутствия оценки. т.е. после каждой контрольной точки модель проверяется на eval_steps
iterations
: количество шагов, поставленных в очередь в TPU, должно быть меньше, чем steps_per_checkpoint
. (по умолчанию: 500)datasets
: список наборов данных tfrecords, которые можно использовать. Каждый набор данных представляет собой список со следующими параметрами: [train glob , eval glob, stitch, sampling_mode, weight]
. Например, для одного набора данных (обратите внимание на двойной список): [["bundestag_*.tfrecords", "", 10, "random_sample", 1.0]]
dataset_id
: имя файла конфигурации набора данных в ./configs/dataset_configs
stitch
: если используется sampling_mode
random_sample
, входной конвейер выбирает это количество текстов в один для выборки. Вы должны выбрать стежок так, чтобы stitch * minimum_document_length >= n_ctx
sampling_mode
: chunks
(tfrecords предварительно обрабатываются до правильной длины и считываются последовательно) или documents_random
(количество stitch
документов объединяется, а затем фрагмент n_ctx
подвергается случайной субдискретизации)weights
: какой относительный вес должен иметь этот набор данных по сравнению с другими.model
: какую модель обучать. В настоящее время поддерживается только GPT
, и если он отсутствует, используется по умолчанию.model_path
: расположение сегмента хранилища Google (или локальный путь, если используются графические процессоры) для сохранения контрольных точек модели и журналов.n_ctx
: Размер контекстного окна. По умолчанию – 2048.n_layer
: количество слоев (блоков) в модели.scale_by_depth
: если это правда, инициализация веса слоев масштабируется по их глубине, как в статье GPT2.scale_by_in
: если это правда, инициализация веса слоев масштабируется по количеству их входов, как в статье GPT2.mesh_shape
: Mesh — это n-мерный массив процессоров с именованными измерениями, используемый для параллелизма в библиотеке mesh-tensorflow. Каждый тензор равномерно распределяется по размерам сетки в соответствии с макетом (см. ниже). «mesh_shape» — это форма этого массива, которая должна быть равна количеству процессоров. например, для TPU v3-128 «mesh_shape»: «x:16,y:8».layout
: Тензор размещается на своей сетке с одним срезом на каждом процессоре. «Макет» тензора — это инъективная частичная карта, определяющая, какие измерения тензора (равномерно) разделены по каким измерениям сетки. Никакое измерение тензора не может быть разделено на два измерения его сетки, и никакие два измерения тензора не могут быть разделены на одно и то же измерение его сетки. Пользователь определяет глобальный набор правил компоновки в виде пар (тензор-имя-размера, сетка-имя-измерения). Размерность тензора разбивается по размеру его сетки, если существует правило сопоставления, например (для приведенного выше примера mesh_shape: "layout":"batch:x,heads:y"activation_function
: selu
(самонормализация) или gelu
(используется OA), функция активации, используемая в проходах прямой связи. (по умолчанию: гелу)attention_types
: тип внимания для каждого слоя в списке следующего формата [[["attention_type"], n_layers]]. например, для 12-слойной сети [[["глобальная"], 12]] или [[["локальная"], 10], [["глобальная"], 2]].linear
, global
, local
или none
. Мы обнаружили, что сочетание global
и linear
в соотношении 50/50 работает хорошо. none
позволяет создавать слои только с прямой связью для более эффективных моделей PAR Transformer.precision
: float32
или bfloat16
.tokens_per_mb_per_replica
: если не None, пакет будет разделен на более мелкие микропакеты, содержащие токены tokens_per_mb_per_replica
чтобы избежать ошибок. Градиенты накапливаются локально и уменьшаются один раз. ВАЖНО: здесь мб относится к мини-пакету , а не к мегабайту.Смесь экспертов
moe_layers
: список номеров слоев, к которым можно добавить смесь слоев экспертов. НАПРИМЕР: [2,4,6,8,10,12]
. Экспериментально мы обнаружили, что на каждые два слоя самообслуживания хорошо работает один мой слой.moe_params
: словарь дополнительных кваргов для передачи на слой moe. НАПРИМЕР {"moe_dropout_rate": 0.0 }
Экспериментальные возможности
axial_pos_emb_
: если true, используется [осевое позиционное внедрение] (https://arxiv.org/abs/1912.12180.mlp_glu
: если true, использует вариант стробируемых линейных единиц слоев прямой связи.scalenorm
: Если true, вместо Layernorm используется Scalenorm.rezero
: если true, вместо Layernorm используется rezero.num_mem_kv
: добавляет значения памяти/ключей из документа, требующего всеобщего внимания. Param — это целое число с количеством желаемых значений памяти/ключа.macaron
: если true — для каждого блока слоя используется преобразователь макарон. Если вы нашли GPT-Neo полезным в своей работе, вы можете сослаться на этот репозиторий как
@software{gpt-neo,
author = {Black, Sid and
Gao, Leo and
Wang, Phil and
Leahy, Connor and
Biderman, Stella},
title = {{GPT-Neo: Large Scale Autoregressive Language
Modeling with Mesh-Tensorflow}},
month = mar,
year = 2021,
note = {{If you use this software, please cite it using
these metadata.}},
publisher = {Zenodo},
version = {1.0},
doi = {10.5281/zenodo.5297715},
url = {https://doi.org/10.5281/zenodo.5297715}
}
Номер версии следует заменить на номер версии, которую вы используете, а год соответствует выпуску проекта с открытым исходным кодом.
Если вы особенно заинтересованы в цитировании моделей GPT-Neo, обученных на Pile, мы будем признательны, если вы также процитируете
@article{gao2020pile,
title={The Pile: An 800GB Dataset of Diverse Text for Language Modeling},
author={Gao, Leo and Biderman, Stella and Black, Sid and Golding, Laurence and Hoppe, Travis and Foster, Charles and Phang, Jason and He, Horace and Thite, Anish and Nabeshima, Noa and others},
journal={arXiv preprint arXiv:2101.00027},
year={2020}
}