TensorFlow jest fabrycznie wyposażony w obszerną bibliotekę operacji i jąder operacji (implementacji) dostosowanych do różnych typów sprzętu (CPU, GPU itp.). Operacje te są automatycznie łączone z plikiem binarnym TensorFlow Serving ModelServer, bez konieczności wykonywania dodatkowej pracy przez użytkownika. Istnieją jednak dwa przypadki użycia, które wymagają od użytkownika jawnego połączenia operacji z serwerem ModelServer:
- Napisałeś własną, niestandardową operację (np. korzystając z tego przewodnika )
- Używasz już zaimplementowanej operacji, która nie jest dostarczana z TensorFlow
Niezależnie od tego, czy zaimplementowałeś operację, czy nie, aby udostępnić modelowi niestandardowe operacje, potrzebujesz dostępu do źródła operacji. Ten przewodnik przeprowadzi Cię przez kolejne etapy korzystania ze źródła w celu udostępnienia niestandardowych operacji do wyświetlania. Wskazówki dotyczące implementacji operacji niestandardowych można znaleźć w repozytorium tensorflow/custom-op .
Warunek wstępny: Po zainstalowaniu Dockera sklonowałeś repozytorium TensorFlow Serving, a bieżący katalog roboczy jest katalogiem głównym repozytorium.
Skopiuj źródło op do projektu Serving
Aby zbudować usługę TensorFlow Serving z niestandardowymi operacjami, musisz najpierw skopiować źródło operacji do projektu obsługującego. W tym przykładzie użyjesz tensorflow_zero_out z repozytorium operacji niestandardowych wspomnianego powyżej.
W repozytorium obsługującym utwórz katalog custom_ops
, w którym będą znajdować się wszystkie niestandardowe operacje. W tym przykładzie będziesz mieć tylko kod tensorflow_zero_out .
mkdir tensorflow_serving/custom_ops
cp -r <custom_ops_repo_root>/tensorflow_zero_out tensorflow_serving/custom_ops
Zbuduj bibliotekę statyczną dla op
W pliku BUILD tensorflow_zero_out widzisz element docelowy tworzący plik obiektu współdzielonego ( .so
), który możesz załadować do Pythona w celu utworzenia i wytrenowania modelu. Jednakże udostępnianie TensorFlow statycznie łączy operacje w czasie kompilacji i wymaga pliku .a
. Więc dodasz regułę kompilacji, która generuje ten plik do tensorflow_serving/custom_ops/tensorflow_zero_out/BUILD
:
cc_library(
name = 'zero_out_ops',
srcs = [
"cc/kernels/zero_out_kernels.cc",
"cc/ops/zero_out_ops.cc",
],
alwayslink = 1,
deps = [
"@org_tensorflow//tensorflow/core:framework",
]
)
Zbuduj ModelServer z op połączonym
Aby udostępnić model korzystający z niestandardowej operacji, musisz zbudować plik binarny ModelServer z dołączoną do tej operacji. W szczególności dodajesz utworzony powyżej cel kompilacji zero_out_ops
do pliku BUILD
ModelServer.
Edytuj tensorflow_serving/model_servers/BUILD
aby dodać niestandardowy cel kompilacji op do SUPPORTED_TENSORFLOW_OPS
, który jest zawarty w celu server_lib
:
SUPPORTED_TENSORFLOW_OPS = [
...
"//tensorflow_serving/custom_ops/tensorflow_zero_out:zero_out_ops"
]
Następnie użyj środowiska Docker, aby zbudować ModelServer:
tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server
Podaj model zawierający Twój niestandardowy op
Możesz teraz uruchomić plik binarny ModelServer i rozpocząć udostępnianie modelu zawierającego tę niestandardową operację:
tools/run_in_docker.sh -o "-p 8501:8501" \
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \
--rest_api_port=8501 --model_name=<model_name> --model_base_path=<model_base_path>
Wyślij żądanie wnioskowania, aby ręcznie przetestować operację
Możesz teraz wysłać żądanie wnioskowania do serwera modelu, aby przetestować niestandardową operację:
curl http://localhost:8501/v1/models/<model_name>:predict -X POST \
-d '{"inputs": [[1,2], [3,4]]}'
Ta strona zawiera bardziej kompletny interfejs API do wysyłania żądań REST do serwera modelu.