T5X - это новая и улучшенная реализация T5 (и больше) в JAX и лен. T5 на TensorFlow с MESHTF больше не развивается. Если вы новичок в T5, мы рекомендуем начать с T5X.
Библиотека t5
служит в основном как код для воспроизведения экспериментов по изучению пределов обучения передачи с помощью унифицированного трансформатора текста в текст . В статье мы демонстрируем, как достичь самых современных результатов по нескольким задачам NLP, используя трансформатор текста в текст, предварительно обученный на большом текстовом корпусе.
Большая часть кода в этом репозитории используется для загрузки, предварительной обработки, смешивания и оценки наборов данных. Он также предоставляет способ точно настроить предварительно обученные модели, выпущенные вместе с публикацией.
Библиотека t5
может использоваться для будущей разработки модели, предоставляя полезные модули для обучения и тонкой настройки (потенциально огромных ) моделей на смесях задач текста в тексте.
t5.data
- это пакет для определения объектов Task
, которые предоставляют tf.data.Dataset
s.
Каждое Task
состоит из:
Кроме того, вы можете предоставить необязательно:
Источник данных может быть произвольной функцией, которая предоставляет tf.data.Dataset
, но мы также предоставляем более простые обертки для наборов данных, доступных в наборах данных Tensorflow (TFDS) ( TfdsTask
) или хранятся в виде текстовых файлов с одним примером на строку ( TextLineTask
) Полем
Текстовый препроцессор преобразует примеры в наборе данных источника в соответствующий формат для модели текста в тексте с полями для inputs
и targets
. Например, предварительно определенная t5.data.preprocessors.translate
препроцессор преобразует входы в форме
{ 'de' : 'Das ist gut.' , 'en' : 'That is good.' }
к форме
{ 'inputs' : 'translate German to English: Das ist gut.' , 'targets' : 'That is good.' }
В дополнение к предварительной обработке текста, вы также можете использовать один или несколько препроцессоров токенов для изменения входов после токноказывания. Мы внедрили наши неконтролируемые цели перед тренировкой, используя эти препроцессоры токенов.
Мы предоставляем много предопределенных препроцессоров в t5.data.preprocessors
, но вы также можете определить свои собственные.
Модель предложения используется для токенизации входных строк и декодирования выходных токенов. Вы можете создать свою собственную модель с библиотекой Google/Suentenceiece или использовать нашу по умолчанию по адресу t5.data.DEFAULT_SPM_PATH
. Если вы создаете свои собственные, вы должны использовать флаги --pad_id=0 --eos_id=1 --unk_id=2 --bos_id=-1
с spm_train
, чтобы быть совместимым с нашей кодом модели.
Метрическая функция возвращает оценку, учитывая цель и прогноз из модели. Вы также можете определить функцию постпроцесса для преобразования цели цели и прогнозирования в другой формат, прежде чем вызывать метрику. Мы предоставляем некоторые предопределенные показатели в t5.evaluation.metrics
.
Наконец, t5.data
содержит класс Mixture
, который можно создать для объединения нескольких наборов данных Task
для обучения с несколькими задачами, используя различные функции для определения скоростей смеси.
t5.evaluation
содержит два основных компонента:
t5.models
содержит SLIM для подключения Tasks
T5 и Mixtures
к модельной реализации для обучения, оценки и вывода.
В настоящее время доступно два прокладка: одно для трансформатора сетки Tensorflow, которое мы использовали в нашей статье, а другой для библиотеки Transformers с объятиями. API обнимающего лица в настоящее время экспериментально и подвержена изменениям, но обеспечивает простой и простой способ загрузки, тонкой настройки и оценки наших предварительно обученных моделей с использованием Pytorch на одном графическом процессоре. Если вы хотите использовать наши самые большие модели на TPU и/или воспроизвести результаты в нашей статье, вам следует использовать API MTFModel и бинар t5_mesh_transformer
. Если вы заинтересованы в том, чтобы настраивать наши модели на графическом процессоре в Pytorch, вам следует попробовать API Hfpytorchmodel. Поскольку HFPYTORCHMODEL является экспериментальной, оставшаяся часть этого Readme предполагает использование MTFModel и его связанный бинар. Пример использования HFPYTORCHMODEL доступен здесь.
Самый простой способ попробовать T5 - это бесплатный TPU в нашем учебном пособии Colab.
Ниже мы приводим примеры того, как предварительно готовить, настраивать, оценивать и декодировать из модели из командной строки с нашей кодовой базой. Вы можете использовать эти инструкции, чтобы воспроизвести наши результаты, точно настроить одну из наших выпущенных контрольных точек с вашими собственными данными и/или гиперпараметрами, или предварительно провести модель с нуля.
Вы можете либо использовать новую или ранее существовавшую Task
, либо вы можете загрузить примеры из предварительного файла TSV.
Task
В зависимости от вашего источника данных (см. Выше), вам нужно будет подготовить свои данные надлежащим образом.
Task
Если вы используете ванильную задачу, просто убедитесь, что любой файл (ы), загруженный вашим dataset_fn
, доступны для TPU (то есть находятся в ведре GCS), и вы должны быть полезны!
TfdsTask
Большинство наших предопределенных Task
используют наборы данных TensorFlow (TFD) в качестве источника данных. Когда вы запускаете наш учебный двоичный файл (см. Инструкции ниже) с помощью TfdsTask
, набор данных будет автоматически загружаться и подготовлен при первом использовании. После завершения подготовки набор данных кэшируется в вашем локальном хранилище, чтобы избежать этого накладных расходов в будущих пробегах. Если работаем в облаке, мы рекомендуем вам установить флаг --t5_tfds_data_dir
, чтобы указать на постоянное место хранения, например, ведро GCS. Это требование при обучении на TPU.
Набор данных C4, который мы создали для неконтролируемого предварительного обучения, доступен в наборах данных TensorFlow, но он требует значительного количества полосы пропускания для загрузки необработанных царапин Crawl Crawles (~ 7 TB) и вычислять для его подготовки (~ 335 CPU-Days). Мы предлагаем вам воспользоваться поддержкой Beam Apache в TFD, которая обеспечивает распределенную предварительную обработку набора данных и может быть запущена в Google Cloud Dataflow. С 500 работниками работа должна завершить через ~ 16 часов.
После определения MY_PROJECT
и MY_BUCKET
вы можете создать набор данных в DATAFLOW из GCP, используя следующие команды:
pip install tfds-nightly[c4]
echo ' tfds-nightly[c4] ' > /tmp/beam_requirements.txt
python -m tensorflow_datasets.scripts.download_and_prepare
--datasets=c4/en
--data_dir=gs:// $MY_BUCKET /tensorflow_datasets
--beam_pipeline_options= " project= $MY_PROJECT ,job_name=c4,staging_location=gs:// $MY_BUCKET /binaries,temp_location=gs:// $MY_BUCKET /temp,runner=DataflowRunner,requirements_file=/tmp/beam_requirements.txt,experiments=shuffle_mode=service,region= $MY_REGION "
Читайте больше в инструкциях TFDS Beam.
TextLineTask
TextLineTask
полезен, когда ваш источник данных представляет собой текстовый файл (или файлы) с одним примером на строку. Затем вы можете использовать текстовый препроцессор для преобразования каждой строки в словарь входов и целей.
Убедитесь, что ваши файлы доступны для TPU (т.е. в ведре GCS), и вам будет хорошо!
Вместо определения новой Task
вы можете использовать файл TSV (или файлы) непосредственно в качестве набора данных, в котором каждая строка отформатируется как <input>t<target>
.
Тем не менее, есть пара предостережений:
Если вам нужна какая -либо из этих функций, вы должны определить новую Task
, TfdsTask
или TextLineTask
.
Подобно вышеупомянутым случаям, ваш файл TSV должен быть доступен для TPU (то есть находится в ведре GCS).
Чтобы установить пакет T5, просто запустите:
pip install t5[gcp]
Сначала вам нужно будет запустить виртуальную машину (виртуальную машину) в Google Cloud. Подробности о запуске виртуальной машины можно найти в документации Google Cloud.
Чтобы запустить обучение или оценить облачные TPU, вы должны настроить следующие переменные на основе вашего проекта, зоны и ведра GCS. Пожалуйста, обратитесь к руководству QuickStart Cloud TPU для получения более подробной информации.
export PROJECT=your_project_name
export ZONE=your_project_zone
export BUCKET=gs://yourbucket/
export TPU_NAME=t5-tpu
export TPU_SIZE=v3-8
export DATA_DIR= " ${BUCKET} /your_data_dir "
export MODEL_DIR= " ${BUCKET} /your_model_dir "
Пожалуйста, используйте следующую команду для создания устройства TPU в VM Cloud.
ctpu up --name= $TPU_NAME --project= $PROJECT --zone= $ZONE --tpu-size= $TPU_SIZE
--tpu-only --noconf
В приведенной ниже команде мы тренируем модель на задаче MRPC для клея с нуля. Вы можете изменить параметр gin MIXTURE_NAME
, чтобы использовать любую из задач или смесей, представленных в нашем пакете.
t5_mesh_transformer
--tpu= " ${TPU_NAME} "
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${MODEL_DIR} "
--t5_tfds_data_dir= " ${DATA_DIR} "
--gin_file= " dataset.gin "
--gin_file= " models/bi_v1.gin "
--gin_param= " utils.tpu_mesh_shape.model_parallelism = 1 "
--gin_param= " utils.tpu_mesh_shape.tpu_topology = ' ${TPU_SIZE} ' "
--gin_param= " MIXTURE_NAME = 'glue_mrpc_v002' "
Полный список задач и смесей может быть получен путем запуска:
python -c " import t5; print(t5.data.MixtureRegistry.names()) "
Вы также можете определить дополнительные задачи и смеси в новом файле и импортировать его, используя флаг --module_import
.
В качестве альтернативы, вы можете тренироваться с файлом TSV, где каждая строка отформатирована как <input>t<target>
(см. Выше).
Чтобы точно настроить одну из наших предварительно обученных моделей, вам необходимо передать оперативную конфигурацию предварительно обученной модели в учебный скрипт. Оперативная конфигурация должна передаваться как флаг gin_file
. Он указывает модельную архитектуру и другие гиперпараметры. Кроме того, вам необходимо указать смесь для тонкой настройки. Например, чтобы точно настроить модель T5-SMALL на смесь glue_mrpc_v002
, пожалуйста, запустите:
t5_mesh_transformer
--tpu= " ${TPU_NAME} "
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${MODEL_DIR} "
--t5_tfds_data_dir= " ${DATA_DIR} "
--gin_file= " dataset.gin "
--gin_param= " utils.tpu_mesh_shape.model_parallelism = 1 "
--gin_param= " utils.tpu_mesh_shape.tpu_topology = ' ${TPU_SIZE} ' "
--gin_param= " MIXTURE_NAME = 'glue_mrpc_v002' "
--gin_file= " gs://t5-data/pretrained_models/small/operative_config.gin "
Правильный предварительно обученный путь контрольной точки включен в оперативную конфигурацию.
Вы также можете определить дополнительные задачи и смеси в новом файле и импортировать его, используя флаг --module_import
.
В качестве альтернативы, вы можете точно настроить файл TSV, в котором каждая строка отформатирована как <input>t<target>
(см. Выше). Например, вы можете попробовать один из парных наборов данных о переводе от WMT '19 News Commerpity 14 учебный набор (например, английский фланч). При использовании файла TSV вы замените флаг MIXTURE_NAME
на:
--gin_param= " utils.run.train_dataset_fn = @t5.models.mesh_transformer.tsv_dataset_fn "
--gin_param= " tsv_dataset_fn.filename = 'gs:/path/to/tsv' "
Для точной настройки с теми же гиперпараметрами, которые мы использовали в статье (используя постоянную скорость обучения 0,001), вы можете пройти в этом джин-файле, который включен в пакет T5:
--gin_file="learning_rate_schedules/constant_0_001.gin"
Оперативная конфигурация для предварительно обученных моделей устанавливается так, чтобы фактически не ограничивается количество этапов поездов. Если вы хотите тренироваться для определенного количества шагов, вам нужно передать это. Поскольку предварительно обученная модель уже была обучена для 1 000 000 шагов, вам следует указать общее количество шагов после предварительного обучения и тонкая настройка. Например, если вы хотите точно настройку на дополнительные 10000 шагов, вы должны пройти
--gin_param="run.train_steps = 1010000"
Вы также можете использовать другой размер партии для точной настройки. Мы устанавливаем размер партии в соответствии с общим количеством токенов в партии. По умолчанию, партия использует длину последовательности 512. Чтобы установить количество токенов в партию, вы должны установить
--gin_param = "tokens_per_batch=1048576"
Чтобы оценить модель в структуре T5, вам необходимо использовать файл eval.gin
, указать каталог модели, метод декодирования и какой шаг (ы) контрольной точки для оценки. Итак, чтобы оценить задачу MRPC Glue, используя поиск пучка на всех контрольных точках, используйте следующую команду:
t5_mesh_transformer
--tpu= " ${TPU_NAME} "
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${MODEL_DIR} "
--gin_file= " ${MODEL_DIR} /operative_config.gin "
--t5_tfds_data_dir= ${DATA_DIR}
--gin_file= " eval.gin "
--gin_file= " beam_search.gin "
--gin_param= " run.dataset_split = 'validation' "
--gin_param= " utils.tpu_mesh_shape.tpu_topology = ' ${TPU_SIZE} ' "
--gin_param= " MIXTURE_NAME = 'glue_mrpc_v002' "
--gin_param= " eval_checkpoint_step = 'all' "
Чтобы оценить конкретную контрольную точку, просто установите параметр eval_checkpoint_step
для соответствующей контрольной точки.
--gin_param="eval_checkpoint_step = 100000"
Вы также можете использовать greedy_decode.gin
или sample_decode.gin
вместо beam_search.gin
в приведенной выше команде.
Чтобы создать прогнозы из модели в структуре T5, вам необходимо указать каталог модели, метод декодирования и какие шаги контрольной точки (ы) для использования для декодирования. Предполагая, что у вас есть текстовый файл входных последовательностей, хранящихся по адресу /path/to/inputs.txt
, команда примера будет:
t5_mesh_transformer
--tpu= " ${TPU_NAME} "
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${MODEL_DIR} "
--gin_file= " ${MODEL_DIR} /operative_config.gin "
--gin_file= " infer.gin "
--gin_file= " sample_decode.gin "
--gin_param= " input_filename = '/path/to/inputs.txt' "
--gin_param= " output_filename = '/tmp/outputs.txt' "
--gin_param= " utils.tpu_mesh_shape.tpu_topology = ' ${TPU_SIZE} ' "
--gin_param= " infer_checkpoint_step = 'all' "
Чтобы предсказать с помощью конкретной контрольной точки, просто установите параметр infer_checkpoint_step
для соответствующей контрольной точки.
--gin_param="infer_checkpoint_step = 100000"
Вы также можете использовать beam_search.gin
или greedy_decode.gin
вместо sample_decode.gin
в команде выше.
Вы также можете захотеть экспортировать SavedModel
, которая полезна для обслуживания вашей обученной модели (например, при развертывании с помощью ML Engine или в изображении Docker).
t5_mesh_transformer
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${MODEL_DIR} "
--use_model_api
--mode= " export_predict "
--export_dir= " /path/to/export/dir "
Приведенная выше команда экспортирует последнюю контрольную точку в каталоге модели. Чтобы экспортировать конкретную контрольную точку, добавьте следующие флаги:
--checkpoint_mode= " specific "
--checkpoint_steps=1000000
Ноутбук T5-Deploy демонстрирует экспорт SavedModel
и упаковывает ее на изображении Docker для подачи.
Если вы хотите использовать GPU вместо TPU, вы можете изменить вышеуказанные команды, удалив специфичные для TPU флаги ( --tpu
, --tpu_zone
, --gcp_project
) и установив параметры джина для mesh_shape
и mesh_devices
на основе желаемой настройки. Полем
Например, если у вашей машины есть доступ к 6 графическим процессорам, и вы хотели бы сделать трехсторонний параллелизм модели и двухсторонний параллелизм данных, команда тонкой настройки выше станет:
t5_mesh_transformer
--model_dir= " ${MODEL_DIR} "
--t5_tfds_data_dir= " ${DATA_DIR} "
--gin_file= " dataset.gin "
--gin_param= " utils.run.mesh_shape = 'model:3,batch:2' "
--gin_param= " utils.run.mesh_devices = ['gpu:0','gpu:1','gpu:2','gpu:3','gpu:4','gpu:5'] "
--gin_param= " MIXTURE_NAME = 'glue_mrpc_v002' "
--gin_file= " gs://t5-data/pretrained_models/small/operative_config.gin "
С одним графическим процессором команда:
t5_mesh_transformer
--model_dir= " ${MODEL_DIR} "
--t5_tfds_data_dir= " ${DATA_DIR} "
--gin_file= " dataset.gin "
--gin_param= " utils.run.mesh_shape = 'model:1,batch:1' "
--gin_param= " utils.run.mesh_devices = ['gpu:0'] "
--gin_param= " MIXTURE_NAME = 'glue_mrpc_v002' "
--gin_file= " gs://t5-data/pretrained_models/small/operative_config.gin "
Мы предоставляем оперативные конфигурации для всех экспериментов в статье в GS: // T5-DATA/экспериментах. Папка experiments
имеет разные подкатарии, соответствующие различным разделам в нашей статье. Например, GS: // T5-DATA/Experiments/Gapeves содержит эксперименты из Раздела 3.3 («Неконтролируемые цели»). Каждая подкатария папки objectives
содержит оперативные конфигурации для некоторого конкретного эксперимента (где свободно говорить «эксперимент» является одним из строк в одной из таблиц в нашей статье).
Допустим, вы хотите воспроизвести результаты для цели «префикс -моделирование» (первая строка в таблице 4). Оперативные конфигурации для этого эксперимента живут в GS: // T5-data/experiments/oals/obj-prefix_lm. В базовом каталоге существует оперативная конфигурация для предварительного обучения модели (GS: //t5-data/experiments/objectives/obj-prefix_lm/operative_config.gin). Затем существуют подкатарии для каждой из нисходящих смесей с тонкой настройкой, которые мы рассматриваем, каждый из которых имеет свою собственную оперативную конфигурацию (например, GS: //t5-data/experiments/objectives/obj-prefix_lm/cnn_dailymail_v002/opective_config.gin. ) Чтобы запустить этот эксперимент, сначала предварительно подготовить модель с помощью оперативной конфигурации перед тренировкой:
export PRETRAIN_MODEL_DIR= " ${BUCKET} /obj-prefix_lm "
t5_mesh_transformer
--tpu= " ${TPU_NAME} "
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${PRETRAIN_MODEL_DIR} "
--gin_file= " gs://t5-data/experiments/objectives/obj-prefix_lm/operative_config.gin "
--gin_param= " utils.tpu_mesh_shape.model_parallelism = 1 "
--gin_param= " utils.tpu_mesh_shape.tpu_topology = ' ${TPU_SIZE} ' "
Затем вы можете точно настроить предварительно обученную модель на CNN/Daily Mail так:
export FINETUNE_MODEL_DIR= " ${BUCKET} /obj-prefix_lm/cnn_dailymail_v002 "
t5_mesh_transformer
--tpu= " ${TPU_NAME} "
--gcp_project= " ${PROJECT} "
--tpu_zone= " ${ZONE} "
--model_dir= " ${FINETUNE_MODEL_DIR} "
--gin_file= " gs://t5-data/experiments/objectives/obj-prefix_lm/cnn_dailymail_v002/operative_config.gin "
--gin_param= " init_checkpoint = ' ${PRETRAIN_MODEL_DIR} /model.ckpt-524288' "
--gin_param= " utils.tpu_mesh_shape.model_parallelism = 1 "
--gin_param= " utils.tpu_mesh_shape.tpu_topology = ' ${TPU_SIZE} ' "
Некоторые варианты обучения нуждаются в нескольких флагах, которые будут установлены одновременно. Для каждого из приведенных ниже вариантов добавьте группу ./third_party/py/t5/google/scripts/run_finetune.sh
.
Детерминированное обучение
--train_gin_param= " mesh_train_dataset_fn.seed= ${SEED} "
--train_gin_param= " utils.run.skip_seen_data = True "
Языковая модель
--objective= " lm "
--train_gin_param= " utils.run.model_type = " lm " "
Мы выпустили следующие контрольно-пропускные пункты для предварительно обученных моделей, описанных в нашей статье:
См. Здесь для списка дополнительных экспериментальных предварительно обученных контрольных точек модели.
Если вы расширяете или используете эту работу, пожалуйста, укажите статью, где она была введена:
@article { 2020t5 ,
author = { Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu } ,
title = { Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer } ,
journal = { Journal of Machine Learning Research } ,
year = { 2020 } ,
volume = { 21 } ,
number = { 140 } ,
pages = { 1-67 } ,
url = { http://jmlr.org/papers/v21/20-074.html }
}