Exporta un modelo guardado para realizar predicciones

A fin de implementar los modelos entrenados en AI Platform Prediction y usarlos para entregar predicciones, primero debes exportarlos en el formato de modelo guardado de TensorFlow.

En esta página, se describen algunos aspectos importantes que debes tener en cuenta cuando crees tu modelo guardado. Si deseas obtener información más detallada sobre cómo exportar a un modelo guardado, lee la guía de TensorFlow de modelos guardados y la guía de TensorFlow para guardar modelos de Keras. Si quieres obtener más información sobre cómo implementar el modelo guardado en AI Platform Prediction para que entregue predicciones, lee la guía de implementación de modelos. Para obtener información general sobre el proceso de predicción, consulta la página de descripción general de las predicciones.

Rutinas de predicción personalizadas

Como alternativa a la implementación de un modelo guardado, también puedes crear y, luego, implementar una rutina de predicción personalizada. Una rutina de predicción personalizada puede combinar un modelo guardado (o un modelo entrenado que se guardó de otra manera) con otros artefactos de entrenamiento y el código de Python que proporcionas para personalizar la manera en que AI Platform Prediction controla las solicitudes de predicción. Por ejemplo, puedes usar esta flexibilidad para hacer un procesamiento previo de la entrada de predicción antes de que el modelo haga la predicción.

Para obtener más información, lee la guía de rutinas de predicción personalizadas.

Obtén información sobre los grafos de entrenamiento y cómo entregarlos

Cuando hayas entrenado tu modelo y lo hayas exportado como un modelo guardado, debes seguir algunos pasos importantes antes de poder obtener predicciones.

Existen algunas diferencias clave entre un grafo de entrenamiento y uno de entrega. Los grafos de entrenamiento contienen funciones que no son apropiadas para la entrega, como las siguientes:

  • lectores de archivos
  • colas de entrada
  • capas de retirados
  • funciones de pérdida
  • optimizadores

Debido a que el proceso de entrega de predicciones tiene requisitos distintos al proceso de entrenamiento, la práctica recomendada es exportar un grafo separado específicamente para entregar predicciones.

Obtén información sobre el modelo guardado

Un modelo guardado es el formato recomendado por TensorFlow para guardar modelos, y es el formato obligatorio a fin de implementar modelos entrenados de TensorFlow en AI Platform Prediction. Cuando exportas el modelo entrenado como un modelo guardado, el grafo de entrenamiento se guarda junto con sus elementos, variables y metadatos en un formato que AI Platform Prediction puede consumir y restablecer para las predicciones.

Después de exportar un modelo guardado, tendrás un directorio de modelo guardado con estos elementos:

Cuando implementas el modelo guardado en AI Platform Prediction, debes incluir todo el directorio de modelo guardado, no solo el archivo del búfer de protocolo del modelo guardado que contiene el grafo y los metadatos. Este archivo suele tener una extensión .pb.pbtxt.

El modelo guardado te permite almacenar diferentes versiones de un grafo que comparten los mismos activos y variables (o puntos de control). Por ejemplo, puedes desarrollar dos versiones del mismo grafo, una que se ejecute con CPU y otra que se ejecute con GPU.

Obtén más información sobre la estructura del directorio de modelo guardado.

Exporta desde varias API de TensorFlow

Hay varias maneras de exportar modelos guardados desde el código de entrenamiento de TensorFlow. En la siguiente lista, se describen algunas opciones diferentes que funcionan para varias API de TensorFlow:

Compatibilidad con Explicaciones de IA

Si deseas usar Explicaciones de IA con el modelo, debes tener en cuenta ciertas limitaciones a la hora de exportar tu modelo guardado. En particular, no debes usar TensorFlow 2 y debes exportar el modelo guardado mediante la API de Estimador. (Si no entrenas el modelo mediante un Estimador, puedes convertirlo en un Estimador antes de exportarlo).

Comprueba y ajusta el tamaño del modelo

El tamaño de tu modelo guardado debe ser de 500 MB o menos si deseas implementarlo en una versión del modelo que use un tipo de máquina heredada (MLS1). Puede ser de hasta 2 GB si usas un tipo de máquina de Compute Engine (N1). Obtén más información sobre los tipos de máquina para la predicción en línea.

Este límite de tamaño incluye todos los activos y variables en el directorio de tu modelo guardado, no solo el archivo del búfer de protocolo del modelo guardado en sí (es decir, saved_model.pb o saved_model.pbtxt).

Para verificar el tamaño del modelo mientras lo estás desarrollando, exporta un modelo guardado y comprueba el tamaño del archivo del directorio.

Si tu modelo guardado supera el límite de 500 MB, haz lo siguiente:

Si sigues estos pasos, podrás reducir el tamaño del modelo guardado a menos de 500 MB y disminuir la latencia de las predicciones. Dentro de los beneficios, se incluyen un mejor rendimiento, y no tener que solicitar y esperar un aumento de cuota.

Si aun así necesitas más cuota, consulta cómo solicitar un aumento de cuota.

Compila un grafo de predicción óptimo

El entrenamiento produce muchos puntos de control que no se usan para entregar predicciones. Asegúrate de subir un directorio que solo contenga el modelo que implementarás y no incluya esos artefactos.

Por ejemplo, si exportas resúmenes durante el proceso de entrenamiento para verlos en TensorBoard, asegúrate de que no estén en tu modelo guardado. Los resúmenes de TensorBoard no son necesarios para un grafo de predicción.

Reduce la precisión para disminuir el tamaño del archivo

