使用 BigQuery、Cloud Run 和 Gemma 分析 GKE 上的数据


本教程演示了如何使用 BigQueryCloud RunGemma LLM 从大型数据集中得出洞见。在本教程中,您将一个示例应用部署到 Google Kubernetes Engine (GKE)。示例应用利用 BigQuery 进行数据存储和处理,利用 Cloud Run 处理请求,并利用 Gemma LLM 分析数据并根据传入的提示生成预测结果。

本教程适用于云平台管理员和架构师数据和 AI 专家机器学习工程师以及 MLOps (DevOps) 专业人员。在阅读本页面内容之前,请确保您熟悉 KubernetesJupyter 等记事本环境。

本教程的前提是,您必须先完成通过 Hugging Face TGI 使用 GKE 中的 GPU 应用 Gemma 开放模型教程。TGI 框架有助于简化模型服务流程。

为何选择 GKE 和 BigQuery

BigQuery 是一个平台即服务 (PaaS),它是一种全代管式无服务器数据仓库,可对 PB 级数据进行伸缩分析。有了 BigQuery,您就可以专心分析数据,从中发掘有意义的数据洞见,同时使用熟悉的 SQL 和内置机器学习。

通过 TGI 使用 GKE 中的 GPU,您可以部署 Gemma 语言模型,以自然语言分析和总结用户互动。随后,通过将 BigQuery 与 GKE 集成,您可以使用 BigQuery 高效处理海量数据集(例如 Google Analytics [分析]),并利用模型的自然语言理解功能生成有意义的洞见。

例如,作为数据科学家、分析师或电子商务公司中的业务决策者,您可能希望了解用户在您的网站或应用中的行为。这些数据洞见有助于您优化和个性化用户体验历程,并做出明智的业务决策,从而提高销售额。

在这种情况下,您可以从 BigQuery 中提取原始 Google Analytics 数据,将其馈送给 Gemma 模型,然后以自然语言接收网页访问摘要和数据洞见。Gemma 模型在可伸缩的基础架构上运行,并通过 GKE 提供 GPU 加速,可快速处理用户历程数据,识别模式和趋势。您可以通过数据分析找出热门的商品组合、发现结账流程中常见的流失点,以及突出显示为特定着陆页吸引流量的成功营销活动。

优势

此解决方案可简化工作流程,具有以下优势:

  • BigQuery 集成:使用 BigQuery 存储和处理大型数据集(例如本教程中的 Google Analytics 数据)。这样,您就可以查询和汇总模型分析所需的数据。
  • GPU 加速:在支持 GPU 的 GKE 集群上运行 Gemma 模型,以加快推理过程,生成预测的速度比基于 CPU 的处理器快得多。
  • 降低成本和缩短时间:使用开源的预训练 Gemma 语言模型,无需从头构建自定义模型,从而节省时间和资源。

目标

在本教程中,您将学习如何:

  1. 部署模型并将其公开:创建一个服务 YAML 文件,以定义用于访问 Gemma 模型的内部负载均衡器。
  2. 创建 BigQuery 远程函数:运行 Python 代码以定义一个远程函数,该函数会获取 Google Analytics 数据、为模型构造提示、使用负载均衡器向模型的端点发送请求,并返回模型的响应。
  3. 配置虚拟私有云 (VPC) 网络:设置 VPC 网络和 VPC 连接器,以便在 BigQuery 和 GKE 集群之间实现安全通信。这对于远程函数访问模型端点至关重要。
  4. 分析数据:使用 BigQuery DataFrame 分析数据,或使用 bq 命令行工具直接在 SQL 中分析数据。在 Colab Enterprise 笔记本中运行提供的代码段,以便:
    • 使用 SQL 从 BigQuery 查询 Google Analytics 数据。
    • 将远程函数应用于数据,以便从 Gemma 模型生成数据分析。
    • 显示结果。

架构

以下架构图显示了所涉及的组件及其交互方式:

