Está a ter dificuldades com a IA ou com o desenvolvimento full-stack? Os nossos especialistas estão aqui para o orientar: aconselhamento personalizado, integração técnica e muito mais. Entre em contacto com [email protected].

Como Acelerar a Inferência de Aprendizagem Profunda para Transformadores de Processamento de Linguagem Natural

Modelos avançados de aprendizagem profunda para Processamento de Linguagem Natural baseados em Transformadores dão resultados impressionantes, mas ficando elevados a performance da velocidade é difícil. Neste artigo resumimos as melhores opções que tem, se quiser diminuir a latência das suas previsões na produção.

Usar um melhor CPU ou GPU

Quando se quer melhorar a velocidade dos modelos de Processamento de Linguagem Natural baseados em Transformador, a abordagem "ingénua" é usar mais hardware avançado.

A maior parte das vezes, esta é uma solução inevitável, uma vez que as soluções baseadas em software puro têm todas limites. Imagine que está a fazer inferências sobre uma CPU. Poderá passar semanas a trabalhar na optimização de baixo nível para o seu modelo favorito baseado em Transformador, é muito provável que ainda consiga melhorar a velocidade simplesmente movendo o seu modelo para um NVIDIA A100 GPU.

Hoje em dia, as GPUs mais utilizadas para inferência na produção são as NVIDIA Tesla T4 e V100.

GPU NVIDIA Tesla

Mas e se já actualizou o seu hardware? Ou e se o seu orçamento for limitado e não puder dar-se ao luxo de alavancar as últimas GPUs caras de ponta? Leia o seguinte!

Inferência por Lote

A inferência de lotes consiste em enviar vários pedidos ao mesmo tempo ao seu modelo, pelo que se dirige ao seu solicita tudo de uma só vez.

A inferência de lotes é muito poderosa porque levará quase o mesmo tempo para o seu modelo se dirigir vários pedidos, conforme é necessário, para responder a 1 pedido. Sob o capô algumas operações serão factorizadas, por isso que, em vez de fazer tudo n vezes, o modelo só tem de o fazer uma vez.

Tecnicamente falando, não diminui a latência dos seus pedidos, porque os seus pedidos não serão abordado mais rapidamente, mas irá melhorar drasticamente o rendimento da sua aplicação (a sua aplicação pode tratar de mais pedidos com o mesmo hardware).

Mas a inferência de lotes não é perfeita.

Em primeiro lugar, nem sempre é adequado para inferências em linha (ou seja, para aplicações que se dirigem aos clientes), porque a fim de construir os seus lotes, terá de proteger alguns pedidos de utilizadores, pelo que alguns utilizadores terão esperar mais tempo do que o habitual.

2º desafio: a inferência por lotes funciona melhor para pedidos semelhantes. Por exemplo, se estiver a utilizar um modelo de Processamento de Linguagem Natural, a criação de lotes será mais eficiente se criar lotes de pedidos que têm o mesmo comprimento.

Por último, a inferência por lotes não é realizada pelo seu modelo de aprendizagem profunda em si, mas por um modelo superior camada de nível, como um servidor de inferência dedicado. Nem sempre é fácil implementar uma tal camada. Para exemplo, o Servidor de Inferência Triton da NVIDIA (ver abaixo) é muito bom a fazer inferências por lotes, mas precisa primeiro de encontrar uma forma de tornar o seu modelo compatível com o Triton.

Uma vez que consiga exportar o seu modelo para Triton, a inferência de lote é muito simples. Por exemplo, aqui está como criar lotes compostos de até 128 pedidos, e esperar 5 segundos, no máximo, antes de processar o lote (isto deve ser colocado no ficheiro "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Alavancar implementações personalizadas

Muitas pessoas e empresas estão a trabalhar arduamente em optimizações de baixo nível para alguns Transformer-based Natural Language Processing modelos. Pode ser uma boa ideia para si aproveitar estas implementações personalizadas do seu modelo.

A maior parte das vezes, esta implementação personalizada é fácil de usar e não requer quase nenhum trabalho adicional de você. Deixe-me mencionar alguns deles aqui:

Aqui está um exemplo sobre como pode fazer inferências para o seu modelo GPT Neo 2.7B graças ao DeepSpeed. Não é muito difícil, não é?

# 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)         
            

Ao utilizar uma destas implementações personalizadas, não se esqueça de testar rigorosamente a qualidade do seu novo modelo, pois nunca se pode ter 100% de certeza de que não há nenhum bug nestas novas implementações.

Use um Motor de Inferência Dedicado

A Microsoft e a NVIDIA trabalharam ambas em motores de inferência avançados a fim de melhorar a inferência actuações.

ONNX Runtime ("ORT"), da Microsoft, é uma inferência e uma máquina de treino e aprendizagem em plataforma cruzada acelerador (ver aqui). TensorRT ("TRT"), da NVIDIA, é um SDK para aprendizagem profunda de alto desempenho inferência. Inclui um optimizador de inferência de aprendizagem profunda e tempo de execução que proporciona baixa latência e alto rendimento para aplicações de inferência de aprendizagem profunda (ver aqui).

Além disso, o NVIDIA Triton Inference Server é um software de inferência que faz a inferência da IA mais fácil, tornando possível a implementação de modelos de IA a partir de várias estruturas. Graças ao Triton, é possível exemplo, fazer inferência por lotes facilmente, executar vários modelos de aprendizagem profunda ao mesmo tempo na mesma GPU, implantar modelos em múltiplas GPUs, e muito mais. Ver aqui.

ONNX Runtime
TensorRT
Triton Inference Server

O acima exposto parece excitante, mas claro que não é assim tão simples... Para que o seu modelo possa alavancar estes motores de inferência dedicados, primeiro precisa de converter o seu modelo existente num formato adequado.

Tem várias opções:

Ao jogar com os métodos acima referidos, deve ter muito cuidado com a qualidade dos seus modelos exportados. Você pode pensar que exportou com sucesso o seu modelo, mas é possível que tenha perdido alguma precisão em o processo, por isso seja muito rigoroso na forma como está a testar o seu novo modelo exportado.

Conclusão

Os modelos modernos de processamento de linguagem natural baseados em transformadores dão resultados impressionantes, para que cada vez mais empresas queiram utilizá-los na produção. Mas muito frequentemente parece que as actuações são decepcionantes.

Trabalhar para melhorar a velocidade das suas previsões é crucial mas, como pode ver acima, não há solução de tamanho único.

Se tiver dúvidas sobre como acelerar a sua inferência, não hesite em contactar-nos!

Julien Salinas
CTO em NLP Cloud