JetStream과 함께 GKE에서 TPU를 사용하여 Gemma 제공


이 가이드에서는 MaxText를 통해 JetStream과 함께 Google Kubernetes Engine(GKE)에서 TPU(Tensor Processing Unit)를 사용하여 Gemma 대규모 언어 모델(LLM)을 제공하는 방법을 보여줍니다. 이 가이드에서는 Gemma 7B 매개변수 명령이 조정된 모델 가중치를 Cloud Storage에 다운로드하고 JetStream을 실행하는 컨테이너를 사용하여 GKE Autopilot 또는 Standard 클러스터에 배포합니다.

이 가이드는 JetStream에 모델을 배포할 때 Kubernetes 기능에서 제공하는 확장성, 복원력, 비용 효율성이 필요한 경우 좋은 출발점이 될 수 있습니다.

배경

JetStream과 함께 GKE에서 TPU를 사용하는 Gemma를 제공하면 비용 효율적인 확장성 및 더 높은 가용성을 비롯하여 관리형 Kubernetes의 모든 이점을 갖춘 강력한 프로덕션에 즉시 사용 가능한 서빙 솔루션을 빌드할 수 있습니다. 이 섹션에서는 이 튜토리얼에서 사용되는 주요 기술을 설명합니다.

Gemma

Gemma는 오픈 라이선스로 출시된 공개적으로 사용 가능한 가벼운 생성형 인공지능(AI) 모델의 집합입니다. 이러한 AI 모델은 애플리케이션, 하드웨어, 휴대기기 또는 호스팅된 서비스에서 실행할 수 있습니다. 텍스트 생성에 Gemma 모델을 사용할 수 있지만 특수한 태스크를 위해 이러한 모델을 조정할 수도 있습니다.

자세한 내용은 Gemma 문서를 참조하세요.

TPU

TPU는 Google이 TensorFlow, PyTorchJAX와 같은 프레임워크를 활용하여 빌드된 머신러닝 및 AI 모델을 가속화하는 데 사용하기 위해 커스텀 개발한 ASIC(application-specific integrated circuits)입니다.

GKE에서 TPU를 사용하기 전에 다음 학습 과정을 완료하는 것이 좋습니다.

  1. Cloud TPU 시스템 아키텍처를 사용하는 현재 TPU 버전 가용성 알아보기
  2. GKE의 TPU 알아보기

이 튜토리얼에서는 Gemma 7B 모델 제공에 대해 설명합니다. GKE는 지연 시간이 짧은 프롬프트를 제공하기 위한 모델 요구사항에 따라 TPU 토폴로지가 구성된 단일 호스트 TPUv5e 노드에 모델을 배포합니다.

JetStream

JetStream은 Google이 개발한 오픈소스 추론 서빙 프레임워크입니다. JetStream은 TPU 및 GPU에서 고성능, 높은 처리량, 메모리 최적화된 추론을 가능하게 합니다. LLM 배포를 용이하게 하기 위해 연속 일괄 처리 및 양자화 기술을 포함하여 고급 성능 최적화를 제공합니다. JetStream은 최적의 성능을 위해 PyTorch/XLA 및 JAX TPU 서빙을 지원합니다.

이러한 최적화에 대한 자세한 내용은 JetStream PyTorchJetStream MaxText 프로젝트 저장소를 참조하세요.

MaxText

MaxTextFlax, OrbaxOptax와 같은 오픈소스 JAX 라이브러리를 기반으로 구축된 성능이 뛰어나고 확장 가능하며 적응력이 뛰어난 JAX LLM 구현입니다. MaxText의 디코더 전용 LLM 구현은 Python으로 작성됩니다. XLA 컴파일러를 많이 활용하여 커스텀 커널을 빌드할 필요 없이 고성능을 실현합니다.

MaxText에서 지원되는 최신 모델 및 매개변수 크기에 대한 자세한 내용은 MaxtText 프로젝트 저장소를 참조하세요.

목표

이 튜토리얼은 JAX를 사용하는 생성형 AI 고객, GKE의 신규 또는 기존 사용자, ML 엔지니어, MLOps(DevOps) 엔지니어, LLM 제공을 위해 Kubernetes 컨테이너 조정 기능을 사용하는 데 관심이 있는 플랫폼 관리자를 대상으로 합니다.

