Architektura

TensorFlow Serving to elastyczny, wysokowydajny system obsługi modeli uczenia maszynowego, zaprojektowany z myślą o środowiskach produkcyjnych. TensorFlow Serving ułatwia wdrażanie nowych algorytmów i eksperymentów przy zachowaniu tej samej architektury serwera i interfejsów API. TensorFlow Serving zapewnia gotową integrację z modelami TensorFlow, ale można go łatwo rozszerzyć, aby obsługiwał inne typy modeli.

Kluczowe idee

Aby zrozumieć architekturę TensorFlow Serving, musisz zrozumieć następujące kluczowe pojęcia:

Porcje

Serwable są centralną abstrakcją w TensorFlow Serving. Elementy serwowalne to podstawowe obiekty używane przez klientów do wykonywania obliczeń (na przykład wyszukiwania lub wnioskowania).

Rozmiar i szczegółowość obiektu Servable jest elastyczny. Pojedynczy obiekt Servable może obejmować wszystko, od pojedynczego fragmentu tabeli przeglądowej, przez pojedynczy model, aż po krotkę modeli wnioskowania. Serwable mogą być dowolnego typu i mają dowolny interfejs, co zapewnia elastyczność i przyszłe ulepszenia, takie jak:

  • wyniki strumieniowe
  • eksperymentalne API
  • asynchroniczne tryby pracy

Serwable nie zarządzają własnym cyklem życia.

Typowe serwable obejmują:

  • pakiet TensorFlow SavedModelBundle ( tensorflow::Session )
  • tabela przeglądowa do osadzania lub wyszukiwania słownictwa

Wersje do serwowania

TensorFlow Serving może obsłużyć jedną lub więcej wersji obiektu udostępnianego przez cały okres istnienia pojedynczej instancji serwera. Umożliwia to ładowanie nowych konfiguracji algorytmów, wag i innych danych w miarę upływu czasu. Wersje umożliwiają jednoczesne ładowanie więcej niż jednej wersji obiektu serwowalnego, co pozwala na stopniowe wdrażanie i eksperymentowanie. W momencie udostępniania klienci mogą zażądać najnowszej wersji lub określonego identyfikatora wersji dla konkretnego modelu.

Obsługiwane strumienie

Strumień udostępniany to sekwencja wersji strumienia udostępnianego, posortowana według rosnących numerów wersji.

Modele

Udostępnianie TensorFlow reprezentuje model jako jeden lub więcej obiektów serwowalnych. Model uczony maszynowo może zawierać jeden lub więcej algorytmów (w tym wyuczone wagi) oraz tabele przeglądowe lub osadzające.

Model złożony można przedstawić w jeden z poniższych sposobów:

  • wiele niezależnych serwów
  • pojedynczy kompozytowy serwowany

Serwalny może również odpowiadać ułamkowi modelu. Na przykład dużą tabelę odnośników można podzielić na wiele instancji udostępniania TensorFlow.

Ładowarki

Programy ładujące zarządzają cyklem życia serwowalnego. Interfejs API modułu ładującego umożliwia korzystanie ze wspólnej infrastruktury niezależnej od konkretnych algorytmów uczenia się, danych lub przypadków użycia produktu. W szczególności moduły ładujące standaryzują interfejsy API do ładowania i rozładowywania serwowalnego.

Źródła

Źródła to moduły wtyczek, które wyszukują i dostarczają elementy serwowalne. Każde Źródło zapewnia zero lub więcej strumieni możliwych do obsłużenia. Dla każdego strumienia, który można obsłużyć, Źródło dostarcza jedną instancję modułu ładującego dla każdej wersji, którą udostępnia do załadowania. (Źródło jest w rzeczywistości połączone łańcuchem z zerem lub większą liczbą SourceAdapterów, a ostatni element w łańcuchu emituje moduły ładujące.)

Interfejs TensorFlow Serving dla źródeł może wykrywać elementy serwowalne z dowolnych systemów pamięci masowej. Udostępnianie TensorFlow obejmuje typowe implementacje źródeł referencyjnych. Na przykład Źródła mogą uzyskiwać dostęp do mechanizmów takich jak RPC i odpytywać system plików.

Źródła mogą utrzymywać stan, który jest współdzielony przez wiele obiektów serwowalnych lub wersji. Jest to przydatne w przypadku serwable, które korzystają z aktualizacji delta (diff) pomiędzy wersjami.

Wersje aspirowane

Wersje aspirowane reprezentują zbiór wersji możliwych do wyświetlenia, które powinny zostać załadowane i gotowe. Źródła przekazują ten zestaw możliwych do wyświetlenia wersji dla pojedynczego strumienia, który można udostępnić na raz. Kiedy Źródło przekazuje Menedżerowi nową listę aspirowanych wersji, zastępuje ona poprzednią listę dla tego obsługiwanego strumienia. Menedżer usuwa wszelkie wcześniej załadowane wersje, które nie pojawiają się już na liście.

Zapoznaj się z zaawansowanym samouczkiem , aby zobaczyć, jak ładowanie wersji działa w praktyce.

Menedżerowie

Menedżerowie obsługują pełny cykl życia Servables, w tym:

  • ładowanie porcji
  • serwowanie porcji
  • rozładunek Servables

Menedżerowie słuchają źródeł i śledzą wszystkie wersje. Menedżer próbuje spełnić żądania Źródeł, ale może odmówić załadowania wersji aspirowanej, jeśli, powiedzmy, wymagane zasoby nie są dostępne. Menedżerowie mogą również odłożyć „rozładunek”. Na przykład menedżer może poczekać z wyładowaniem do czasu zakończenia ładowania nowszej wersji, w oparciu o politykę gwarantującą, że co najmniej jedna wersja będzie ładowana przez cały czas.

