Obsługa modelu TensorFlow

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Ten samouczek pokazuje, jak używać komponentów TensorFlow Serving do eksportowania wytrenowanego modelu TensorFlow i używania standardowego tensorflow_model_server do jego obsługi. Jeśli jesteś już zaznajomiony z TensorFlow Serving i chcesz wiedzieć więcej o tym, jak działają elementy wewnętrzne serwera, zobacz TensorFlow Serving zaawansowany samouczek .

W tym samouczku zastosowano prosty model regresji Softmax, który klasyfikuje odręczne cyfry. Jest bardzo podobny do wprowadzonego w tutorialu TensorFlow sprawie klasyfikacji obrazu przy użyciu zestawu danych Moda MNIST .

Kod tego samouczka składa się z dwóch części:

  • Pythona plik, mnist_saved_model.py , że pociągi i eksport modelu.

  • ModelServer dwuskładnikowych, które mogą być instalowane zarówno za pomocą APT albo zestawiona z C ++ pliku ( main.cc ). W TensorFlow Serving odkrywa ModelServer nowe modele eksportowane i prowadzi gRPC usługi dla służenia im.

Przed rozpoczęciem pracy najpierw zainstalować Döcker .

Trenuj i eksportuj model TensorFlow

Dla fazy treningowej wykres TensorFlow jest uruchamiany w TensorFlow sesji sess z tensora wejściowego (obraz) jak x i tensora wyjściowego (wynik Softmax) jako y .

Następnie używamy TensorFlow za moduł SavedModelBuilder wyeksportować model. SavedModelBuilder oszczędza „migawkę” wyszkolonego modelu do niezawodnego przechowywania tak, że może być załadowana później do wnioskowania.

Aby uzyskać szczegółowe informacje na temat formatu SavedModel, proszę zapoznać się z dokumentacją w SavedModel README.md .

Od mnist_saved_model.py , Poniżej znajduje się krótki fragment kodu do zilustrowania ogólny proces zapisywania modelu na dysku.

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__ przyjmuje następującą tezę:

  • export_path to ścieżka katalogu eksportu.

SavedModelBuilder stworzy katalog, jeśli nie istnieje. Na przykład, możemy złączyć argument wiersza poleceń i FLAGS.model_version celu uzyskania katalogu eksportu. FLAGS.model_version określa wersję modelu. Podczas eksportowania nowszej wersji tego samego modelu należy podać większą wartość całkowitą. Każda wersja zostanie wyeksportowana do innego podkatalogu pod podaną ścieżką.

Możesz dodać wykres meta i zmiennych do konstruktora używając SavedModelBuilder.add_meta_graph_and_variables() z następującymi argumentami:

  • sess jest sesja TensorFlow że posiada wyszkolonych modelu jesteś eksportującego.

  • tags to zestaw znaczników z którego można zapisać wykres meta. W tym przypadku, ponieważ mamy zamiar użyć wykresu w obsłudze, używamy serve tag z predefiniowanych stałych znaczników SavedModel. Aby uzyskać więcej informacji, zobacz tag_constants.py i pokrewne TensorFlow dokumentacji API .

  • signature_def_map określa mapa klucz użytkownika dostarczone do podpisu do tensorflow :: SignatureDef dodać do wykresu meta. Podpis określa typ eksportowanego modelu oraz tensory wejścia/wyjścia, z którymi należy powiązać podczas uruchamiania wnioskowania.

    Specjalnego klucza podpisu serving_default Określa domyślny obsługujących podpis. Domyślny klucz definicji podpisu obsługującego, wraz z innymi stałymi związanymi z podpisami, jest zdefiniowany jako część stałych podpisu SavedModel. Aby uzyskać więcej informacji, zobacz signature_constants.py i pokrewne TensorFlow dokumentacji API .

    Ponadto, aby pomóc budować podpisu DEFS łatwo API SavedModel zapewnia sygnatur utils def .. W szczególności, w oryginalnym mnist_saved_model.py pliku, używamy signature_def_utils.build_signature_def() budować predict_signature i classification_signature .

    Jako przykład jak predict_signature jest zdefiniowany, util przyjmuje następujące argumenty:

    • inputs={'images': tensor_info_x} określa informacje tensorowy wejściowego.

    • outputs={'scores': tensor_info_y} określa wyniki tensora informacji.

    • method_name metoda jest stosowana do wnioskowania. Żądań Prediction, powinien być ustawiony na tensorflow/serving/predict . Dla innych nazw metod, zobacz signature_constants.py i pokrewne TensorFlow dokumentacji API .

Zauważ, że tensor_info_x i tensor_info_y mają strukturę tensorflow::TensorInfo protokołu bufor zdefiniowane tutaj . Łatwo zbudować tensora infos API TensorFlow SavedModel zapewnia również utils.py , z odnośną dokumentacją TensorFlow API .

Należy również pamiętać, że images i scores są nazwami aliasów tensor. Mogą być cokolwiek unikalne ciągi chcesz, a oni stają się logiczne nazwy tensora x i y , które odnoszą się do wiązania podczas wysyłania żądania predykcji później tensora.

Na przykład, jeżeli x oznacza tensor o nazwie „long_tensor_name_foo” i y oznacza tensor z nazwą „generated_tensor_name_bar” builder przechowuje tensorowy nazwą logiczną do rzeczywistego nazwą odwzorowania ( „obrazów” -> „long_tensor_name_foo”) i ( "punktów ' -> 'generated_tensor_name_bar'). Dzięki temu użytkownik może odwoływać się do tych tensorów za pomocą ich logicznych nazw podczas wnioskowania.

Uruchommy to!

Po pierwsze, jeśli jeszcze tego nie zrobiłeś, sklonuj to repozytorium na swoją maszynę lokalną:

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

Wyczyść katalog eksportu, jeśli już istnieje:

rm -rf /tmp/mnist

Teraz wytrenujmy model:

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

Powinno to skutkować wyjściem, które wygląda następująco:

Training model...

...

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

Przyjrzyjmy się teraz katalogowi eksportu.

$ ls /tmp/mnist
1

Jak wspomniano powyżej, zostanie utworzony podkatalog do eksportu każdej wersji modelu. FLAGS.model_version ma domyślną wartość 1, w związku z tym odpowiedni podkatalog 1 jest tworzony.

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

Każdy podkatalog wersji zawiera następujące pliki:

  • saved_model.pb jest odcinkach tensorflow :: SavedModel. Zawiera jedną lub więcej definicji wykresów modelu, a także metadane modelu, takie jak sygnatury.

  • variables są pliki, które posiadają zmienne odcinkach z wykresów.

Dzięki temu Twój model TensorFlow jest eksportowany i gotowy do załadowania!

Załaduj wyeksportowany model za pomocą standardowego serwera TensorFlow ModelServer

Użyj obrazu do wyświetlania w Dockerze, aby łatwo załadować model do wyświetlania:

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

Przetestuj serwer

Możemy użyć dostarczonego mnist_client narzędzie do testowania serwera. Klient pobiera dane testowe MNIST, wysyła je jako żądania do serwera i oblicza współczynnik błędów wnioskowania.

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

Powinno to wyświetlić coś takiego:

    ...
    Inference error rate: 11.13%

Oczekujemy około 90% dokładności dla wytrenowanego modelu Softmax i otrzymujemy 11% współczynnik błędu wnioskowania dla pierwszych 1000 obrazów testowych. Potwierdza to, że serwer pomyślnie ładuje i uruchamia wyszkolony model!