本教學課程將示範如何使用 BigQuery、Cloud Run 和 Gemma LLM,從大型資料集擷取洞察資訊。在本教學課程中,您會將範例應用程式部署至 Google Kubernetes Engine (GKE)。這個範例應用程式會運用 BigQuery 儲存及處理資料、使用 Cloud Run 處理要求,並透過 Gemma LLM 分析資料,以及根據收到的提示生成預測結果。
本教學課程的適用對象為雲端平台管理員和架構師、資料和 AI 專家、機器學習工程師,以及機器學習運作 (DevOps) 專業人員。閱讀本頁面之前,請務必先熟悉 Kubernetes 和 Jupyter 等筆記本環境。
完成「Serve Gemma open models using GPUs on GKE with Hugging Face TGI」(透過 Hugging Face TGI 使用 GKE 中的 GPU 提供 Gemma 開放式模型服務) 教學課程,是本教學課程的先決條件。TGI 架構可簡化模型服務程序。
選用 GKE 和 BigQuery 的理由
BigQuery 是一項平台即服務 (PaaS),提供全代管無伺服器資料倉儲,可對 PB 級資料進行可擴充的分析。BigQuery 可讓您專注於分析資料,找出有意義的洞察資訊,同時使用熟悉的 SQL 和內建機器學習功能。
在 GKE 上搭配 TGI 使用 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 模型。
設定虛擬私有雲網路
在 us-central1
區域中建立或使用 VPC 網路,讓遠端函式可以連線至 GKE 叢集。在本教學課程中,請使用 Default
VPC。
為確保 BigQuery 資料集、遠端函式和基礎 Cloud Run 函式部署在相容的位置,VPC 網路必須與 BigQuery 遠端函式位於相同區域。在本教學課程中,您建立遠端函式時設定 BigQuery DataFrame 選項,並指定 US
做為資料集的位置,預設為 Cloud Run 函式的 us-central1
區域。因此,請在 us-central1
區域中建立或使用虛擬私有雲。
建立負載平衡器
請按照下列操作說明,在 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
應用程式通訊。
建立連接器
您可以使用無伺服器虛擬私有雲存取連接器,透過虛擬私有雲網路傳送及接收要求,不必使用公開網際網路。詳情請參閱無伺服器虛擬私有雲存取。
在本教學課程中,您將建立具有全新專屬子網路的連接器,避免與虛擬私有雲中的現有資源發生 IP 位址衝突。如需操作說明,請參閱「建立連接器」一節,並按照「建立連接器和新的子網路」一節的 gcloud
操作說明操作。
如要使用現有子網路,請按照「使用現有子網路建立連接器」一節的說明操作。
會強制執行這項規定。詳情請參閱「連接器子網路需求」。
建立筆記本
在本教學課程中,您將使用 Colab Enterprise 筆記本執行所有程式碼,定義 BigQuery 遠端函式並執行分析。
如要透過 Google Cloud 控制台建立 Colab Enterprise 筆記本,請按照下列步驟操作:
前往 Google Cloud 控制台的「Colab Enterprise Notebooks」頁面:
在「Region」(區域) 選單中選取「
us-central1
」。您在本教學課程中建立的所有服務,都位於這個區域。按一下「檔案」旁的「建立筆記本」。
新的筆記本就會出現在「My notebooks」(我的筆記本) 分頁中。
如要在新筆記本中執行程式碼,請在筆記本中為每個指令或程式碼片段插入新的程式碼儲存格。
建立 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
:您先前建立的無伺服器虛擬私有雲存取連接器名稱。
在本教學課程中,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 | 結果 | 軸 |
---|---|---|---|---|---|---|
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 執行分析。
如要使用 bq
指令列工具,在您建立的 Colab Enterprise 筆記本中執行遠端函式,請按照下列步驟操作:
- 按一下「+ 程式碼」,插入新的程式碼儲存格。
在新的程式碼儲存格中複製下列程式碼,並將
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 | result |
---|---|---|---|---|
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"} |