이 가이드는 다음 과정을 다룹니다.

  1. 모델 특성에 따라 권장 TPU 토폴로지를 사용하여 GKE Autopilot 또는 Standard 클러스터를 준비합니다.
  2. GKE에 JetStream 구성요소를 배포합니다.
  3. Gemma 7B 명령 조정 모델을 가져와 게시합니다.
  4. 게시된 모델을 제공하고 상호작용합니다.

아키텍처

이 섹션에서는 이 튜토리얼에서 사용되는 GKE 아키텍처를 설명합니다. 이 아키텍처는 TPU를 프로비저닝하고 모델을 배포하고 제공하기 위해 JetStream 구성요소를 호스팅하는 GKE Autopilot 또는 Standard 클러스터로 구성됩니다.

다음 다이어그램은 이 아키텍처의 구성요소를 보여줍니다.

Maxengine 및 Max HTTP 구성요소를 포함하는 단일 호스트 TPU 노드 풀이 있는 GKE 클러스터의 아키텍처

이 아키텍처에는 다음 구성요소가 포함됩니다.

  • GKE Autopilot 또는 Standard 리전 클러스터입니다.
  • JetStream 배포를 호스팅하는 2개의 단일 호스트 TPU 슬라이스 노드 풀입니다.
  • 서비스 구성요소는 인바운드 트래픽을 모든 JetStream HTTP 복제본에 분산합니다.
  • JetStream HTTP는 JetStream의 필수 형식에 대한 래퍼로 요청을 수락하고 JetStream의 GRPC 클라이언트로 전송하는 HTTP 서버입니다.
  • Maxengine은 연속 일괄 처리를 사용하여 추론을 수행하는 JetStream 서버입니다.

시작하기 전에

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

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • Enable the required API.

    Enable the API

  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Make sure that billing is enabled for your Google Cloud project.

  • Enable the required API.

    Enable the API

  • Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin

    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 colunn 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. 저장을 클릭합니다.
  • TPU v5e PodSlice Lite 칩 8개에 대해 충분한 할당량이 있는지 확인합니다. 이 튜토리얼에서는 온디맨드 인스턴스를 사용합니다.
  • Kaggle 계정이 없는 경우 만듭니다.

모델 액세스 권한 얻기

GKE에 배포하기 위해 Gemma 모델에 액세스하려면 먼저 라이선스 동의 계약에 서명해야 합니다.

Gemma를 사용하려면 동의 계약에 서명해야 합니다. 다음 안내를 따르세요.

  1. Kaggle.com의 Gemma 모델 동의 페이지에 액세스합니다.
  2. 아직 로그인하지 않았다면 Kaggle에 로그인합니다.
  3. 액세스 요청을 클릭합니다.
  4. 동의를 위한 계정 선택 섹션에서 Kaggle 계정을 통해 인증을 선택하여 동의를 위해 Kaggle 계정을 사용합니다.
  5. 모델 이용약관에 동의합니다.

액세스 토큰 생성

Kaggle을 통해 모델에 액세스하려면 Kaggle API 토큰이 필요합니다.

아직 토큰이 없으면 다음 단계에 따라 새 토큰을 생성합니다.

  1. 브라우저에서 Kaggle 설정으로 이동합니다.
  2. API 섹션에서 새 토큰 만들기를 클릭합니다.

kaggle.json이라는 파일이 다운로드됩니다.

환경 준비

이 튜토리얼에서는 Cloud Shell을 사용하여 Google Cloud에서 호스팅되는 리소스를 관리합니다. Cloud Shell에는 kubectlgcloud CLI를 포함하여 이 튜토리얼에 필요한 소프트웨어가 사전 설치되어 있습니다.

