Guía paso a paso sobre cómo entrenar el modelo GPT-2 usando Google Colab

El modelo Schopenhauer-GPT-2 fue entrenado usando de base el modelo GPT-2 de OpenAI. Se realizó un fino ajuste sobre el modelo previamente entrenado al ser provisto de la obra completa del filósofo Schopenhauer. Este proyecto tiene como objetivo estudiar cómo GPT-2 puede comprender ideas y conceptos filosóficos profundos. Los resultados fueron bastante entretenidos y prometedores al presenciar como el modelo intenta siempre explicar y/o meter baza con el concepto Schopenhariano de Voluntad (the will). Os dejo un par de ejemplos del resultado final. El texto está en inglés puesto que el modelo pre-entrenado de partida es en inglés (de momento no hay versión en castellano):

"Therefore the will has as its goal the mature consciousness of a man, in which, therefore, in its nature, the perfection of itself may exist. Consequently, the development of this consciousness is in itself essential, and leads out of the man, not as something external to him, but merely as the product of his inner constitution. His will, upon the contrary, is conditioned by his intellect, and is the inner product of his intellect."
"The truth is, that the will really presents us with two problems: first, whether we should remain in ourselves, or whether, as soon as we set our selves, correctly, up as to our own individuality, we should, like other individuals, enter into relations of mingled freedom with a stranger. In the first place, the question is how we should go about this; secondly, how we should come to be ourselves again. The reply to the first is, that we ought to become what we were made to be—what each and all of us is—the will to live. The will is the first thing to recognize this truth."

Este proyecto, huelga decir, es fácilmente reutilizable para entrenar sobre otros textos y formatos. Podéis encontrar el código fuente aquí: github.com/Zeta36/schopenhauer_GPT_2

A continuación os dejo unas breves instrucciones para que podáis echarlo a andar con éxito:

Preparando tu cuaderno de Google Colab

Utilizaremos Google Drive para guardar nuestros checkpoints (un checkpoint es nuestro último modelo guardado en el momento del entrenamiento). Una vez que se guarda nuestro modelo entrenado, podemos cargarlo cuando queramos generar textos condicionales e incondicionales.

Nota: no olvides configurar el tipo de ejecución de tu Google Colab en modo GPU.

Use el siguiente código para conectar tu Google Colab y tu Google Drive:

from google.colab import drive

drive.mount('/content/drive')

Una vez conectado a Google Drive, creamos la carpeta donde almacenar los checkpoints:

%cd drive

%cd My\ Drive

%mkdir schopenhauer_gtp_2

%cd /content/

!ls

A continuación clonamos el repositorio GPT-2 de @Mohamad Ali Nasser

que es un fork del impresionante repositorio de @nnsheperd (que es a su vez un fork del repositorio original de OpenAI pero con la increíble incorporación del fichero de entrenamiento: train.py):

!git clone github.com/mohamad-ali-nasser/gpt-2.git

Ahora descargamos el modelo pre-entrenado que deseemos utilizar. Trabajaremos con el modelo '345M', que es bastante decente. La razón por la que trabajaremos con ese modelo en lugar de usar el '774M' o el '1558M' es porque la memoria de GPU disponible está limitada en Google Colab durante la fase de entrenamiento: 

%cd gpt-2

!python3 download_model.py 345M

Ahora que el modelo está instalado, preparemos nuestro dataset y carguemos nuestros checkpoints en caso de que ya hayamos entrenado previamente nuestro modelo:

!ls /content/drive/My\ Drive/schopenhauer_gtp_2/checkpoint

!cp -r /content/drive/My\ Drive/schopenhauer_gtp_2/checkpoint/checkpoint/run1/* /content/gpt-2/models/345M

Descargar dependencias y CUDA.

Ahora que tenemos todo listo, preparemos el entorno. Comenzaremos instalando el archivo de dependencias.

%cd /content/gpt-2

!pip3 install -r requirements.txt

!pip install tensorflow-gpu==1.15.0

!pip install 'tensorflow-estimator<1 .15.0rc0="">=1.14.0rc0' --force-reinstall

!wget developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda-repo-

!dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb

!apt-key add /var/cuda-repo-*/7fa2af80.pub

!apt-get update

!apt-get install cuda-9-0

!export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-9.0/lib64/

Entrenamos al modelo.

Ya podemos pasar directamente a entrenar al modelo utilizando el dataset (texto plano) que hayamos previamente decidido utilizar (en mi caso fue un archivo 'books.txt' con toda la obra completa de Schopenhauer en formato de texto):

!PYTHONPATH=src ./train.py --dataset /content/drive/My\ Drive/schopenhauer_gtp_2/dataset/books.txt --model_name '345M' --batch_size 1 --learning_rate 0.00001 

El modelo guardará un checkpoint cada 1000 iteraciones. Puedes seguir ejecutándolo durante minutos, horas o días, todo depende de la cantidad de texto en el dataset.

Ahora que el modelo está entrenado, guardemos los checkpoints en Google Drive:

!cp -r /content/gpt-2/checkpoint/ /content/drive/My\ Drive/schopenhauer_gtp_2/checkpoint

Generando texto condicionado.

Finalmente ya podemos proceder a generar texto con nuestro nuevo modelo ajustado al dataset utilizado.

import os

%cd src

from conditional_model import conditional_model

%cd ..

conditional_model(seed=1, model_name='345M', sentences=['The truth is'])

Ésta última sentencia será la encargada de ofrecer una salida de texto generada por nuestro modelo completando el contexto pasado como parámetro (en el caso de ejemplo 'The truth is'). 

La salida, en mi caso; una vez entrenado GPT-2 con las obras completas del filósofo Schopenhauer fue el siguiente:

"The truth is, that the will really presents us with two problems: first, whether we should remain in ourselves, or whether, as soon as we set our selves, correctly, up as to our own individuality, we should, like other individuals, enter into relations of mingled freedom with a stranger. In the first place, the question is how we should go about this; secondly, how we should come to be ourselves again. The reply to the first is, that we ought to become what we were made to be—what each and all of us is—the will to live. The will is the first thing to recognize this truth."

Nota: Si queréis conocer más sobre el proyecto GPT-2 de OpenAI, podéis visitar esta entrada de su blog.