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

Serving eines TensorFlow-Modells

Dieses Tutorial zeigt Ihnen, wie Sie TensorFlow Serving-Komponenten verwenden, um ein trainiertes TensorFlow-Modell zu exportieren und es mit dem Standard-Tensorflow_model_server bereitzustellen. Wenn Sie bereits mit TensorFlow Serving vertraut sind und mehr über die Funktionsweise der Server-Interna erfahren möchten, lesen Sie das erweiterte Tutorial zu TensorFlow Serving .

In diesem Lernprogramm wird ein einfaches Softmax-Regressionsmodell verwendet, das handschriftliche Ziffern klassifiziert. Es ist dem im TensorFlow-Tutorial zur Bildklassifizierung unter Verwendung des Fashion MNIST-Datensatzes vorgestellten sehr ähnlich.

Der Code für dieses Tutorial besteht aus zwei Teilen:

  • Eine Python-Datei, mnist_saved_model.py , die das Modell trainiert und exportiert.

  • Eine ModelServer-Binärdatei, die entweder mit Apt installiert oder aus einer C ++ - Datei ( main.cc ) kompiliert werden kann . Der TensorFlow Serving ModelServer erkennt neue exportierte Modelle und führt einen gRPC- Dienst für deren Bereitstellung aus.

Bevor Sie beginnen, installieren Sie zuerst Docker .

Trainieren und exportieren Sie das TensorFlow-Modell

Für die Trainingsphase wird die TensorFlow Graph in TensorFlow Sitzung gestartet sess , mit dem Eingang Tensor (Bild) als x und Ausgang Tensor (Softmax score) als y .

Dann verwenden wir das SavedModelBuilder-Modul von TensorFlow, um das Modell zu exportieren. SavedModelBuilder speichert einen "Schnappschuss" des trainierten Modells in einem zuverlässigen Speicher, damit er später zur Inferenz geladen werden kann.

Einzelheiten zum SavedModel-Format finden Sie in der Dokumentation unter SavedModel README.md .

In mnist_saved_model.py finden Sie im Folgenden einen kurzen Code-Ausschnitt, der den allgemeinen Prozess des Speicherns eines Modells auf der Festplatte veranschaulicht.

export_path_base = sys.argv[-1]
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
    sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
    signature_def_map={
        'predict_images':
            prediction_signature,
        tf.compat.v1.saved_model.signature_constants
            .DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            classification_signature,
    },
    main_op=tf.compat.v1.tables_initializer(),
    strip_default_attrs=True)
builder.save()

SavedModelBuilder.__init__ das folgende Argument:

  • export_path ist der Pfad des Exportverzeichnisses.

SavedModelBuilder erstellt das Verzeichnis, wenn es nicht vorhanden ist. Im Beispiel verketten wir das Befehlszeilenargument und FLAGS.model_version , um das Exportverzeichnis zu erhalten. FLAGS.model_version gibt die Version des Modells an. Sie sollten einen größeren ganzzahligen Wert angeben, wenn Sie eine neuere Version desselben Modells exportieren. Jede Version wird unter dem angegebenen Pfad in ein anderes Unterverzeichnis exportiert.

Sie können dem Builder mithilfe von SavedModelBuilder.add_meta_graph_and_variables() und Variablen mit den folgenden Argumenten hinzufügen:

  • sess ist die TensorFlow-Sitzung, die das trainierte Modell enthält, das Sie exportieren.

  • tags ist die Gruppe von Tags, mit denen das Metadiagramm gespeichert werden soll. In diesem Fall verwenden wir das serve Tag aus vordefinierten SavedModel-Tag-Konstanten, da wir beabsichtigen, das Diagramm beim Serving zu verwenden. Weitere Informationen finden Sie in der Dokumentation zu tag_constants.py und der zugehörigen TensorFlow-API .

  • signature_def_map gibt die Zuordnung des vom Benutzer angegebenen Schlüssels für eine Signatur zu einem tensorflow :: SignatureDef an, die dem Metadiagramm hinzugefügt werden soll. Die Signatur gibt an, welcher Modelltyp exportiert wird und an welche Eingabe- / Ausgabe-Tensoren beim Ausführen der Inferenz gebunden werden soll.

    Der spezielle Signaturschlüssel serving_default gibt die Standard-Serving-Signatur an. Der Standardschlüssel für die Serving-Signatur def wird zusammen mit anderen Konstanten, die sich auf Signaturen beziehen, als Teil der SavedModel-Signaturkonstanten definiert. Weitere Informationen finden Sie in signatur_constants.py und in der zugehörigen TensorFlow-API-Dokumentation .

    Um das Erstellen von Signatur-Defs zu vereinfachen, bietet die SavedModel-API Signatur-Def-Utils . Insbesondere verwenden wir in der ursprünglichen Datei mnist_saved_model.py die signature_def_utils.build_signature_def() , um die predict_signature signature_def_utils.build_signature_def() und die classification_signature zu predict_signature .

    Als ein Beispiel dafür , wie predict_signature definiert ist, nimmt die util die folgenden Argumente:

    • input inputs={'images': tensor_info_x} gibt die eingegebenen inputs={'images': tensor_info_x} .

    • outputs={'scores': tensor_info_y} gibt die Tensor-Informationen der Scores an.

    • method_name ist die Methode, die für die Inferenz verwendet wird. Für Vorhersageanforderungen sollte tensorflow/serving/predict . Weitere Methodennamen finden Sie in signatur_constants.py und in der zugehörigen TensorFlow-API-Dokumentation .