Cloud Shell로 환경을 설정하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔의 Google Cloud 콘솔에서 Cloud Shell 활성화 아이콘 Cloud Shell 활성화를 클릭하여 Cloud Shell 세션을 시작합니다. 그러면 Google Cloud 콘솔 하단 창에서 세션이 시작됩니다.

  2. 기본 환경 변수를 설정합니다.

    gcloud config set project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export CLUSTER_NAME=CLUSTER_NAME
    export BUCKET_NAME=BUCKET_NAME
    export REGION=REGION
    export LOCATION=LOCATION
    

    다음 값을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • CLUSTER_NAME: GKE 클러스터의 이름입니다.
    • BUCKET_NAME: Cloud Storage 버킷 이름입니다. gs:// 프리픽스를 지정할 필요가 없습니다.
    • REGION_NAME: GKE 클러스터, Cloud Storage 버킷, TPU 노드가 위치한 리전입니다. 리전에는 TPU v5e 머신 유형을 사용할 수 있는 영역이 포함됩니다(예: us-west1, us-west4, us-central1, us-east1, us-east5 또는 europe-west4).
    • (표준 클러스터만 해당) LOCATION: TPU 리소스를 사용할 수 있는 영역입니다(예: us-west4-a). Autopilot 클러스터의 경우 영역을 지정할 필요 없이 리전만 지정하면 됩니다.

Google Cloud 리소스 만들기 및 구성

다음 안내에 따라 필요한 리소스를 만듭니다.

GKE 클러스터 만들기

GKE Autopilot 또는 Standard 클러스터의 TPU에 Gemma를 제공할 수 있습니다. 완전 관리형 Kubernetes 환경을 위해서는 Autopilot을 사용하는 것이 좋습니다. 워크로드에 가장 적합한 GKE 작업 모드를 선택하려면 GKE 작업 모드 선택을 참조하세요.

Autopilot

Cloud Shell에서 다음 명령어를 실행합니다.

gcloud container clusters create-auto ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${REGION} \
  --release-channel=rapid \
  --cluster-version=1.29

GKE는 배포된 워크로드의 요청에 따라 CPU 및 TPU 노드를 사용하여 Autopilot 클러스터를 만듭니다.

표준

  1. GKE용 워크로드 아이덴티티 제휴를 사용하는 리전별 GKE Standard 클러스터를 만듭니다.

    gcloud container clusters create ${CLUSTER_NAME} \
        --enable-ip-alias \
        --machine-type=e2-standard-4 \
        --num-nodes=2 \
        --release-channel=rapid \
        --workload-pool=${PROJECT_ID}.svc.id.goog \
        --location=${REGION}
    

    클러스터 만들기는 몇 분 정도 걸릴 수 있습니다.

  2. 다음 명령어를 실행하여 클러스터에 대해 노드 풀을 만듭니다.

    gcloud container node-pools create gemma-7b-tpu-nodepool \
      --cluster=${CLUSTER_NAME} \
      --machine-type=ct5lp-hightpu-8t \
      --project=${PROJECT_ID} \
      --num-nodes=2 \
      --region=${REGION} \
      --node-locations=${LOCATION}
    

    GKE는 2x4 토폴로지와 2개의 노드를 사용하여 TPU v5e 노드 풀을 만듭니다.

Cloud Storage 버킷 만들기

Cloud Shell에서 다음 명령어를 실행합니다.

gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}

그러면 Kaggle에서 다운로드한 모델 파일을 저장할 Cloud Storage 버킷이 생성됩니다.

Cloud Shell에 액세스 토큰 업로드

Cloud Shell에서 Kaggle API 토큰을 Google Cloud 프로젝트에 업로드할 수 있습니다.

  1. Cloud Shell에서 더보기 > 업로드를 클릭합니다.
  2. 파일을 선택하고 파일 선택을 클릭합니다.
  3. kaggle.json 파일을 엽니다.
  4. 업로드를 클릭합니다.

Kaggle 사용자 인증 정보용 Kubernetes 보안 비밀 만들기

Cloud Shell에서 다음을 수행합니다.

  1. 클러스터와 통신하도록 kubectl을 구성합니다.

    gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}
    
  2. Kaggle 사용자 인증 정보를 저장할 보안 비밀을 만듭니다.

    kubectl create secret generic kaggle-secret \
        --from-file=kaggle.json
    

GKE용 워크로드 아이덴티티 제휴를 사용하여 워크로드 액세스 구성

