1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-GPT2

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

GPT2

Disclaimer: Это не официальная реализация GPT2! Я сделал все возможное, чтобы следовать спецификациям оригинальной модели GPT2 как можно точнее, но будьте предупреждены, что я не смог воспроизвести полную производительность оригинальной модели с помощью этого кода. Я не знаю, почему это происходит, я не смог найти баг, который мог бы вызывать это.

Реализация обучения для GPT2 с поддержкой как GPU, так и TPU. Скрипты для датасета немного костыльные и, вероятно, потребуют адаптации под ваши нужды.

Требования

Для GPU:

pip3 install tensorflow-gpu regex

Для TPU:

pip3 install tensorflow regex google-api-python-client oauth2client

Для загрузки моделей:

pip3 install requests tqdm

Для генерации датасета (в дополнение к Tensorflow):

pip3 install ftfy tqdm newspaper3k

Загрузка предобученных моделей

Если вы хотите использовать мои модели, я в настоящее время предлагаю "117M", "PrettyBig" и "1.5B". 117M был обучен на одном v2 TPU в течение недели (вероятно, меньше, чем оригинальная модель OpenAI), PrettyBig немного больше 345M и был обучен на v2-256 pod в течение недели. Поскольку OpenAI выпустила свою модель, я теперь также выпустил свою (менее совершенную) модель 1.5B, которая была обучена на v3-512 pod в течение недели.python3 download_model.py PrettyBig

Это создаст два каталога, один с именем модели и другой с именем "encoder". Измените параметры "model_dir" и "encoder_path" в соответствующем .json файле, чтобы указать на эти пути соответственно.

Если вам нужен только encoder, используйте:

python3 download_model.py encoder

Генерация текста

Чтобы предсказать, вы можете либо передать подсказку напрямую в командной строке, либо иметь её прочитанной из файла. (Это полезно для подсказок, которые включают новые строки) Текст выводится в консоль и в файл, указанный в параметре "predict_path". Для работы вам потребуется checkpoint модели и копия BPE encoder в доступном месте. (Измените параметры "model_dir" и "encoder_path" в .json) Из командной строки:

python3 main.py --model Your-Model.json [--top_k Top-K-Truncation] --predict_text "Привет! Меня зовут"

Из файла:

python3 main.py --model Your-Model.json [--top_k Top-K-Truncation] --predict_file input.txt

Необязательный параметр top_k заставляет модель учитывать только top k наиболее вероятных токенов на каждом шаге. Установка этого параметра примерно на 40 обычно приводит к лучшим результатам, но с меньшим разнообразием.

Предсказание на TPU не поддерживается.

Обучение

Чтобы обучить модель, определите её параметры в файле .json (см. примеры) и затем просто вызовите

python3 main.py --model Your-Model.json [--tpu Your-TPU-Name]

Использование TPU является необязательным, модель работает хорошо и на GPU без каких-либо изменений. (Примечание: Оценка не работает на TPU-подах и должна быть закомментирована)Это предполагает, что у вас есть версия корпуса OpenWebText, хранящаяся в доступном месте. Если у вас её нет, см. ниже, как сгенерировать свою собственную версию.

Генерация датасета

GPT2 обучается на корпусе webtext, который представляет собой практически все веб-сайты, связанные с Reddit с минимумом 3 Karma. Поскольку база данных огромна и содержит много материала, защищённого авторскими правами, я не могу предоставить её для загрузки здесь. Вместо этого я опишу, как я её получил. Будьте осведомлены, что мне пришлось потратить около 500€ на облачные вычислительные ресурсы для загрузки и обработки всего этого, но я не утверждаю, что был оптимально эффективен.

  1. Используйте скрипт загрузки из этого источника для загрузки архивов (я использовал файл предфильтрованных URL)
  2. Используйте datasets/openwebtext/run_newspaper_extract.py для извлечения текста
  3. Как только у вас будут сырые .txt файлы, используйте datasets/openwebtext/create_tfrecords.py для кодирования их в .tfrecords файлы (Требуется копия кодировщика, см. Загрузка предобученных моделей)
  4. Разместите .tfrecords файлы в доступной папке или Google Storage bucket (Размещение в Google Storage bucket обязательно, если вы используете TPU)
  5. Измените параметр "data_path" в вашем .json файле, чтобы указать местоположение ваших .tfrecords файлов, и, если необходимо, адаптируйте функции в inputs.py для открытия правильных файлов ## Использование собственных данных Вы также можете использовать свои собственные текстовые файлы в качестве данных обучения, но вам потребуется вручную изменить некоторый код.
  6. Измените параметры в datasets/openwebtext/create_tfrecords.py:
