Kæmper du med AI eller full-stack-udvikling? Vores eksperter er her for at vejlede dig: skræddersyet rådgivning, teknisk integration og meget mere. Kontakt os på [email protected].

Hvordan man fremskynder Deep Learning-inferens til behandling af naturligt sprog Transformers

Avancerede deep learning-modeller til behandling af naturligt sprog baseret på transformere giver imponerende resultater, men at få høje hastighedsresultater er svært. I denne artikel opsummerer vi de bedste muligheder, du har, hvis du ønsker at reducere latenstiden for dine forudsigelser i produktionen.

Brug en bedre CPU eller GPU

Når man ønsker at forbedre hastigheden af Transformer-baserede modeller til behandling af naturligt sprog, er den "naive" fremgangsmåde at bruge flere avanceret hardware.

Det er oftest en uundgåelig løsning, da rene softwarebaserede løsninger alle har begrænsninger. Forestil dig, at du udfører inferens på en CPU. Du kan bruge uger på at arbejde på optimering på lavt niveau for din foretrukne Transformer-baserede model, er det meget sandsynligt, at du stadig vil få en bedre hastighedsforbedring ved blot at flytte din model til en NVIDIA A100 GPU.

I dag er de mest udbredte GPU'er til inferens i produktionen NVIDIA Tesla T4 og V100.

NVIDIA Tesla GPU

Men hvad nu, hvis du allerede har opgraderet din hardware? Eller hvad hvis dit budget er begrænset, og du ikke kan råd til at udnytte de sidste banebrydende dyre GPU'er? Læs det følgende!

Batch-inferens

Batch-inferens handler om at sende flere forespørgsler på samme tid til din model, så den tager højde for dine anmodninger alle på én gang.

Batch-inferens er meget effektiv, fordi det vil tage næsten den samme tid for din model at behandle flere forespørgsler, som det tager at behandle én forespørgsel. Under motorhjelmen vil nogle operationer blive faktoriseret, så at i stedet for at gøre alting n gange, behøver modellen kun at gøre det én gang.

Teknisk set mindsker det ikke latenstiden for dine forespørgsler, fordi dine forespørgsler ikke vil blive adresseres hurtigere, men det vil dramatisk forbedre gennemstrømningen af din applikation (din applikation kan håndtere flere anmodninger med den samme hardware).

Batch-inferens er dog ikke perfekt.

For det første er den ikke altid egnet til online-inferens (dvs. til kundevendte applikationer), fordi for at opbygge dine batches er du nødt til at buffer nogle brugerforespørgsler, så nogle brugere vil have at vente længere end normalt.

2. udfordring: Batch-inferens fungerer bedre for lignende anmodninger. Hvis du f.eks. udsender en tekstgenerering af en Natural Language Processing-model, vil batching være mere effektivt, hvis du opretter batches af anmodninger, der har den samme længde.

Endelig udføres batch-inferens ikke af din deep learning-model selv, men af en højere lag på højere niveau, som f.eks. en dedikeret inferenceserver. Det er ikke altid let at implementere et sådant lag. For eksempel er NVIDIA's Triton Inference Server (se nedenfor) meget god til at udføre batch-inferens, men du skal først finde en måde at gøre din model kompatibel med Triton på.

Når det først er lykkedes dig at eksportere din model til Triton, er batch-inferens meget enkel. Her er f.eks. hvordan man opretter batches bestående af op til 128 forespørgsler og venter højst 5 sekunder, før man behandler den batch (dette skal sættes i filen "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Udnytte brugerdefinerede implementeringer

Mange mennesker og virksomheder arbejder hårdt på optimeringer på lavt niveau for nogle Transformer-baserede Natural Language Processing modeller. Det kan være en god idé for dig at udnytte disse brugerdefinerede implementeringer af din model.

For det meste er disse brugerdefinerede implementeringer nemme at bruge og kræver næsten intet ekstra arbejde fra dig. Lad mig nævne nogle af dem her:

Her er et eksempel på, hvordan du kan udføre inferens for din GPT Neo 2.7B-model takket være DeepSpeed. Ikke så svært, ikke sandt?

# 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 bruger en af disse brugerdefinerede implementeringer, skal du ikke glemme at teste kvaliteten af din nye model, da du aldrig kan være 100 % sikker på, at der ikke er nogen fejl i disse nye implementeringer.

Brug en dedikeret inferencemotor

Microsoft og NVIDIA har begge arbejdet på avancerede inferencemaskiner for at forbedre inferencen præstationer.

ONNX Runtime ("ORT") fra Microsoft er en platformoverskridende maskinlærings- og træningsløsning til maskinlæring accelerator (se her). TensorRT ("TRT") fra NVIDIA er et SDK til højtydende deep learning inferens. Det omfatter en optimering af dyb læringsinferens og runtime, der leverer lav latenstid og høj gennemløb for deep learning-inferensapplikationer (se her).

Derudover er NVIDIA Triton Inference Server en software til servering af inferencer, der gør AI-inferencer lettere ved at gøre det muligt at implementere AI-modeller fra forskellige frameworks. Takket være Triton kan du for for eksempel nemt udføre batch-inferens, køre flere deep learning-modeller samtidig på den samme GPU, implementere modeller på flere GPU'er og meget mere. Se her.

ONNX Runtime
TensorRT
Triton Inference Server

Ovenstående virker spændende, men så enkelt er det naturligvis ikke... For at din model kan udnytte disse dedikerede inferensmotorer, skal du først konvertere din eksisterende model til et korrekt format.

Du har flere valgmuligheder:

Når du leger med ovenstående metoder, skal du være meget forsigtig med kvaliteten af dine eksporterede modeller. Du tror måske, at du har eksporteret din model med succes, men det er muligt, at du har mistet noget nøjagtighed i processen, så vær meget stringent med hensyn til, hvordan du tester din nye eksporterede model.

Konklusion

Moderne transformerbaserede Natural Language Processing-modeller giver imponerende resultater, så flere og flere virksomheder ønsker at bruge dem i produktionen. Men meget ofte viser det sig, at præstationerne er skuffende...

Det er vigtigt at arbejde på at forbedre hastigheden af dine forudsigelser, men som du kan se ovenfor, er der ingen én størrelse passer til alle løsninger.

Hvis du har spørgsmål om, hvordan du kan fremskynde din inferens, så tøv ikke med at kontakte os!

Julien Salinas
Teknisk direktør hos NLP Cloud