Kubernetes 서비스 계정을 애플리케이션에 할당하고 IAM 서비스 계정으로 작동하도록 Kubernetes 서비스 계정을 구성합니다.

  1. 애플리케이션의 IAM 서비스 계정을 만듭니다.

    gcloud iam service-accounts create wi-jetstream
    
  2. IAM 서비스 계정에 IAM 정책 바인딩을 추가하여 Cloud Storage를 관리합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member "serviceAccount:wi-jetstream@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/storage.objectUser
    
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member "serviceAccount:wi-jetstream@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/storage.insightsCollectorService
    
  3. Kubernetes 서비스 계정과 IAM 서비스 계정 사이에 IAM 정책 바인딩을 추가하여 Kubernetes 서비스 계정이 IAM 서비스 계정을 가장하도록 허용합니다. 이러한 바인딩으로 Kubernetes 서비스 계정이 IAM 서비스 계정 역할을 하도록 허용합니다.

    gcloud iam service-accounts add-iam-policy-binding wi-jetstream@${PROJECT_ID}.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:${PROJECT_ID}.svc.id.goog[default/default]"
    
  4. Kubernetes 서비스 계정에 IAM 서비스 계정의 이메일 주소를 주석으로 추가합니다.

    kubectl annotate serviceaccount default \
        iam.gke.io/gcp-service-account=wi-jetstream@${PROJECT_ID}.iam.gserviceaccount.com
    

모델 체크포인트 변환

이 섹션에서는 다음 작업을 수행할 작업을 만듭니다.

  1. Kaggle에서 기본 Orbax 체크포인트를 다운로드합니다.
  2. 체크포인트를 Cloud Storage 버킷에 업로드합니다.
  3. 체크포인트를 MaxText 호환 체크포인트로 변환합니다.
  4. 서빙에 사용할 체크포인트를 스캔 취소합니다.

모델 체크포인트 변환 작업 배포

다음 안내에 따라 Gemma 7B 모델 체크포인트 파일을 다운로드하고 변환합니다.

  1. 다음 매니페스트를 job-7b.yaml로 만듭니다.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: data-loader-7b
    spec:
      ttlSecondsAfterFinished: 30
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: inference-checkpoint
            image: us-docker.pkg.dev/cloud-tpu-images/inference/inference-checkpoint:v0.2.0
            args:
            - -b=BUCKET_NAME
            - -m=google/gemma/maxtext/7b-it/2
            volumeMounts:
            - mountPath: "/kaggle/"
              name: kaggle-credentials
              readOnly: true
            resources:
              requests:
                google.com/tpu: 8
              limits:
                google.com/tpu: 8
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
          volumes:
          - name: kaggle-credentials
            secret:
              defaultMode: 0400
              secretName: kaggle-secret
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f job-7b.yaml
    
  3. 작업에서 로그를 봅니다.

    kubectl logs -f jobs/data-loader-7b
    

    작업이 완료되면 출력은 다음과 비슷합니다.

    Successfully generated decode checkpoint at: gs://BUCKET_NAME/final/unscanned/gemma_7b-it/0/checkpoints/0/items
    + echo -e '\nCompleted unscanning checkpoint to gs://BUCKET_NAME/final/unscanned/gemma_7b-it/0/checkpoints/0/items'
    
    Completed unscanning checkpoint to gs://BUCKET_NAME/final/unscanned/gemma_7b-it/0/checkpoints/0/items
    

JetStream 배포

이 섹션에서는 JetStream 컨테이너를 배포하여 Gemma 모델을 제공합니다.

