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 y de código abierto, lo que elimina la necesidad de crear un modelo personalizado desde cero.

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 implementan 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 nueva 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 nueva 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 nueva 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"}