Analiza imágenes con un modelo de visión de Gemini

En este instructivo, se muestra cómo crear un modelo remoto de BigQuery ML que se base en el modelo gemini-1.0-pro-vision de Vertex AI y, luego, usar ese modelo con la función ML.GENERATE_TEXT para analizar un conjunto de imágenes de pósteres de películas.

En este instructivo, se abarcan las siguientes tareas:

  • Crear una tabla de objetos de BigQuery sobre datos de imágenes en un bucket de Cloud Storage.
  • Crear un modelo remoto de BigQuery ML que se oriente al modelo gemini-1.0-pro-vision de Vertex AI (vista previa).
  • Usar el modelo remoto con la función ML.GENERATE_TEXT para identificar las películas asociadas con un conjunto de pósteres de películas.

Los datos de pósteres de películas están disponibles en el bucket de Cloud Storage público gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters.

Roles obligatorios

  • Para crear una conexión, necesitas el rol de administrador de conexión de BigQuery (roles/bigquery.connectionAdmin).

  • Para otorgar permisos a la cuenta de servicio de la conexión, necesitas el rol de Administrador de IAM del proyecto (roles/resourcemanager.projectIamAdmin).

  • Para crear conjuntos de datos, modelos y tablas, necesitas el rol de editor de datos de BigQuery (roles/bigquery.dataEditor).

  • Para ejecutar trabajos de BigQuery, necesitas el rol Usuario de BigQuery (roles/bigquery.user).

Costos

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

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI model that is represented by the BigQuery remote model.

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 BigQuery, consulta Precios de BigQuery en la documentación de BigQuery.

Para obtener más información sobre los precios de IA generativa de Vertex AI, consulta la página Precios de Vertex AI.

Antes de comenzar

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

    Go to project selector

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

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Crea un conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de AA:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haz clic en Ver acciones > Crear conjunto de datos.

    Crea un conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, ingresa bqml_tutorial.

    • En Tipo de ubicación, selecciona Multirregión y, luego, EE.UU. (varias regiones en Estados Unidos).

      Los conjuntos de datos públicos se almacenan en la multirregión US. Para que sea más simple, almacena tu conjunto de datos en la misma ubicación.

    • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos.

      Página Crear un conjunto de datos

Crear una conexión

Crea una conexión de recurso de Cloud y obtén la cuenta de servicio de la conexión.

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. Para crear una conexión, haz clic en Agregar y, luego, en Conexiones a fuentes de datos externas.

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

  4. En el campo ID de conexión, escribe tutorial.

  5. Haz clic en Crear conexión.

  6. Haz clic en Ir a la conexión.

  7. Copia el ID de la cuenta de servicio del panel Información de conexión para usarlo en un paso posterior.

bq

  1. En un entorno de línea de comandos, crea una conexión:

    bq mk --connection --location=us --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE tutorial

    El parámetro --project_id anula el proyecto predeterminado.

    Reemplaza PROJECT_ID con tu ID del proyecto de Google Cloud.

    Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.

    Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:

    bq show --connection PROJECT_ID.us.tutorial

    El resultado es similar a este:

    name                properties
    1234.us.tutorial    {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

Agrega la siguiente sección a tu archivo main.tf.

 ## This creates a Cloud Resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "tutorial"
    project = "PROJECT_ID"
    location = "us"
    cloud_resource {}
}        

Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

Otorga permisos a la cuenta de servicio de las conexiones

Otorga a la cuenta de servicio de la conexión los roles adecuados para acceder a los servicios de Cloud Storage y Vertex AI. Debes otorgar estos roles en el mismo proyecto que creaste o seleccionaste en la sección Antes de comenzar. Si otorgas los roles en un proyecto diferente, se produce el error bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource.

Para otorgar los roles adecuados, sigue estos pasos:

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

    Ir a IAM y administración

  2. Haz clic en Otorgar acceso.

  3. En el campo Principales nuevas, escribe el ID de la cuenta de servicio que copiaste antes.

  4. En el campo Selecciona un rol, elige Vertex AI y, luego, selecciona Usuario de Vertex AI.

  5. Haz clic en Agregar otro rol.

  6. En el campo Elige un rol, elige Cloud Storage y, luego,Visualizador de objetos de Storage.

  7. Haz clic en Guardar.

Crea la tabla de objetos

