Modelele avansate de învățare profundă pentru procesarea limbajului natural bazate pe transformatoare dau rezultate impresionante, dar obținerea de rezultate ridicate performanțe de mare viteză este dificil de obținut. În acest articol rezumăm cele mai bune opțiuni pe care le aveți dacă doriți să reduceți latența predicțiilor dvs. în producție.
Atunci când se dorește îmbunătățirea vitezei modelelor de procesare a limbajului natural bazate pe transformator, abordarea "naivă" este de a utiliza mai multe hardware mai avansat.
De cele mai multe ori, aceasta este o soluție inevitabilă, deoarece toate soluțiile bazate exclusiv pe software au limite. Imaginați-vă că efectuați inferențe pe un procesor. Este posibil să petreceți săptămâni întregi lucrând la optimizarea la nivel scăzut pentru modelul dumneavoastră preferat bazat pe Transformer, este foarte probabil să obțineți în continuare o îmbunătățire mai bună a vitezei prin simpla mutare a modelului dvs. pe un procesor de NVIDIA A100 GPU.
În prezent, cele mai utilizate GPU-uri pentru inferență în producție sunt NVIDIA Tesla T4 și V100.
Dar ce se întâmplă dacă v-ați actualizat deja hardware-ul? Sau dacă bugetul dvs. este limitat și nu puteți vă permiteți să să profitați de ultimele GPU scumpe de ultimă generație? Citiți cele ce urmează!
Inferența pe loturi se referă la trimiterea mai multor solicitări în același timp către modelul dvs. solicitări deodată.
Inferența pe loturi este foarte puternică, deoarece modelul dvs. va avea nevoie de aproape același timp pentru a aborda mai multe solicitări, cât îi ia să adreseze o singură solicitare. Sub capotă, unele operații vor fi factorizate, astfel încât astfel încât, în loc să facă totul de n ori, modelul trebuie să o facă doar o singură dată.
Din punct de vedere tehnic, nu scade latența cererilor, deoarece cererile dvs. nu vor fi adresate mai repede, dar va îmbunătăți dramatic randamentul aplicației dvs. (aplicația dvs. poate gestiona mai multe cereri cu același hardware).
Totuși, inferența pe loturi nu este perfectă.
În primul rând, nu este întotdeauna potrivită pentru inferența online (adică pentru aplicațiile orientate către client), deoarece pentru a construi loturile, va trebui să tamponați unele cereri ale utilizatorilor, astfel încât unii utilizatori vor avea să aștepte mai mult decât de obicei.
A doua provocare: inferența pe loturi funcționează mai bine în cazul cererilor similare. De exemplu, dacă implementați o aplicație model de procesare a limbajului natural de generare a textului, gruparea pe loturi va fi mai eficientă dacă creați loturi de cereri care au aceeași lungime.
În cele din urmă, inferența de lot nu este efectuată de modelul de învățare profundă în sine, ci de un nivel superior, cum ar fi un server de inferență dedicat. Nu este întotdeauna ușor de implementat un astfel de strat. Pentru exemplu, serverul de inferență Triton de la NVIDIA (a se vedea mai jos) este foarte bun la efectuarea inferenței pe loturi, dar trebuie mai întâi să găsiți o modalitate de a face modelul dvs. compatibil cu Triton.
Odată ce reușiți să exportați modelul în Triton, inferența pe loturi este foarte simplă. De exemplu, iată cum să creați loturi formate din până la 128 de solicitări și să așteptați maximum 5 secunde înainte de a procesa cererile. lot (acest lucru trebuie introdus în fișierul "config.pbtxt").
max_batch_size: 128
dynamic_batching {
max_queue_delay_microseconds: 5000000
}
Mulți oameni și companii lucrează din greu la optimizări de nivel scăzut pentru unele transformatoare bazate pe procesarea limbajului natural. de procesare a limbajului natural. Ar putea fi o idee bună pentru dumneavoastră să profitați de aceste implementări personalizate ale modelului dumneavoastră.
De cele mai multe ori, aceste implementări personalizate sunt ușor de utilizat și nu necesită aproape nicio muncă suplimentară din partea dumneavoastră. Permiteți-mi să menționez câteva dintre ele aici:
Iată un exemplu despre cum puteți efectua inferența pentru modelul GPT Neo 2.7B datorită DeepSpeed. Nu este prea greu, nu-i așa?
# 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)
Atunci când utilizați una dintre aceste implementări personalizate, nu uitați să testați cu rigurozitate calitatea noii dvs. deoarece nu puteți fi niciodată 100% sigur că nu există niciun bug în aceste noi implementări.
Atât Microsoft, cât și NVIDIA au lucrat la motoare de inferență avansate pentru a îmbunătăți inferența. performanțele de inferență.
ONNX Runtime ("ORT"), de la Microsoft, este un sistem de inferență și de învățare automată de tip machine-learning pentru mai multe platforme. accelerator (vezi aici). TensorRT ("TRT"), de la NVIDIA, este un SDK pentru învățare profundă de înaltă performanță. de înaltă performanță. Acesta include un optimizator de inferență de învățare profundă și un timp de execuție care oferă o latență scăzută și randament ridicat pentru aplicațiile de inferență de învățare profundă (vezi aici).
În plus, NVIDIA Triton Inference Server este un software de servire a inferențelor care face ca inferențele de inteligență artificială mai ușor, făcând posibilă implementarea modelelor de inteligență artificială din diverse cadre. Datorită lui Triton puteți pentru exemplu, să efectuați cu ușurință inferențe pe loturi, să rulați mai multe modele de învățare profundă simultan pe același GPU, implementați modele pe mai multe GPU-uri și multe altele. A se vedea aici.
Cele de mai sus par interesante, dar, desigur, nu este atât de simplu... Pentru ca modelul dvs. să valorifice aceste motoare de inferență dedicate, trebuie mai întâi să vă convertiți modelul existent într-un format adecvat.
Aveți mai multe opțiuni:
Când vă jucați cu metodele de mai sus, trebuie să fiți foarte atenți la calitatea modelelor exportate. Accesați s-ar putea să credeți că ați exportat cu succes modelul, dar este posibil să fi pierdut ceva acuratețe în procesul, așa că fiți foarte riguros cu privire la modul în care testați noul model exportat.
Modelele moderne de procesare a limbajului natural bazate pe transformatoare oferă rezultate impresionante, astfel încât tot mai multe companii doresc să să le utilizeze în producție. Dar, de foarte multe ori, se pare că performanțele sunt dezamăgitoare...
Lucrul la îmbunătățirea vitezei previziunilor tale este crucial, dar, după cum ai putut vedea mai sus, nu există o o soluție unică pentru toate.
Dacă aveți întrebări despre cum să vă accelerați inferența, nu ezitați să ne contactați!
Julien Salinas
CTO la NLP Cloud