Instructivo: Ejecuta la inferencia en una tabla de objeto con un modelo de vector de atributos

En este instructivo, se muestra cómo crear una tabla de objetos basada en las imágenes deconjunto de datos de flores y, luego, ejecutar inferencias en esa tabla de objetos con el modelo de MobileNet V3.

El modelo MobileNet V3

El modelo MobileNet V3 analiza los archivos de imagen y muestra un array de vector de atributos. El array de vector de atributos es una lista de elementos numéricos que describen las características de las imágenes analizadas. Cada vector de atributos describe un espacio de atributos multidimensionales y proporciona las coordenadas de la imagen en este espacio. Puedes usar la información del vector de atributos para una imagen de clasificación mayor, por ejemplo, mediante la similitud de coseno con el fin de agrupar imágenes similares.

La entrada del modelo MobileNet V3 toma un tensor de DType tf.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 conjunto de datos y 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 mobilenet_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.mobilenet_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. Haz clic en Crear conexión (Create connection).

  6. En el panel Explorador, expande tu proyecto, expande el nodo Conexiones externas y selecciona la conexión us.lake-connection.

  7. En el panel Información de conexión, copia el valor del campo ID de cuenta de servicio. Necesitarás esta información para otorgar permiso a la cuenta de servicio de la conexión en el bucket de Cloud Storage que crearás en el siguiente paso.

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

  1. Crea buckets de Cloud Storage.
  2. Crea dos carpetas en el bucket, una llamada mobilenet para los archivos de modelo y otra llamada flowers para el conjunto de datos.

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.

Sube el conjunto de datos a Cloud Storage

Obtén los archivos de conjuntos de datos y haz que estén disponibles en Cloud Storage:

  1. Descarga el conjunto de datos de flores a tu máquina local.
  2. Descomprime el archivo flower_photos.tgz.
  3. Sube la carpeta flower_photos a la carpeta flowers en el bucket que creaste antes.
  4. Una vez que se complete la carga, borra el archivo LICENSE.txt en la carpeta flower_photos.

Crea una tabla de objetos

Crea una tabla de objetos llamada sample_images basada en el conjunto de datos de flores que subiste:

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 mobilenet_inference_test.sample_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://BUCKET_NAME/flowers/*']);

    Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

bq

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

bq mk --table \
--external_table_definition='gs://BUCKET_NAME/flowers/*@us.lake-connection' \
--object_metadata=SIMPLE \
mobilenet_inference_test.sample_images

Reemplaza BUCKET_NAME por el nombre del bucket que creaste previamente.

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 de MobileNet V3 en 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 a la carpeta mobilenet en el 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 `mobilenet_inference_test.mobilenet`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/mobilenet/*');

    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 mobilenet_inference_test y, luego, expande el nodo Modelos.

  3. Haz clic en el modelo mobilenet.

  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 feature_vector.

  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 inputs.

Ejecuta la inferencia

Ejecuta la inferencia en la tabla de objetos sample_images con el modelo mobilenet:

  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 `mobilenet_inference_test.mobilenet`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs
      FROM mobilenet_inference_test.sample_images)
    );

    Los resultados debería ser similar al siguiente:

    --------------------------------------------------------------------------------------------------------------
    | feature_vector         | uri                                                        | inputs               |
    -------------------------------------------------------------------------------------------------------------
    | 0.850297749042511      | gs://mybucket/flowers/dandelion/3844111216_742ea491a0.jpg  | 0.29019609093666077  |
    -------------------------------------------------------------------------------------------------------------
    | -0.27427938580513      |                                                            | 0.31372550129890442  |
    -------------------------                                                            ------------------------
    | -0.23189745843410492   |                                                            | 0.039215687662363052 |
    -------------------------                                                            ------------------------
    | -0.058292809873819351  |                                                            | 0.29985997080802917  |
    -------------------------------------------------------------------------------------------------------------
    

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.