Analiza datos en GKE con BigQuery, Cloud Run y Gemma

En este instructivo, se muestra cómo obtener estadísticas a partir de conjuntos de datos grandes con BigQuery, Cloud Run y el LLM de Gemma. En este instructivo, implementarás una aplicación de ejemplo en Google Kubernetes Engine (GKE). La app de ejemplo aprovecha BigQuery para el almacenamiento y procesamiento de datos, Cloud Run para el control de solicitudes y el LLM de Gemma para analizar datos y generar predicciones basadas en instrucciones entrantes.

Este instructivo está dirigido a administradores y arquitectos de plataformas de nube, especialistas en datos y en IA, ingenieros de AA y profesionales de MLOps (DevOps). Antes de leer esta página, asegúrate de estar familiarizado con Kubernetes y un entorno de notebook como Jupyter.

Como requisito previo para este instructivo, debes completar el instructivo Entrega modelos abiertos de Gemma con GPUs en GKE con Hugging Face TGI. El framework de TGI facilita el proceso de entrega del modelo.

Por qué usar GKE y BigQuery

BigQuery es una plataforma como servicio (PaaS), un almacén de datos sin servidores completamente administrado que permite el análisis escalable de petabytes de datos. BigQuery te permite enfocarte en el análisis de datos para encontrar estadísticas valiosas mientras usas SQL conocido y aprendizaje automático integrado.

Con las GPUs en GKE con TGI, puedes implementar un modelo de lenguaje de Gemma para analizar y resumir las interacciones del usuario en lenguaje natural. Luego, al integrar BigQuery con GKE, puedes usar BigQuery para controlar de manera eficiente conjuntos de datos masivos (como Google Analytics) y las capacidades de comprensión del lenguaje natural del modelo para generar estadísticas significativas.

Por ejemplo, como científico o analista de datos, o como responsable de la toma de decisiones comerciales en una empresa de comercio electrónico, es posible que desees comprender 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, y a tomar decisiones comerciales fundamentadas para aumentar las ventas.

En esta situación, podrías tomar los datos sin procesar de Google Analytics de BigQuery, proporcionárselos al modelo de Gemma y recibir resúmenes y estadísticas de visitas a la página en lenguaje natural. El modelo Gemma, que se ejecuta en una infraestructura escalable con aceleración de GPU de GKE, procesa rápidamente los datos del recorrido del usuario y, luego, identifica patrones y tendencias. Podrías obtener estadísticas para identificar combinaciones de productos populares, revelar puntos de abandono comunes en el proceso de confirmación de compra y destacar campañas de marketing exitosas que dirigen tráfico a páginas de destino específicas.

Beneficios

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

  • Integración de BigQuery: Usa BigQuery para almacenar y procesar grandes conjuntos de datos (como los datos de Google Analytics en este instructivo). Esto te permite consultar y agregar los datos necesarios para el análisis del modelo.
  • Aceleración por GPU: Ejecuta el modelo de 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 costos y tiempo: Ahorra tiempo y recursos usando el modelo de lenguaje Gemma de código abierto y previamente entrenado, lo que elimina la necesidad de crear un modelo personalizado desde cero.

Publica un modelo de Gemma

Ve al instructivo Entrega modelos abiertos de Gemma mediante GPUs en GKE con Hugging Face TGI y sigue las instrucciones desde Antes de comenzar hasta Interactúa con el modelo usando curl para asegurarte de que tu modelo de Gemma se implementó correctamente y puedas interactuar con él.

Para los fines de este instructivo, implementa el modelo Gemma 2B-it.

Configura la 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 instructivo, usa la VPC Default.

Para asegurarte de que tu conjunto de datos de BigQuery, tu función remota y las funciones subyacentes de Cloud Run se implementen en ubicaciones compatibles, la red de VPC debe estar en la misma región que tu función remota de BigQuery. En este instructivo, cuando configures las opciones de BigQuery DataFrames mientras creas una función remota, especificarás US como ubicación para tu conjunto de datos, que se establece de forma predeterminada en la región us-central1 para tus Cloud Run Functions. Por lo tanto, crea o usa la VPC en la región us-central1.

Crea un balanceador de cargas

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

  1. Crea el siguiente 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 una nueva 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 cargas. Es posible que debas esperar de 1 a 2 minutos antes de que se pueda recuperar 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 cargas.

Crear un conector

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

En este instructivo, crearás un conector con una subred nueva y dedicada para evitar cualquier conflicto de direcciones IP con los recursos existentes en la VPC. Para obtener instrucciones, consulta la sección Crea un conector y sigue las instrucciones de gcloud para la sección Crea un conector y una subred nuevos.

Como alternativa, si quieres usar una subred existente, sigue las instrucciones de la sección Crea un conector con una subred existente.

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

Crea un notebook

En este instructivo, usarás un notebook 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 notebook de Colab Enterprise con la Google Cloud consola, haz lo siguiente:

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

    Ir a Notebooks

  2. En el menú Región, selecciona us-central1. Esta es la misma región en la que crearás todos tus servicios en este instructivo.

  3. Junto a Archivos, haz clic en Crear un notebook.

El notebook nuevo aparece en la pestaña Mis notebooks.

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

Crea una función remota de BigQuery

Una de las formas en que puedes definir una función remota de BigQuery es con la biblioteca bigframes. En esta sección, usa bigframes para crear una función remota llamada process_incoming. Esta función remota toma los datos de Google Analytics como entrada, construye una instrucción y la envía a tu modelo de Gemma para su análisis.

En el notebook de Colab Enterprise que creaste, haz lo siguiente:

  1. Haz clic en + Código para insertar una celda de código nueva.
  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}")
    
    

    Reemplaza lo siguiente:

    En este instructivo, la ubicación de tu conjunto de datos de BigQuery se establece en US, que, de forma predeterminada, se establece en la región us-central1.

  3. Haz clic en Ejecutar celda.

El resultado muestra el nombre de la función de manera similar a la siguiente:

The function name is: PROJECT_ID.ga_demo.ga_explain_example

Analiza el comportamiento de los usuarios

En esta sección, analizarás el comportamiento de los usuarios en tu sitio web con la función remota process_incoming de una de las siguientes dos maneras:

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

Usa BigQuery DataFrames

Para ejecutar la función remota con BigQuery DataFrames en el notebook de Colab Enterprise que creaste, haz lo siguiente:

  1. Haz clic en + Código para insertar una celda de código nueva.
  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 muestra 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 'Los siguientes son…
1 48976087.6959390698 https://www.googlemerchandisestore.com/ 1612056537823270 2 {"user_pseudo_id":"48976087.6959390698","strin... {"generated_text":"\n \n ```python\n imp...

Usa la herramienta de línea de comandos de bq

Como alternativa, puedes usar la herramienta de línea de comandos de bq para realizar el análisis directamente con SQL.

Para ejecutar la función remota con la herramienta de línea de comandos bq en el notebook de Colab Enterprise que creaste, haz lo siguiente:

  1. Haz clic en + Código para insertar una celda de código nueva.
  2. Copia el siguiente código en la nueva celda de código y reemplaza 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 muestra de la consulta:

user_pseudo_id string_value event_timestamp reverse_event_number Resultado
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 desde la que llegó.\n\n Explicación:\n\nLos datos proporcionados muestran que el usuario actual visitó la tienda de artículos promocionales de Google específicamente para el producto "Google Dino Game Tee". \n \nConsideraciones importantes:\n\n* Interpretación de los datos: No puedes afirmar de manera definitiva que la"}
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"}