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