Analizar datos en GKE con BigQuery, Cloud Run y Gemma


En este tutorial se muestra cómo obtener información valiosa a partir de grandes conjuntos de datos mediante BigQuery, Cloud Run y el LLM de Gemma. En este tutorial, desplegarás una aplicación de ejemplo en Google Kubernetes Engine (GKE). La aplicación de ejemplo usa BigQuery para almacenar y procesar datos, Cloud Run para gestionar solicitudes y el LLM Gemma para analizar datos y generar predicciones basadas en las peticiones entrantes.

Este tutorial está dirigido a administradores y arquitectos de plataformas en la nube, especialistas en datos e IA, ingenieros de aprendizaje automático y profesionales de MLOps (DevOps). Antes de leer esta página, asegúrate de que conoces Kubernetes y un entorno de cuaderno como Jupyter.

Antes de empezar este tutorial, debes completar el tutorial Servir modelos abiertos de Gemma con GPUs en GKE mediante Hugging Face TGI. El framework TGI facilita el proceso de servicio de modelos.

Ventajas de GKE y BigQuery

BigQuery es una plataforma como servicio (PaaS), un almacén de datos sin servidor totalmente gestionado que permite realizar análisis escalables de petabytes de datos. BigQuery te permite centrarte en analizar datos para obtener información valiosa mientras usas SQL y aprendizaje automático integrados.

Si usas GPUs en GKE con TGI, puedes desplegar un modelo de lenguaje Gemma para analizar y resumir las interacciones de los usuarios en lenguaje natural. Después, al integrar BigQuery con GKE, puedes usar BigQuery para gestionar de forma eficiente conjuntos de datos de gran tamaño (como Google Analytics) y las funciones de comprensión del lenguaje natural del modelo para generar estadísticas valiosas.

Por ejemplo, si eres científico o analista de datos, o bien una persona que toma decisiones empresariales en una empresa de comercio electrónico, puede que quieras conocer el comportamiento de los usuarios en tu sitio web o aplicación. Esta información puede ayudarte a optimizar y personalizar los recorridos de los usuarios, así como a tomar decisiones empresariales fundamentadas para aumentar las ventas.

En este caso, podrías tomar datos sin procesar de Google Analytics de BigQuery, proporcionárselos al modelo Gemma y recibir resúmenes e información valiosa sobre las visitas a las páginas en lenguaje natural. El modelo de Gemma, que se ejecuta en una infraestructura escalable con aceleración de GPU de GKE, procesa rápidamente los datos del recorrido del usuario, identificando patrones y tendencias. Podrías obtener información valiosa para identificar combinaciones de productos populares, descubrir los puntos de abandono habituales en el proceso de compra y destacar las campañas de marketing eficaces que dirigen tráfico a páginas de destino específicas.

Ventajas

Esta solución ofrece un flujo de trabajo optimizado con las siguientes ventajas:

  • Integración con BigQuery: usa BigQuery para almacenar y procesar grandes conjuntos de datos (como los datos de Google Analytics de este tutorial). Esto le permite consultar y agregar los datos necesarios para el análisis del modelo.
  • Aceleración de GPU: ejecuta el modelo Gemma en un clúster de GKE con compatibilidad con GPU para acelerar el proceso de inferencia y generar predicciones mucho más rápido que con los procesadores basados en CPU.
  • Reducción de costes y tiempo: ahorra tiempo y recursos usando el modelo de lenguaje Gemma preentrenado de código abierto, lo que elimina la necesidad de crear un modelo personalizado desde cero.

Objetivos

