使用 BigQuery、Cloud Run 和 Gemma 分析 GKE 資料

本教學課程將示範如何使用 BigQueryCloud RunGemma LLM,從大型資料集擷取洞察資訊。在本教學課程中,您會將範例應用程式部署至 Google Kubernetes Engine (GKE)。這個範例應用程式會運用 BigQuery 儲存及處理資料、使用 Cloud Run 處理要求,並透過 Gemma LLM 分析資料,以及根據收到的提示生成預測結果。

本教學課程的適用對象為雲端平台管理員和架構師資料和 AI 專家機器學習工程師,以及機器學習運作 (DevOps) 專業人員。閱讀本頁面之前,請務必先熟悉 KubernetesJupyter 等筆記本環境。

完成「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 叢集中建立內部負載平衡器:

  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 應用程式通訊。

建立連接器

您可以使用無伺服器虛擬私有雲存取連接器,透過虛擬私有雲網路傳送及接收要求,不必使用公開網際網路。詳情請參閱無伺服器虛擬私有雲存取

在本教學課程中,您將建立具有全新專屬子網路的連接器,避免與虛擬私有雲中的現有資源發生 IP 位址衝突。如需操作說明,請參閱「建立連接器」一節,並按照「建立連接器和新的子網路」一節的 gcloud 操作說明操作。

如要使用現有子網路,請按照「使用現有子網路建立連接器」一節的說明操作。

會強制執行這項規定。

詳情請參閱「連接器子網路需求」。

建立筆記本

在本教學課程中,您將使用 Colab Enterprise 筆記本執行所有程式碼,定義 BigQuery 遠端函式並執行分析。

如要透過 Google Cloud 控制台建立 Colab Enterprise 筆記本,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Colab Enterprise Notebooks」頁面:

    前往「Notebooks」(筆記本) 頁面

  2. 在「Region」(區域) 選單中選取「us-central1」。您在本教學課程中建立的所有服務,都位於這個區域。

  3. 按一下「檔案」旁的「建立筆記本」

新的筆記本就會出現在「My notebooks」(我的筆記本) 分頁中。

如要在新筆記本中執行程式碼,請在筆記本中為每個指令或程式碼片段插入新的程式碼儲存格。

建立 BigQuery 遠端函式

您可以使用 bigframes 程式庫定義 BigQuery 遠端函式。在本節中,請使用 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(
      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}")
    
    

    更改下列內容:

    在本教學課程中,BigQuery 資料集的位置設為 US,預設為 us-central1 地區。

  3. 按一下「執行儲存格」圖示

輸出內容會顯示函式名稱,如下所示:

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. 將下列程式碼複製到新的程式碼儲存格中,然後按一下「執行儲存格」
# 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 筆記本中執行遠端函式,請按照下列步驟操作:

  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. 按一下「執行儲存格」圖示

以下輸出內容顯示查詢的範例結果:

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