¿El repositorio actual contiene el código que acompaña a la publicación del blog? Cómo construir una IA conversacional de última generación con aprendizaje por transferencia.
Este código es una base de código limpia y comentada con scripts de entrenamiento y prueba que se pueden usar para entrenar un agente de diálogo aprovechando la transferencia. Aprendizaje de un modelo de lenguaje OpenAI GPT y GPT-2 Transformer.
Esta base de código se puede utilizar para reproducir los resultados de la participación de HuggingFace en el concurso de diálogo ConvAI2 de NeurIPS 2018, que fue lo último en métricas automáticas. Las más de 3.000 líneas de código de competencia se destilaron en aproximadamente 250 líneas de código de capacitación con opciones distribuidas y FP16 para formar el repositorio actual.
Este modelo se puede entrenar en aproximadamente una hora en una instancia de nube 8 V100 (actualmente cuesta alrededor de $25) y también está disponible un modelo previamente entrenado.
Para instalar y utilizar los scripts de capacitación e inferencia, clone el repositorio e instale los requisitos:
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
Para instalar usando Docker, cree la imagen independiente:
docker build -t convai .
Nota: asegúrese de que la configuración de Docker asigne suficiente memoria para construir el contenedor. La compilación con el valor predeterminado de 1,75 GB fallará debido a la gran rueda de Pytorch.
Luego puedes ingresar la imagen.
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
Luego puede ejecutar el script interact.py
en el modelo previamente entrenado:
python3 interact.py --model models/
Aquí ponemos a disposición un modelo previamente entrenado y ajustado en nuestro S3. La forma más sencilla de descargar y utilizar este modelo es simplemente ejecutar el script interact.py
para hablar con el modelo. Sin ningún argumento, este script descargará y almacenará automáticamente en caché nuestro modelo.
El script de entrenamiento se puede utilizar en configuraciones de GPU única o de múltiples GPU:
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
El guión de formación acepta varios argumentos para modificar la formación:
Argumento | Tipo | Valor predeterminado | Descripción |
---|---|---|---|
ruta_conjunto_datos | str | "" | Ruta o URL del conjunto de datos. Si está vacío, descargue desde S3. |
conjunto de datos_cache | str | './dataset_cache.bin' | Ruta o URL de la caché del conjunto de datos |
modelo | str | "openai-gpt" | Ruta, url o nombre corto del modelo |
num_candidatos | int | 2 | Número de candidatos a la formación |
max_historia | int | 2 | Número de intercambios anteriores para mantener en la historia |
tren_lote_tamaño | int | 4 | Tamaño del lote para entrenamiento |
tamaño_lote_válido | int | 4 | Tamaño de lote para validación |
pasos_de_acumulación_gradiente | int | 8 | Acumular gradientes en varios pasos. |
lr | float | 6.25e-5 | Tasa de aprendizaje |
lm_coef | float | 1.0 | Coeficiente de pérdida LM |
mc_coef | float | 1.0 | Coeficiente de pérdida de opción múltiple |
norma_max | float | 1.0 | Norma de gradiente de recorte |
n_épocas | int | 3 | Número de épocas de entrenamiento |
permutaciones_personalidad | int | 1 | Número de permutaciones de oraciones de personalidad. |
dispositivo | str | "cuda" if torch.cuda.is_available() else "cpu" | Dispositivo (cuda o cpu) |
fp16 | str | "" | Establezca en O0, O1, O2 u O3 para el entrenamiento fp16 (consulte la documentación de Apex) |
rango_local | int | -1 | Rango local para entrenamiento distribuido (-1: no distribuido) |
A continuación se explica cómo reproducir nuestros resultados en un servidor con 8 GPU V100 (adapte el número de nodos y el tamaño de los lotes a su configuración):
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
Este modelo debería dar Hits@1 superior a 79, perplejidad de 20,5 y F1 de 16,5 utilizando el script de evaluación convai2 (ver más abajo).
Estas cifras son ligeramente inferiores a las que obtuvimos en el concurso ConvAI2. Esto es lo que puedes modificar para alcanzar los mismos resultados:
El script de entrenamiento guarda todos los experimentos y puntos de control en una subcarpeta nombrada con la marca de tiempo del experimento en la carpeta ./runs
de la carpeta base del repositorio.
Luego puede utilizar el script interactivo para interactuar con el modelo simplemente señalando esta carpeta.
Aquí hay una línea de comando de ejemplo para ejecutar el script interactivo:
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
El modelo ajustado dará impactos FINALES@1: 0,715
El script interactivo acepta algunos argumentos para modificar el algoritmo de decodificación:
Argumento | Tipo | Valor predeterminado | Descripción |
---|---|---|---|
ruta_conjunto_datos | str | "" | Ruta o URL del conjunto de datos. Si está vacío, descargue desde S3. |
conjunto de datos_cache | str | './dataset_cache.bin' | Ruta o URL de la caché del conjunto de datos |
modelo | str | "openai-gpt" | Ruta, url o nombre corto del modelo |
max_historia | int | 2 | Número de expresiones anteriores para mantener en el historial |
dispositivo | str | cuda si torch.cuda.is_available() más cpu | Dispositivo (cuda o cpu) |
no_muestra | acción store_true | Configurado para usar decodificación codiciosa en lugar de muestreo | |
longitud_max | int | 20 | Longitud máxima de las expresiones de salida. |
longitud_min | int | 1 | Longitud mínima de las expresiones de salida. |
semilla | int | 42 | Semilla |
temperatura | int | 0.7 | Temperatura softmax de muestreo |
top_k | int | 0 | Filtrar los tokens top-k antes del muestreo ( <=0 : sin filtrado) |
arriba_p | float | 0.9 | Filtrado de núcleo (top-p) antes del muestreo ( <=0.0 : sin filtrado) |
Para ejecutar los scripts de evaluación del desafío ConvAI2, primero debe instalar ParlAI
en la carpeta base del repositorio de esta manera:
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
Luego puede ejecutar el script de evaluación desde la carpeta 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
El script de evaluación acepta algunos argumentos para seleccionar la métrica de evaluación y modificar el algoritmo de decodificación:
Argumento | Tipo | Valor predeterminado | Descripción |
---|---|---|---|
tipo_evaluación | str | "hits@1" | Evalúe el modelo según la métrica hits@1 , ppl o f1 en el conjunto de datos de validación ConvAI2 |
modelo | str | "openai-gpt" | Ruta, url o nombre corto del modelo |
max_historia | int | 2 | Número de expresiones anteriores para mantener en el historial |
dispositivo | str | cuda si torch.cuda.is_available() más cpu | Dispositivo (cuda o cpu) |
no_muestra | acción store_true | Configurado para usar decodificación codiciosa en lugar de muestreo | |
longitud_max | int | 20 | Longitud máxima de las expresiones de salida. |
longitud_min | int | 1 | Longitud mínima de las expresiones de salida. |
semilla | int | 42 | Semilla |
temperatura | int | 0.7 | Temperatura softmax de muestreo |
top_k | int | 0 | Filtrar los tokens top-k antes del muestreo ( <=0 : sin filtrado) |
arriba_p | float | 0.9 | Filtrado de núcleo (top-p) antes del muestreo ( <=0.0 : sin filtrado) |
consulte example_entry.py
y el comentario en la parte superior.
Si utiliza este código en su investigación, puede citar nuestro documento del taller 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}
}