martes, 21 de julio de 2020

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

"Therefore the will has as its goal the mature consciousness of a man..."
(Schopenhauer GPT-2)


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í: https://github.com/Zeta36/schopenhauer_GPT_2



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

Preparando su 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 https://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 https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb

!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.

9 comentarios:

Shalom dijo...

¡Gracias!

Aparte del .txt soporta otro formato de texto?

Samu dijo...

Cualquier formato pero que el contenido sea de tipo texto plano ;).

Samu dijo...

Un amigo acaba de comentarme que ha conseguido los siguientes aforismos generados a partir de pasarle al modelo como entrada los textos de la obra de Emil Cioran. ¡No tiene desperdicio!:

"The greater part of human events would be a story not of heroic characters but of hyenas".

"Nothing suppresses our curiosity so as to be unable to invent an effect superior to that already existing in astronomy".

"I feel as good running after my ideas as I do running after food".

"We can see into the heart of a man only when we hug him close. When we tear his clothes …"

"It is our ambition to dissector his essence, to understand his grudges; to graft them on to a single malleable organ; to tear that wretched thing to pieces; — this is the terrible certainty".

"You cannot change the world by lecturing it about justice or democracy. You only influence them by appealing to their basest instincts, to the cheerfulness of their fascinations".

"Human nature: too numerous to have any one point of view".

"In order to secure some temporary repose, we must try, each time, to assassinate off a fragment of our former self".

"Right from the start, Man felt himself to be trapped in the immensity of the impossible. From the third day he was constructing towns, cathedrals, and temples on the spotless impossibilities of the air — from the first the palace of terror is near".

Félix Eroles dijo...

Hola Samu, llevo desde que publicaste la entrada intentando hacer correr tu modelo adaptado a la ëtica de Spinoza y cuando lo lanzo peta.

Seguro que haré muchas partes mal pero por ahora me veo incapaz de hacerlo correr.
Me da muchos warnings con la versión del TF y al final no puede leer mi eticaspinoza.txt.

Continúo investigando pues le pasa a más personas
Snif...

Samu dijo...

Buenas, Félix. Pásame un enlace desde donde poder descargar el fichero "eticaspinoza.txt". Lo intentaré hacer yo a ver si descubro que error puedes tener. Como te digo varios amigos y conocidos lo han conseguido sin problema en otros corpus.

Félix Eroles dijo...

Hola Samu,
Aquí te lo dejo. Gracias
https://docs.google.com/document/d/1QMWKRGRPr9B1xTXvW1BDG_su3gPaZrH_15JquxTBL-4/edit?usp=sharing

Samu dijo...

Félix, a mí me funciona bien. Una cosa que se me ocurre es que no hayas cambiado bien la ruta del corpus de datos en tu Google Colab. Por ejemplo, en mi caso la línea:

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

la tuve que cambiar a:

!PYTHONPATH=src ./train.py --dataset /content/drive/My\ Drive/schopenhauer_gtp_2/dataset/eticaspinoza.txt --model_name '345M'

Debes asegurarte que la ruta "/content/drive/My\ Drive/schopenhauer_gtp_2/dataset/eticaspinoza.txt" existe en tu Drive. También prueba a quitar de la misma línea de código esta parte: "--batch_size 1 --learning_rate 0.00001".

Como última prueba, una vez todo lo anterior hecho, prueba a pulsar en la opción del menú "Entorno de ejecución > Restablecer el estado de fábrica del entorno de ejecución" y posteriormente de nuevo en "Ejecutar todo".

Ya me cuentas. ¡Un abrazo!

Félix Eroles dijo...

Disculpa Samu que te continúe molestando. Cada poco tiempo pruebo diferentes sintaxis a ver si consigo hacer correr tu ejemplo pero me es imposible.

Seguro que será una tontería. Te paso el mensaje que me da por si me puedes orientar.
>>>>>>>>>>>>>>>
Loading checkpoint models/345M/model.ckpt
Loading dataset...
0% 0/1 [00:00
main()
File "./train.py", line 174, in main
chunks = load_dataset(enc, args.dataset, args.combine, encoding=args.encoding)
File "/content/gpt-2/src/load_dataset.py", line 32, in load_dataset
with open(path, 'r', encoding=encoding) as fp:
OSError: [Errno 95] Operation not supported: '/content/drive/My Drive/spinoza_gtp_2/dataset/eticaspinoza.txt.gdoc'
>>>>>>>>>>>>>>>>>>>>

Un saludo !!!

Félix Eroles dijo...

Otro error si sigo tu ejemplo tal cual excepto por cambiar al libro de Spinoza:
>>>>>>>>>>
Loading checkpoint models/345M/model.ckpt
Loading dataset...
0it [00:00, ?it/s]
dataset has 0 tokens
Training...
Traceback (most recent call last):
File "./train.py", line 297, in
main()
File "./train.py", line 275, in main
feed_dict={context: sample_batch()})
File "./train.py", line 251, in sample_batch
return [data_sampler.sample(1024) for _ in range(args.batch_size)]
File "./train.py", line 251, in
return [data_sampler.sample(1024) for _ in range(args.batch_size)]
File "/content/gpt-2/src/load_dataset.py", line 74, in sample
self.chunks
ZeroDivisionError: integer division or modulo by zero
>>>>>>>>>>>>>>>>
Gracias

Publicar un comentario