Tutorial: Ejecutar inferencias en una tabla de objetos con un modelo de clasificación

En este tutorial se explica cómo crear una tabla de objetos basada en las imágenes de un conjunto de datos público y, a continuación, cómo ejecutar inferencias en esa tabla de objetos con el modelo ResNet 50.

Modelo ResNet 50

El modelo ResNet 50 analiza archivos de imagen 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 de la página de TensorFlow Hub del modelo.

La entrada del modelo ResNet 50 toma un tensor de DType = float32 con la forma [-1, 224, 224, 3]. El resultado es una matriz de tensores de tf.float32 con la forma [-1, 1024].

Permisos obligatorios

  • 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 conceder 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 segmento, 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 la inferencia, necesitas los siguientes permisos:

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

Costes

En este documento, se utilizan 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 costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

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

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

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

Antes de empezar

  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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Connection API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Crear 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, a continuación, crear una asignación de reserva que use el tipo de tarea QUERY.

    Crear conjunto de datos

    Crea un conjunto de datos llamado resnet_inference_test:

    SQL

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

      CREATE SCHEMA `PROJECT_ID.resnet_inference_test`;

      Sustituye PROJECT_ID por el ID del proyecto.

    bq

    1. En la Google Cloud consola, 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

      Sustituye PROJECT_ID por el ID del proyecto.

    Crear una conexión

    Crea una conexión llamada lake-connection:

    Consola

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel Explorador, haz clic en Añadir datos.

      Se abrirá el cuadro de diálogo Añadir datos.

    3. En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Bases de datos.

      También puede introducir Vertex AI en el campo Buscar fuentes de datos.

    4. En la sección Fuentes de datos destacadas, haga clic en Vertex AI.

    5. Haz clic en la tarjeta de solución Modelos de Vertex AI: federación de BigQuery.

    6. En la lista Tipo de conexión, selecciona Modelos remotos, funciones remotas y BigLake (recurso de Cloud) de Vertex AI.

    7. En el campo Connection ID (ID de conexión), escribe lake-connection.

    8. Haga clic en Crear conexión.

    9. 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. Necesitas esta información para conceder 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 obtener información sobre la conexión:

      bq show --connection us.lake-connection
      
    3. En la columna properties, copie el valor de la propiedad serviceAccountId y guárdelo en algún lugar. Necesitas esta información para conceder permisos a la cuenta de servicio de la conexión.

    Crea un segmento de Cloud Storage

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

    Conceder permisos a la cuenta de servicio de la conexión

    Consola

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

      Ir a IAM y administración

    2. Haz clic en Conceder acceso.

      Se abrirá el cuadro de diálogo Añadir principales.

    3. En el campo Nuevos principales, introduce el ID de la cuenta de servicio que has copiado anteriormente.

    4. En el campo Selecciona un rol, elige Cloud Storage y, a continuación, Visor de objetos de Storage.

    5. Haz clic en Guardar.

    gcloud

    En Cloud Shell, ejecuta el gcloud storage buckets add-iam-policy-bindingcomando:

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

    Sustituye MEMBER por el ID de la cuenta de servicio que has copiado antes. Sustituye BUCKET_NAME por el nombre del segmento que has creado anteriormente.

    Para obtener más información, consulta Añadir un principal a una política a nivel de segmento.

    Crear una tabla de objetos

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

    SQL

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel Editor, ejecuta la siguiente instrucción 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 en tu máquina local. De esta forma, obtendrás un archivo saved_model.pb y una carpeta variables para el modelo.
    2. Sube el archivo saved_model.pb y la carpeta variables al segmento que has creado anteriormente.

    Cargar el modelo en BigQuery ML

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

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

      Sustituye BUCKET_NAME por el nombre del bucket que has creado anteriormente.

    Inspeccionar el modelo

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

    1. Ve a la página BigQuery.

      Ir a BigQuery

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

    3. Haz clic en el modelo resnet.

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

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

    6. Consulte la sección Funciones. Identifica los campos que se deben introducir en el modelo. Se hace referencia a ellos en la instrucción SELECT de la función ML.DECODE_IMAGE. En este caso, el valor del nombre del campo es input_1.

    Ejecutar inferencia

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

    1. Ve a la página BigQuery.

      Ir a BigQuery

    2. En el panel Editor, ejecuta la siguiente instrucción 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ían ser similares a los siguientes:

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

    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.