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żywamyserve
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
iclassification_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 natensorflow/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!