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. 모델 배포 및 노출: Gemma 모델에 액세스하기 위한 내부 부하 분산기를 정의하는 서비스 YAML 파일을 만듭니다.
  2. BigQuery 원격 함수 만들기: Python 코드를 실행하여 Google 애널리틱스 데이터를 가져오고, 모델의 프롬프트를 구성하고, 로드 밸런서를 사용하여 모델의 엔드포인트로 요청을 전송하고, 모델의 응답을 반환하는 원격 함수를 정의합니다.
  3. Virtual Private Cloud (VPC) 네트워크 구성: BigQuery와 GKE 클러스터 간의 보안 통신을 사용 설정하도록 VPC 네트워크와 VPC 커넥터를 설정합니다. 이는 원격 함수가 모델 엔드포인트에 액세스하는 데 중요합니다.
  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. 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.

    Go to project selector

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

  6. 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

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

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

    gcloud config set project PROJECT_ID
    

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

    IAM 역할 부여

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

    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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. 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.

    4. 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

    1. In the Google Cloud console, go to the IAM page.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 Google 계정의 이메일 주소입니다.

    5. 역할 선택 목록에서 역할을 선택합니다.
    6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
    7. 저장을 클릭합니다.
    8. 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(
          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":"답변:\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 커넥터를 삭제합니다.

      다음 단계