Menedżerowie serwowania TensorFlow zapewniają prosty, wąski interfejs — GetServableHandle() — umożliwiający klientom dostęp do załadowanych instancji, które można obsłużyć.

Rdzeń

Korzystając ze standardowego interfejsu API obsługującego TensorFlow, rdzeń obsługujący TensorFlow zarządza następującymi aspektami obiektów serwowalnych:

  • koło życia
  • metryka

TensorFlow Serving Core traktuje serwable i moduły ładujące jako obiekty nieprzezroczyste.

Życie sługi

Schemat architektury obsługującej tf

Mówiąc ogólnie:

  1. Źródła tworzą moduły ładujące dla dostępnych wersji.
  2. Programy ładujące są wysyłane jako wersje aspirowane do Menedżera, który je ładuje i udostępnia żądaniom klientów.

Bardziej szczegółowo:

  1. Wtyczka Source tworzy moduł ładujący dla określonej wersji. Moduł ładujący zawiera wszelkie metadane potrzebne do załadowania obiektu Servable.
  2. Źródło używa wywołania zwrotnego, aby powiadomić Menedżera o wersji aspirowanej.
  3. Menedżer stosuje skonfigurowaną Politykę wersji, aby określić następną akcję, którą należy podjąć, np. usunięcie wcześniej załadowanej wersji lub załadowanie nowej wersji.
  4. Jeśli Menedżer uzna, że ​​jest to bezpieczne, daje modułowi ładującemu wymagane zasoby i każe mu załadować nową wersję.
  5. Klienci proszą Menedżera o udostępnienie, albo jawnie określając wersję, albo po prostu żądając najnowszej wersji. Menedżer zwraca uchwyt dla obiektu Servable.

Załóżmy na przykład, że źródło reprezentuje wykres TensorFlow z często aktualizowanymi wagami modeli. Wagi zapisywane są w pliku na dysku.

  1. Źródło wykrywa nową wersję wag modelu. Tworzy moduł ładujący zawierający wskaźnik do danych modelu na dysku.
  2. Źródło powiadamia Menedżera Dynamicznego o wersji aspirowanej.
  3. Menedżer dynamiczny stosuje zasady wersji i decyduje się załadować nową wersję.
  4. Menedżer dynamiczny informuje moduł ładujący, że jest wystarczająca ilość pamięci. Program ładujący tworzy instancję wykresu TensorFlow z nowymi wagami.
  5. Klient żąda uchwytu do najnowszej wersji modelu, a Menedżer dynamiczny zwraca uchwyt do nowej wersji obiektu Servable.

Rozciągliwość

TensorFlow Serving zapewnia kilka punktów rozszerzeń, w których można dodać nowe funkcje.

Polityka wersji

Zasady wersji określają kolejność ładowania i rozładowywania wersji w ramach jednego obsługiwanego strumienia.

TensorFlow Serving zawiera dwie zasady, które obsługują większość znanych przypadków użycia. Są to Zasady zachowania dostępności (unikaj pozostawiania załadowanych wersji zerowych; zazwyczaj ładuj nową wersję przed wyładowaniem starej) i Zasady zachowania zasobów (unikaj jednoczesnego ładowania dwóch wersji, co wymaga podwójnego wykorzystania zasobów; wyładuj starą wersję przed załadowaniem nowy). W przypadku prostego korzystania z TensorFlow Serving, gdzie dostępność modelu jest ważna, a koszty zasobów niskie, polityka zachowania dostępności zapewni, że nowa wersja zostanie załadowana i gotowa przed zwolnieniem starej. W przypadku zaawansowanego wykorzystania TensorFlow Serving, na przykład zarządzania wersjami na wielu instancjach serwerów, Polityka zachowywania zasobów wymaga najmniejszych zasobów (bez dodatkowego bufora do ładowania nowych wersji).

Źródło

Nowe źródła mogą obsługiwać nowe systemy plików, oferty chmurowe i backendy algorytmów. TensorFlow Serving zapewnia kilka typowych elementów składowych, dzięki którym tworzenie nowych źródeł jest łatwe i szybkie. Na przykład TensorFlow Serving zawiera narzędzie do otaczania zachowania odpytywania wokół prostego źródła. Źródła są ściśle powiązane z modułami ładującymi dla określonych algorytmów i obiektów obsługujących dane.

Zobacz dokument źródła niestandardowego , aby uzyskać więcej informacji na temat tworzenia źródła niestandardowego.

Ładowarki

Moduły ładujące są punktem rozszerzenia umożliwiającym dodawanie algorytmów i backendów danych. TensorFlow jest jednym z takich backendów algorytmów. Na przykład można zaimplementować nowy moduł ładujący w celu załadowania, zapewnienia dostępu i zwolnienia instancji nowego typu obsługiwanego modelu uczenia maszynowego. Przewidujemy utworzenie modułów ładujących dla tabel przeglądowych i dodatkowych algorytmów.

Zobacz dokument Niestandardowe udostępnianie, aby dowiedzieć się, jak utworzyć niestandardowy element udostępniany.

Dozownik

Łączenie wielu żądań w jedno żądanie może znacznie obniżyć koszty wnioskowania, szczególnie w obecności akceleratorów sprzętowych, takich jak procesory graficzne. TensorFlow Serving zawiera widżet przetwarzania wsadowego żądań, który umożliwia klientom łatwe grupowanie wniosków specyficznych dla typu z żądań w żądania wsadowe, które systemy algorytmów mogą wydajniej przetwarzać. Więcej informacji można znaleźć w Przewodniku dozowania .