Al servizio di un modello TensorFlow

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo tutorial mostra come utilizzare i componenti TensorFlow Serving per esportare un modello TensorFlow addestrato e utilizzare il tensorflow_model_server standard per servirlo. Se sei già familiarità con tensorflow Servire, e vuoi sapere di più su come la struttura interna del server funzionano, vedere la tensorflow servizio tutorial avanzato .

Questo tutorial utilizza un semplice modello di regressione Softmax che classifica le cifre scritte a mano. E 'molto simile a quello introdotto nel tutorial di tensorflow sulla classificazione immagine utilizzando il set di dati di moda MNIST .

Il codice per questo tutorial è composto da due parti:

  • Un file Python, mnist_saved_model.py , che i treni e le esportazioni del modello.

  • Un ModelServer binario che può essere installato sia usando Apt, o compilato da un file di C ++ ( main.cc ). I tensorflow Serving scopre ModelServer nuovo esportati modelli e gestisce un gRPC servizio per servirli.

Prima di iniziare, prima installare Docker .

Addestra ed esporta il modello TensorFlow

Per la fase di addestramento, il grafico tensorflow è lanciato in tensorflow sessione sess , con il tensore ingresso (immagine) come x e tensore uscita (score Softmax) come y .

Poi usiamo di tensorflow modulo SavedModelBuilder di esportare il modello. SavedModelBuilder salva un ' "istantanea" del modello addestrato per archiviazione affidabile in modo che possa essere caricato successivamente per l'inferenza.

Per dettagli sul formato SavedModel, si prega di consultare la documentazione a SavedModel README.md .

Dalla mnist_saved_model.py , la seguente è una breve frammento di codice per illustrare il processo generale di salvare un modello a disco.

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__ prende il seguente argomento:

  • export_path è il percorso della directory di esportazione.

SavedModelBuilder creerà la directory se non esiste. Nell'esempio, abbiamo concatenare le argomento della riga di comando e FLAGS.model_version per ottenere la directory di esportazione. FLAGS.model_version specifica la versione del modello. È necessario specificare un valore intero più grande quando si esporta una versione più recente dello stesso modello. Ogni versione verrà esportata in una sottodirectory diversa nel percorso specificato.

È possibile aggiungere meta grafico e variabili al costruttore utilizzando SavedModelBuilder.add_meta_graph_and_variables() con le seguenti argomentazioni:

  • sess è la sessione tensorflow che contiene il modello di formazione che si sta esportando.

  • tags è l'insieme di tag con cui salvare il grafico meta. In questo caso, dal momento che abbiamo intenzione di utilizzare il grafico nel servire, usiamo la serve tag dal predefiniti tag costanti SavedModel. Per maggiori dettagli, vedere tag_constants.py e relativa tensorflow documentazione delle API .

  • signature_def_map specifica la mappa di Key fornita dall'utente per una firma a un tensorflow :: SignatureDef da aggiungere al grafico meta. La firma specifica il tipo di modello che viene esportato e i tensori di input/output a cui associarsi durante l'esecuzione dell'inferenza.

    I principali firma speciali serving_default specifica il default servire firma. La chiave def predefinita della firma che serve, insieme ad altre costanti relative alle firme, sono definite come parte delle costanti della firma SavedModel. Per maggiori dettagli, vedere signature_constants.py e relativa tensorflow documentazione delle API .

    Inoltre, per contribuire a costruire firma defs facilmente, l'API SavedModel fornisce firma utils def .. In particolare, in originale mnist_saved_model.py di file, usiamo signature_def_utils.build_signature_def() per costruire predict_signature e classification_signature .

    Come esempio di come predict_signature è definito, l'util prende i seguenti parametri:

    • inputs={'images': tensor_info_x} specifica le informazioni in ingresso tensore.

    • outputs={'scores': tensor_info_y} specifica i punteggi tensore informazioni.

    • method_name è il metodo utilizzato per l'inferenza. Per richieste di previsione, dovrebbe essere impostato su tensorflow/serving/predict . Per gli altri nomi dei metodi, vedere signature_constants.py e relativa tensorflow documentazione delle API .

Si noti che tensor_info_x e tensor_info_y avere la struttura di tensorflow::TensorInfo Protocol Buffer definito qui . Per costruire facilmente tensore informazioni, l'API tensorflow SavedModel fornisce anche utils.py , con relativa documentazione tensorflow API .

Si noti inoltre che images ei scores sono nomi alias tensore. Possono essere qualunque stringhe unico che si desidera, e diventeranno i nomi logici di tensore x e y che si fa riferimento a per il legame per l'invio di richieste di previsione successivamente tensore.

Per esempio, se x si riferisce al tensore con il nome 'long_tensor_name_foo' e y si riferisce al tensore con il nome 'generated_tensor_name_bar', builder memorizzerà tensore nome logico vero nome mappatura ( 'immagini' -> 'long_tensor_name_foo') e ( 'punteggi ' -> 'generated_tensor_name_bar'). Ciò consente all'utente di fare riferimento a questi tensori con i loro nomi logici durante l'esecuzione dell'inferenza.

Eseguiamolo!

Innanzitutto, se non l'hai ancora fatto, clona questo repository sul tuo computer locale:

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

Cancella la directory di esportazione se esiste già:

rm -rf /tmp/mnist

Ora addestriamo il modello:

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

Questo dovrebbe portare a un output simile a:

Training model...

...

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

Ora diamo un'occhiata alla directory di esportazione.

$ ls /tmp/mnist
1

Come accennato in precedenza, verrà creata una sottodirectory per l'esportazione di ogni versione del modello. FLAGS.model_version ha il valore predefinito di 1, quindi il corrispondente sottodirectory 1 viene creata.

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

Ogni sottodirectory di versione contiene i seguenti file:

  • saved_model.pb è il tensorflow serializzato :: SavedModel. Include una o più definizioni di grafici del modello, nonché metadati del modello come le firme.

  • variables sono file che contengono le variabili serializzati dei grafici.

Con ciò, il tuo modello TensorFlow è esportato e pronto per essere caricato!

Carica il modello esportato con TensorFlow ModelServer standard

Utilizza un'immagine di pubblicazione Docker per caricare facilmente il modello per la pubblicazione:

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

Prova il server

Possiamo usare la fornito mnist_client utility per testare il server. Il client scarica i dati del test MNIST, li invia come richieste al server e calcola il tasso di errore di inferenza.

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

Questo dovrebbe produrre qualcosa del tipo

    ...
    Inference error rate: 11.13%

Prevediamo una precisione di circa il 90% per il modello Softmax addestrato e otteniamo un tasso di errore di inferenza dell'11% per le prime 1000 immagini di prova. Ciò conferma che il server carica ed esegue correttamente il modello addestrato!