Le présent dépôt contient le code accompagnant le billet de blog ? Comment créer une IA conversationnelle de pointe avec l'apprentissage par transfert.
Ce code est une base de code propre et commentée avec des scripts de formation et de test qui peuvent être utilisés pour former un agent de dialogue tirant parti de l'apprentissage par transfert à partir d'un modèle de langage OpenAI GPT et GPT-2 Transformer.
Cette base de code peut être utilisée pour reproduire les résultats de la participation de HuggingFace au concours de dialogue NeurIPS 2018 ConvAI2 qui était à la pointe de la technologie en matière de métriques automatiques. Les plus de 3 000 lignes de code de compétition ont été distillées en environ 250 lignes de code de formation avec des options distribuées et FP16 pour former le référentiel actuel.
Ce modèle peut être formé en environ une heure sur une instance cloud 8 V100 (coût actuellement environ 25 $) et un modèle pré-entraîné est également mis à disposition.
Pour installer et utiliser les scripts de formation et d'inférence, veuillez cloner le dépôt et installer la configuration requise :
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
Pour installer à l'aide de Docker, veuillez créer l'image autonome :
docker build -t convai .
Remarque : assurez-vous que votre configuration Docker alloue suffisamment de mémoire pour créer le conteneur. La construction avec la valeur par défaut de 1,75 Go échouera en raison de la grande roue Pytorch.
Vous pouvez ensuite saisir l'image
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
Vous pouvez ensuite exécuter le script interact.py
sur le modèle pré-entraîné :
python3 interact.py --model models/
Nous mettons à disposition un modèle pré-entraîné et affiné sur notre S3 ici. Le moyen le plus simple de télécharger et d'utiliser ce modèle consiste simplement à exécuter le script interact.py
pour communiquer avec le modèle. Sans aucun argument, ce script téléchargera et mettra automatiquement en cache notre modèle.
Le script de formation peut être utilisé dans des paramètres mono-GPU ou multi-GPU :
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
Le script de formation accepte plusieurs arguments pour peaufiner la formation :
Argument | Taper | Valeur par défaut | Description |
---|---|---|---|
chemin_ensemble de données | str | "" | Chemin ou URL de l'ensemble de données. Si vide, téléchargez depuis S3. |
jeu de données_cache | str | './dataset_cache.bin' | Chemin ou URL du cache de l'ensemble de données |
modèle | str | "openai-gpt" | Chemin, URL ou nom court du modèle |
num_candidats | int | 2 | Nombre de candidats à la formation |
max_historique | int | 2 | Nombre d'échanges précédents à conserver dans l'historique |
train_batch_size | int | 4 | Taille du lot pour la formation |
valid_batch_size | int | 4 | Taille du lot pour validation |
gradient_accumulation_steps | int | 8 | Accumuler les dégradés sur plusieurs marches |
mdr | float | 6.25e-5 | Taux d'apprentissage |
lm_coef | float | 1.0 | Coefficient de perte LM |
mc_coef | float | 1.0 | Coefficient de perte à choix multiples |
max_norme | float | 1.0 | Norme de dégradé de détourage |
n_époques | int | 3 | Nombre d'époques de formation |
personnalité_permutations | int | 1 | Nombre de permutations de phrases de personnalité |
appareil | str | "cuda" if torch.cuda.is_available() else "cpu" | Appareil (cuda ou processeur) |
fp16 | str | "" | Réglé sur O0, O1, O2 ou O3 pour la formation fp16 (voir la documentation apex) |
local_rank | int | -1 | Rang local pour les formations distribuées (-1 : non distribué) |
Voici comment reproduire nos résultats sur un serveur doté de 8 GPU V100 (adapter le nombre de nœuds et la taille des lots à votre configuration) :
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
Ce modèle devrait donner un Hits@1 supérieur à 79, une perplexité de 20,5 et un F1 de 16,5 en utilisant le script d'évaluation convai2 (voir ci-dessous).
Ces chiffres sont légèrement inférieurs au nombre que nous avons obtenu lors du concours ConvAI2. Voici ce que vous pouvez modifier pour obtenir les mêmes résultats :
Le script de formation enregistre toutes les expériences et points de contrôle dans un sous-dossier nommé avec l'horodatage de l'expérience dans le dossier ./runs
du dossier de base du référentiel.
Vous pouvez ensuite utiliser le script interactif pour interagir avec le modèle simplement en pointant sur ce dossier.
Voici un exemple de ligne de commande pour exécuter le script interactif :
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
Le modèle affiné donnera FINAL Hits@1 : 0,715
Le script interactif accepte quelques arguments pour peaufiner l'algorithme de décodage :
Argument | Taper | Valeur par défaut | Description |
---|---|---|---|
chemin_ensemble de données | str | "" | Chemin ou URL de l'ensemble de données. Si vide, téléchargez depuis S3. |
jeu de données_cache | str | './dataset_cache.bin' | Chemin ou URL du cache de l'ensemble de données |
modèle | str | "openai-gpt" | Chemin, URL ou nom court du modèle |
max_historique | int | 2 | Nombre d'énoncés précédents à conserver dans l'historique |
appareil | str | cuda si torch.cuda.is_available() sinon cpu | Appareil (cuda ou processeur) |
no_sample | action store_true | Réglé pour utiliser le décodage gourmand au lieu de l'échantillonnage | |
longueur_max | int | 20 | Longueur maximale des énoncés de sortie |
min_length | int | 1 | Longueur minimale des énoncés de sortie |
graine | int | 42 | Graine |
température | int | 0.7 | Échantillonnage de la température softmax |
top_k | int | 0 | Filtrer les jetons top-k avant l'échantillonnage ( <=0 : pas de filtrage) |
top_p | float | 0.9 | Filtrage du noyau (top-p) avant échantillonnage ( <=0.0 : pas de filtrage) |
Pour exécuter les scripts d'évaluation du défi ConvAI2, vous devez d'abord installer ParlAI
dans le dossier de base du dépôt comme ceci :
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
Vous pouvez ensuite exécuter le script d'évaluation depuis le dossier de base 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
Le script d'évaluation accepte quelques arguments pour sélectionner la métrique d'évaluation et modifier l'algorithme de décodage :
Argument | Taper | Valeur par défaut | Description |
---|---|---|---|
type_eval | str | "hits@1" | Évaluez le modèle sur la métrique hits@1 , ppl ou f1 sur l'ensemble de données de validation ConvAI2 |
modèle | str | "openai-gpt" | Chemin, URL ou nom court du modèle |
max_historique | int | 2 | Nombre d'énoncés précédents à conserver dans l'historique |
appareil | str | cuda si torch.cuda.is_available() sinon cpu | Appareil (cuda ou processeur) |
no_sample | action store_true | Réglé pour utiliser le décodage gourmand au lieu de l'échantillonnage | |
longueur_max | int | 20 | Longueur maximale des énoncés de sortie |
min_length | int | 1 | Longueur minimale des énoncés de sortie |
graine | int | 42 | Graine |
température | int | 0.7 | Échantillonnage de la température softmax |
top_k | int | 0 | Filtrer les jetons top-k avant l'échantillonnage ( <=0 : pas de filtrage) |
top_p | float | 0.9 | Filtrage du noyau (top-p) avant échantillonnage ( <=0.0 : pas de filtrage) |
voir example_entry.py
et le commentaire en haut.
Si vous utilisez ce code dans vos recherches, vous pouvez citer notre document d'atelier 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}
}