Это код для воспроизведения экспериментов из бумаги EMNLP 2021 «Мощность масштаба для настройки параметров для приглашения» (Lester et al., 2021).
Эти модели построены на T5X, который определяет модель и тренировочную петлю; Flaxformer, который определяет фактическое вычисление модели; Лен, который определяет низкоуровневые модели слоев; и JAX, который обеспечивает фактическое исполнение. Подробности нашей реализации можно найти здесь.
gs://{bucket-name}/path/to/item/in/bucket . Здесь мы будем хранить кэшированные наборы данных, а также контрольные точки модели и результаты. Для облегчения ссылки некоторые из наиболее распространенных облачных команд для взаимодействия с виртуальными машинами TPU являются # Create a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-8
--version v2-alpha
# SSH into a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE}
# Delete a Cloud TPU VM
$ gcloud alpha compute tpus tpu-vm delete ${TPU_NAME} --zone ${ZONE}git clone --branch=main https://github.com/google-research/prompt-tuning
cd prompt-tuningpython3 -m pip install .[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html Если вы столкнетесь с ошибкой, когда PIP пытается установить ранее и версии зависимостей в рамках (например, TensorFlow), пока он не попытается установить версию 0.0.0 , а затем не удастся, попробуйте добавить --use-deprecated=legacy-resolver в команду установки. Эта ошибка связана с необходимыми версиями, которые следуют зависимостям, и поведение часто называют обратной обработкой. Если вы используете флаг, возможно, что несовместимые версии библиотек могут быть установлены, и вам следует обратить внимание на предупреждения о несоответствиях на выводе команды установки.
Примечание. Если вы планируете взломать внутреннюю часть настройки быстрого настройки и нуждайтесь в редактируемой установке (поэтому изменения в клонированном коде используются при запуске обучения). Запустите pip с флагом -e , и вам может потребоваться удалить файл pyproject.toml , если вы получаете ошибки во время установки.
Чтобы запустить тесты, установите пакет с опцией [test] (Python3 python3 -m pytest python3 -m pip install .[test] ...
Обучение подсказки аналогична точной настройке модели с T5X; Основное отличие заключается в том, что у нас есть собственный набор файлов конфигурации настройки быстрого настройки.
Мы предоставляем демонстрационный скрипт ( prompt_tuning/scripts/sst2-demo.sh ), который имеет все необходимые детали для обучения приглашения. Вы можете использовать это в качестве отправной точки или установить переменные среды MODEL_DIR и TFDS_DATA_DIR с путями к своему ведро для хранения Google, чтобы напрямую запустить этот скрипт.
./prompt-tuning/prompt_tuning/scripts/sst2-demo.shЧтобы помочь со скоростью итерации, мы склонны указывать гораздо больше параметров командной строки, а не объединять всю конфигурацию в один файл джина. Несколько вариантов примечания:
--gin_search_paths :: Раздельный список каталогов для использования в качестве префиксов пути для файлов джина. Мы можем использовать prompt_tuning.scripts.find_module ${module} чтобы найти место установки библиотек, которые связывают с ними конфигурации.--gin_file :: Файл джина для загрузки. Мы склонны использовать пути относительно, начиная с библиотеки, с которой они устанавливаются, IE prompt_tuning/configs/models/t5_1_1_base_prompt.gin Over models/t5_1_1_base_prompt.gin чтобы избежать какого -либо путаницы. Использование флага может быть использовано для указания нескольких файлов джина, которые объединятся вместе. Любые параметры конфигураций, установленные в нескольких файлах, будут использовать значение из последнего файла в списке.--gin.{PARAM}={VALUE} :: Этот общий флаг переопределения установит PARAM на VALUE . Это может быть использовано для легкости параметров конфигурации, не требуя, чтобы они были фактическими аргументами командной строки. Например. --gin.utils.SaveCheckpointConfig.keep=20 Сохранит последние 20 контрольных точек.По мере того, как модели становятся все больше, XL и XXL, например, они не подходят к 8 TPU, которые поставляются с одним виртуальной машиной TPU. В этих случаях нам понадобится кусок модуля TPU (дополнительную информацию об архитектуре TPU и доступных конфигурациях можно найти здесь). Основное различие между обучением подсказки на одном виртуальной машине TPU и на ломтике POD заключается в том, что теперь у нас есть несколько виртуальных машин TPU, и мы будем запускать один и тот же SPMD JAX, каждая виртуальная машина, у этой страницы есть больше информации о программах JAX Multi-Host. Это руководство дает быстрое введение в запуск программ JAX на ломтике POD TPU, но мы нанесем здесь основные очки.
$ gcloud alpha compute tpus tpu-vm create ${TPU_NAME}
--zone ${ZONE}
--accelerator-type v3-32
--version v2-alpha--command= и что она должна работать на всех наших виртуальных машинах (называемых работниками) с помощью --worker=all . $ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " git clone --branch=main https://github.com/google-research/prompt-tuning && cd prompt-tuning && "
python3 -m pip install . -f https://storage.googleapis.com/jax-releases/libtpu_releases.html Напишите сценарий, чтобы обучить свою подсказку. Мы включили демонстрационный скрипт ( /prompt_tuning/scripts/sst2-xxl-demo.sh ) поезда подсказка для решения набора данных SST2 с использованием T5 1,1 LM100K XXL. Вы можете использовать это в качестве отправной точки или просто заполнить пути к своему ведро с облачным хранилищем Google, чтобы указать, где вы хотите сохранить свои результаты ( MODEL_DIR ) и где кэшировать данные TFDS ( TFDS_DATA_DIR ), или установить их в качестве переменных среды.
Скопируйте свой сценарий обучения каждого работника. Если это ваш первый раз, когда вы запускаете scp вы можете получить ошибку, запустите команду ssh-add /.../.ssh/google_compute_engine из сообщения об ошибке и повторите попытку.
$ gcloud alpha compute tpus tpu-vm scp sst2-xxl-demo.sh ${TPU_NAME} :
--zone= ${ZONE}
--worker=all$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " ./sst2-xxl-demo.sh " Если у одного из рабочих есть ошибка во время обучения, у вас останутся процессы, которые используют TPU для других работников. Это помешает вам перезапустить вашу работу до тех пор, пока они не будут прекращены и не выпустят TPU. Следующая команда должна закончить все эти процессы. Вы можете увидеть страницу команды kill , возвращается от работника, у которого была первоначальная ошибка.
$ gcloud alpha compute tpus tpu-vm ssh ${TPU_NAME}
--zone ${ZONE}
--worker=all
--command= " sudo lsof -t /dev/accel0 | xargs kill -9 "Для обучения подсказок с использованием пользовательских деталей, таких как ваш собственный набор данных, следуйте инструкциям T5X на пользовательских компонентах
Если вы упаковываете свой код в качестве пакета PIP -Python, вы не будете связаны с одним каталогом, и вы можете использовать python3 -m prompt_tuning.scripts.find_module {your_module} чтобы помочь установить gin_search_paths , чтобы конфигурации Gin в вашей библиотеке были найдены. Примечание. Если вы планируете объединить конфигурации джина в установленном пакете, убедитесь, что каталоги, содержащие файлы конфигурации, имеют __init__.py поскольку джин требует, чтобы файлы были в пакете Python.
Если части ваших пользовательских компонентов настраиваются, они должны быть явно импортированы в ваши джинсы; Если они в конечном итоге импортируются после того, как файлы джина будут проанализированы, они принесут ошибку. Если ни одна из ваших зависимостей не содержит конфигурации джина, вы можете избежать записи файла джина, передавая --gin.MIXTURE_OR_TASK_MODULE="'path.to.your.module' . Это автоматически импортирует ваш модуль и удобно, когда все, что вы делаете, это заменять наборы данных.
Наш предлагаемый способ сделать вывод с помощью запроса - загрузить исходную контрольную точку, используемую для инициализации модели, и подсказку из файла. Как объяснено в этом разделе о частичной загрузке, T5X поддерживает загрузку некоторых параметров модели при инициализации других с нуля. Мы используем это в сочетании с инициализатором приглашения from_array , чтобы перезагрузить замороженные параметры с исходной контрольной точки и файла приглашения файла. configs/runs/prompt_eval.gin устанавливает эту конфигурацию для вас; Вам просто нужно предоставить PROMPT_FILE . Если ваша модель была обучена каким -либо из файлов prompts/ конфигурации, вы можете удалить их из аргументов в сценарий оценки.
Включенный сценарий sst2-demo-eval.sh показывает пример проведения оценки таким образом. Все, что необходимо, - это установить переменные среды EVAL_DIR и TFDS_DATA_DIR на пути для хранения вывода оценки и кэша наборов данных Tensorflow, соответствующих.
В T5X сценарий оценки предполагает, что ваш набор данных имеет метки и выводит окончательные результаты из метрических функций вашего набора данных. Скрипт вывода не требует метки и вместо этого выводит прогноз вашей модели. Мы включаем аналогичный файл prompt_infer.gin для использования с помощью сценария вывода.
Если вы хотите сделать вывод или оценку с помощью контрольной точки T5X, которая производится из тренировочного прогона настройки быстрого настройки, вы можете использовать конфигурацию (eval|infer).gin из T5X напрямую. Вам нужно будет обновить utils.RestoreChekcpointConfig . Вы должны установить path к новой контрольной точке, assignment_map=() и fallback_to_scratch=False .
Вся модель, обучение, оценка, сохранение, восстановление и т. Д. Конфигурация выполняется через джин. См. Репозиторий джина-конфигурации для общего введения в джин и этого праймера
Мы следим за макетом конфигурации T5X:
runs/ :: содержит конфигурации для фактической подготовки модели. Здесь идут такие вещи, как набор данных и конфигурация оценки.architectures/ :: Содержит конфигурации для того, как работает модель. Именно здесь настроены такие вещи, как Encoder-Decoder vs Decoder, и обмен внедрением.models/ :: Содержит конфигурации, которые устанавливают конкретные параметры модели, такие как количество слоев или размер таблицы встраивания. Он также настраивает такие вещи, как используемая обертка T5X модели.models/decoding/ :: содержит простые в использовании конфигурации, чтобы обмениваться тем, как модель генерирует текст во время вывода, включает в себя конфигурации для поиска луча и выборки ядра.models/sizes/ :: Содержит различные настройки для создания моделей разных размеров, они объединены с версиями по умолчанию для создания версии размера, например, t5_1_1_prompt.gin + sizes/large.gin создает большую модель T5 1.1. Некоторые общие комбинации, уже доступные в виде файлов джина с правой, включают ( t5_1_1_large_prompt.gin для нашего примера выше). Примечание. Эти файлы размера должны прийти после основного файла модели.prompts/ :: Наш дополнительный каталог содержит конфигурации, которые устанавливают переменную Gin PROMPT , что позволяет легко переключать инициализацию, основанный на приглашении, который файл приглашения добавляется в качестве аргумента --gin_file (он должен прийти после models/ джин -файла), При указании аргументов --gin_file в командной строке, порядок имеет значение. Общий порядок, в котором должны быть указаны файлы джина:
models/*.ginprompts/*.ginmodels/sizes/*.gin*models/decoding/*.ginruns/*.gin У T5X есть некоторые необходимые поля, такие как MIXTURE_OR_TASK_NAME или TASK_FEATURE_LENGTHS . Мы добавляем еще два:
PROMPT_LENGTH :: Длина подсказки, которую мы используем, это используется в нескольких разных местах, которые нам требуют в качестве макроса джина, который мы можем ссылаться в нескольких местах и обеспечить синхронизацию значений.PROMPT :: Это конфигурация фактического модуля приглашения, который будет использоваться в подклассах PromptX Flaxformer. ПРИМЕЧАНИЕ. Это означает, что наша максимальная целевая длина должна быть достаточно длинной, чтобы соответствовать цели для каждого примера. Это означает, что наши targets клавиши в картировании TASK_FEATURE_LENGTHS могут быть намного короче, например, около 4 для многих задач SuperGlue (Wang et al., 2019), по сравнению с 62, что является по умолчанию P5X.
Существует несколько вариантов инициализации параметра приглашения. Мы поддерживаем различные методы в разделе 3.2 в нашей статье, а также инициализацию из файла. Последний позволяет делать что -то, например, на поезде на Boolq, начиная с подсказки, изученной на MNLI.
Все инициализаторы следуют API инициализатора льна, являющегося параметризованной функцией, которая возвращает закрытие над функцией инициализации. Функция фактической инициализации всегда имеет подпись
def initializer ( rng : Array , shape : Sequence [ int ]) -> Array :
... Мы предоставляем каждую схему инициализации в качестве файла конфигурации джина в каталоге configs/prompts . Они могут быть использованы, включив файл джина с помощью --gin_file=path/to/configs/prompts/scheme.gin . Этот файл должен прийти после основного файла модели, в противном случае метод по умолчанию (случайная униформа) перезаписывает выбранную вами. Некоторые из этих методов инициализации потребуют, чтобы вы установили дополнительные значения джина, хотя и флаг переопределения в одном из ваших джин -файлов.
Случайная униформа
Стандартная случайная инициализация, аналогичная тому, что люди использовали для внедрения инициализации. Это по умолчанию, и джин -файл не требуется. Шкала случайных значений может быть скорректирована путем переопределения prompt_init/linen.initializers.uniform.scale=N .
Выборка
Образец встраивания токена для использования в качестве инициализации для каждой позиции подсказок с помощью инициализатора from_sample_of_embeddings . Вы можете ограничить выборку первыми n interdings с помощью параметра prompt_init/prompts.from_samples_of_embeddings.population_size .
Это можно использовать с помощью --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab.gin . В этом методе используется таблица встраивания, извлеченную из начальной контрольной точки модели. Вы также можете предоставить свой собственный файл встраивания с помощью --gin_file=prompt_tuning/configs/prompts/from_sampled_vocab_numpy.gin . Этот метод требует, чтобы вы предоставили значение для EMBEDDING_FILE , которое представляет собой массив Numpy в таблице внедрения модели. Это может быть извлечено с контрольной точки модели с использованием recavle_tuning.scripts.extract_variable.
Классовая этикетка
Мы поддерживаем инициализацию оперативных временных патч с внедрением меток классов (он же вербализаторы ) с помощью инициализатора from_embedded_list . Пользователи, предоставляющие список слов (метки класса) для использования. Каждое слова токенизируются предоставленным словом; встроенный с предоставленным словарным столом; агрегировано, если необходимо, по всему суб-тукенам; и используется для инициализации быстрых временных шагов. Если предоставленные токены не покрывают полную длину подсказки, пропавшие токены инициализируются с использованием предоставленного запасного инициализатора.
Мы можем сопоставить статью, где незаполненные токены заполняются отбором отбора проб из таблицы встраивания, составляя эту инициализацию с той, которая выше выше. Его можно использовать с помощью --gin_file=prompt_tuning/configs/prompts/from_class_labels.gin . Это требует установки CLASS_LABELS , который представляет собой список слов, которые вы хотите внедрить в качестве быстрого инициализации. Вы также можете предоставить свой собственный встроенный файл (который такой же, как и выше) с помощью --gin_file=prompt_tuning/configs/prompts/from_class_labels_numpy.gin . Это дополнительно требует настройки EMBEDDING_FILE .
Из строки
Мы также поддерживаем инициализацию подсказки с внедрением какой -то строки, часто используемой для запуска с дискретной подсказки или описания задачи. Это использует инициализатор from_embedded_string . Строка токенизируется предоставленным словарем, каждый токен смотрит в приуженной таблице встраивания, а полученное встроенное представление строки используется в качестве инициализации быстрого. Если предоставленные токены не покрывают полную длину подсказки, пропавшие токены инициализируются с использованием предоставленного запасного инициализатора.
ПРИМЕЧАНИЕ. Словарь просто преобразует строку в последовательность идентификаторов, вам необходимо убедиться, что строка соответствует результату любого форматирования текста (пространства вокруг пунктуации и т. Д.), которые выполняет ваша задача Seqio.
Из файла
Вы также можете загрузить подсказку из файла с помощью инициализатора from_array , чтобы включить передачу по задачам. Это делается с помощью --gin_file=prompt_tuning/configs/prompts/from_file.gin . Это требует установки PROMPT_FILE с путем к файлу Numpy с помощью запроса загрузки. Numpy версии подсказки испускаются по умолчанию при обучении, но подсказка также может быть извлечена с помощью сценария, упомянутого выше.
Мы выпустили нативные контрольно -пропускные пункты T5X на контрольно -пропускных пунктах T5 1.1, которые имели 100 тыс. Сталов адаптации языковой модели.
Они преобразуются со контрольно -пропускных пунктов Public Mesh Tensorflow.
Мы выпустили предварительные подсказки по различным задачам и планируем добавить к ним с течением времени.
Подсказки могут быть найдены в каталоге pretrained_prompts . Оттуда каждая подканальная группа подсказывает по модели, для которой они были обучены. Самый простой способ ссылаться на эти подсказки, которые связаны с библиотекой:
--PROMPT_FILE= ` python3 -m prompt_tuning.scripts.find_module prompt_tuning ` /pretrained_prompts/{MODEL_SIZE}/{PROMPT}.npy Из -за неотъемлемой случайности параллельных вычислений существует несколько настроек, которые должны соответствовать обучению и оценке, чтобы получить точно такие же числа. Каждая модель подчинка имеет README.md Указывает, какими должны быть эти настройки. Наиболее важными настройками являются размеры партии, топология TPU и разделение параллелизма модели. Таблицы включают оценки, которые вы должны ожидать, если вы используете эти подсказки в t5x.eval
Это набор дополнительных ресурсов о быстрой настройке.
Если вы используете эту работу в качестве точки прыжка, пожалуйста, цитируйте
@inproceedings { lester-etal-2021-power ,
title = " The Power of Scale for Parameter-Efficient Prompt Tuning " ,
author = " Lester, Brian and
Al-Rfou, Rami and
Constant, Noah " ,
booktitle = " Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing " ,
month = nov,
year = " 2021 " ,
address = " Online and Punta Cana, Dominican Republic " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2021.emnlp-main.243 " ,
doi = " 10.18653/v1/2021.emnlp-main.243 " ,
pages = " 3045--3059 " ,
}Это не официально поддерживаемый продукт Google.