Geavanceerde deep learning modellen voor natuurlijke taalverwerking gebaseerd op Transformers geven indrukwekkende resultaten, maar het krijgen van hoge snelle prestaties is moeilijk. In dit artikel vatten we de beste opties samen die je hebt als je de latency van je voorspellingen in productie wilt verlagen.
Wanneer men de snelheid van op Transformer gebaseerde natuurlijke taalverwerkingsmodellen wil verbeteren, is de "naïeve" benadering het gebruik van meer geavanceerde hardware.
Meestal is dit een onvermijdelijke oplossing, omdat zuiver softwarematige oplossingen allemaal beperkingen hebben. Stel je voor dat je inferentie uitvoert op een CPU. Je kunt wekenlang werken aan low-level optimalisatie voor je favoriete Transformer-gebaseerde model, het is zeer waarschijnlijk dat u nog steeds een betere snelheidsverbetering krijgt door simpelweg uw model te verplaatsen naar een NVIDIA A100 GPU.
Tegenwoordig zijn de meest gebruikte GPU's voor inferentie in productie de NVIDIA Tesla T4 en V100.
Maar wat als u uw hardware al hebt geüpgraded? Of wat als uw budget beperkt is en u zich geen veroorloven om gebruik te maken van de laatste cutting-edge dure GPU's? Lees het volgende!
Batch inferentie gaat over het sturen van meerdere verzoeken tegelijk naar je model, zodat het je verzoeken allemaal tegelijk.
Batch inferentie is zeer krachtig omdat het bijna evenveel tijd zal kosten voor je model om verschillende verzoeken als het kost om 1 verzoek te behandelen. Onder de motorkap zullen sommige operaties in factoren worden omgezet, zodat dat in plaats van alles n keer te doen, het model het maar één keer hoeft te doen.
Technisch gesproken, vermindert het niet de latency van uw aanvragen, omdat uw aanvragen niet sneller worden behandeld, maar het zal de doorvoer van je applicatie drastisch verbeteren (je applicatie kan meer verzoeken afhandelen met dezelfde hardware).
Batch inferentie is echter niet perfect.
Ten eerste is het niet altijd geschikt voor online inferentie (d.w.z. voor klantgerichte toepassingen), omdat om je batches te bouwen zul je sommige gebruikersverzoeken moeten bufferen, dus sommige gebruikers zullen langer moeten wachten dan normaal.
2e uitdaging: batch inferentie werkt beter voor gelijksoortige verzoeken. Bijvoorbeeld, als je een tekstgenererend Natural Language Processing model, zal batching efficiënter zijn als je batches maakt van verzoeken die dezelfde lengte hebben.
Ten slotte wordt batch-inferentie niet uitgevoerd door je deep learning model zelf, maar door een hogere niveau, zoals een speciale inferentieserver. Het is niet altijd eenvoudig om zo'n laag te implementeren. Voor NVIDIA's Triton Inference Server (zie hieronder) is bijvoorbeeld erg goed in het uitvoeren van batch-inferentie, maar je moet eerst een manier vinden om je model compatibel te maken met Triton.
Als je er eenmaal in slaagt je model naar Triton te exporteren, is batch inferentie doodsimpel. Bijvoorbeeld, hier is hoe je batches maakt van maximaal 128 verzoeken, en maximaal 5 seconden wacht voordat je de batch (dit moet in het "config.pbtxt" bestand worden gezet).
max_batch_size: 128
dynamic_batching {
max_queue_delay_microseconds: 5000000
}
Veel mensen en bedrijven werken hard aan low-level optimalisaties voor sommige Transformer-gebaseerde Natuurlijke Taal Verwerkings modellen. Het kan voor u een goed idee zijn om deze aangepaste implementaties van uw model te benutten.
Meestal zijn deze aangepaste implementaties gemakkelijk te gebruiken en vereisen ze bijna geen extra werk van u. Laat me er hier een paar noemen:
Hier is een voorbeeld van hoe u inferentie kunt uitvoeren voor uw GPT Neo 2.7B model dankzij DeepSpeed. Niet te moeilijk, toch?
# 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)
Als u een van deze aangepaste implementaties gebruikt, vergeet dan niet om de kwaliteit van uw nieuwe model, omdat je nooit 100% zeker kunt zijn dat er geen bug in deze nieuwe implementaties zit.
Microsoft en NVIDIA hebben beide gewerkt aan geavanceerde inferentie-engines om de inferentie prestaties te verbeteren.
ONNX Runtime ("ORT"), van Microsoft, is een platformonafhankelijke versneller voor inferentie en training van machinaal leren versneller (zie hier). TensorRT ("TRT"), van NVIDIA, is een SDK voor krachtige deep learning inferentie. Het bevat een deep learning inferentie optimizer en runtime die een lage latency en hoge doorvoer voor deep learning inferentie toepassingen (zie hier).
Daarnaast is de NVIDIA Triton Inference Server een inferentieserversoftware die AI-inferentie eenvoudiger maakt door het mogelijk te maken AI-modellen van verschillende frameworks in te zetten. Dankzij Triton kun je bijvoorbeeld bijvoorbeeld eenvoudig batch inference uitvoeren, meerdere deep learning modellen gelijktijdig op dezelfde GPU draaien, modellen inzetten op meerdere GPU's, en meer. Zie hier.
Het bovenstaande lijkt spannend, maar het is natuurlijk niet zo eenvoudig... Opdat uw model gebruik zou kunnen maken van deze speciale inferentie-engines te gebruiken, moet u eerst uw bestaande model omzetten in een geschikt formaat.
Je hebt verschillende keuzes:
Wanneer je met de bovenstaande methodes speelt, moet je heel voorzichtig zijn met de kwaliteit van je geëxporteerde modellen. U denkt misschien dat u uw model met succes hebt geëxporteerd, maar het is mogelijk dat u wat nauwkeurigheid hebt verloren in het proces, dus wees zeer rigoureus in de manier waarop u uw nieuw geëxporteerde model test.
Moderne op transformatoren gebaseerde Natural Language Processing-modellen leveren indrukwekkende resultaten op, zodat steeds meer bedrijven ze ze in productie willen gebruiken. Maar heel vaak blijkt dat de prestaties tegenvallen...
Werken aan het verbeteren van de snelheid van uw voorspellingen is cruciaal, maar zoals u hierboven hebt kunnen zien, is er geen één pasklare oplossing.
Als u vragen hebt over hoe u uw inferentie kunt versnellen, aarzel dan niet om contact met ons op te nemen!
Julien Salinas
CTO bij NLP Cloud