Treten Sie der SIG TFX-Addons-Community bei und helfen Sie mit, TFX noch besser zu machen! SIG TFX-Addons beitreten

Die Architektur

TensorFlow Serving ist ein flexibles, leistungsstarkes Serving-System für Modelle des maschinellen Lernens, das für Produktionsumgebungen entwickelt wurde. TensorFlow Serving erleichtert die Bereitstellung neuer Algorithmen und Experimente unter Beibehaltung derselben Serverarchitektur und APIs. TensorFlow Serving bietet eine sofort einsatzbereite Integration mit TensorFlow-Modellen, kann jedoch problemlos auf andere Modelltypen erweitert werden.

Schlüssel Konzepte

Um die Architektur von TensorFlow Serving zu verstehen, müssen Sie die folgenden Schlüsselkonzepte verstehen:

Servables

Servables sind die zentrale Abstraktion in TensorFlow Serving. Servables sind die zugrunde liegenden Objekte, mit denen Clients Berechnungen durchführen (z. B. Nachschlagen oder Inferenz).

Die Größe und Granularität eines Servables ist flexibel. Ein einzelnes Servable kann alles umfassen, von einem einzelnen Shard einer Nachschlagetabelle über ein einzelnes Modell bis hin zu einem Tupel von Inferenzmodellen. Servables können von jedem Typ und jeder Schnittstelle sein und ermöglichen Flexibilität und zukünftige Verbesserungen wie:

  • Streaming-Ergebnisse
  • experimentelle APIs
  • asynchrone Betriebsarten

Servables verwalten nicht ihren eigenen Lebenszyklus.

Typische Serviceleistungen sind:

  • ein TensorFlow SavedModelBundle ( tensorflow::Session )
  • eine Nachschlagetabelle zum Einbetten oder Nachschlagen von Vokabeln

Servable Versionen

TensorFlow Serving kann eine oder mehrere Versionen eines Servables über die Lebensdauer einer einzelnen Serverinstanz verarbeiten. Dadurch können im Laufe der Zeit neue Algorithmuskonfigurationen, Gewichte und andere Daten geladen werden. Mit Versionen können mehrere Versionen eines Servables gleichzeitig geladen werden, was ein schrittweises Rollout und Experimentieren unterstützt. Zur Bereitstellungszeit können Clients entweder die neueste Version oder eine bestimmte Versions-ID für ein bestimmtes Modell anfordern.

Servable Streams

Ein servable Stream ist die Folge von Versionen eines servable Streams, sortiert nach zunehmenden Versionsnummern.

Modelle

TensorFlow Serving repräsentiert ein Modell als ein oder mehrere Servables. Ein maschinell erlerntes Modell kann einen oder mehrere Algorithmen (einschließlich erlernter Gewichte) und Nachschlagetabellen oder Einbettungstabellen enthalten.

Sie können ein zusammengesetztes Modell wie folgt darstellen:

  • mehrere unabhängige Servables
  • Single Composite wartbar

Ein Servable kann auch einem Bruchteil eines Modells entsprechen. Beispielsweise kann eine große Nachschlagetabelle für viele TensorFlow Serving-Instanzen aufgeteilt werden.

Lader

Lader verwalten den Lebenszyklus eines Servables. Die Loader-API ermöglicht eine gemeinsame Infrastruktur unabhängig von bestimmten Lernalgorithmen, Daten oder Produktanwendungsfällen. Insbesondere standardisieren Loader die APIs zum Laden und Entladen eines Servables.

Quellen

Quellen sind Plugin-Module, die Servables finden und bereitstellen. Jede Quelle bietet null oder mehr bedienbare Streams. Für jeden bedienbaren Stream stellt eine Quelle eine Loader-Instanz für jede Version bereit, die zum Laden verfügbar ist. (Eine Quelle ist tatsächlich mit null oder mehr SourceAdaptern verkettet, und das letzte Element in der Kette gibt die Lader aus.)