En este tutorial, aprenderás a hacer lo siguiente:

  1. Implementa el modelo y exponlo: crea un archivo YAML de servicio para definir un balanceador de carga interno que permita acceder al modelo Gemma.
  2. Crea una función remota de BigQuery: ejecuta código de Python para definir una función remota que tome datos de Google Analytics, cree peticiones para el modelo, envíe solicitudes al endpoint del modelo mediante el balanceador de carga y devuelva la respuesta del modelo.
  3. Configura la red de nube privada virtual (VPC): configura una red de VPC y un conector de VPC para habilitar la comunicación segura entre BigQuery y el clúster de GKE. Esto es fundamental para que la función remota acceda al endpoint del modelo.
  4. Analizar datos: analiza los datos con DataFrames de BigQuery o directamente en SQL mediante la herramienta de línea de comandos bq. Ejecuta los fragmentos de código proporcionados en un cuaderno de Colab Enterprise para:
    • Consultar datos de Google Analytics de BigQuery con SQL.
    • Aplica la función remota a los datos para generar estadísticas a partir del modelo de Gemma.
    • Muestra los resultados.

Arquitectura

En el siguiente diagrama de arquitectura se muestran los componentes implicados y cómo interactúan:

Arquitectura de análisis de datos

  • Usa un cuaderno de Colab Enterprise para ejecutar tu código Python. Con Python, puedes usar la biblioteca bigframes para simplificar tus interacciones con SQL.
  • BigQuery actúa como motor de procesamiento de Big Data, lo que permite usar SQL para interactuar con los datos.
  • La función remota invoca una función de Cloud Run. Los datos se enrutan automáticamente a la función remota, donde se preparan y se envían a GKE para la inferencia.
  • Los resultados se envían de nuevo a BigQuery y se muestran en una tabla.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

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.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

Asegúrate de cumplir los siguientes requisitos previos:

Seleccionar o crear un proyecto

