Implantación de GPT-NeoX 20B en producción y enfoque en Deepspeed

Desplegar GPT-NeoX 20B en producción es un reto y lo hemos aprendido de la manera más difícil en NLP Cloud... En este artículo te contamos más sobre varios trucos relacionados con el uso de GPT-NeoX 20B, y especialmente cómo tratar con DeepSpeed en producción.

GPT-NeoX

GPT-NeoX 20B

GPT-NeoX 20B es el mayor modelo de Procesamiento del Lenguaje Natural de código abierto en el momento de escribir este artículo.

Fue lanzado por EleutherAI hace 2 semanas. Fue entrenado con 20.000 millones de parámetros, tras un arduo trabajo de un año lleno de desafíos. Una de sus principales dificultades parece ser la capacidad de establecer una arquitectura paralela adecuada para que el modelo pueda ser entrenado eficientemente en múltiples GPUs.

Su modelo anterior, GPT-J, fue entrenado en TPUs de Google y fue diseñado para ser utilizado en TPUs. La arquitectura interna de GPT-NeoX 20B es radicalmente diferente y está hecha para ser utilizada en GPUs. La idea es que sea el primero de una serie de modelos aún mayores (el objetivo es alcanzar a GPT-3).

GPT-NeoX 20 es un modelo de generación de texto, lo que significa que puede escribir texto por usted y realmente lograr casi cualquier caso de uso del Procesamiento del Lenguaje Natural con una gran precisión: generación de entradas de blog, chatbots, clasificación de texto, análisis de sentimiento, extracción de palabras clave, generación de código, extracción de entidades, clasificación de intención, respuesta a preguntas, y más...

Sin duda, muchos investigadores y empresas aprovecharán este nuevo modelo y obtendrán grandes resultados. Pero hay un reto: ¿cómo desplegar GPT-NeoX 20B?

Requisitos de hardware

El primer reto al que se enfrenta uno cuando intenta desplegar GPT-NeoX 20B en producción, es el hardware avanzado que requiere.

Todavía era posible implementar GPT-J en hardware de consumo, aunque fuera muy caro. Por ejemplo, se podía implementar en una CPU muy buena (aunque el resultado fuera dolorosamente lento) o en una GPU de juegos avanzada como la NVIDIA RTX 3090. Pero GPT-NeoX 20B es tan grande que ya no es posible.

Básicamente, GPT-NeoX requiere al menos 42 GB de VRAM y 40 GB de espacio en disco (y sí, estamos hablando de la versión slim fp16). Pocas GPUs cumplen estos requisitos. Las principales son las NVIDIA A100, A40 y RTX A6000.

Estas GPU no sólo son muy caras, sino que además es difícil hacerse con una de ellas hoy en día debido a la escasez mundial de semiconductores.

La mejor solución en este caso es optar por una arquitectura multi-GPU.

Multi-GPU con Deepspeed

Si no puedes meter tu modelo en una sola GPU, puedes intentar dividirlo en varias GPU.

Es una opción interesante por dos razones. En primer lugar, escalar una infraestructura horizontalmente suele ser más barato que hacerlo verticalmente. Esto es cierto para los servidores y también para las GPU. En segundo lugar, es más fácil hacerse con varias GPUs pequeñas como la NVIDIA Tesla T4 que con GPUs más grandes como la NVIDIA A40.

Por desgracia, dividir un modelo de aprendizaje automático en varias GPU es un reto técnico. Hugging Face hizo un gran artículo sobre el paralelismo de modelos y las opciones que tienes. Léelo aquí. Pero por suerte, EleutherAI diseñó la GPT-NeoX 20B de forma que es fácilmente paralelizable en varias GPUs, ya sea para el entrenamiento o la inferencia.

La arquitectura GPT-NeoX se basa en Deepspeed. Deepspeed es un marco de trabajo de Microsoft que se diseñó originalmente para paralelizar los entrenamientos entre varias GPU, y cada vez se utiliza más para la inferencia también. EleutherAI hizo todo el trabajo duro, por lo que paralelizar GPT-NeoX es tan sencillo como cambiar un número en un archivo de configuración.

Paralelismo GPT-NeoX
Extract from the GPT-NeoX docs about parallelism

Sin embargo, desplegar Deepspeed en producción para la inferencia en línea a través de una API es difícil... Deepspeed no fue diseñado para integrarse fácilmente en servidores web. En NLP Cloud, lo aprendimos por las malas, pero después de un arduo trabajo finalmente logramos dar con una forma eficiente de hacer que Deepspeed y GPT-NeoX funcionen detrás de nuestra API.

Trucos de uso

Supongamos que ha conseguido aprovisionar el hardware adecuado y desplegar correctamente GPT-NeoX 20B con Deepspeed. Ahora hay un par de advertencias que debes tener en cuenta.

En primer lugar, en comparación con GPT-J, los parámetros (top k, top p y temperatura) no tienen los mismos efectos en el modelo. Así que si has conseguido encontrar una buena configuración para GPT-J, no lo des por hecho: tendrás que hacer nuevas pruebas con GPT-NeoX.

Por último, aunque el tamaño de la entrada pueda llegar a 2048 tokens, requerirá más memoria que los 42 GB de base mencionados anteriormente...

¿Inferencia por lotes?

Los modelos GPT son bastante lentos, y el GPT-NeoX 20B no es una excepción. Así que, para mejorar el rendimiento de su aplicación, puede que quiera trabajar en una solución de inferencia por lotes.

Por el momento no hemos encontrado una buena solución para eso en NLP Cloud.

El código de GPT-NeoX está hecho para que uno pueda realizar varias inferencias al mismo tiempo dentro de una sola solicitud. Pero en nuestras pruebas, el tiempo de respuesta crecía linealmente con el número de inferencias, lo que anula el propósito de la inferencia por lotes...

Conclusión:

El GPT-NeoX 20B es definitivamente difícil de implementar en producción. La calidad de la generación de textos es sorprendente, pero pocos tendrán la capacidad de instalar realmente este modelo.

Más que nunca, parece que la solución será apoyarse en un servicio en la nube como NLP Cloud para utilizar este modelo.

Si tienes comentarios sobre este artículo, no dudes en ponerte en contacto con nosotros, ¡será estupendo conocer tu opinión al respecto!

Julien Salinas
CTO en NLP Cloud