本教程演示了如何使用 BigQuery、Cloud Run 和 Gemma LLM 从大型数据集中发掘数据洞见。在本教程中,您将一个示例应用部署到 Google Kubernetes Engine (GKE)。该示例应用利用 BigQuery 进行数据存储和处理,利用 Cloud Run 进行请求处理,以及利用 Gemma LLM 来分析数据并根据传入的提示生成预测结果。
本教程适用于云平台管理员和架构师、数据和 AI 专家、机器学习工程师以及 MLOps (DevOps) 专业人员。在阅读本页面内容之前,请确保您熟悉 Kubernetes 和 Jupyter 等笔记本环境。
完成本教程之前,您必须先完成通过 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 语言模型,可节省时间和资源,无需从头开始构建自定义模型。
提供 Gemma 模型
请参阅通过 Hugging Face TGI 使用 GKE 中的 GPU 提供 Gemma 开放模型教程,并按照从准备工作到使用 curl 与模型互动的说明操作,确保 Gemma 模型已成功部署,并且您可以与其互动。
在本教程中,请部署 Gemma 2B-it 模型。
设置 VPC 网络
在 us-central1
区域中创建或使用 VPC 网络,以便远程函数可以连接到 GKE 集群。在本教程中,请使用 Default
VPC。
为确保您的 BigQuery 数据集、远程函数和底层 Cloud Run functions 部署在兼容的位置,VPC 网络必须与您的 BigQuery 远程函数位于同一区域。在本教程中,如果您在创建远程函数时设置 BigQuery DataFrames 选项,您会将 US
指定为数据集的位置,该位置默认为 Cloud Run functions 的 us-central1
区域。因此,请在 us-central1
区域中创建或使用 VPC。
创建负载均衡器
请按照以下说明在 GKE 集群中创建内部负载均衡器:
创建以下
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
打开新的 Cloud Shell 终端,然后运行以下命令来应用清单:
kubectl apply -f tgi-2b-lb-service.yaml
获取负载均衡器 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 笔记本,请执行以下操作:
在 Google Cloud 控制台中,前往 Colab Enterprise Notebooks 页面:
在区域菜单中,选择
us-central1
。 此区域与您在本教程中创建所有服务时使用的区域相同。在文件旁边,点击创建笔记本。
您的新笔记本会显示在我的笔记本标签页上。
如需在新笔记本中运行代码,请针对您要运行的每个命令或代码段在笔记本中插入一个新的代码单元。
创建 BigQuery 远程函数
您可以使用 bigframes
库来定义 BigQuery 远程函数。在本部分中,请使用 bigframes
创建一个名为 process_incoming
的远程函数。此远程函数会接受 Google Analytics 数据作为输入,构造提示,并将其发送到 Gemma 模型进行分析。
在您创建的 Colab Enterprise 笔记本中:
- 点击 + 代码以插入新的代码单元。
将以下代码复制到新的代码单元中:
# 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}")
替换以下内容:
LOADBALANCER_IP_ADDRESS
:您之前创建的内部负载均衡器的 IP 地址和端口,例如10.128.05:8000
。PROJECT_ID
:您的项目 ID。VPC_CONNECTOR_NAME
:您之前创建的无服务器 VPC 访问通道连接器的名称。
在本教程中,BigQuery 数据集的位置设置为
US
,默认值为us-central1
区域。点击
运行单元。
输出会显示函数名称,类似于以下内容:
The function name is: PROJECT_ID.ga_demo.ga_explain_example
分析用户行为
在本部分中,您将通过以下两种方式之一,使用 process_incoming
远程函数分析网站上的用户行为:
- 使用 BigQuery DataFrames
- 使用
bq
命令行工具直接在 SQL 中运行查询。
使用 BigQuery DataFrames
如需在您创建的 Colab Enterprise 笔记本中使用 BigQuery DataFrames 运行远程函数,请执行以下操作:
- 点击 + 代码以插入新的代码单元。
- 将以下代码复制到新的代码单元中,然后点击 运行单元。
# 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 | results | axis |
---|---|---|---|---|---|---|
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
命令行工具运行远程函数,请执行以下操作:
- 点击 + 代码以插入新的代码单元。
在新的代码单元中复制以下代码,并将
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}
点击
运行单元。
以下输出显示了查询的示例结果:
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 说明:\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* 数据解读: You can't definitively say the"} |
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"} |