Servire i modelli TensorFlow con operazioni personalizzate

TensorFlow viene fornito precostruito con un'ampia libreria di operazioni e kernel operativi (implementazioni) ottimizzati per diversi tipi di hardware (CPU, GPU, ecc.). Queste operazioni vengono automaticamente collegate al binario TensorFlow Serving ModelServer senza alcun lavoro aggiuntivo richiesto dall'utente. Tuttavia, esistono due casi d'uso che richiedono all'utente di collegarsi esplicitamente in ops al ModelServer:

  • Hai scritto la tua operazione personalizzata (ad esempio utilizzando questa guida )
  • Stai utilizzando un'operazione già implementata che non viene fornita con TensorFlow

Indipendentemente dal fatto che tu abbia implementato o meno l'operazione, per servire un modello con operazioni personalizzate, devi accedere alla fonte dell'operazione. Questa guida ti guida attraverso i passaggi per utilizzare l'origine per rendere disponibili operazioni personalizzate per la pubblicazione. Per indicazioni sull'implementazione delle operazioni personalizzate, fare riferimento al repository tensorflow/custom-op .

Prerequisito: con Docker installato, hai clonato il repository TensorFlow Serving e la tua directory di lavoro corrente è la radice del repository.

Copia sull'origine operativa nel progetto di gestione

Per creare TensorFlow Serving con le tue operazioni personalizzate, dovrai prima copiare l'origine operativa nel tuo progetto di servizio. Per questo esempio, utilizzerai tensorflow_zero_out dal repository custom-op menzionato sopra.

All'interno del repository di servizio, crea una directory custom_ops , che ospiterà tutte le tue operazioni personalizzate. Per questo esempio, avrai solo il codice tensorflow_zero_out .

mkdir tensorflow_serving/custom_ops
cp -r <custom_ops_repo_root>/tensorflow_zero_out tensorflow_serving/custom_ops

Costruisci libreria statica per l'op

Nel file BUILD di tensorflow_zero_out, vedi un target che produce un file oggetto condiviso ( .so ), che caricheresti in Python per creare e addestrare il tuo modello. TensorFlow Serving, tuttavia, collega staticamente le operazioni in fase di creazione e richiede un file .a . Quindi aggiungerai una regola di compilazione che produce questo file a 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",
    ]
)

Costruisci ModelServer con l'operazione collegata

Per servire un modello che utilizza un'operazione personalizzata, devi creare il binario ModelServer con quell'operazione collegata. Nello specifico, aggiungi il target di build zero_out_ops creato sopra al file BUILD di ModelServer.

Modifica tensorflow_serving/model_servers/BUILD per aggiungere il tuo target di build op personalizzato a SUPPORTED_TENSORFLOW_OPS che è incluso nel target server_lib :

SUPPORTED_TENSORFLOW_OPS = [
    ...
    "//tensorflow_serving/custom_ops/tensorflow_zero_out:zero_out_ops"
]

Quindi utilizzare l'ambiente Docker per creare ModelServer:

tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server

Servi un modello contenente la tua operazione personalizzata

Ora puoi eseguire il binario ModelServer e iniziare a servire un modello che contiene questa operazione personalizzata:

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>

Invia una richiesta di inferenza per testare manualmente l'operazione

Ora puoi inviare una richiesta di inferenza al server modello per testare la tua operazione personalizzata:

curl http://localhost:8501/v1/models/<model_name>:predict -X POST \
-d '{"inputs": [[1,2], [3,4]]}'

Questa pagina contiene un'API più completa per l'invio di richieste REST al server modello.