Beachten Sie, dass tensor_info_x und tensor_info_y die hier definierte Struktur des tensorflow::TensorInfo Protokollpuffers haben . Um Tensor-Infos einfach zu erstellen, bietet die TensorFlow SavedModel-API auch utils.py mit zugehöriger TensorFlow-API-Dokumentation .

Beachten Sie außerdem, dass images und scores Tensor-Aliasnamen sind. Sie können beliebige eindeutige Zeichenfolgen sein und werden zu den logischen Namen der Tensoren x und y , auf die Sie sich beim späteren Senden von Vorhersageanforderungen für die Tensorbindung beziehen.

Wenn sich x auf den Tensor mit dem Namen 'long_tensor_name_foo' und y auf den Tensor mit dem Namen 'generate_tensor_name_bar' bezieht, speichert der builder den logischen Tensornamen für die Zuordnung des realen Namens ('images' -> 'long_tensor_name_foo') und ('Scores' '->' generate_tensor_name_bar '). Auf diese Weise kann der Benutzer beim Ausführen der Inferenz auf diese Tensoren mit ihren logischen Namen verweisen.

Lass es uns laufen!

Wenn Sie dies noch nicht getan haben, klonen Sie dieses Repository zunächst auf Ihren lokalen Computer:

git clone https://github.com/tensorflow/serving.git
cd serving

Löschen Sie das Exportverzeichnis, falls es bereits vorhanden ist:

rm -rf /tmp/mnist

Lassen Sie uns nun das Modell trainieren:

tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
  /tmp/mnist

Dies sollte zu einer Ausgabe führen, die wie folgt aussieht:

Training model...

...

Done training!
Exporting trained model to models/mnist
Done exporting!

Schauen wir uns nun das Exportverzeichnis an.

$ ls /tmp/mnist
1

Wie oben erwähnt, wird ein Unterverzeichnis zum Exportieren jeder Version des Modells erstellt. FLAGS.model_version hat den Standardwert 1, daher wird das entsprechende Unterverzeichnis 1 erstellt.

$ ls /tmp/mnist/1
saved_model.pb variables

Jedes Versionsunterverzeichnis enthält die folgenden Dateien:

  • saved_model.pb ist der serialisierte Tensorflow :: SavedModel. Es enthält eine oder mehrere Diagrammdefinitionen des Modells sowie Metadaten des Modells, z. B. Signaturen.

  • variables sind Dateien, die die serialisierten Variablen der Diagramme enthalten.

Damit ist Ihr TensorFlow-Modell exportiert und kann geladen werden!

Laden Sie das exportierte Modell mit dem Standard-TensorFlow ModelServer

Verwenden Sie ein Docker-Serving-Image, um das Modell für das Serving einfach zu laden:

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

Testen Sie den Server

Wir können das bereitgestellte Dienstprogramm mnist_client verwenden , um den Server zu testen. Der Client lädt MNIST-Testdaten herunter, sendet sie als Anforderungen an den Server und berechnet die Inferenzfehlerrate.

tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
  --num_tests=1000 --server=127.0.0.1:8500

Dies sollte so etwas wie ausgeben

    ...
    Inference error rate: 11.13%

Wir erwarten eine Genauigkeit von ca. 90% für das trainierte Softmax-Modell und eine Inferenzfehlerrate von 11% für die ersten 1000 Testbilder. Dies bestätigt, dass der Server das trainierte Modell erfolgreich lädt und ausführt!