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

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

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

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

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

BigQuery는 페타바이트 규모의 데이터에 대한 확장 가능한 분석을 지원하는 완전 관리형 서버리스 데이터 웨어하우스인 PaaS (Platform as a Service)입니다. 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. 계정에 로그인합니다. Google Cloud 를 처음 사용하는 경우 Google Cloud 계정을 만들어 실제 시나리오에서 제품이 어떻게 작동하는지 평가하세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

API 사용 설정

Artifact Registry, Compute Engine, GKE, IAM 서비스 계정 사용자 인증 정보, Cloud Functions, Cloud Build, Cloud Run Admin, Cloud Logging, 서버리스 VPC 액세스, BigQuery, Dataform, Vertex AI API를 사용 설정합니다.

API 사용 설정에 필요한 역할

API를 사용 설정하려면 serviceusage.services.enable 권한이 포함된 서비스 사용량 관리자 IAM 역할(roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기.

API 사용 설정

Cloud Shell 설정

이 튜토리얼에서는 Cloud Shell을 사용하여 gcloudkubectl 명령어를 실행합니다. Cloud Shell은 에서 호스팅되는 리소스를 관리하는 데 사용되는 셸 환경입니다. Google Cloud Google Cloud CLIkubectl 명령줄 도구가 사전 설치되어 있습니다.

콘솔에서 Cloud Shell을 활성화합니다. Google Cloud

Cloud Shell 활성화

Console 하단의 프레임에서 Cloud Shell 세션이 열립니다.

이 튜토리얼에서 명령어를 실행하기 전에 기본 프로젝트가 샘플 앱을 배포할 프로젝트 ID로 설정되어 있는지 확인합니다. 아직 설정되지 않았으면 Cloud Shell에서 다음 명령어를 실행합니다.

gcloud config set project PROJECT_ID

PROJECT_ID프로젝트 ID로 바꿉니다.

IAM 역할 부여

프로젝트의 사용자 계정 및 Compute Engine 기본 서비스 계정 에 이 튜토리얼에 필요한 Identity and Access Management (IAM) 역할이 있는지 확인합니다.

사용자 계정에 역할을 부여합니다. 다음 IAM 역할마다 다음 명령어를 1회 실행합니다. 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

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID입니다.
  • USER_IDENTIFIER: 사용자 계정의 식별자입니다. 예를 들면 myemail@example.com입니다.
  • ROLE: 사용자 계정에 부여하는 IAM 역할입니다.

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 Functions가 호환되는 위치에 배포되도록 하려면 VPC 네트워크가 BigQuery 원격 함수와 동일한 리전에 있어야 합니다. 이 튜토리얼에서는 원격 함수를 만드는 동안 BigQuery DataFrames 옵션을 설정할 때 데이터 세트의 위치로 US를 지정합니다. 이는 Cloud Run Functions의 기본값인 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 원격 함수를 정의하고 분석을 수행하는 모든 코드를 실행합니다.

콘솔을 사용하여 Colab Enterprise 노트북을 만들려면 다음 안내를 따르세요. Google Cloud

  1. 콘솔에서 Colab Enterprise 노트북 페이지로 이동합니다. Google Cloud

    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(
      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을 통해 직접 분석을 수행할 수 있습니다.

만든 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":"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 \nImportant Considerations:\n\n* Data Interpretation: 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"}

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

이 튜토리얼에서 사용한 리소스 비용이 계정에 청구되지 않도록 하려면 개별 리소스를 삭제하세요. Google Cloud

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

다음 단계