다음 안내에 따라 Gemma 7B 명령 조정 모델을 배포합니다.

  1. 다음 jetstream-gemma-deployment.yaml 매니페스트를 만듭니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: maxengine-server
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: maxengine-server
      template:
        metadata:
          labels:
            app: maxengine-server
        spec:
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
          containers:
          - name: maxengine-server
            image: us-docker.pkg.dev/cloud-tpu-images/inference/maxengine-server:v0.2.0
            args:
            - model_name=gemma-7b
            - tokenizer_path=assets/tokenizer.gemma
            - per_device_batch_size=4
            - max_prefill_predict_length=1024
            - max_target_length=2048
            - async_checkpointing=false
            - ici_fsdp_parallelism=1
            - ici_autoregressive_parallelism=-1
            - ici_tensor_parallelism=1
            - scan_layers=false
            - weight_dtype=bfloat16
            - load_parameters_path=gs://BUCKET_NAME/final/unscanned/gemma_7b-it/0/checkpoints/0/items
            ports:
            - containerPort: 9000
            resources:
              requests:
                google.com/tpu: 8
              limits:
                google.com/tpu: 8
          - name: jetstream-http
            image: us-docker.pkg.dev/cloud-tpu-images/inference/jetstream-http:v0.2.0
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: jetstream-http-svc
    spec:
      selector:
        app: maxengine-server
      ports:
      - protocol: TCP
        port: 8000
        targetPort: 8000
    

    매니페스트는 다음과 같은 주요 속성을 설정합니다.

    • tokenizer_path: 모델의 tokenizer에 대한 경로입니다.
    • load_parameters_path: 체크포인트가 저장되는 Cloud Storage 버킷의 경로입니다.
    • per_device_batch_size: 기기당 디코딩 배치 크기이며 여기서 TPU 칩 1개는 기기 1개와 같습니다.
    • max_prefill_predict_length: 자동 회귀를 수행할 때 미리 채우기의 최대 길이입니다.
    • max_target_length: 최대 시퀀스 길이입니다.
    • model_name: 모델 이름(gemma-7b)입니다.
    • ici_fsdp_parallelism: 완전 샤딩된 데이터 동시 로드(FSDP)의 샤드 수입니다.
    • ici_tensor_parallelism: 텐서 동시 로드의 샤드 수입니다.
    • ici_autoregressive_parallelism: 자동 회귀 동시 로드의 샤드 수입니다.
    • scan_layers: 스캔 레이어 부울 플래그(부울)입니다.
    • weight_dtype: 가중치 데이터 유형(bfloat16)입니다.
  2. 매니페스트를 적용합니다.

    kubectl apply -f jetstream-gemma-deployment.yaml
    
  3. 배포를 확인합니다.

    kubectl get deployment
    

    출력은 다음과 비슷합니다.

    NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
    maxengine-server                  2/2     2            2           ##s
    
  4. HTTP 서버 로그를 확인하여 모델이 로드되고 컴파일되었는지 확인합니다. 서버에서 이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

    kubectl logs deploy/maxengine-server -f -c jetstream-http
    

    출력은 다음과 비슷합니다.

    kubectl logs deploy/maxengine-server -f -c jetstream-http
    
    INFO:     Started server process [1]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
    
  5. MaxEngine 로그를 보고 컴파일이 완료되었는지 확인합니다.

    kubectl logs deploy/maxengine-server -f -c maxengine-server
    

    출력은 다음과 비슷합니다.

    2024-03-29 17:09:08,047 - jax._src.dispatch - DEBUG - Finished XLA compilation of jit(initialize) in 0.26236414909362793 sec
    2024-03-29 17:09:08,150 - root - INFO - ---------Generate params 0 loaded.---------
    

모델 제공

이 섹션에서는 모델과 상호작용합니다.

포트 전달 설정

이전 단계에서 만든 ClusterIP 서비스를 통해 JetStream 배포에 액세스할 수 있습니다. ClusterIP 서비스는 클러스터 내에서만 연결할 수 있습니다. 따라서 클러스터 외부에서 서비스에 액세스하려면 다음 단계를 완료하세요.

포트 전달 세션을 설정하려면 다음 명령어를 실행합니다.

kubectl port-forward svc/jetstream-http-svc 8000:8000

