Zmagasz się z AI lub rozwojem full-stack? Nasi eksperci są tutaj, aby Cię poprowadzić: dostosowane porady, integracja techniczna i nie tylko. Skontaktuj się z nami pod adresem [email protected].

Jak przyspieszyć wnioskowanie w głębokim uczeniu dla przetwarzania języka naturalnego Transformatory

Zaawansowane modele głębokiego uczenia do przetwarzania języka naturalnego oparte na transformatorach dają imponujące wyniki, ale uzyskanie wysokiej wydajności jest trudne. W tym artykule podsumowujemy najlepsze opcje, jakie masz, jeśli chcesz zmniejszyć opóźnienia swoich predykcji w produkcji.

Użyj lepszego CPU lub GPU

Gdy chcemy zwiększyć szybkość działania modeli przetwarzania języka naturalnego opartych na transformatach, "naiwnym" podejściem jest użycie bardziej zaawansowanego sprzętu.

W większości przypadków jest to rozwiązanie nieuniknione, ponieważ rozwiązania oparte na czystym oprogramowaniu mają swoje ograniczenia. Wyobraź sobie, że przeprowadzasz wnioskowanie na procesorze. Możesz spędzić tygodnie pracując nad optymalizacją niskiego poziomu dla swojego ulubionego modelu opartego na Transformerze, jest bardzo prawdopodobne, że nadal będziesz w stanie uzyskać większą poprawę szybkości, po prostu przenosząc swój model na procesor NVIDIA A100.

Obecnie najczęściej stosowanymi w produkcji procesorami graficznymi do wnioskowania są NVIDIA Tesla T4 i V100.

Układ GPU NVIDIA Tesla

Ale co jeśli już zmodernizowałeś swój sprzęt? Albo co, jeśli Twój budżet jest ograniczony i nie możesz pozwolić sobie na wykorzystać ostatnie, najnowocześniejsze, drogie układy GPU? Przeczytaj poniższe informacje!

Wnioskowanie wsadowe

Wnioskowanie wsadowe polega na wysyłaniu kilku zapytań w tym samym czasie do modelu, więc model odpowiada na zapytania wszystkie żądania jednocześnie.

Wnioskowanie wsadowe jest bardzo wydajne, ponieważ zajmie prawie tyle samo czasu, aby twój model zajął się kilku żądań, jak w przypadku jednego żądania. Pod maską niektóre operacje będą faktoryzowane, więc że zamiast wykonywać wszystko n razy, model musi to zrobić tylko raz.

Technicznie rzecz biorąc, nie zmniejsza to opóźnień twoich żądań, ponieważ twoje żądania nie będą adresowane szybciej, ale radykalnie poprawi przepustowość twojej aplikacji (twoja aplikacja może obsłużyć więcej żądań przy użyciu tego samego sprzętu).

Wnioskowanie wsadowe nie jest jednak doskonałe.

Po pierwsze, nie zawsze nadaje się do wnioskowania online (tj. dla aplikacji skierowanych do klienta), ponieważ aby zbudować swoje partie będziesz musiał buforować niektóre żądania użytkowników, więc niektórzy użytkownicy będą musieli czekać dłużej niż zwykle.

Drugie wyzwanie: wnioskowanie wsadowe działa lepiej dla podobnych żądań. Na przykład, jeśli wdrażasz model generujący tekst model Natural Language Processing, wnioskowanie wsadowe będzie bardziej efektywne, jeśli utworzysz partie zapytań, które mają tę samą długość.

Wreszcie, wnioskowanie wsadowe nie jest wykonywane przez sam model uczenia głębokiego, ale przez warstwę wyższego poziomu, np. warstwę wyższego poziomu, np. dedykowany serwer wnioskowania. Nie zawsze jest łatwo zaimplementować taką warstwę. Dla Przykładowo, Triton Inference Server firmy NVIDIA (patrz poniżej) bardzo dobrze radzi sobie z wnioskowaniem wsadowym, ale musisz najpierw znaleźć sposób, aby Twój model był zgodny z Tritonem.