Die Schnittstelle für Quellen von TensorFlow Serving kann Servables von beliebigen Speichersystemen erkennen. TensorFlow Serving enthält allgemeine Referenzquellenimplementierungen. Beispielsweise können Quellen auf Mechanismen wie RPC zugreifen und ein Dateisystem abfragen.

Quellen können den Status beibehalten, der von mehreren Servables oder Versionen gemeinsam genutzt wird. Dies ist nützlich für Servables, die Delta (Diff) -Updates zwischen Versionen verwenden.

Angestrebte Versionen

Angestrebte Versionen stellen den Satz von wartbaren Versionen dar, die geladen und bereit sein sollten. Quellen kommunizieren diesen Satz servierbarer Versionen jeweils für einen einzelnen servable Stream. Wenn eine Quelle dem Manager eine neue Liste der angestrebten Versionen übergibt, ersetzt sie die vorherige Liste für diesen wartbaren Stream. Der Manager entlädt alle zuvor geladenen Versionen, die nicht mehr in der Liste angezeigt werden.

Im erweiterten Tutorial erfahren Sie , wie das Laden von Versionen in der Praxis funktioniert.

Manager

Manager verwalten den gesamten Lebenszyklus von Servables, einschließlich:

  • Laden von Servables
  • Servables servieren
  • Servables entladen

Manager hören sich Quellen an und verfolgen alle Versionen. Der Manager versucht, die Anforderungen von Sources zu erfüllen, kann jedoch das Laden einer gewünschten Version ablehnen, wenn beispielsweise die erforderlichen Ressourcen nicht verfügbar sind. Manager können auch ein "Entladen" verschieben. Beispielsweise kann ein Manager mit dem Entladen warten, bis das Laden einer neueren Version abgeschlossen ist. Dies basiert auf einer Richtlinie, die sicherstellt, dass immer mindestens eine Version geladen wird.

TensorFlow Serving Manager bieten eine einfache, schmale Schnittstelle - GetServableHandle() - für Clients, um auf geladene servable Instanzen zuzugreifen.

Ader

Mit den Standard-TensorFlow-Serving-APs verwaltet TensorFlow Serving Core die folgenden Aspekte von Servables:

  • Lebenszyklus
  • Metriken

TensorFlow Serving Core behandelt Servables und Loader als undurchsichtige Objekte.

Das Leben eines Dieners

tf Serving-Architekturdiagramm

Allgemein gesprochen:

  1. Quellen erstellen Loader für Servable-Versionen.
  2. Lader werden als gewünschte Versionen an den Manager gesendet, der sie lädt und an Clientanforderungen weiterleitet.

Ausführlicher:

  1. Ein Quell-Plugin erstellt einen Loader für eine bestimmte Version. Der Loader enthält alle Metadaten, die zum Laden des Servables erforderlich sind.
  2. Die Quelle verwendet einen Rückruf, um den Manager über die gewünschte Version zu informieren.
  3. Der Manager wendet die konfigurierte Versionsrichtlinie an, um die nächste auszuführende Aktion zu bestimmen, z. B. das Entladen einer zuvor geladenen Version oder das Laden der neuen Version.
  4. Wenn der Manager feststellt, dass es sicher ist, gibt er dem Loader die erforderlichen Ressourcen und weist den Loader an, die neue Version zu laden.
  5. Clients fragen den Manager nach dem Servable, indem sie entweder explizit eine Version angeben oder nur die neueste Version anfordern. Der Manager gibt ein Handle für das Servable zurück.