curl을 사용하여 모델과 상호작용

  1. 새 터미널을 열고 다음 명령어를 실행하여 JetStream HTTP 서버에 액세스할 수 있는지 확인합니다.

    curl --request POST \
    --header "Content-type: application/json" \
    -s \
    localhost:8000/generate \
    --data \
    '{
        "prompt": "What are the top 5 programming languages",
        "max_tokens": 200
    }'
    

    모델 준비로 인해 초기 요청이 완료되는 데 몇 초 정도 걸릴 수 있습니다. 출력은 다음과 비슷합니다.

    {
        "response": "\nfor data science in 2023?\n\n**1. Python:**\n- Widely used for data science due to its simplicity, readability, and extensive libraries for data wrangling, analysis, visualization, and machine learning.\n- Popular libraries include pandas, scikit-learn, and matplotlib.\n\n**2. R:**\n- Statistical programming language widely used for data analysis, visualization, and modeling.\n- Popular libraries include ggplot2, dplyr, and caret.\n\n**3. Java:**\n- Enterprise-grade language with strong performance and scalability.\n- Popular libraries include Spark, TensorFlow, and Weka.\n\n**4. C++:**\n- High-performance language often used for data analytics and machine learning models.\n- Popular libraries include TensorFlow, PyTorch, and OpenCV.\n\n**5. SQL:**\n- Relational database language essential for data wrangling and querying large datasets.\n- Popular tools"
    }
    

(선택사항) GRadio 채팅 인터페이스를 통해 모델과 상호작용

이 섹션에서는 명령 조정 모델과 상호작용할 수 있는 웹 채팅 애플리케이션을 빌드합니다.

Gradio는 챗봇용 사용자 인터페이스를 만드는 ChatInterface 래퍼가 있는 Python 라이브러리입니다.

채팅 인터페이스 배포

  1. Cloud Shell에서 다음 매니페스트를 gradio.yaml로 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: gradio
      labels:
        app: gradio
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: gradio
      template:
        metadata:
          labels:
            app: gradio
        spec:
          containers:
          - name: gradio
            image: us-docker.pkg.dev/google-samples/containers/gke/gradio-app:v1.0.3
            resources:
              requests:
                cpu: "512m"
                memory: "512Mi"
              limits:
                cpu: "1"
                memory: "512Mi"
            env:
            - name: CONTEXT_PATH
              value: "/generate"
            - name: HOST
              value: "http://jetstream-http-svc:8000"
            - name: LLM_ENGINE
              value: "max"
            - name: MODEL_ID
              value: "gemma"
            - name: USER_PROMPT
              value: "<start_of_turn>user\nprompt<end_of_turn>\n"
            - name: SYSTEM_PROMPT
              value: "<start_of_turn>model\nprompt<end_of_turn>\n"
            ports:
            - containerPort: 7860
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: gradio
    spec:
      selector:
        app: gradio
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 7860
      type: ClusterIP
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f gradio.yaml
    
  3. 배포를 사용할 수 있을 때까지 기다립니다.

    kubectl wait --for=condition=Available --timeout=300s deployment/gradio
    

채팅 인터페이스 사용

  1. Cloud Shell에서 다음 명령어를 실행합니다.

    kubectl port-forward service/gradio 8080:8080
    

    이렇게 하면 Cloud Shell에서 Gradio 서비스로의 포트 전달이 생성됩니다.

  2. Cloud Shell 작업 표시줄의 오른쪽 상단에 있는 웹 미리보기 아이콘 웹 미리보기 버튼을 클릭합니다. 포트 8080에서 미리보기를 클릭합니다. 브라우저에 새 탭이 열립니다.

  3. GRadio 채팅 인터페이스를 사용하여 Gemma와 상호작용합니다. 프롬프트를 추가하고 제출을 클릭합니다.

문제 해결하기

  • Empty reply from server 메시지가 표시되면 컨테이너에서 모델 데이터 다운로드가 완료되지 않았을 수 있습니다. 모델을 제공할 준비가 되었음을 나타내는 Connected 메시지가 있는지 포드의 로그를 다시 확인합니다.
  • Connection refused가 표시되면 포트 전달이 활성 상태인지 확인합니다.

삭제

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

배포된 리소스 삭제

이 가이드에서 만든 리소스에 대한 Google Cloud 계정에 요금이 청구되지 않도록 하려면 다음 명령어를 실행하고 프롬프트를 따르세요.

gcloud container clusters delete ${CLUSTER_NAME} --region=${REGION}

gcloud iam service-accounts delete wi-jetstream@PROJECT_ID.iam.gserviceaccount.com

gcloud storage rm --recursive gs://BUCKET_NAME

다음 단계