このチュートリアルでは、BigQuery、Cloud Run、Gemma LLM を使用して、大規模なデータセットから分析情報を導き出す方法について説明します。このチュートリアルでは、サンプル アプリケーションを Google Kubernetes Engine(GKE)にデプロイします。サンプルアプリでは、データの保存と処理に BigQuery、リクエスト処理に Cloud Run、データの分析と受信プロンプトに基づく予測の生成に Gemma LLM を利用しています。
このチュートリアルは、クラウド プラットフォームの管理者とアーキテクト、データと AI のスペシャリスト、ML エンジニア、MLOps(DevOps)の専門家を対象としています。このページを読む前に、Kubernetes と Jupyter などのノートブック環境について理解しておいてください。
このチュートリアルの前提条件として、GKE の GPU で Hugging Face TGI を使用して Gemma オープンモデルを提供するチュートリアルを完了する必要があります。TGI フレームワークは、モデル サービング プロセスを容易にします。
GKE と BigQuery を選ぶ理由
BigQuery は、ペタバイト規模のデータに対するスケーラブルな分析を実現する、Platform as a Service(PaaS)のフルマネージド サーバーレス データ ウェアハウスです。BigQuery では、使い慣れた SQL と組み込みの ML を使用して、有用な分析情報を得るためのデータ分析に専念できます。
GKE の GPU で TGI を使用すると、Gemma 言語モデルをデプロイして、ユーザー インタラクションを自然言語で分析して要約できます。BigQuery を GKE と統合することで、BigQuery を使用して大量のデータセット(Google アナリティクスなど)を効率的に処理し、モデルの自然言語理解機能を使用して有意な分析情報を生成できます。
たとえば、データ サイエンティスト、アナリスト、または e コマース企業のビジネス上の意思決定者であれば、ウェブサイトやアプリでのユーザー行動を把握したいと考えるでしょう。この分析情報は、ユーザー ジャーニーを最適化してパーソナライズし、情報に基づいたビジネス上の意思決定を行い、売り上げを伸ばすために役立ちます。
このシナリオでは、BigQuery から未加工の Google アナリティクス データを取得し、Gemma モデルにフィードして、ページ訪問の概要と分析情報を自然言語で受け取ることができます。Gemma モデルは、GKE の GPU アクセラレーションを備えたスケーラブルなインフラストラクチャで実行され、ユーザー ジャーニー データを迅速に処理してパターンとトレンドを特定します。分析情報を活用して、人気のある商品の組み合わせを特定したり、購入手続きの途中で離脱するユーザーが多いポイントを特定したり、特定のランディング ページにトラフィックを誘導している成功したマーケティング キャンペーンをハイライト表示できます。
利点
このソリューションは、次のようなメリットがある効率的なワークフローを提供します。
- BigQuery との統合: BigQuery を使用して、大規模なデータセット(このチュートリアルの Google アナリティクス データなど)を保存、処理します。これにより、モデルの分析に必要なデータをクエリして集計できます。
- GPU アクセラレーション: GPU をサポートする GKE クラスタで Gemma モデルを実行することで、推論プロセスが高速化され、CPU ベースのプロセッサよりもはるかに高速に予測を生成できます。
- 費用と時間を削減: オープンソースの事前トレーニング済み Gemma 言語モデルを使用することで、時間とリソースを節約でき、カスタムモデルをゼロから構築する必要がなくなります。
目標
このチュートリアルでは、以下の方法について学習します。
- モデルをデプロイして公開する: サービス YAML ファイルを作成して、Gemma モデルにアクセスする内部ロードバランサを定義します。
- BigQuery リモート関数を作成する: Python コードを実行して、Google アナリティクス データの取得、モデルのプロンプトの作成を行い、ロードバランサを使用してモデルのエンドポイントにリクエストを送信して、モデルのレスポンスを返すリモート関数を定義します。
- Virtual Private Cloud(VPC)ネットワークを構成する: VPC ネットワークと VPC コネクタを設定して、BigQuery と GKE クラスタ間の安全な通信を可能にします。これは、リモート関数がモデル エンドポイントにアクセスするために重要です。
- データを分析する: BigQuery DataFrames を使用してデータを分析するか、
bq
コマンドライン ツールを使用して SQL で直接データを分析します。提供されたコード スニペットを Colab Enterprise ノートブックで実行して、次の処理を行います。- SQL を使用して BigQuery から Google アナリティクスのデータをクエリする。
- リモート関数をデータに適用して、Gemma モデルから分析情報を生成する。
- 結果を表示する。
アーキテクチャ
次のアーキテクチャ図は、関係するコンポーネントとそれらの相互作用を示しています。
- Colab Enterprise ノートブックを使用して Python コードを実行します。Python では、bigframes ライブラリを使用して SQL の操作を簡素化できます。
- BigQuery はビッグデータ処理エンジンとして機能し、SQL を使用してデータとやり取りできます。
- リモート関数は Cloud Run functions の関数を呼び出します。データは自動的にリモート関数に転送され、そこで準備され、GKE に送信されて推論されます。
- 結果は BigQuery に戻され、テーブル形式で表示されます。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
- Compute Engine instances used by GKE
- GPU resources used by GKE
- BigQuery
- Cloud Load Balancing
- Cloud Run functions
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
次の前提条件を満たしていることを確認してください。
プロジェクトの選択または作成
既存のプロジェクトを使用することも、このチュートリアル用の新しいプロジェクトを作成することもできます。
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
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.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
-
Make sure that you have the following role or roles on the project: roles/aiplatform.colabEnterpriseAdmin, roles/run.invoker, roles/container.admin, roles/iam.serviceAccountAdmin, roles/logging.logWriter
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
IAM に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。PROJECT_NUMBER
はプロジェクト番号に置き換えて、プロジェクトの Compute Engine のデフォルトのサービス アカウント ドメインを作成します。例:123456789012-compute@developer.gserviceaccount.com
ROLE
は、個々のロールに置き換えます。次の
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 アドレスを取得します。この IP アドレスを取得できるようになるまで 1~2 分ほどかかることがあります。
kubectl get service llm-lb-service --output yaml | grep ip:
Google Cloud コンソールで、[Colab Enterprise ノートブック] ページに移動します。
[リージョン] メニューで [
us-central1
] を選択します。これは、このチュートリアルですべてのサービスを作成するリージョンと同じです。[ファイル] の横にある [ノートブックを作成] をクリックします。
- [+ コード] をクリックして、新しいコードセルを挿入します。
新しいコードセルに次のコードをコピーします。
# 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
リージョンになります。(セルを実行)をクリックします。
- BigQuery DataFrames を使用する
bq
コマンドライン ツールを使用して SQL で直接クエリを実行する- [+ コード] をクリックして、新しいコードセルを挿入します。
- 新しいコードセルに次のコードをコピーし、 (セルを実行)をクリックします。
- [+ コード] をクリックして、新しいコードセルを挿入します。
新しいコードセルに次のコードをコピーし、
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}
(セルを実行)をクリックします。
- Colab Enterprise ノートブックを削除します。
- Colab Enterprise ランタイムを削除します。
- BigQuery 関数を削除します。サービス アカウントに
bigquery.routines.delete
権限があることを確認します。詳細については、BigQuery の権限をご覧ください。 - BigQuery の外部接続を削除します。
- Cloud Run functions の関数を削除します。
- GKE クラスタを削除します。
- VPC コネクタを削除します。
- 構造化データと非構造化データの分析ユースケースに関するハンズオン Codelab を試す。
- GKE でバッチ ワークロードを実行するためのベスト プラクティスを参照する。
- BigQuery での AI / ML のユースケースの詳細を確認する。
- GKE での AI / ML のユースケースの詳細を確認する。
Compute Engine のデフォルト サービス アカウントにロールを付与します。IAM ロール(
roles/logging.logWriter, roles/artifactregistry.writer, roles/storage.objectViewer
)ごとに次のコマンドを 1 回実行します。gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=ROLE
Gemma モデルを提供する
GKE の GPU で Hugging Face TGI を使用して Gemma オープンモデルを提供するチュートリアルに移動し、始める前にから curl を使用してモデルを操作するまでの手順に沿って、Gemma モデルが正常にデプロイされ、操作できることを確認します。
このチュートリアルでは、Gemma 2B-it モデルをデプロイします。
VPC ネットワークを設定する
リモート関数が GKE クラスタに接続できるように、
us-central1
リージョンに VPC ネットワークを作成または使用します。このチュートリアルでは、Default
VPC を使用します。BigQuery データセット、リモート関数、基盤となる Cloud Run functions の関数が互換性のあるロケーションにデプロイされるようにするには、VPC ネットワークが BigQuery リモート関数と同じリージョンにある必要があります。このチュートリアルでは、リモート関数を作成しながら BigQuery DataFrames オプションを設定するときに、データセットのロケーションとして
US
を指定します。これは、デフォルトで Cloud Run functions のus-central1
リージョンになります。したがって、us-central1
リージョンに VPC を作成するか、そのリージョンの VPC を使用します。ロードバランサの作成
GKE クラスタに内部ロードバランサを作成するには、次の操作を行います。
この IP アドレスを使用して、ロードバランサの背後で実行されている
gemma-server
アプリケーションと通信します。コネクタを作成する
サーバーレス VPC アクセス コネクタを使用すると、公共のインターネットを使用せずに VPC ネットワークを介してリクエストを送受信できます。詳細については、サーバーレス VPC アクセスをご覧ください。
このチュートリアルでは、VPC 内の既存のリソースとの IP アドレスの競合を回避するために、新しい専用サブネットを持つコネクタを作成します。手順については、コネクタを作成するセクションを参照して、コネクタと新しいサブネットを作成するセクションの
gcloud
の説明に従って操作します。既存のサブネットを使用する場合は、既存のサブネットを使用してコネクタを作成するの手順に沿って操作します。
詳細については、コネクタのサブネットの要件をご覧ください。
ノートブックを作成する
このチュートリアルでは、Colab Enterprise ノートブックを使用して、BigQuery リモート関数を定義し、分析を実行するためのすべてのコードを実行します。
Google Cloud コンソールを使用して Colab Enterprise ノートブックを作成するには:
新しいノートブックが [マイ ノートブック] タブに表示されます。
新しいノートブックでコードを実行するには、実行するコマンドまたはコード スニペットごとに新しいコードセルをノートブックに挿入します。
BigQuery リモート関数を作成する
BigQuery リモート関数を定義する方法の一つは、
bigframes
ライブラリを使用する方法です。このセクションでは、bigframes
を使用してprocess_incoming
というリモート関数を作成します。このリモート関数は、Google アナリティクスのデータを入力として受け取り、プロンプトを作成して Gemma モデルに送信し、分析を行います。作成した Colab Enterprise ノートブックで、次の操作を行います。
出力には、次のような関数名が表示されます。
The function name is: PROJECT_ID.ga_demo.ga_explain_example
ユーザーの行動を分析する
このセクションでは、次の 2 つの方法のいずれかで
process_incoming
リモート関数を使用して、ウェブサイト上のユーザーの行動を分析します。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 「次の項目は... 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
コマンドライン ツールを使用してリモート関数を実行するには:次の出力は、クエリのサンプル結果を示しています。
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":"回答:\n 最もアクセスされたページは https://shop.googlemerchandisestore.com/Google+Redesign/Apparel/Google+Dino+Game+Tee でした。\n 次にアクセスされたページは、ユーザーがアクセスしてきたページです。\n\n 説明:\n\n 提供されたデータから、現在のユーザーは「Google Dino Game Tee」の商品を目的として Google のグッズストアにアクセスしたことがわかります。\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 アカウントに課金されないようにするには、個々のリソースを削除します。
次のステップ
-
API を有効にする
Cloud Shell を設定する
このチュートリアルでは、Cloud Shell を使用して gcloud
コマンドと kubectl
コマンドを実行します。Cloud Shell は、 Google Cloudでホストされているリソースを管理するためのシェル環境です。Google Cloud CLI と kubectl コマンドライン ツールがプリインストールされています。
コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。
このチュートリアルでコマンドを実行する前に、デフォルト プロジェクトがサンプルアプリをデプロイするプロジェクト ID に設定されていることを確認します。まだ設定していない場合は、Cloud Shell で次のコマンドを実行します。
gcloud config set project PROJECT_ID
PROJECT_ID
を実際のプロジェクト ID に置き換えます。
IAM ロールを付与する
ユーザー アカウントとプロジェクト内の Compute Engine のデフォルトのサービス アカウントに、このチュートリアルに必要な Identity and Access Management(IAM)ロールがあることを確認します。