Angenommen, eine Quelle repräsentiert ein TensorFlow-Diagramm mit häufig aktualisierten Modellgewichten. Die Gewichte werden in einer Datei auf der Festplatte gespeichert.

  1. Die Quelle erkennt eine neue Version der Modellgewichte. Es wird ein Loader erstellt, der einen Zeiger auf die Modelldaten auf der Festplatte enthält.
  2. Die Quelle benachrichtigt den Dynamic Manager über die gewünschte Version.
  3. Der Dynamic Manager wendet die Versionsrichtlinie an und beschließt, die neue Version zu laden.
  4. Der Dynamic Manager teilt dem Loader mit, dass genügend Speicher vorhanden ist. Der Loader instanziiert das TensorFlow-Diagramm mit den neuen Gewichten.
  5. Ein Client fordert ein Handle für die neueste Version des Modells an, und der Dynamic Manager gibt ein Handle für die neue Version des Servable zurück.

Erweiterbarkeit

TensorFlow Serving bietet mehrere Erweiterungspunkte, an denen Sie neue Funktionen hinzufügen können.

Versionsrichtlinie

Versionsrichtlinien geben die Reihenfolge des Ladens und Entladens der Version innerhalb eines einzelnen servable Streams an.

TensorFlow Serving enthält zwei Richtlinien, die die meisten bekannten Anwendungsfälle berücksichtigen. Dies sind die Availability Preserving Policy (vermeiden Sie, dass keine Versionen geladen werden; laden Sie normalerweise eine neue Version, bevor Sie eine alte laden) und die Resource Preserving Policy (vermeiden Sie, dass zwei Versionen gleichzeitig geladen werden, sodass doppelt so viele Ressourcen erforderlich sind; entladen Sie eine alte Version vor dem Laden ein neues). Für die einfache Verwendung von TensorFlow Serving, bei der die Verfügbarkeit eines Modells für das Serving wichtig und die Ressourcenkosten niedrig sind, stellt die Availability Preserving Policy sicher, dass die neue Version geladen und bereit ist, bevor die alte entladen wird. Für die anspruchsvolle Verwendung von TensorFlow Serving, z. B. das Verwalten von Versionen über mehrere Serverinstanzen hinweg, erfordert die Ressourcenerhaltungsrichtlinie die geringsten Ressourcen (kein zusätzlicher Puffer zum Laden neuer Versionen).

Quelle

Neue Quellen könnten neue Dateisysteme, Cloud-Angebote und Algorithmus-Backends unterstützen. TensorFlow Serving bietet einige gängige Bausteine, um das Erstellen neuer Quellen einfach und schnell zu gestalten. Beispielsweise enthält TensorFlow Serving ein Dienstprogramm, mit dem das Abrufverhalten um eine einfache Quelle gewickelt werden kann. Quellen sind eng mit Loadern für bestimmte Algorithmen und Datenhosting-Servables verwandt.

Weitere Informationen zum Erstellen einer benutzerdefinierten Quelle finden Sie im Dokument Benutzerdefinierte Quelle.

Lader

Loader sind der Erweiterungspunkt für das Hinzufügen von Algorithmus- und Daten-Backends. TensorFlow ist ein solches Algorithmus-Backend. Beispielsweise würden Sie einen neuen Loader implementieren, um eine Instanz eines neuen Typs eines wartbaren maschinellen Lernmodells zu laden, Zugriff darauf zu gewähren und zu entladen. Wir erwarten, Loader für Nachschlagetabellen und zusätzliche Algorithmen zu erstellen.

Weitere Informationen zum Erstellen eines benutzerdefinierten Servables finden Sie im Dokument Benutzerdefinierte Wartung.

Batcher

Durch das Zusammenfassen mehrerer Anforderungen zu einer einzelnen Anforderung können die Kosten für die Durchführung von Inferenzen erheblich gesenkt werden, insbesondere bei Vorhandensein von Hardwarebeschleunigern wie GPUs. TensorFlow Serving enthält ein Widget zum Stapeln von Anforderungen, mit dem Clients ihre typspezifischen Schlussfolgerungen problemlos über Anforderungen in Stapelanforderungen stapeln können, die von Algorithmus-Systemen effizienter verarbeitet werden können. Weitere Informationen finden Sie im Chargenhandbuch .