BigQuery, Cloud Run, Gemma를 사용하여 GKE에서 데이터 분석


이 튜토리얼에서는 BigQuery, Cloud Run, Gemma LLM을 사용하여 대규모 데이터 세트에서 유용한 정보를 도출하는 방법을 보여줍니다. 이 튜토리얼에서는 샘플 애플리케이션을 Google Kubernetes Engine (GKE)에 배포합니다. 샘플 앱은 데이터 저장 및 처리를 위해 BigQuery를, 요청 처리를 위해 Cloud Run을, 데이터를 분석하고 수신 프롬프트를 기반으로 예측을 생성하기 위해 Gemma LLM을 활용합니다.

이 튜토리얼은 클라우드 플랫폼 관리자 및 설계자, 데이터 및 AI 전문가, ML 엔지니어, MLOps (DevOps) 전문가를 대상으로 합니다. 이 페이지를 읽기 전에 KubernetesJupyter와 같은 노트북 환경을 숙지해야 합니다.

이 튜토리얼을 시작하려면 Hugging Face TGI로 GKE에서 GPU를 사용하여 Gemma 개방형 모델 제공 튜토리얼을 완료해야 합니다. TGI 프레임워크는 모델 제공 프로세스를 용이하게 합니다.

GKE 및 BigQuery를 사용해야 하는 이유

BigQuery는 페타바이트 규모의 데이터에 대한 확장 가능한 분석을 지원하는 완전 관리형 서버리스 데이터 웨어하우스인 Platform as a Service (PaaS)입니다. BigQuery를 사용하면 익숙한 SQL과 기본 제공 머신러닝을 사용하면서 데이터 분석에 집중하여 의미 있는 정보를 찾을 수 있습니다.

TGI와 함께 GKE에서 GPU를 사용하면 Gemma 언어 모델을 배포하여 자연어로 사용자 상호작용을 분석하고 요약할 수 있습니다. 그런 다음 BigQuery를 GKE와 통합하면 BigQuery를 사용하여 Google 애널리틱스와 같은 대규모 데이터 세트와 모델의 자연 언어 이해 기능을 효율적으로 처리하여 의미 있는 통계를 생성할 수 있습니다.

예를 들어 데이터 과학자, 분석가 또는 전자상거래 회사의 비즈니스 의사 결정권자는 웹사이트 또는 앱에서의 사용자 행동을 파악하고자 할 수 있습니다. 이러한 통계를 통해 사용자 여정을 최적화하고 맞춤설정하며 정보에 입각한 비즈니스 결정을 내려 판매를 늘릴 수 있습니다.

이 시나리오에서는 BigQuery에서 원시 Google 애널리틱스 데이터를 가져와 Gemma 모델에 제공하고 자연어로 페이지 방문 요약 및 통계를 받을 수 있습니다. GKE의 GPU 가속을 통해 확장 가능한 인프라에서 실행되는 Gemma 모델은 사용자 여정 데이터를 빠르게 처리하여 패턴과 추세를 파악합니다. 인기 있는 제품 조합을 파악하고, 결제 과정에서 일반적으로 중단되는 지점을 파악하고, 특정 방문 페이지로 트래픽을 유도하는 성공적인 마케팅 캠페인을 강조 표시하는 등의 유용한 정보를 얻을 수 있습니다.

이점

이 솔루션은 다음과 같은 이점을 제공하는 간소화된 워크플로를 제공합니다.

  • BigQuery 통합: BigQuery를 사용하여 대규모 데이터 세트 (예: 이 튜토리얼의 Google 애널리틱스 데이터)를 저장하고 처리합니다. 이를 통해 모델 분석에 필요한 데이터를 쿼리하고 집계할 수 있습니다.
  • GPU 가속: GPU 지원 GKE 클러스터에서 Gemma 모델을 실행하여 추론 프로세스의 속도를 높이고 CPU 기반 프로세서보다 훨씬 빠르게 예측을 생성합니다.
  • 비용 및 시간 절감: 선행 학습된 오픈소스 Gemma 언어 모델을 사용하여 시간과 리소스를 절약하고 맞춤 모델을 처음부터 빌드할 필요가 없습니다.

목표

이 튜토리얼에서는 다음을 수행하는 방법을 알아봅니다.

  1. 모델 배포 및 노출: 서비스 YAML 파일을 만들어 Gemma 모델에 액세스할 내부 부하 분산기를 정의합니다.
  2. BigQuery 원격 함수 만들기: Python 코드를 실행하여 Google 애널리틱스 데이터를 가져오고, 모델의 프롬프트를 구성하고, 로드 밸런서를 사용하여 모델의 엔드포인트로 요청을 전송하고, 모델의 응답을 반환하는 원격 함수를 정의합니다.
  3. Virtual Private Cloud (VPC) 네트워크 구성: VPC 네트워크와 VPC 커넥터를 설정하여 BigQuery와 GKE 클러스터 간에 안전한 통신을 사용 설정합니다. 이는 원격 함수가 모델 엔드포인트에 액세스하는 데 중요합니다.
  4. 데이터 분석: BigQuery DataFrames를 사용하여 데이터를 분석하거나 bq 명령줄 도구를 사용하여 SQL에서 직접 데이터를 분석합니다. Colab Enterprise 노트북에서 제공된 코드 스니펫을 실행하여 다음 작업을 수행합니다.
    • SQL을 사용하여 BigQuery에서 Google 애널리틱스 데이터를 쿼리합니다.
    • 원격 함수를 데이터에 적용하여 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은 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 역할마다 다음 명령어를 1회 실행합니다. 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 네트워크 설정

원격 함수가 GKE 클러스터에 연결할 수 있도록 us-central1 리전에서 VPC 네트워크를 만들거나 사용합니다. 이 튜토리얼에서는 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 주소를 가져옵니다. 이 IP 주소를 가져오려면 1~2분 정도 기다려야 할 수 있습니다.

    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 애널리틱스 데이터를 입력으로 받아 프롬프트를 구성하고 분석을 위해 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. 셀 실행을 클릭합니다.

출력에는 다음과 유사한 함수 이름이 표시됩니다.

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 '다음은...
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. 셀 실행을 클릭합니다.

다음 출력은 쿼리의 샘플 결과를 보여줍니다.

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 계정에 청구되지 않도록 하려면 개별 리소스를 삭제합니다.

  1. Colab Enterprise 노트북을 삭제합니다.
  2. Colab Enterprise 런타임을 삭제합니다.
  3. BigQuery 함수를 삭제합니다. 서비스 계정에 bigquery.routines.delete 권한이 있는지 확인합니다. 자세한 내용은 BigQuery 권한을 참고하세요.
  4. BigQuery 외부 연결을 삭제합니다.
  5. Cloud Run 함수를 삭제합니다.
  6. GKE 클러스터를 삭제합니다.
  7. VPC 커넥터를 삭제합니다.

다음 단계