Текущий репозиторий содержит код, сопровождающий сообщение в блоге? Как создать современный диалоговый ИИ с помощью трансферного обучения.
Этот код представляет собой чистую и прокомментированную базу кода со сценариями обучения и тестирования, которые можно использовать для обучения диалогового агента, использующего передачу обучения на основе языковой модели OpenAI GPT и GPT-2 Transformer.
Эту базу кода можно использовать для воспроизведения результатов участия HuggingFace в конкурсе диалогов NeurIPS 2018 ConvAI2, который был самым современным по автоматическим метрикам. Более 3 тысяч строк соревновательного кода были преобразованы примерно в 250 строк обучающего кода с распределенными опциями и опциями FP16, чтобы сформировать настоящий репозиторий.
Эту модель можно обучить примерно за один час на облачном экземпляре с 8 V100 (в настоящее время стоит около 25 долларов США), также доступна предварительно обученная модель.
Чтобы установить и использовать сценарии обучения и вывода, клонируйте репозиторий и установите необходимые требования:
git clone https://github.com/huggingface/transfer-learning-conv-ai
cd transfer-learning-conv-ai
pip install -r requirements.txt
python -m spacy download en
Для установки с помощью Docker создайте автономный образ:
docker build -t convai .
Примечание. Убедитесь, что ваша установка Docker выделяет достаточно памяти для создания контейнера. Сборка со значением по умолчанию 1,75 ГБ не удастся из-за большого колеса Pytorch.
Затем вы можете ввести изображение
ip-192-168-22-157:transfer-learning-conv-ai loretoparisi$ docker run --rm -it convai bash
root@91e241bb823e:/ # ls
Dockerfile README.md boot dev home lib media models proc root sbin sys train.py utils.py
LICENCE bin convai_evaluation.py etc interact.py lib64 mnt opt requirements.txt run srv tmp usr var
Затем вы можете запустить сценарий interact.py
на предварительно обученной модели:
python3 interact.py --model models/
Мы делаем предварительно обученную и точно настроенную модель доступной для нашего S3 здесь. Самый простой способ загрузить и использовать эту модель — просто запустить сценарий interact.py
для общения с моделью. Без каких-либо аргументов этот скрипт автоматически загрузит и кэширует нашу модель.
Сценарий обучения можно использовать в настройках с одним или несколькими графическими процессорами:
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
Сценарий обучения принимает несколько аргументов для настройки обучения:
Аргумент | Тип | Значение по умолчанию | Описание |
---|---|---|---|
путь к набору_данных | str | "" | Путь или URL-адрес набора данных. Если пусто скачать с S3. |
dataset_cache | str | './dataset_cache.bin' | Путь или URL-адрес кэша набора данных |
модель | str | "openai-gpt" | Путь, URL-адрес или короткое имя модели |
num_candidates | int | 2 | Количество кандидатов на обучение |
max_history | int | 2 | Количество предыдущих обменов, которые нужно сохранить в истории |
train_batch_size | int | 4 | Размер пакета для обучения |
valid_batch_size | int | 4 | Размер партии для проверки |
градиент_аккумуляция_шаги | int | 8 | Накопление градиентов за несколько шагов |
лр | float | 6.25e-5 | Скорость обучения |
lm_coef | float | 1.0 | Коэффициент потерь LM |
mc_coef | float | 1.0 | Коэффициент потерь при множественном выборе |
max_norm | float | 1.0 | Норма градиента отсечения |
n_epochs | int | 3 | Количество эпох обучения |
person_permutations | int | 1 | Количество перестановок личных предложений |
устройство | str | "cuda" if torch.cuda.is_available() else "cpu" | Устройство (cuda или процессор) |
фп16 | str | "" | Установите O0, O1, O2 или O3 для тренировки fp16 (см. документацию apex). |
local_rank | int | -1 | Локальный ранг для распределенного обучения (-1: не распределено) |
Вот как можно воспроизвести наши результаты на сервере с 8 графическими процессорами V100 (адаптируйте количество узлов и размеры пакетов в соответствии с вашей конфигурацией):
python -m torch.distributed.launch --nproc_per_node=8 ./train.py --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=2 --n_epochs=1 --num_candidates=4 --personality_permutations=2 --train_batch_size=2 --valid_batch_size=2
Эта модель должна давать Hits@1 более 79, недоумение 20,5 и F1 16,5 с использованием сценария оценки convai2 (см. ниже).
Эти цифры немного ниже, чем полученные нами в конкурсе ConvAI2. Вот что вы можете настроить, чтобы достичь тех же результатов:
Сценарий обучения сохраняет все эксперименты и контрольные точки в подпапке, имя которой соответствует отметке времени эксперимента, в папке ./runs
базовой папки репозитория.
Затем вы можете использовать интерактивный скрипт для взаимодействия с моделью, просто указав на эту папку.
Вот пример командной строки для запуска интерактивного сценария:
python ./interact.py --model_checkpoint ./data/Apr17_13-31-38_thunder/ # run the interactive script with a training checkpoint
python ./interact.py # run the interactive script with the finetuned model on our S3
Точная настройка модели даст FINAL Hits@1: 0,715.
Интерактивный скрипт принимает несколько аргументов для настройки алгоритма декодирования:
Аргумент | Тип | Значение по умолчанию | Описание |
---|---|---|---|
путь к набору_данных | str | "" | Путь или URL-адрес набора данных. Если пусто скачать с S3. |
dataset_cache | str | './dataset_cache.bin' | Путь или URL-адрес кэша набора данных |
модель | str | "openai-gpt" | Путь, URL-адрес или короткое имя модели |
max_history | int | 2 | Количество предыдущих высказываний, которые нужно сохранить в истории |
устройство | str | cuda если torch.cuda.is_available() еще cpu | Устройство (cuda или процессор) |
no_sample | store_true действий_true | Установите использование жадного декодирования вместо выборки. | |
максимальная_длина | int | 20 | Максимальная длина выходных высказываний |
минимальная_длина | int | 1 | Минимальная длина выходных высказываний |
семя | int | 42 | Семя |
температура | int | 0.7 | Температура отбора проб Softmax |
top_k | int | 0 | Фильтровать токены top-k перед выборкой ( <=0 : без фильтрации) |
top_p | float | 0.9 | Ядерная фильтрация (top-p) перед отбором проб ( <=0.0 : без фильтрации) |
Чтобы запустить оценочные сценарии испытания ConvAI2, сначала необходимо установить ParlAI
в базовую папку репозитория следующим образом:
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
Затем вы можете запустить оценочный скрипт из базовой папки ParlAI
:
cd ParlAI
python ../convai_evaluation.py --eval_type hits@1 # to download and evaluate our fine-tuned model on hits@1 metric
python ../convai_evaluation.py --eval_type hits@1 --model_checkpoint ./data/Apr17_13-31-38_thunder/ # to evaluate a training checkpoint on hits@1 metric
Сценарий оценки принимает несколько аргументов для выбора метрики оценки и настройки алгоритма декодирования:
Аргумент | Тип | Значение по умолчанию | Описание |
---|---|---|---|
eval_type | str | "hits@1" | Оцените модель по метрике hits@1 , ppl или f1 в наборе проверочных данных ConvAI2. |
модель | str | "openai-gpt" | Путь, URL-адрес или короткое имя модели |
max_history | int | 2 | Количество предыдущих высказываний, которые нужно сохранить в истории |
устройство | str | cuda если torch.cuda.is_available() еще cpu | Устройство (cuda или процессор) |
no_sample | store_true действий_true | Установите использование жадного декодирования вместо выборки. | |
максимальная_длина | int | 20 | Максимальная длина выходных высказываний |
минимальная_длина | int | 1 | Минимальная длина выходных высказываний |
семя | int | 42 | Семя |
температура | int | 0.7 | Температура отбора проб Softmax |
top_k | int | 0 | Фильтрация топ-k токенов перед выборкой ( <=0 : без фильтрации) |
top_p | float | 0.9 | Ядерная фильтрация (top-p) перед отбором проб ( <=0.0 : без фильтрации) |
см. example_entry.py
и комментарий вверху.
Если вы используете этот код в своих исследованиях, вы можете процитировать наш семинар NeurIPS CAI:
@article{DBLP:journals/corr/abs-1901-08149,
author = {Thomas Wolf and
Victor Sanh and
Julien Chaumond and
Clement Delangue},
title = {TransferTransfo: {A} Transfer Learning Approach for Neural Network
Based Conversational Agents},
journal = {CoRR},
volume = {abs/1901.08149},
year = {2019},
url = {http://arxiv.org/abs/1901.08149},
archivePrefix = {arXiv},
eprint = {1901.08149},
timestamp = {Sat, 02 Feb 2019 16:56:00 +0100},
biburl = {https://dblp.org/rec/bib/journals/corr/abs-1901-08149},
bibsource = {dblp computer science bibliography, https://dblp.org}
}