base_dir = "/home/connor/my_text_dir" # Путь к папке, где находятся ваши файлы .txt
files_per = 175000 # Количество txt файлов, которые нужно поместить в один tfrecord, не слишком важно
name = "my-custom-data" # Имя выходных файлов будет name_i.tfrecords, где i — номер файла
output_dir = "/home/connor/output" # Папка для хранения .tfrecords файлов
log_dir = "logs" # Здесь будут сохранены некоторые логи для поддержки перезапуска, если кодировка была прервана
files = glob.glob(os.path.join(base_dir, "**/*.txt")) # Это должно привести к списку путей ко всем вашим txt файлам
processes = 64 # Количество процессов кодирования
encoder_path = "/home/connor/encoder" # Путь к файлам кодировщика
minimum_size = 128 # Минимальная длина (в BPE токенах) файла, который разрешено иметь, иначе файл будет отброшен.
  1. Запустите скрипт. Это приведет к созданию большого количества файлов name_i.tfrecords. Разместите эти файлы в доступном месте (должно быть в корзине Google Storage, если вы используете TPU).
  2. Создайте новую функцию ввода в inputs.py. Любая функция ввода должна иметь сигнатуру function_name(params, eval=False). Значение stitch контролирует, сколько текстов объединяются, чтобы никогда не получить образец, который слишком мал. Это должно быть: ceil((n_ctx+1) / minimum_size).Например, если минимальный размер 128 и n_ctx 1024, stitch должен быть 9.```python def my_input(params, eval=False): if not eval: numbers = [0, 3, 4, 5, 6, 7, 8, 9] # Случайный подмножество файлов для обучения else: numbers = [1, 2] # Случайное подмножество для оценки files = [os.path.join(params["data_path"], "my-custom-data_{}.tfrecords".format(str(i))) for i in numbers] # Генерирует список файлов
return bpe_text(params["batch_size"], files, amount=params["n_ctx"], iterations=params["iterations"], stitch=9, batch=True)
4. Зарегистрируйте вашу новую функцию ввода в *main.py*.

```python
inputs = {
    "openwebtext": openwebtext, # Стандартный ввод OpenWebtext
    "openwebtext_longbiased": openwebtext_longbiased, # OpenWebtext с предпочтением к более длинным (>512 токенов) примерам
    "openwebtext_long": openwebtext_long, # Openwebtext, который показывает только длинные примеры
    "my_input": my_input,
}
  1. Установите ваш .json для использования нового ввода.
[...]
    "iterations": 500,
    "n_embd": 768,
    "input": "my_input",
    "model": "GPT2",
[...]
  1. Вы закончили. Введенный здесь ввод должен быть максимально похож на GPT2 и работать идеально на TPU.

Объяснение параметров

Поскольку передача двадцати с лишним параметров через командную строку была бы утомительной, вы передаете все параметры модели в файле .json. Обратите внимание, что любые пути поддерживают пути Google Storage и должны быть gs:// путями, если вы работаете на TPU.Значения, которые вы наверняка захотите изменить:

  • model_path: Куда сохранять и загружать точки контроля
  • data_path: Куда расположены ваши файлы .tfrecords
  • encoder_path: Путь к файлам BPE-энкодера. Чтобы получить это, используйте скрипт download_model.py для загрузки любого модели (или только энкодера). Вы получите папку под названием "encoder". Это то, к чему должен указывать этот путь (требуется только для предсказания)Значения, которые вы, вероятно, захотите изменить:
  • train_batch_size: Размер пакета во время фазы обучения
  • eval_batch_size: Размер пакета во время оценки
  • predict_batch_size: Размер пакета во время предсказания
  • predict_path: Путь для сохранения предсказаний (укажите этот путь в текстовый файл для его добавления)Параметры модели:
  • model: Строка, которая указывает на используемую модель. Это всегда должно быть "GPT2" (никакие другие модели здесь не реализованы).
  • n_ctx: Количество токенов, которые модель рассматривает (по умолчанию: 1024).
  • n_vocab: Размер словаря (по умолчанию: 50257).
  • n_embd: Размер слоев эмбеддинга.
  • n_layer: Количество слоев в модели.
  • n_head: Количество голов внимания (по умолчанию: n_embd / 64).
  • scale_by_depth: Нужно ли масштабировать инициализацию по количеству слоев (по умолчанию: true).
  • scale_by_in: Нужно ли масштабировать инициализацию по количеству входных каналов (по умолчанию: true).

Параметры обучения:

  • точность: Использовать ли переменные типа float32 или bfloat16 (использовать "bfloat16" при обучении очень больших моделей) (необязательный параметр, по умолчанию float32).
  • вход: Какая функция входа использовать (по умолчанию: "openwebtext").
  • lr: Скорость обучения (по умолчанию: 0.00025).
  • warmup_steps: Количество шагов разогрева. Если этот параметр задан, используется линейный разогрев + косинусное затухание (по умолчанию: 2000) (необязательный параметр).
  • opt_name: Название оптимизатора, в настоящее время доступны "adam" и "adafactor" (по умолчанию: "adam").
  • weight_decay: Параметр затухания весов, если параметр не задан, то затухание весов не используется (используется исправление затухания весов для Adam) (по умолчанию: 0.01) (необязательный параметр).* beta1: Параметр beta1 для Adam/Adafactor (по умолчанию для Adam: 0.9, по умолчанию для Adafactor: 0.0)
  • beta2: Параметр beta2 для Adam/Adafactor (по умолчанию: 0.98) (необязательный параметр для Adafactor с типом затухания pow)
  • epsilon: Параметр epsilon для Adam (по умолчанию: 1e-9)
  • decay_type: Тип затухания Adafactor, либо "pow" либо "adam" (по умолчанию: "pow")
  • decay_exponent: Экспонента затухания Adafactor типа pow (по умолчанию: 0.8)
  • train_steps: Количество шагов обучения между оценками
  • eval_steps: Количество шагов на каждую оценку
  • max_steps: Максимальное количество шагов обучения (важно для уменьшения скорости обучения)
  • iterations: Количество итераций, выполняемых на TPUs (по умолчанию: 100) (требуется только для TPUs)
  • embed_dropout: Вероятность отбрасывания для эмбеддинга слов, установите значение 0 для отключения (по умолчанию: 0.1)
  • attn_dropout: Вероятность отбрасывания для слоев внимания, установите значение 0 для отключения (по умолчанию: 0.1)
  • res_dropout: Вероятность отбрасывания для соединений остатка, установите значение 0 для отключения (по умолчанию: 0.1)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

НесофиISTICкий GPT-2 реализация обучения, поддерживающая GPU и TPU Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-GPT2.git
git@api.gitlife.ru:oschina-mirror/mirrors-GPT2.git
oschina-mirror
mirrors-GPT2
mirrors-GPT2
master