Udostępnianie modeli TensorFlow z niestandardowymi operacjami

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.