Reducir la precisión de las variables y los datos de entrada es una alternativa que reduce significativamente el tamaño de tu modelo, pero tiene cierto costo en la precisión de las predicciones. Los datos de alta precisión se almacenan de forma menos eficiente que los datos de baja precisión. Aunque los datos de baja precisión son una fuente de ruido, una red neuronal puede “ignorar” ese ruido y, aun así, producir predicciones bastante precisas.

Si el uso de estos métodos produce una pérdida demasiado grande en la precisión de las predicciones de tu caso práctico, intenta solicitar un aumento de cuota

  • Reduce el tamaño del archivo disminuyendo el tamaño de las ponderaciones, que adoptan como predeterminados números de punto flotante que son difíciles de almacenar de manera eficiente. Estas ponderaciones almacenadas de forma ineficiente son las que más contribuyen al tamaño total del archivo de modelo.

  • Cuantiza tus datos continuos para reducir el tamaño del modelo hasta un 75% sin sacrificar una cantidad significativa de precisión.

  • Usa variables menos precisas. Por ejemplo, cambia el tipo de datos (dtype) de int64 a int32.

  • Reduce el tamaño de otros atributos de entrada en la carpeta assets del directorio de tu modelo guardado. Por ejemplo, usa tamaños de vocabulario menores para los datos de texto.

  • Lee sobre técnicas que te permiten optimizar los modelos de TensorFlow para la entrega con más detalle y trabaja con ejemplos de la aplicación de estas técnicas.

Herramientas para inspeccionar los grafos y los modelos guardados

TensorFlow te proporciona una interfaz de línea de comandos que puedes usar para verificar el estado de ciertos aspectos de tu modelo guardado, como el formato de entrada y SignatureDefs. Obtén más información sobre la CLI de los modelos guardados.

La Herramienta de transformación de grafo de TensorFlow se puede usar para optimizar tu modelo antes de implementarlo. Aunque se explica cómo usar esta herramienta en el contexto de la implementación móvil, también se puede usar con el fin de optimizar modelos para la implementación no móvil.

Crea funciones de entrada de entrega

Si exportas un modelo guardado mediante tf.keras.Model.save, no es necesario que especifiques una función de entrada de entrega.

De lo contrario, define una función de entrada de entrega cuando exportes el modelo guardado. Puedes hacerlo en los siguientes momentos del proceso de entrenamiento general:

  • Durante el final del proceso de entrenamiento.
  • Como un proceso separado después de que el entrenamiento esté completo.

En los siguientes ejemplos, se muestra cómo hacerlo para un Estimador entrenado. Obtén más información sobre las funciones de entrada de entrega para los Estimadores.

Crea un grafo de entrega durante el entrenamiento

Esto suele hacerse al final del proceso de entrenamiento, pero, de todos modos, está relacionado con el entrenamiento.

  1. Define una función de entrada de entrega. En la función, asegúrate de que la dimensión más externa de los atributos sea None. Esto corresponde al tamaño del lote y se muestra a continuación cuando se define el valor de los elementos en las funciones dict mediante tf.placeholder. El siguiente código de ejemplo es de nuestra muestra del censo:

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Para exportar un modelo guardado desde tu Estimador mediante tf.estimator.Estimator.export_saved_model, tienes que pasar la ruta de tu modelo como el parámetro export_dir_base y el nombre de la función de entrada de entrega como el parámetro serving_input_fn. En el ejemplo del censo, el tipo de Estimador que se usa es tf.estimator.DNNLinearCombinedClassifier.

Crea un grafo de entrega por fuera del entrenamiento

Si ya entrenaste tu modelo, puedes obtener predicciones sin necesidad de un nuevo entrenamiento. Este proceso es muy parecido a la creación de un grafo de entrega durante el entrenamiento. La principal diferencia es que debes crear un grafo de entrega en una secuencia de comandos de Python separada que debes ejecutar cuando el entrenamiento haya finalizado. La idea básica es construir el Estimator con el mismo model_dir que se usa en el entrenamiento y, luego, llamar a tf.estimator.Estimator.export_saved_model como se describió en la sección anterior.

  1. Define una función de entrada de entrega en tu secuencia de comandos de Python de manera similar a como lo haces en el entrenamiento:

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Cuando crees tu Estimator, asegúrate de configurar el parámetro model_dir para que sea el mismo que usaste en el entrenamiento. Esto permite que los puntos de control del modelo guardado antes estén disponibles para el Estimator.

  3. Por último, usa tu Estimator para llamar a tf.estimator.Estimator.export_saved_model y, luego, pasa la ruta de acceso del modelo como el parámetro export_dir_base, y el nombre de la función de entrada de entrega como el parámetro serving_input_fn.

Etiquetas y firmas de TensorFlow

Si exportas un modelo guardado de tf.keras o de un Estimador de TensorFlow, el grafo exportado está listo para la entrega de forma predeterminada.

En otros casos, cuando crees un grafo de predicción de TensorFlow, debes especificar los valores correctos para las etiquetas y firmas de tu grafo. TensorFlow ofrece constantes para estos valores de etiquetas y firmas, los cuales se usan con los siguientes objetivos:

  • Seleccionar un grafo en tu modelo guardado para entregar predicciones.
  • Indicar que estás compilando una firma de predicción para tu grafo de predicción.

Las firmas definen las entradas y salidas del grafo. Cuando compilas una firma para el grafo de predicción, debes especificar una constante de firma válida como el parámetro method_name en build_signature_def. Para la predicción, la mejor opción suele ser PREDICT_METHOD_NAME.

Debes usar una etiqueta a fin de especificar qué grafo de tu modelo guardado se usa para entregar predicciones. En add_meta_graph_and_variables, agrega tag_constants.SERVING a tu lista tags.

Ve un ejemplo de cómo compilar un grafo de predicción con las constantes correctas para las etiquetas y las firmas.

Próximos pasos