Hur man snabbar upp Deep Learning-inferensen för behandling av naturligt språk Transformers

Avancerade modeller för djupinlärning för behandling av naturligt språk baserade på transformatorer ger imponerande resultat, men att få en hög prestanda med hög hastighet är svårt. I den här artikeln sammanfattar vi de bästa alternativen du har om du vill minska latensen för dina förutsägelser i produktionen.

Använd en bättre CPU eller GPU

När man vill förbättra hastigheten hos transformatorbaserade modeller för behandling av naturligt språk är den "naiva" metoden att använda fler avancerad hårdvara.

Oftast är detta en oundviklig lösning, eftersom rena mjukvarubaserade lösningar alla har begränsningar. Föreställ dig att du utför inferenser på en CPU. Du kan tillbringa veckor med att arbeta med optimering på låg nivå för din favorit Transformer-baserade modell, men det är mycket troligt att du ändå får en bättre hastighetsförbättring genom att helt enkelt flytta din modell till en NVIDIA A100 GPU.

De mest använda GPU:erna för inferens i produktionen är numera NVIDIA Tesla T4 och V100.

NVIDIA Tesla GPU

Men vad händer om du redan har uppgraderat din maskinvara? Eller vad händer om din budget är begränsad och du inte kan har råd att utnyttja de senaste banbrytande dyra GPU:erna? Läs följande!

Batch-inferens

Batch-inferens handlar om att skicka flera förfrågningar samtidigt till modellen, så den tar upp din alla förfrågningar på en gång.

Batchinferens är mycket kraftfull eftersom det tar nästan lika lång tid för modellen att hantera följande flera förfrågningar än vad det tar att behandla en förfrågan. Under huven kommer vissa operationer att faktoriseras, så att att istället för att göra allting n gånger behöver modellen bara göra det en gång.

Tekniskt sett minskar det inte latensen för dina förfrågningar, eftersom dina förfrågningar inte kommer att vara snabbare, men det kommer att dramatiskt förbättra genomströmningen av din applikation (din applikation kan hantera fler förfrågningar med samma hårdvara).

Batch-inferens är dock inte perfekt.

För det första är den inte alltid lämpad för online-inferens (dvs. för kundorienterade tillämpningar), eftersom för att bygga upp dina batcher måste du buffra vissa användarförfrågningar, så vissa användare kommer att ha måste vänta längre än vanligt.

Andra utmaningen: Batchinferens fungerar bättre för liknande förfrågningar. Om du till exempel distribuerar en textgenerering av en modell för behandling av naturligt språk, blir batching effektivare om du skapar batcher av förfrågningar som har samma längd.

Sist men inte minst utförs inte batchinferens av din djupinlärningsmodell själv, utan av en högre nivå, som en dedikerad inferensserver. Det är inte alltid lätt att implementera ett sådant lager. För NVIDIA:s Triton Inference Server (se nedan) är till exempel mycket bra på att utföra batch-inferens, men du måste först hitta ett sätt att göra din modell kompatibel med Triton.

När du väl har lyckats exportera din modell till Triton är det väldigt enkelt att göra en batch-inferens. Här är till exempel hur man skapar batcher bestående av upp till 128 förfrågningar och väntar högst 5 sekunder innan man bearbetar batch (detta ska läggas in i filen "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Utnyttja anpassade implementationer

Många människor och företag arbetar hårt med optimeringar på låg nivå för vissa transformatorbaserade bearbetningar av naturligt språk. modeller. Det kan vara en bra idé för dig att utnyttja dessa anpassade implementeringar av din modell.

För det mesta är dessa anpassade implementeringar enkla att använda och kräver nästan inget extra arbete av dig. dig. Låt mig nämna några av dem här:

Här är ett exempel på hur du kan utföra inferens för din GPT Neo 2.7B-modell tack vare DeepSpeed. Inte alltför svårt, eller hur?

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

När du använder en av dessa anpassade implementationer, glöm inte att noggrant testa kvaliteten på din nya modell, eftersom du aldrig kan vara 100 % säker på att det inte finns några fel i dessa nya implementationer.

Använd en dedikerad inferensmotor

Microsoft och NVIDIA har båda arbetat med avancerade inferensmotorer för att förbättra inferensen. prestanda.

ONNX Runtime ("ORT"), från Microsoft, är en plattformsoberoende maskininlärning för inferens och utbildning. accelerator (se här). TensorRT ("TRT") från NVIDIA är en SDK för högpresterande djupinlärning. inferens. Det innehåller en optimerare och körtid för djupinlärning som ger låg latenstid och hög genomströmning för tillämpningar för djupinlärning. (se här).

Dessutom är NVIDIA Triton Inference Server en programvara för inferenservering som gör AI-inferenser till en enklare genom att göra det möjligt att distribuera AI-modeller från olika ramverk. Tack vare Triton kan du för till exempel utföra batch-inferens enkelt, köra flera deep learning-modeller samtidigt på samma GPU, distribuera modeller på flera GPU:er, med mera. Se här.

ONNX Runtime
TensorRT
Triton Inference Server

Ovanstående verkar spännande, men så enkelt är det naturligtvis inte... För att din modell ska kunna utnyttja dessa dedikerade inferensmotorer måste du först konvertera din befintliga modell till ett lämpligt format.

Du har flera valmöjligheter:

När du använder ovanstående metoder bör du vara mycket försiktig med kvaliteten på de exporterade modellerna. Du kanske tror att du lyckades exportera din modell, men det är möjligt att du förlorade lite noggrannhet i processen, så var mycket noggrann med hur du testar din nya exporterade modell.

Slutsats

Moderna transformatorbaserade modeller för Natural Language Processing ger imponerande resultat, vilket gör att fler och fler företag vill använda dem. använda dem i produktionen. Men väldigt ofta visar det sig att resultaten är en besvikelse...

Det är viktigt att arbeta för att förbättra hastigheten på dina förutsägelser, men som du kan se ovan finns det ingen en lösning som passar alla.

Om du har frågor om hur du kan påskynda din inferens, tveka inte att kontakta oss!

Julien Salinas
CTO på NLP Cloud