Crea una tabla de objetos sobre las imágenes de pósteres de películas en el bucket público de Cloud Storage. La tabla de objetos permite analizar las imágenes sin transferirlas desde Cloud Storage.

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta para crear la tabla de objetos:

    CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.movie_posters`
      WITH CONNECTION `us.tutorial`
      OPTIONS (
        object_metadata = 'SIMPLE',
        uris =
          ['gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters/*']);

Crea el modelo remoto

Crea un modelo remoto que represente un modelo gemini-1.0-pro-vision de Vertex AI:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta para crear el modelo remoto:

    CREATE OR REPLACE MODEL `bqml_tutorial.gemini-pro-vision`
      REMOTE WITH CONNECTION `us.tutorial`
      OPTIONS (ENDPOINT = 'gemini-pro-vision');

    La consulta tarda varios segundos en completarse, después de eso, el modelo gemini-pro-vision aparece en el conjunto de datos bqml_tutorial en el panel Explorador. Debido a que la consulta usa una declaración CREATE MODEL para crear un modelo, no hay resultados de consultas.

Analiza los pósteres de películas

Usa el modelo remoto para analizar los pósteres de películas y determinar qué película representa cada uno de ellos. Luego, escribe estos datos en una tabla.

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta para analizar las imágenes de pósteres de películas:

    CREATE OR REPLACE TABLE
      `bqml_tutorial.movie_posters_results` AS (
      SELECT
        uri,
        ml_generate_text_llm_result
      FROM
        ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini-pro-vision`,
          TABLE `bqml_tutorial.movie_posters`,
          STRUCT( 0.2 AS temperature,
            'For the movie represented by this poster, what is the movie title and year of release? Answer in JSON format with two keys: title, year. title should be string, year should be integer.' AS PROMPT,
            TRUE AS FLATTEN_JSON_OUTPUT)));
        
  3. En el editor de consultas, ejecuta la siguiente declaración para ver los datos de la tabla:

    SELECT * FROM `bqml_tutorial.movie_posters_results`;

    El resultado es similar al siguiente:

    +--------------------------------------------+----------------------------------+
    | uri                                        | ml_generate_text_llm_result      |
    +--------------------------------------------+----------------------------------+
    | gs://cloud-samples-data/vertex-ai/dataset- | ```json                          |
    | management/datasets/classic-movie-         | {                                |
    | posters/little_annie_rooney.jpg            |  "title": "Little Annie Rooney", |
    |                                            |  "year": 1912                    |
    |                                            | }                                |
    |                                            | ```                              |
    +--------------------------------------------+----------------------------------+
    | gs://cloud-samples-data/vertex-ai/dataset- | ```json                          |
    | management/datasets/classic-movie-         | {                                |
    | posters/mighty_like_a_mouse.jpg            |  "title": "Mighty Like a Moose", |
    |                                            |  "year": 1926                    |
    |                                            | }                                |
    |                                            | ```                              |
    +--------------------------------------------+----------------------------------+
    | gs://cloud-samples-data/vertex-ai/dataset- | ```json                          |
    | management/datasets/classic-movie-         | {                                |
    | posters/brown_of_harvard.jpeg              |  "title": "Brown of Harvard",    |
    |                                            |  "year": 1926                    |
    |                                            | }                                |
    |                                            | ```                              |
    +--------------------------------------------+----------------------------------+
    

Da formato a la salida del modelo

Da formato a los datos de análisis de películas que muestra el modelo para hacer que el título de la película y los datos de años sean más legibles.

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, ejecuta la siguiente consulta para dar formato a los datos:

    CREATE OR REPLACE TABLE
      `bqml_tutorial.movie_posters_results_formatted` AS (
      SELECT
        uri,
        JSON_QUERY(RTRIM(LTRIM(results.ml_generate_text_llm_result, " ```json"), "```"), "$.title") AS title,
        JSON_QUERY(RTRIM(LTRIM(results.ml_generate_text_llm_result, " ```json"), "```"), "$.year") AS year
      FROM
        `bqml_tutorial.movie_posters_results` results );
  3. En el editor de consultas, ejecuta la siguiente declaración para ver los datos de la tabla:

    SELECT * FROM `bqml_tutorial.movie_posters_results_formatted`;

    El resultado es similar al siguiente:

    +--------------------------------------------+----------------------------+------+
    | uri                                        | title                      | year |
    +--------------------------------------------+----------------------------+------+
    | gs://cloud-samples-data/vertex-ai/dataset- | "Barque sortant du port"   | 1895 |
    | management/datasets/classic-movie-         |                            |      |
    | posters/barque_sortant_du_port.jpeg        |                            |      |
    +--------------------------------------------+----------------------------+------+
    | gs://cloud-samples-data/vertex-ai/dataset- | "The Great Train Robbery"  | 1903 |
    | management/datasets/classic-movie-         |                            |      |
    | posters/the_great_train_robbery.jpg        |                            |      |
    +--------------------------------------------+----------------------------+------+
    | gs://cloud-samples-data/vertex-ai/dataset- | "Little Annie Rooney"      | 1912 |
    | management/datasets/classic-movie-         |                            |      |
    | posters/little_annie_rooney.jpg            |                            |      |
    +--------------------------------------------+----------------------------+------+
    

Limpia

  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.