Implémentation d'un modèle de générateur de dialogue neuronal avec XLNet
pré-entraîné Yang et al. (2019) et architecture GPT2
Radford et al. (2019) sur trois ensembles de données actuellement : DailyDialog
Li et al. (2017) , PersonaChat
Zhang et al. (2018) et le nouveau TopicalChat
Gopalakrishnan et al. (2019) d'Alexa Prize Socialbot Grand Challenge 3. Échantillonnage Top-k Fan et al. (2018) et décodage du noyau Holtzman et al. (2019) sont disponibles comme techniques de décodage. L'objectif de la formation est une modélisation linguistique autorégressive sur les énoncés et les histoires de dialogue.
Le modèle peut tirer parti de l’entraînement de précision mixte de nvidia/apex. Notez que l'apex n'est pas obligatoire et n'est utilisé que s'il est disponible. Pour le guide d’installation, consultez les instructions officielles. L'utilisation de ce module n'est pas utile pour tous les GPU (uniquement Volta et Turing) et vous devez vérifier au préalable si votre instance prend en charge l'entraînement de précision mixte.
Pour entraîner le modèle, clonez ce référentiel et installez les dépendances. Le projet utilise Cython pour assembler des lots afin d'obtenir un pipeline d'entrée plus rapide. Il a également préféré utiliser un virtualenv python.
git clone https://github.com/bme-chatbots/dialogue-generation.git
cd dialogue-generation
pip install -r requirements.txt
python setup.py build_ext --inplace
La commande suivante lancera l'entraînement sur un seul GPU/CPU avec le modèle gpt2-medium
sur PersonaChat
. --name
est le nom du sous-répertoire du dossier modèle, où les journaux et les points de contrôle sont enregistrés.
python -m src.train --model gpt2-medium --data personachat --name my_test_run
Pour la formation multi-GPU distribuée, le script de train doit être appelé comme ceci.
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS src/train.py --model gpt2
Vous pouvez également utiliser des configurations prédéfinies en passant le chemin du fichier de configuration json comme argument --config
. Ceux-ci sont disponibles dans le dossier src/configs
et leurs résultats de formation peuvent être consultés sous la section des résultats.
python -m src.train --config src/configs/xlnet-dailydialog.json
La formation du modèle est rapide et simple sur Google Colaboratory ou le noyau Kaggle . Il est important de définir le type d'exécution sur GPU avec la nouvelle unité Tesla P100 ou Tesla T4, car elle peut pleinement exploiter l'entraînement à précision mixte et est beaucoup plus rapide que l'ancienne version Tesla K80. Vous pouvez vérifier le type actuel en exécutant !nvidia-smi
dans une cellule de votre collaboration.
À titre de raccourci, voici un exemple complet, que vous pouvez simplement importer sur votre Google Drive en tant que fichier collaboratif.
Copiez et exécutez le code suivant dans une cellule de votre fichier colab (ou noyau Kaggle) pour installer le modèle. Si vous utilisez le noyau Kaggle, vous devez également activer l'accès à Internet.
! git clone https://github.com/bme-chatbots/dialogue-generation.git
! python -m pip install --upgrade pip
# installing apex is optional and is only useful if Colab's Tesla P100 or T4 is used
# !git clone https://github.com/NVIDIA/apex
# !cd apex; pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" .
# building the cython code and installing the required packages
! cd dialogue-generation ; pip install -r requirements.txt ; python setup.py build_ext --inplace
Les métriques de formation et de validation sont enregistrées sur Tensorboard, qui peuvent également être suivies dans le fichier Colab si le code ci-dessous est exécuté avant la cellule de formation.
%load_ext tensorboard
%tensorboard --logdir " dialogue-generation/model "
Le modèle peut ensuite être entraîné en exécutant simplement le script train
avec les indicateurs par défaut. Vous pouvez voir tous les indicateurs acceptés par le script train.py
en fournissant l'indicateur -h
.
! cd dialogue-generation ; python -m src.train
Après la formation, le modèle peut être téléchargé en définissant le lien de téléchargement dans l'extrait suivant sur celui enregistré par le script après évaluation. ( Saving model to dialogue-generation/src/../model/gpt2/19.11.03-12:59:47/model.pt
)
from IPython . display import FileLink
# note that in case of kaggle kernel you have to give path
# relative to your working directory
FileLink ( r'dialogue-generation/src/../model/gpt2/19.11.03-12:59:47/model.pt' )
Un mode d'évaluation interactif est disponible sur le modèle entraîné en exécutant le script interact
et en fournissant le chemin du modèle entraîné avec --model_file
. Vous pouvez également fournir le fichier --config
ou simplement donner les mêmes arguments --model
et --name
que ceux utilisés lors de la formation.
python -m src.interact --model gpt2-medium --name my_test_run
python -m src.interact --config src/configs/xlnet-dailydialog.json
Pour entraîner n'importe quel modèle sur votre propre ensemble de données, vous devez simplement sous-classer DialogDataset
et implémenter la génération de données à partir des fichiers bruts. Étant donné un train.txt
, valid.txt
et test.txt
placés dans data<name of your data>
, où chaque tour d'une boîte de dialogue se trouve sur une nouvelle ligne et les boîtes de dialogue séparées sont divisées par une ligne vide supplémentaire.
├── data
| ├── dailydialog
| └── custom_dataset # name of your data ( custom_dataset by default )
| ├── train.txt # the correctly formated train, valid and test files
| ├── valid.txt
| └── test.txt
├── src
Hello how are you?
Hi I'm fine thanks. And you?
Me too thanks for asking.
Hi my name Peter.
Nice to meet you I am Eric.
Un exemple de classe d'ensemble de données personnalisé nommé CustomDataset
est implémenté dans data.py
qui lit un ensemble de données avec ces propriétés.
La boîte de dialogue ci-dessous est un échantillon de gpt2
entraîné avec des paramètres par défaut pour 7 époques (149 051 étapes) et --max_hist 3
sur l'ensemble de données PersonaChat
.
User: hi
Bot: greetings, i'm gerald.
User: how are you ?
Bot: good, thanks. getting ready for another hike, i love hiking!
User: oh realy? where are you going?
Bot: pikes peak. i am curently exploring famous mountains when i have time.
User: that is cool are you going alone?
Bot: my brother is in the us, we go hiking with him every month.
User: how old are you by the way?
Bot: a little under 46 years old
User: are you in a relationship?
Bot: yes i am married, 3 boys, i am pregnant again. i am too busy to focus
La boîte de dialogue ci-dessous est échantillonnée à partir de gpt2
entraîné avec des paramètres par défaut pour 8 époques (48 824 étapes) et --max_hist 3
sur l'ensemble de données DailyDialog
.
User: hi how are you ?
Bot: fine. i got a promotion at work earlier this week.
User: where do you work ?
Bot: I work at the polling place.
User: where is that ?
Bot: I live in the dorms across the street.
User: do you like it ?
Bot: it's great. I heard it is far from here.
User: are you a student ?
Bot: yes. I am a student too.