数据分析架构

  • 使用 Colab Enterprise 笔记本执行 Python 代码。使用 Python 时,您可以使用 bigframes 库来简化 SQL 交互。
  • BigQuery 可用作大数据处理引擎,支持使用 SQL 与数据交互。
  • 远程函数会调用 Cloud Run 函数。系统会自动将数据路由到远程函数,在那里进行准备并发送到 GKE 进行推理。
  • 结果会发送回 BigQuery 并显示在表格中。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

请务必满足以下前提条件:

选择或创建项目

您可以使用现有项目,也可以为本教程创建一个新项目。

  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.

    Go to project selector

  3. Make sure 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.

    Go to project selector

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

启用 API

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.

Enable the APIs

设置 Cloud Shell

在本教程中,您将使用 Cloud Shell 运行 gcloudkubectl 命令。Cloud Shell 是一种 shell 环境,用于管理托管在 Google Cloud上的资源。它预安装有 Google Cloud CLIkubectl 命令行工具。

In the Google Cloud console, activate Cloud Shell.

Activate Cloud Shell

控制台下方的框架内会打开一个 Cloud Shell 会话。

在运行本教程中的命令之前,请确保将默认项目设置为您要在其中部署示例应用的项目 ID。如果尚未进行此项设置,请在 Cloud Shell 中运行以下命令:

gcloud config set project PROJECT_ID

PROJECT_ID 替换为您的项目 ID

授予 IAM 角色

确保您的用户账号和项目中的 Compute Engine 默认服务账号具有本教程所需的 Identity and Access Management (IAM) 角色

Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/aiplatform.colabEnterpriseAdmin, roles/run.invoker, roles/container.admin, roles/iam.serviceAccountAdmin, roles/logging.logWriter

gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
  • Replace PROJECT_ID with your project ID.
  • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

  • Replace ROLE with each individual role.

向您的 Compute Engine 默认服务账号授予角色。对以下每个 IAM 角色运行以下命令一次: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
  • PROJECT_ID 替换为您的项目 ID。
  • PROJECT_NUMBER 替换为您的项目编号,以构建项目的 Compute Engine 默认服务账号网域。例如 123456789012-compute@developer.gserviceaccount.com
  • ROLE 替换为每个角色。

提供 Gemma 模型

前往通过 Hugging Face TGI 使用 GKE 中的 GPU 应用 Gemma 开放模型教程,然后按照从开始使用 curl 与模型交互的说明操作,确保 Gemma 模型成功部署且您可以与其交互。

在本教程中,请部署 Gemma 2B-it 模型。

设置 VPC 网络

us-central1 区域创建或使用 VPC 网络,以便远程函数可以连接到 GKE 集群。在本教程中,请使用 Default VPC。

为确保您的 BigQuery 数据集、远程函数和底层 Cloud Run 函数部署在兼容的位置,VPC 网络必须与您的 BigQuery 远程函数位于同一区域。在本教程中,创建远程函数时设置 BigQuery DataFrames 选项时,您将 US 指定为数据集的位置,该位置默认为 Cloud Run 函数的 us-central1 区域。因此,请在 us-central1 区域中创建或使用 VPC。

创建负载均衡器

请按照以下说明在 GKE 集群中创建内部负载均衡器:

  1. 创建以下 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. 打开一个新的 Cloud Shell 终端,然后运行以下命令以应用清单:

    kubectl apply -f tgi-2b-lb-service.yaml
    
  3. 获取负载均衡器的 IP 地址。您可能需要等待 1-2 分钟才能提取此 IP 地址:

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

您将使用此 IP 地址与在负载均衡器后面运行的 gemma-server 应用进行通信。

创建连接器

您可以使用无服务器 VPC 访问通道连接器通过 VPC 网络发送和接收请求,而无需使用公共互联网。如需了解详情,请参阅无服务器 VPC 访问通道

在本教程中,您将使用新的专用子网创建连接器,以避免与 VPC 中的现有资源发生任何 IP 地址冲突。如需了解相关说明,请参阅创建连接器部分,然后按照创建连接器和新的子网部分的 gcloud 说明操作。

或者,如果您想使用现有子网,请按照使用现有子网创建连接器部分中的说明操作。

如需了解详情,请参阅连接器子网要求

