Instructivo: Ejecuta la inferencia en una tabla de objeto con un modelo de clasificación

En este instructivo, se muestra cómo crear una tabla de objetos basada en las imágenes de un conjunto de datos públicos y, luego, ejecutar inferencias en esa tabla de objetos con el modelo ResNet 50.

El modelo ResNet 50

El modelo ResNet 50 analiza los archivos de imágenes y genera un lote de vectores que representan la probabilidad de que una imagen pertenezca a la clase correspondiente (logits). Para obtener más información, consulta la sección Uso en la página de TensorFlow Hub del modelo.

La entrada del modelo ResNet 50 toma un tensor de DType = float32 en la forma [-1, 224, 224, 3]. La salida es un array de tensores de tf.float32 en la forma [-1, 1024].

Permisos necesarios

  • Para crear el conjunto de datos, necesitas el permiso bigquery.datasets.create.
  • Para crear el recurso de conexión, necesitas los siguientes permisos:

    • bigquery.connections.create
    • bigquery.connections.get
  • Para otorgar permisos a la cuenta de servicio de la conexión, necesitas el siguiente permiso:

    • resourcemanager.projects.setIamPolicy
  • Para crear la tabla de objetos, necesitas los siguientes permisos:

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • Para crear el bucket, necesitas el permiso storage.buckets.create.

  • Para subir el modelo a Cloud Storage, necesitas los permisos storage.objects.create y storage.objects.get.

  • Para cargar el modelo en BigQuery ML, necesitas los siguientes permisos:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Para ejecutar inferencias, necesitas los siguientes permisos:

    • bigquery.tables.getData en la tabla de objetos
    • bigquery.models.getData en el modelo
    • bigquery.jobs.create

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • BigQuery: You incur storage costs for the object table you create in BigQuery.
  • BigQuery ML: You incur costs for the model you create and the inference you perform in BigQuery ML.
  • Cloud Storage: You incur costs for the objects you store in Cloud Storage.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Para obtener más información sobre los precios de almacenamiento de BigQuery, consulta los Precios de almacenamiento en la documentación de BigQuery.

Para obtener más información sobre los precios de BigQuery ML, consulta los precios de BigQuery ML en la documentación de BigQuery.

Para obtener más información, consulta la página Precios de Cloud Storage.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

Crea una reserva

Para usar un modelo importado con una tabla de objetos, debes crear una reserva que use la Edición Enterprise o Enterprise Plus de BigQuery, y, luego, crear una asignación de reserva que use el tipo de trabajo QUERY.

Crea un conjunto de datos

Crea un conjunto de datos llamado resnet_inference_test:

SQL

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    CREATE SCHEMA `PROJECT_ID.resnet_inference_test`;

    Reemplaza PROJECT_ID con el ID del proyecto.

bq

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

  2. Ejecuta el comando bq mk para crear el conjunto de datos.

    bq mk --dataset --location=us PROJECT_ID:resnet_inference_test

    Reemplaza PROJECT_ID con el ID del proyecto.

Crear una conexión

Crea una conexión llamada lake-connection:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. Haz clic en Agregar y, luego, en Fuente de datos externa.

  3. En la lista Tipo de conexión, selecciona BigLake y funciones remotas (Cloud Resource).

  4. En el campo ID de conexión, escribe lake-connection.

  5. Haga clic en Crear conexión.

  6. En el panel Información de conexión, copia el valor del campo ID de cuenta de servicio y guárdalo en algún lugar. Necesitarás esta información para otorgar permisos a la cuenta de servicio de la conexión.

bq

  1. En Cloud Shell, ejecuta el comando bq mk para crear la conexión:

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. Ejecuta el comando bq show para recuperar información sobre la conexión:

    bq show --connection us.lake-connection
    
  3. En la columna properties, copia el valor de la propiedad serviceAccountId y guárdalo en algún lugar. Necesitarás esta información para otorgar permisos a la cuenta de servicio de la conexión.

Crea un bucket de Cloud Storage