Puedes usar un proyecto que ya tengas o crear uno para este tutorial.

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

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

  6. Habilitar las APIs

    Enable the Artifact Registry, Compute Engine, GKE, IAM Service Account Credentials, Cloud Functions, Cloud Build, Cloud Run Admin, Cloud Logging, Serverless VPC Access, BigQuery, Dataform, Vertex AI 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

    Configurar Cloud Shell

    En este tutorial, usarás Cloud Shell para ejecutar comandos gcloud y kubectl. Cloud Shell es un entorno de shell para gestionar recursos alojados en Google Cloud. Viene preinstalado con la CLI de Google Cloud y la herramienta de línea de comandos kubectl.

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    Se abrirá una sesión de Cloud Shell en un marco de la parte inferior de la consola.

    Antes de ejecutar los comandos de este tutorial, asegúrate de que el proyecto predeterminado sea el ID del proyecto en el que quieras desplegar la aplicación de ejemplo. Si aún no lo has hecho, ejecuta el siguiente comando en Cloud Shell:

    gcloud config set project PROJECT_ID
    

    Sustituye PROJECT_ID por el ID de tu proyecto.

    Otorgar roles de gestión de identidades y accesos

    Asegúrate de que tu cuenta de usuario y la cuenta de servicio predeterminada de Compute Engine de tu proyecto tengan los roles de gestión de identidades y accesos (IAM) necesarios para este tutorial.

    Make sure that you have the following role or roles on the project: roles/aiplatform.colabEnterpriseAdmin, roles/run.invoker, roles/container.admin, roles/iam.serviceAccountAdmin, roles/logging.logWriter

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Conceder acceso.
    4. En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, se trata de la dirección de correo de una cuenta de Google.

    5. En la lista Selecciona un rol, elige un rol.
    6. Para conceder más roles, haz clic en Añadir otro rol y añade cada rol adicional.
    7. Haz clic en Guardar.
    8. Concede roles a tu cuenta de servicio predeterminada de Compute Engine. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de gestión de identidades y accesos: roles/logging.logWriter, roles/artifactregistry.writer, roles/storage.objectViewer

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=ROLE
      
      • Sustituye PROJECT_ID por el ID del proyecto.
      • Sustituye PROJECT_NUMBER por el número de tu proyecto para crear el dominio de la cuenta de servicio predeterminada de Compute Engine de tu proyecto. Por ejemplo, 123456789012-compute@developer.gserviceaccount.com.
      • Sustituye ROLE por cada rol individual.

      Servir un modelo de Gemma

      Ve al tutorial Servir modelos abiertos de Gemma con GPUs en GKE con Hugging Face TGI y sigue las instrucciones desde Antes de empezar hasta Interactuar con el modelo mediante curl para asegurarte de que tu modelo de Gemma se ha desplegado correctamente y puedes interactuar con él.

      En este tutorial, vamos a desplegar el modelo Gemma 2B-it.

      Configurar una red de VPC

      Crea o usa la red de VPC en la región us-central1 para que tu función remota pueda conectarse al clúster de GKE. En este tutorial, usa la VPC Default.

      Para asegurarte de que tu conjunto de datos de BigQuery, tu función remota y las funciones de Cloud Run subyacentes se implementen en ubicaciones compatibles, la red VPC debe estar en la misma región que tu función remota de BigQuery. En este tutorial, cuando configures las opciones de DataFrame de BigQuery al crear una función remota, especificarás US como ubicación de tu conjunto de datos, que tiene como valor predeterminado la región us-central1 de tus funciones de Cloud Run. Por lo tanto, crea o usa la VPC en la región us-central1.

      Crear un balanceador de carga

      Sigue estas instrucciones para crear un balanceador de carga interno en tu clúster de GKE:

      1. Crea el siguiente archivo de manifiesto tgi-2b-lb-service.yaml:

        apiVersion: v1
        kind: Service
        metadata:
        name: llm-lb-service
        annotations:
            networking.gke.io/load-balancer-type: "Internal"
        spec:
        selector:
          app: gemma-server
        type: LoadBalancer
        ports:
        - protocol: TCP
          port: 8000
          targetPort: 8000
        
      2. Abre un nuevo terminal de Cloud Shell y ejecuta el siguiente comando para aplicar el manifiesto:

        kubectl apply -f tgi-2b-lb-service.yaml
        
      3. Obtén la dirección IP del balanceador de carga. Es posible que tengas que esperar entre 1 y 2 minutos para que se pueda obtener esta dirección IP:

        kubectl get service llm-lb-service --output yaml | grep ip:
        

      Usarás esta dirección IP para comunicarte con tu aplicación gemma-server, que se ejecuta detrás del balanceador de carga.

      Crear conector

      Puedes usar un conector de acceso a VPC sin servidor para enviar y recibir solicitudes a través de tu red de VPC sin usar la red de Internet pública. Para obtener más información, consulta Acceso a VPC sin servidor.

      En este tutorial, crearás un conector con una subred nueva y específica para evitar conflictos de direcciones IP con los recursos de la VPC. Para obtener instrucciones, consulta la sección Crear un conector y sigue las instrucciones de gcloud para la sección Crear un conector y una subred.

      Si quieres usar una subred que ya tengas, sigue las instrucciones de la sección Crear un conector con una subred que ya tengas.

      Para obtener más información, consulta los requisitos de la subred del conector.

      Crear un cuaderno

      En este tutorial, usarás un cuaderno de Colab Enterprise para ejecutar todo el código necesario para definir la función remota de BigQuery y realizar el análisis.

      Para crear un cuaderno de Colab Enterprise con la Google Cloud consola, sigue estos pasos:

      1. En la consola, ve a la página Notebooks de Colab Enterprise: Google Cloud

        Ir a Cuadernos

      2. En el menú Región, selecciona us-central1. Es la misma región en la que crearás todos los servicios de este tutorial.

      3. Junto a Archivos, haz clic en Crear cuaderno.

      El nuevo cuaderno aparecerá en la pestaña Mis cuadernos.

      Para ejecutar código en tu nuevo cuaderno, inserta una celda de código nueva en el cuaderno por cada comando o fragmento de código que quieras ejecutar.

      Crear una función remota de BigQuery

      Una de las formas de definir una función remota de BigQuery es usar la biblioteca bigframes. En esta sección, usa bigframes para crear una función remota llamada process_incoming. Esta función remota toma datos de Google Analytics como entrada, crea una petición y la envía a tu modelo de Gemma para que la analice.

      En el cuaderno de Colab Enterprise que has creado, haz lo siguiente:

      1. Haz clic en + Código para insertar una celda de código.
      2. Copia el siguiente código en la nueva celda de código:

        # Install the necessary packages on the notebook runtime
        %pip install --upgrade bigframes --quiet
        
        import bigframes.pandas as bpd
        import os
        import ast
        import requests
        
        # Replace the following  variables
        # Use the format ip:port
        # For example, "10.128.05:8000"
        lb_url = "LOADBALANCER_IP_ADDRESS:8000"
        
        # Set BigQuery DataFrames options
        bpd.options.bigquery.project = "PROJECT_ID"
        bpd.options.bigquery.location = "US"
        # Update the VPC connector name with the one you created
        vpc_connector_name = "VPC_CONNECTOR_NAME"
        
        # Create a remote function using bigframes
        # https://cloud.google.com/bigquery/docs/remote-functions#bigquery-dataframes
        
        @bpd.remote_function(
          dataset="ga_demo",
          name="ga_explain_example",
          bigquery_connection="bigframes-rf-conn",
          reuse=True,
          packages=["requests"],
          cloud_function_vpc_connector=VPC_CONNECTOR_NAME,
          cloud_function_service_account="default",
        )
        def process_incoming(data: str) -> str:
          ga_data = ast.literal_eval(data)
          USER_PROMPT = """
              'The following are the results from Google Analytics.
              They are reverse ranked.
              reverse_event_number 1 is the last page visited.
              reverse_event_number 2 is the second last page visited.
              You are given the following data.
              {}
              Can you summarize what was the most popular page people landed on and what page they came from?
          """.format(ga_data)
        
          url = 'http://{}/generate'.format(lb_url)
        
          myobj = {
              "inputs": USER_PROMPT,
              "temperature": 0.90,
              "top_p": 0.95,
              "max_tokens": 2048
          }
          x = requests.post(url, json=myobj)
          result = x.text
          return (result)
        
        function_name = process_incoming.bigframes_remote_function
        print (f"The function name is: {function_name}")
        
        

        Haz los cambios siguientes:

        En este tutorial, la ubicación del conjunto de datos de BigQuery es US, que tiene como valor predeterminado la región us-central1.

      3. Haz clic en Ejecutar celda.

      La salida muestra el nombre de la función, que es similar al siguiente:

      The function name is: PROJECT_ID.ga_demo.ga_explain_example
      

      Analizar el comportamiento de los usuarios

      En esta sección, analizará el comportamiento de los usuarios en su sitio web mediante la función process_incoming remota de una de las dos formas siguientes:

      • Usar BigQuery DataFrames
      • Usar la herramienta de línea de comandos bq para ejecutar una consulta directamente en SQL.

      Usar BigQuery DataFrames

      Para ejecutar la función remota con BigQuery DataFrames en el cuaderno de Colab Enterprise que has creado, sigue estos pasos:

      1. Haz clic en + Código para insertar una celda de código.
      2. Copia el siguiente código en la nueva celda de código y haz clic en Ejecutar celda.
      # Generate a list of all matchups and their histories as a JSON
      
      grouping_sql = """
      with
      data_table as (
       SELECT
       distinct
         user_pseudo_id,
         events.value.string_value,
         event_timestamp,
         rank() over (partition by user_pseudo_id order by event_timestamp desc) as reverse_event_number
       FROM
         `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131` as events20210131,
         unnest (events20210131.event_params) as events
       where events.key = 'page_location'
       qualify reverse_event_number < 3
      )
      select
      *,TO_JSON_STRING (data_table) as ga_history
      from data_table
      limit 10;
      
      """
      
      ga_df = bpd.read_gbq(grouping_sql)
      post_processed = ga_df.assign(results=ga_df['ga_history'].apply(process_incoming),axis=1)
      post_processed.head(10)
      
      

      En el siguiente resultado se muestran los resultados de ejemplo de la consulta:

      user_pseudo_id string_value event_timestamp reverse_event_number ga_history resultados eje
      0 2342103247.0307162928 https://shop.googlemerchandisestore.com/Google... 1612096237169825 2 {"user_pseudo_id":"2342103247.0307162928","str... {"generated_text":"\n 'The following are...
      1 48976087.6959390698 https://www.googlemerchandisestore.com/ 1612056537823270 2 {"user_pseudo_id":"48976087.6959390698","strin... {"generated_text":"\n \n ```python\n imp...

      Usar la herramienta de línea de comandos bq

      También puedes usar la herramienta de línea de comandos bq para hacer análisis directamente con SQL.

      Para ejecutar la función remota con la herramienta de línea de comandos bq en el cuaderno de Colab Enterprise que has creado, sigue estos pasos:

      1. Haz clic en + Código para insertar una celda de código.
      2. Copia el siguiente código en la nueva celda de código y sustituye PROJECT_ID por el ID de tu proyecto.

        # Update with your PROJECT_ID
        
        function_name = 'PROJECT_ID.ga_demo.ga_explain_example'
        
        new_sql = """'with \
        data_table as ( \
        SELECT \
        distinct \
          user_pseudo_id, \
          events.value.string_value, \
          event_timestamp, \
          rank() over (partition by user_pseudo_id order by event_timestamp desc) as reverse_event_number \
        FROM \
          `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131` as events20210131, \
          unnest (events20210131.event_params) as events \
        where events.key = "page_location" \
        qualify reverse_event_number < 3 \
        ) \
        select \
        *, `{}`(TO_JSON_STRING (data_table)) as result \
        from data_table \
        limit 10;' \
        """.format(function_name)
        
        # Run query using bq cli directly in a notebook cell
        
        !bq query --use_legacy_sql=false \
        {new_sql}
        
      3. Haz clic en Ejecutar celda.

      En el siguiente resultado se muestran los resultados de ejemplo de la consulta:

      user_pseudo_id string_value event_timestamp reverse_event_number result
      86037838.0267811614 https://shop.googlemerchandisestore.com/Google+Redesign/Apparel/Google+Dino+Game+Tee 1612128627715585 1 {"generated_text":"Respuesta:\n La página más popular fue https://shop.googlemerchandisestore.com/Google+Redesign/Apparel/Google+Dino+Game+Tee\n La siguiente página más popular fue la página de la que procedía.\n\n Explicación:\n\nLos datos proporcionados muestran que el usuario actual visitó la tienda de merchandising de Google específicamente para ver el producto "Google Dino Game Tee". \n \nConsideraciones importantes:\n\n* Interpretación de los datos: no puedes afirmar con certeza que el"}
      4024190.3037653934 https://shop.googlemerchandisestore.com/Google+Redesign/Apparel/Google+Black+Cloud+Zip+Hoodie 1612085948486438 1 {"generated_text":"\n ```python\n import pandas as pd\n\n data = {'user_pseudo_id': ['4024190.3037653934', '4024190.3037653934', '4024190.3037653934'],\n 'string_value': ['https://shop.googlemerchandisestore.com"}

      Limpieza

      Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

      Para evitar que se apliquen cargos en tu Google Cloud cuenta por los recursos utilizados en este tutorial, elimina los recursos.

      1. Elimina tu cuaderno de Colab Enterprise.
      2. Elimina tu entorno de ejecución de Colab Enterprise.
      3. Elimina tu función de BigQuery. Asegúrate de que tu cuenta de servicio tenga el permiso bigquery.routines.delete. Para obtener más información, consulta Permisos de BigQuery.
      4. Elimine su conexión externa de BigQuery.
      5. Elimina tus funciones de Cloud Run.
      6. Elimina el clúster de GKE.
      7. Elimina tu conector de VPC.

      Siguientes pasos