Kiedy już uda się wyeksportować model do Tritona, wnioskowanie wsadowe jest banalnie proste. Na przykład, tutaj jest jak tworzyć partie składające się z maksymalnie 128 zapytań i czekać maksymalnie 5 sekund przed przetworzeniem partii (należy to umieścić w pliku "config.pbtxt"). (powinno to być umieszczone w pliku "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Wykorzystanie niestandardowych wdrożeń

Wiele osób i firm ciężko pracuje nad niskopoziomowymi optymalizacjami dla niektórych modeli przetwarzania języka naturalnego opartych na transformatorach modeli. Dobrym pomysłem dla Ciebie może być wykorzystanie tych niestandardowych implementacji Twojego modelu.

Większość czasu te niestandardowe wdrożenia są łatwe w użyciu i nie wymagają prawie żadnej dodatkowej pracy od Ciebie. Pozwól mi wspomnieć o niektórych z nich tutaj:

Oto przykład, jak można przeprowadzić wnioskowanie dla modelu GPT Neo 2.7B dzięki DeepSpeed. Nie jest to zbyt trudne, prawda?

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

Kiedy używasz jednej z tych niestandardowych implementacji, nie zapomnij rygorystycznie przetestować jakości swojego nowego modelu, ponieważ nigdy nie możesz być w 100% pewien, że nie ma żadnego błędu w tych nowych implementacjach.

Użyj dedykowanego silnika wnioskowania

Zarówno Microsoft jak i NVIDIA pracowały nad zaawansowanymi silnikami wnioskowania w celu zwiększenia wydajności wnioskowania. wydajność.

ONNX Runtime ("ORT"), firmy Microsoft, jest wieloplatformowym akceleratorem wnioskowania i szkolenia w zakresie uczenia maszynowego. akcelerator (zobacz tutaj). TensorRT ("TRT"), firmy NVIDIA, jest pakietem SDK dla wysokowydajnego uczenia głębokiego wnioskowania. Zawiera on optymalizator wnioskowania na podstawie głębokiego uczenia oraz runtime, który zapewnia niskie opóźnienia i wysoką przepustowość dla aplikacji wnioskowania na podstawie głębokiego uczenia. wysoką przepustowość dla aplikacji wnioskowania na podstawie głębokiego uczenia. (zobacz tutaj).

Dodatkowo, NVIDIA Triton Inference Server to oprogramowanie do obsługi wnioskowania, które ułatwia wnioskowanie o sztucznej inteligencji. ułatwiając wdrażanie modeli AI z różnych frameworków. Dzięki Triton możesz np. na przykład łatwo przeprowadzać wnioskowanie wsadowe, uruchamiać wiele modeli głębokiego uczenia jednocześnie na tym samym procesorze graficznym, wdrażać modele na wielu układach GPU i wiele więcej. Zobacz tutaj.

ONNX Runtime
TensorRT
Triton Inference Server

Powyższe wydaje się ekscytujące, ale oczywiście nie jest to takie proste... Aby Twój model mógł wykorzystać te dedykowane silniki wnioskowania, musisz najpierw przekonwertować swój istniejący model do odpowiedniego formatu.

Masz do wyboru kilka opcji:

Podczas zabawy z powyższymi metodami, należy bardzo uważać na jakość eksportowanych modeli. Na stronie może Ci się wydawać, że udało Ci się wyeksportować model, ale możliwe, że straciłeś trochę dokładności w procesie więc bądź bardzo rygorystyczny, jeśli chodzi o testowanie nowo wyeksportowanego modelu.

Wniosek

Nowoczesne modele Natural Language Processing oparte na transformatorach dają imponujące rezultaty, dzięki czemu coraz więcej firm chce je używać ich w produkcji. Jednak bardzo często okazuje się, że wydajność jest rozczarowująca...

Praca nad poprawą szybkości przewidywań jest kluczowa, ale jak widać powyżej, nie ma jedno rozwiązanie dla wszystkich.

Jeśli masz pytania dotyczące tego, jak przyspieszyć wnioskowanie, skontaktuj się z nami!

Julien Salinas
CTO w NLP Cloud