Crea un bucket de Cloud Storage para contener los archivos del modelo.

Otorga permisos a la cuenta de servicio de las conexiones

Console

  1. Ir a la página IAM y administración

    Ir a IAM y administración

  2. Haz clic en Otorgar acceso.

    Se abre el cuadro de diálogo Agregar principales.

  3. En el campo Principales nuevas (New principals), ingresa el ID de la cuenta de servicio que copiaste antes.

  4. En el campo Selecciona una función, elige Cloud Storage y, luego, Visualizador de objetos de almacenamiento.

  5. Haz clic en Guardar.

gcloud

En Cloud Shell, ejecuta el siguiente comando gcloud storage buckets add-iam-policy-binding:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:MEMBER \
--role=roles/storage.objectViewer

Reemplaza MEMBER por el ID de la cuenta de servicio que copiaste antes. Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

Para obtener más información, consulta Agrega una principal a una política a nivel del bucket.

Crea una tabla de objetos

Crea una tabla de objetos llamada vision_images basada en los archivos de imagen del bucket público gs://cloud-samples-data/vision:

SQL

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    CREATE EXTERNAL TABLE resnet_inference_test.vision_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://cloud-samples-data/vision/*.jpg']
    );

bq

En Cloud Shell, ejecuta el comando bq mk para crear la conexión:

bq mk --table \
--external_table_definition='gs://cloud-samples-data/vision/*.jpg@us.lake-connection' \
--object_metadata=SIMPLE \
resnet_inference_test.vision_images

Sube el modelo a Cloud Storage.

Obtén los archivos del modelo y haz que estén disponibles en Cloud Storage:

  1. Descarga el modelo ResNet 50 a tu máquina local. Esto te brinda un archivo saved_model.pb y una carpeta variables para el modelo.
  2. Sube el archivo saved_model.pb y la carpeta variables al bucket que creaste antes.

Carga el modelo en BigQuery ML

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    CREATE MODEL `resnet_inference_test.resnet`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/*');

    Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

Inspecciona el modelo

Inspecciona el modelo subido para ver cuáles son sus campos de entrada y salida:

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, expande tu proyecto, expande el conjunto de datos resnet_inference_test y, luego, expande el nodo Modelos.

  3. Haz clic en el modelo resnet.

  4. En el panel del modelo que se abre, haz clic en la pestaña Esquema.

  5. Consulta la sección Etiquetas. Esto identifica los campos que genera el modelo. En este caso, el valor del nombre del campo es activation_49.

  6. Mira la sección Atributos. Esto identifica los campos que se deben ingresar en el modelo. Haz referencia a ellos en la declaración SELECT para la función ML.DECODE_IMAGE. En este caso, el valor del nombre del campo es input_1.

Ejecuta la inferencia

Ejecuta la inferencia en la tabla de objetos vision_images con el modelo resnet:

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Editor, ejecuta la siguiente instrucción de SQL:

    SELECT *
    FROM ML.PREDICT(
      MODEL `resnet_inference_test.resnet`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS input_1
      FROM resnet_inference_test.vision_images)
    );

    Los resultados debería ser similar al siguiente:

    -------------------------------------------------------------------------------------------------------------------------------------
    | activation_49           | uri                                                                                           | input_1 |
    ------------------------------------------------------------------------------------------------------------------------------------
    | 1.0254175464297077e-07  | gs://cloud-samples-data/vision/automl_classification/flowers/daisy/21652746_cc379e0eea_m.jpg  | 0.0     |
    ------------------------------------------------------------------------------------------------------------------------------------
    | 2.1671139620593749e-06  |                                                                                               | 0.0     |
    --------------------------                                                                                               -----------
    | 8.346052027263795e-08   |                                                                                               | 0.0     |
    --------------------------                                                                                               -----------
    | 1.159310958342985e-08   |                                                                                               | 0.0     |
    ------------------------------------------------------------------------------------------------------------------------------------
    

Realiza una limpieza

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.