Cómo acelerar la inferencia del aprendizaje profundo para los transformadores del NLP

Los modelos avanzados de aprendizaje profundo para NLP basados en Transformers dan resultados impresionantes, pero conseguir rendimientos de alta velocidad es difícil. En este artículo resumimos las mejores opciones que tienes si quieres disminuir la latencia de tus predicciones en producción.

Utilizar una CPU o GPU mejor

Cuando se quiere mejorar la velocidad de los modelos de NLP basados en Transformer, el enfoque "ingenuo" es utilizar un hardware más hardware avanzado.

La mayoría de las veces se trata de una solución inevitable, ya que todas las soluciones basadas en software puro tienen límites. Imagina que realizas inferencia en una CPU. Puede pasar semanas trabajando en la optimización de bajo nivel para su modelo favorito basado en Transformer, es muy probable que aún así obtengas una mejor mejora de la velocidad simplemente trasladando tu modelo a una NVIDIA A100.

Actualmente, las GPU más utilizadas para la inferencia en la producción son las NVIDIA Tesla T4 y V100.

GPU NVIDIA Tesla

¿Pero qué pasa si ya ha actualizado su hardware? O si su presupuesto es limitado y no puede permitirse el lujo de aprovechar las últimas y costosas GPUs? ¡Lee lo siguiente!

Inferencia por lotes

La inferencia por lotes consiste en enviar varias solicitudes al mismo tiempo a su modelo, de modo que éste atienda sus solicitudes a la vez.

La inferencia por lotes es muy potente porque su modelo tardará casi lo mismo en atender varias solicitudes como para atender una solicitud. Bajo el capó, algunas operaciones serán factorizadas, de modo que que en lugar de hacer todo n veces, el modelo sólo tiene que hacerlo una vez.

Técnicamente hablando, no disminuye la latencia de sus peticiones, porque sus peticiones no serán más rápido, pero mejorará drásticamente el rendimiento de su aplicación (su aplicación puede manejar más peticiones con el mismo hardware).

Sin embargo, la inferencia por lotes no es perfecta.

En primer lugar, no siempre es adecuado para la inferencia en línea (es decir, para las aplicaciones orientadas al cliente), porque para construir sus lotes tendrá que amortiguar algunas solicitudes de los usuarios, por lo que algunos usuarios tendrán esperar más de lo normal.

Segundo reto: la inferencia por lotes funciona mejor para solicitudes similares. Por ejemplo, si está desplegando un modelo modelo de NLP de generación de texto, la inferencia por lotes será más eficaz si se crean lotes de peticiones que tienen la misma longitud.

Por último, la inferencia por lotes no la realiza el propio modelo de aprendizaje profundo, sino una capa de nivel superior nivel superior, como un servidor de inferencia dedicado. No siempre es fácil implementar una capa de este tipo. Para ejemplo, el servidor de inferencia Triton de NVIDIA (ver más abajo) es muy bueno para realizar inferencia por lotes, pero primero tienes que encontrar una forma de hacer que tu modelo sea compatible con Triton.

Una vez que consigues exportar tu modelo a Triton, la inferencia por lotes es muy sencilla. Por ejemplo, aquí se explica cómo crear lotes de hasta 128 peticiones, y esperar un máximo de 5 segundos antes de procesar el lote (esto debe ponerse en el archivo "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Aprovechar las implementaciones personalizadas

Muchas personas y empresas están trabajando duro en optimizaciones de bajo nivel para algunos modelos de NLP basados en Transformer basados en Transformer. Puede ser una buena idea para usted aprovechar estas implementaciones personalizadas de su modelo.

La mayoría de las veces estas implementaciones personalizadas son fáciles de usar y no requieren casi ningún trabajo adicional por su parte. usted. Permítanme mencionar algunos de ellos aquí:

Aquí tienes un ejemplo de cómo puedes realizar la inferencia para tu modelo GPT Neo 2.7B gracias a DeepSpeed. No es muy difícil, ¿verdad?

# Filename: gpt-neo-2.7b-generation.py
import os
import deepspeed
import torch
from transformers import pipeline

local_rank = int(os.getenv('LOCAL_RANK', '0'))
world_size = int(os.getenv('WORLD_SIZE', '1'))
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B',
                        device=local_rank)



generator.model = deepspeed.init_inference(generator.model,
                                            mp_size=world_size,
                                            dtype=torch.float,
                                            replace_method='auto')

string = generator("DeepSpeed is", do_sample=True, min_length=50)
if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0:
    print(string)         
            

Cuando utilice una de estas implementaciones personalizadas, no olvide probar rigurosamente la calidad de su nuevo ya que nunca se puede estar 100% seguro de que no hay ningún error en estas nuevas implementaciones.

Utilizar un motor de inferencia dedicado

Tanto Microsoft como NVIDIA han trabajado en motores de inferencia avanzados para mejorar el de la inferencia.

ONNX Runtime ("ORT"), de Microsoft, es un acelerador de aprendizaje automático de inferencia y formación multiplataforma de aprendizaje automático (ver aquí). TensorRT ("TRT"), de NVIDIA, es un SDK para el aprendizaje profundo de alto rendimiento de alto rendimiento. Incluye un optimizador de inferencia de aprendizaje profundo y un tiempo de ejecución que ofrece baja latencia y alto rendimiento para aplicaciones de inferencia de aprendizaje profundo (ver aquí).

Además, el servidor de inferencia NVIDIA Triton es un software de servicio de inferencia que facilita la inferencia de la IA facilitando el despliegue de modelos de IA desde diversos marcos. Gracias a Triton se puede, por ejemplo por ejemplo, realizar fácilmente la inferencia por lotes, ejecutar varios modelos de aprendizaje profundo de forma simultánea en la misma GPU, desplegar modelos en múltiples GPUs, y mucho más. Vea aquí.

ONNX Runtime
TensorRT
Triton Inference Server

Lo anterior parece emocionante, pero por supuesto no es tan sencillo... Para que su modelo pueda aprovechar estos motores de inferencia dedicados, primero hay que convertir el modelo existente en un formato adecuado.

Tienes varias opciones:

Al jugar con los métodos anteriores, debes tener mucho cuidado con la calidad de tus modelos exportados. Usted Puede pensar que ha exportado su modelo con éxito, pero es posible que haya perdido algo de precisión en el proceso. el proceso, así que sea muy riguroso sobre cómo está probando su nuevo modelo exportado.

Conclusión:

Los modelos modernos de NLP basados en transformadores dan resultados impresionantes, por lo que cada vez más empresas quieren utilizarlos en la producción. Pero muy a menudo parece que los rendimientos son decepcionantes...

Trabajar en la mejora de la velocidad de tus predicciones es crucial pero, como has podido ver más arriba, no hay solución única para todos.

Si tiene preguntas sobre cómo acelerar su inferencia, no dude en ponerse en contacto con nosotros.

Julien Salinas
CTO en NLP Cloud