Implementación de un modelo generador de diálogo neuronal con XLNet
previamente entrenado Yang et al. (2019) y arquitectura GPT2
Radford et al. (2019) sobre tres conjuntos de datos actuales: DailyDialog
Li et al. (2017) , PersonaChat
Zhang et al. (2018) y el nuevo TopicalChat
Gopalakrishnan et al. (2019) de Alexa Prize Socialbot Grand Challenge 3. Muestreo Top-k Fan et al. (2018) y decodificación del núcleo Holtzman et al. (2019) están disponibles como técnicas de decodificación. El objetivo de la formación es el modelado del lenguaje autorregresivo sobre los enunciados y las historias de diálogo.
El modelo puede aprovechar el entrenamiento de precisión mixto de nvidia/apex. Tenga en cuenta que el ápice no es necesario y solo se utiliza si está disponible. Para obtener una guía de instalación, consulte las instrucciones oficiales. El uso de este módulo no es útil para todas las GPU (solo Volta y Turing) y debe verificar antes si su instancia admite entrenamiento de precisión mixto.
Para entrenar el modelo, clone este repositorio e instale dependencias. El proyecto utiliza cython para ensamblar lotes para una canalización de entrada más rápida. También prefirió utilizar un virtualenv de 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
El siguiente comando comenzará a entrenar en una única GPU/CPU con modelo gpt2-medium
en PersonaChat
. --name
es el nombre del subdirectorio en la carpeta del modelo, donde se guardan los registros y puntos de control.
python -m src.train --model gpt2-medium --data personachat --name my_test_run
Para el entrenamiento distribuido de múltiples GPU, el script de entrenamiento debe llamarse así.
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS src/train.py --model gpt2
También puede utilizar configuraciones predefinidas pasando la ruta del archivo json de configuración como argumento --config
. Estos están disponibles en la carpeta src/configs
y sus resultados de entrenamiento se pueden ver debajo de la sección de resultados.
python -m src.train --config src/configs/xlnet-dailydialog.json
Entrenar el modelo es rápido y fácil en Google Colaboratory o Kaggle kernel . Es importante configurar el tipo de tiempo de ejecución en GPU con la nueva unidad Tesla P100 o Tesla T4, ya que puede aprovechar al máximo el entrenamiento de precisión mixta y es mucho más rápida que la versión anterior Tesla K80. Puedes comprobar el tipo actual ejecutando !nvidia-smi
en una celda de tu colab.
Como atajo, aquí tienes un ejemplo completo, que puedes simplemente importar a tu Google Drive como un archivo colaborativo.
Copie y ejecute el siguiente código en una celda de su archivo colab (o kernel de Kaggle) para instalar el modelo. Si usa el kernel de Kaggle, también debe habilitar el acceso a 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
Las métricas de entrenamiento y validación se registran en Tensorboard, que también se puede rastrear en el archivo colab si el siguiente código se ejecuta antes de la celda de entrenamiento.
%load_ext tensorboard
%tensorboard --logdir " dialogue-generation/model "
Luego, el modelo se puede entrenar simplemente ejecutando el script train
con los indicadores predeterminados. Puede ver todos los indicadores aceptados por el script train.py
proporcionando el indicador -h
.
! cd dialogue-generation ; python -m src.train
Después del entrenamiento, el modelo se puede descargar estableciendo el enlace de descarga en el siguiente fragmento en el que registra el script después de la evaluación. ( 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 modo de evaluación interactiva está disponible en el modelo entrenado ejecutando el script interact
y proporcionando la ruta del modelo entrenado con --model_file
. También puede proporcionar el archivo --config
o simplemente dar el mismo argumento --model
y --name
que se utilizó durante el entrenamiento.
python -m src.interact --model gpt2-medium --name my_test_run
python -m src.interact --config src/configs/xlnet-dailydialog.json
Para entrenar cualquier modelo en su propio conjunto de datos, simplemente debe crear una subclase de DialogDataset
e implementar la generación de datos a partir de los archivos sin formato. Dado un train.txt
, valid.txt
y test.txt
colocados en data<name of your data>
, donde cada turno en un diálogo está en una nueva línea y los diálogos separados están divididos por una línea vacía adicional.
├── 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.
En data.py
se implementa una clase de conjunto de datos personalizado de ejemplo denominada CustomDataset
que lee un conjunto de datos con estas propiedades.
El siguiente cuadro de diálogo es una muestra de gpt2
entrenado con parámetros predeterminados para 7 épocas (149051 pasos) y --max_hist 3
en el conjunto de datos 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
El siguiente cuadro de diálogo es una muestra de gpt2
entrenado con parámetros predeterminados para 8 épocas (48824 pasos) y --max_hist 3
en el conjunto de datos 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.