创建笔记本

在本教程中,您将使用 Colab Enterprise 笔记本运行用于定义 BigQuery 远程函数和执行分析的所有代码。

如需使用 Google Cloud 控制台创建 Colab Enterprise 笔记本,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 Colab Enterprise Notebooks 页面:

    转到 Notebooks

  2. 区域菜单中,选择 us-central1。此区域就是您在本教程中创建所有服务时所用的区域。

  3. 文件旁边,点击创建笔记本

您的新笔记本会显示在我的笔记本标签页上。

如需在新的笔记本中运行代码,请为您要运行的每个命令或代码段在笔记本中插入一个新的代码单元。

创建 BigQuery 远程函数

定义 BigQuery 远程函数的方法之一是使用 bigframes 库。在本部分中,您将使用 bigframes 创建一个名为 process_incoming 的远程函数。此远程函数会将 Google Analytics 数据作为输入,构建提示,并将其发送到 Gemma 模型进行分析。

在您创建的 Colab Enterprise 笔记本中:

  1. 点击 + 代码以插入新的代码单元。
  2. 将以下代码复制到新的代码单元中:

    # 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(
      [str],
      str,
      dataset="ga_demo",
      name="ga_explain_example",
      bigquery_connection="bigframes-rf-conn",
      reuse=True,
      packages=["requests"],
      cloud_function_vpc_connector=VPC_CONNECTOR_NAME
    
    )
    def process_incoming(data):
      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}")
    
    

    替换以下内容:

    在本教程中,BigQuery 数据集的位置设置为 US,默认为 us-central1 区域。

  3. 点击 Run cell(运行单元)。

输出结果会显示函数名称,如下所示:

The function name is: PROJECT_ID.ga_demo.ga_explain_example

分析用户行为

在本部分中,您将通过以下两种方式之一使用 process_incoming 远程函数分析网站上的用户行为:

  • 使用 BigQuery DataFrames
  • 使用 bq 命令行工具直接在 SQL 中运行查询。

使用 BigQuery DataFrames

如需在您创建的 Colab Enterprise 笔记本中使用 BigQuery DataFrames 运行远程函数,请执行以下操作:

  1. 点击 + 代码以插入新的代码单元。
  2. 在新的代码单元中复制以下代码,然后点击 Run cell(运行单元格)。
# 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)

以下输出显示了查询的示例结果:

user_pseudo_id string_value event_timestamp reverse_event_number ga_history 结果
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...

使用 bq 命令行工具

或者,您也可以使用 bq 命令行工具直接使用 SQL 执行分析。

如需在您创建的 Colab Enterprise 笔记本中使用 bq 命令行工具运行远程函数,请执行以下操作:

  1. 点击 + 代码以插入新的代码单元。
  2. 在新的代码单元中,复制以下代码,并将 PROJECT_ID 替换为您的项目 ID。

    # 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. 点击 Run cell(运行单元)。

以下输出显示了查询的示例结果:

user_pseudo_id string_value event_timestamp reverse_event_number 结果
86037838.0267811614 https://shop.googlemerchandisestore.com/Google+Redesign/Apparel/Google+Dino+Game+Tee 1612128627715585 1 {"generated_text":"Answer:\n The most popular page was https://shop.googlemerchandisestore.com/Google+Redesign/Apparel/Google+Dino+Game+Tee\n The next most popular page was the page they came from.\n\n Explanation:\n\nThe provided data shows that the current user visited Google's merchandise store specifically for the product "Google Dino Game Tee." \n \n重要注意事项:\n\n* 数据解读:您无法断言"}
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"}

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请逐个删除资源。

  1. 删除 Colab Enterprise 笔记本
  2. 删除您的 Colab Enterprise 运行时
  3. 删除您的 BigQuery 函数。 确保您的服务账号具有 bigquery.routines.delete 权限。如需了解详情,请参阅 BigQuery 权限
  4. 删除 BigQuery 外部连接
  5. 删除 Cloud Run functions 函数
  6. 删除 GKE 集群
  7. 删除 VPC 连接器

后续步骤