vLLM을 사용하여 GKE에서 TPU Trillium을 사용하는 LLM 제공


이 튜토리얼에서는 vLLM 제공 프레임워크와 함께 Google Kubernetes Engine (GKE)에서 Tensor Processing Unit (TPU)을 사용하여 대규모 언어 모델 (LLM)을 제공하는 방법을 보여줍니다. 이 튜토리얼에서는 Llama 3.1 70b를 제공하고, TPU Trillium을 사용하고, vLLM 서버 측정항목을 사용하여 수평형 포드 자동 확장을 설정합니다.

이 문서는 AI/ML 워크로드를 배포하고 서빙할 때 관리형 Kubernetes의 세밀한 제어, 확장성, 복원력, 이동성, 비용 효율성이 필요한 경우 좋은 출발점이 될 수 있습니다.

배경

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

TPU Trillium

TPU는 Google에서 맞춤 개발한 ASIC(애플리케이션 특정 통합 회로)입니다. TPU는 TensorFlow, PyTorch, JAX와 같은 프레임워크를 사용하여 빌드된 머신러닝 및 AI 모델을 가속화하는 데 사용됩니다. 이 튜토리얼에서는 Google의 6세대 TPU인 TPU Trillium을 사용합니다.

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

  1. TPU Trillium 시스템 아키텍처에 대해 알아보세요.
  2. GKE의 TPU 알아보기

vLLM

vLLM은 LLM을 제공하기 위해 고도로 최적화된 오픈소스 프레임워크입니다. vLLM은 다음과 같은 기능을 통해 GPU의 제공 처리량을 늘릴 수 있습니다.

  • PagedAttention을 사용한 최적화된 Transformer 구현
  • 전체 제공 처리량을 개선하기 위한 연속적인 작업 일괄 처리
  • 여러 TPU에서 텐서 동시 로드 및 분산 제공

자세한 내용은 vLLM 문서를 참고하세요.

Cloud Storage FUSE

Cloud Storage FUSE는 객체 스토리지 버킷에 있는 모델 가중치에 대해 GKE 클러스터에서 Cloud Storage에 대한 액세스를 제공합니다. 이 튜토리얼에서는 생성된 Cloud Storage 버킷이 처음에는 비어 있습니다. vLLM이 시작되면 GKE는 Hugging Face에서 모델을 다운로드하고 가중치를 Cloud Storage 버킷에 캐시합니다. 포드 재시작 또는 배포 확장 시 후속 모델 로드는 Cloud Storage 버킷에서 캐시된 데이터를 다운로드하여 최적의 성능을 위해 동시 다운로드를 활용합니다.

자세한 내용은 Cloud Storage FUSE CSI 드라이버 문서를 참고하세요.

목표

이 튜토리얼은 LLM 서빙을 위해 GKE 조정 기능을 사용하려는 MLOps 또는 DevOps 엔지니어나 플랫폼 관리자를 대상으로 합니다.

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

  1. 모델 특성에 따라 권장 TPU Trillium 토폴로지를 사용하여 GKE 클러스터를 만듭니다.
  2. 클러스터의 노드 풀에 vLLM 프레임워크를 배포합니다.
  3. vLLM 프레임워크를 사용하여 부하 분산기를 통해 Llama 3.1 70b를 제공합니다.
  4. vLLM 서버 측정항목을 사용하여 수평형 포드 자동 확장을 설정합니다.
  5. 모델을 제공합니다.

시작하기 전에

  • 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, roles/iam.securityAdmin, roles/artifactregistry.writer, roles/container.clusterAdmin

    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. 저장을 클릭합니다.

환경 준비

이 섹션에서는 vLLM 및 모델을 배포하는 데 필요한 리소스를 프로비저닝합니다.

모델 액세스 권한 얻기

Hugging Face 저장소에서 Llama 3.1 70b를 사용하려면 동의 계약에 서명해야 합니다.

액세스 토큰 생성

토큰이 없는 경우 새 Hugging Face 토큰을 생성합니다.

  1. 내 프로필 > 설정 > 액세스 토큰을 클릭합니다.
  2. 새 토큰을 선택합니다.
  3. 원하는 이름과 Read 이상의 역할을 지정합니다.
  4. 토큰 생성을 선택합니다.

Cloud Shell 실행

이 튜토리얼에서는 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 PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") && \
    export CLUSTER_NAME=CLUSTER_NAME && \
    export ZONE=ZONE && \
    export HF_TOKEN=HUGGING_FACE_TOKEN && \
    export CLUSTER_VERSION=CLUSTER_VERSION && \
    export GSBUCKET=GSBUCKET && \
    export KSA_NAME=KSA_NAME && \
    export NAMESPACE=NAMESPACE \
    export IMAGE_NAME=IMAGE_NAME
    

    다음 값을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • CLUSTER_NAME: GKE 클러스터의 이름입니다.
    • ZONE: TPU Trillium (v6e)을 지원하는 영역입니다.
    • CLUSTER_VERSION: 사용하려는 머신 유형을 지원해야 하는 GKE 버전입니다. 기본 GKE 버전은 대상 TPU에 대한 가용성이 없을 수 있습니다. TPU Trillium은 GKE 버전 1.31.2-gke.1115000 이상에서 지원됩니다.
    • GSBUCKET: Cloud Storage FUSE에 사용할 Cloud Storage 버킷의 이름입니다.
    • KSA_NAME: Cloud Storage 버킷에 액세스하는 데 사용되는 Kubernetes ServiceAccount의 이름입니다. Cloud Storage FUSE가 작동하려면 버킷 액세스가 필요합니다.
    • NAMESPACE: vLLM 애셋을 배포할 Kubernetes 네임스페이스입니다.
    • IMAGE_NAME: vLLM TPU 이미지입니다. 공개 이미지 docker.io/vllm/vllm-tpu:2e33fe419186c65a18da6668972d61d7bbc31564를 사용하거나 자체 이미지를 빌드할 수 있습니다.

GKE 클러스터 만들기

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

Autopilot

  1. GKE Autopilot 클러스터를 만듭니다.

    gcloud container clusters create-auto CLUSTER_NAME \
        --cluster-version=CLUSTER_VERSION
    

    PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.

스탠더드

  1. GKE Standard 클러스터를 만듭니다.

    gcloud container clusters create CLUSTER_NAME \
        --project=PROJECT_ID \
        --zone=ZONE \
        --cluster-version=CLUSTER_VERSION \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --addons GcsFuseCsiDriver
    
  2. TPU 슬라이스 노드 풀을 만듭니다.

    gcloud container node-pools create tpunodepool \
        --zone=ZONE \
        --num-nodes=1 \
        --machine-type=ct6e-standard-8t \
        --cluster=CLUSTER_NAME \
        --enable-autoscaling --total-min-nodes=1 --total-max-nodes=2
    

    GKE는 LLM에 다음 리소스를 만듭니다.

클러스터와 통신하도록 kubectl 구성

클러스터와 통신하도록 kubectl을 구성하려면 다음 명령어를 실행합니다.

  gcloud container clusters get-credentials CLUSTER_NAME --location=ZONE

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

  1. 네임스페이스를 만듭니다. default 네임스페이스를 사용하는 경우 이 단계를 건너뛰어도 됩니다.

    kubectl create namespace NAMESPACE
    
  2. Hugging Face 토큰이 포함된 Kubernetes 보안 비밀을 만들려면 다음 명령어를 실행합니다.

    kubectl create secret generic hf-secret \
        --from-literal=hf_api_token=HUGGING_FACE_TOKEN \
        --namespace NAMESPACE
    

Cloud Storage 버킷 만들기

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

gcloud storage buckets create gs://GSBUCKET \
    --uniform-bucket-level-access

이렇게 하면 Hugging Face에서 다운로드한 모델 파일을 저장할 Cloud Storage 버킷이 생성됩니다.

버킷에 액세스할 Kubernetes ServiceAccount 설정

  1. Kubernetes ServiceAccount를 만듭니다.

    kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
    
  2. Cloud Storage 버킷에 액세스할 수 있도록 Kubernetes ServiceAccount에 읽기/쓰기 액세스 권한을 부여합니다.

    gcloud storage buckets add-iam-policy-binding gs://GSBUCKET \
      --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
      --role "roles/storage.objectUser"
    
  3. 또는 프로젝트의 모든 Cloud Storage 버킷에 대한 읽기 및 쓰기 액세스 권한을 부여할 수 있습니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
    --role "roles/storage.objectUser"
    

    GKE는 LLM에 다음 리소스를 만듭니다.

    1. 다운로드된 모델과 컴파일 캐시를 저장할 Cloud Storage 버킷 Cloud Storage FUSE CSI 드라이버가 버킷의 콘텐츠를 읽습니다.
    2. 파일 캐싱이 사용 설정된 볼륨 및 Cloud Storage FUSE의 병렬 다운로드 기능
    권장사항:

    가중치 파일과 같이 모델 콘텐츠의 예상 크기에 따라 tmpfs 또는 Hyperdisk / Persistent Disk로 지원되는 파일 캐시를 사용합니다. 이 튜토리얼에서는 RAM으로 지원되는 Cloud Storage FUSE 파일 캐시를 사용합니다.

(선택사항) TPU 이미지 빌드 및 배포

Docker 이미지의 콘텐츠를 더 세부적으로 제어해야 하는 경우 이 옵션을 선택합니다.

vLLM 서버를 컨테이너화합니다.

  1. vLLM 저장소를 클론하고 이미지를 빌드합니다.

    git clone https://github.com/vllm-project/vllm && cd vllm && git reset --hard 2e33fe419186c65a18da6668972d61d7bbc31564 && docker build -f Dockerfile.tpu . -t vllm-tpu
    
  2. 이미지를 Artifact Registry로 내보냅니다.

    gcloud artifacts repositories create vllm-tpu --repository-format=docker --location=REGION_NAME && \
    gcloud auth configure-docker REGION_NAME-docker.pkg.dev && \
    docker image tag vllm-tpu REGION_NAME-docker.pkg.dev/PROJECT_ID/vllm-tpu/vllm-tpu:latest && \
    docker push REGION_NAME-docker.pkg.dev/PROJECT_ID/vllm-tpu/vllm-tpu:latest
    

vLLM 모델 서버 배포

vLLM 모델 서버를 배포하려면 다음 단계를 따르세요.

  1. vllm-llama3-70b.yaml로 저장된 배포 매니페스트를 검사합니다. 배포는 클러스터의 노드 간에 분산된 포드의 여러 복제본을 실행할 수 있는 Kubernetes API 객체입니다.

    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vllm-tpu
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vllm-tpu
      template:
        metadata:
          labels:
            app: vllm-tpu
          annotations:
            gke-gcsfuse/volumes: "true"
            gke-gcsfuse/cpu-limit: "0"
            gke-gcsfuse/memory-limit: "0"
            gke-gcsfuse/ephemeral-storage-limit: "0"
        spec:
          serviceAccountName: KSA_NAME
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
          containers:
          - name: vllm-tpu
            image: IMAGE_NAME
            command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
            args:
            - --host=0.0.0.0
            - --port=8000
            - --tensor-parallel-size=8
            - --max-model-len=8192
            - --model=meta-llama/Meta-Llama-3.1-70B
            - --download-dir=/data
            env: 
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_api_token
            - name: VLLM_XLA_CACHE_PATH
              value: "/data"
            ports:
            - containerPort: 8000
            resources:
              limits:
                google.com/tpu: 8
            readinessProbe:
              tcpSocket:
                port: 8000
              initialDelaySeconds: 15
              periodSeconds: 10
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
            - name: dshm
              mountPath: /dev/shm
          volumes:
          - name: gke-gcsfuse-cache
            emptyDir:
              medium: Memory
          - name: dshm
            emptyDir:
              medium: Memory
          - name: gcs-fuse-csi-ephemeral
            csi:
              driver: gcsfuse.csi.storage.gke.io
              volumeAttributes:
                bucketName: GSBUCKET
                mountOptions: "implicit-dirs,file-cache:enable-parallel-downloads:true,file-cache:parallel-downloads-per-file:100,file-cache:max-parallel-downloads:-1,file-cache:download-chunk-size-mb:10,file-cache:max-size-mb:-1"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: vllm-service
    spec:
      selector:
        app: vllm-tpu
      type: LoadBalancer	
      ports:
        - name: http
          protocol: TCP
          port: 8000  
          targetPort: 8000
    
  2. 다음 명령어를 실행하여 매니페스트를 적용합니다.

    kubectl apply -f vllm-llama3-70b.yaml -n NAMESPACE
    
  3. 실행 중인 모델 서버의 로그를 봅니다.

    kubectl logs -f -l app=vllm-tpu -n NAMESPACE
    

    출력은 다음과 비슷하게 표시됩니다.

    INFO:     Started server process [1]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
    

모델 제공

  1. 다음 명령어를 실행하여 서비스의 외부 IP 주소를 가져옵니다.

    export vllm_service=$(kubectl get service vllm-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  2. 새 터미널에서 curl을 사용하여 모델과 상호작용합니다.

    curl http://$vllm_service:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "meta-llama/Meta-Llama-3.1-70B",
        "prompt": "San Francisco is a",
        "max_tokens": 7,
        "temperature": 0
    }'
    

    출력은 다음과 비슷하게 표시됩니다.

    {"id":"cmpl-6b4bb29482494ab88408d537da1e608f","object":"text_completion","created":1727822657,"model":"meta-llama/Meta-Llama-3-8B","choices":[{"index":0,"text":" top holiday destination featuring scenic beauty and","logprobs":null,"finish_reason":"length","stop_reason":null,"prompt_logprobs":null}],"usage":{"prompt_tokens":5,"total_tokens":12,"completion_tokens":7}}
    

맞춤 자동 확장 처리 설정

이 섹션에서는 맞춤 Prometheus 측정항목을 사용하여 수평형 포드 자동 확장을 설정합니다. vLLM 서버의 Google Cloud Managed Service for Prometheus 측정항목을 사용합니다.

자세한 내용은 Google Cloud Managed Service for Prometheus를 참고하세요. 이는 GKE 클러스터에서 기본적으로 사용 설정되어야 합니다.

  1. 클러스터에서 커스텀 측정항목 Stackdriver 어댑터를 설정합니다.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  2. 커스텀 측정항목 Stackdriver 어댑터가 사용하는 서비스 계정에 모니터링 보기 권한 사용자 역할을 추가합니다.

    gcloud projects add-iam-policy-binding projects/PROJECT_ID \
        --role roles/monitoring.viewer \
        --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter
    
  3. 다음 매니페스트를 vllm_pod_monitor.yaml로 저장합니다.

    
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
     name: vllm-pod-monitoring
    spec:
     selector:
       matchLabels:
         app: vllm-tpu
     endpoints:
     - path: /metrics
       port: 8000
       interval: 15s
    
  4. 클러스터에 적용합니다.

    kubectl apply -f vllm_pod_monitor.yaml
    

vLLM 엔드포인트에 부하 생성

vLLM 서버에 부하를 만들어 GKE가 커스텀 vLLM 측정항목으로 자동 확장되는 방식을 테스트합니다.

  1. bash 스크립트 (load.sh)를 실행하여 vLLM 엔드포인트에 N개의 동시 요청을 전송합니다.

    #!/bin/bash
    N=PARALLEL_PROCESSES
    export vllm_service=$(kubectl get service vllm-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    for i in $(seq 1 $N); do
      while true; do
        curl http://$vllm_service:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "meta-llama/Meta-Llama-3.1-70B", "prompt": "Write a story about san francisco", "max_tokens": 100, "temperature": 0}'
      done &  # Run in the background
    done
    wait
    

    PARALLEL_PROCESSES를 실행하려는 동시 프로세스 수로 바꿉니다.

  2. bash 스크립트를 실행합니다.

    nohup ./load.sh &
    

Google Cloud Managed Service for Prometheus가 측정항목을 처리하는지 확인

Google Cloud Managed Service for Prometheus에서 측정항목을 스크래핑하고 vLLM 엔드포인트에 부하를 추가하면 Cloud Monitoring에서 측정항목을 볼 수 있습니다.

  1. Google Cloud 콘솔에서 측정항목 탐색기 페이지로 이동합니다.

    측정항목 탐색기로 이동

  2. < > PromQL을 클릭합니다.

  3. 트래픽 측정항목을 관찰하려면 다음 쿼리를 입력합니다.

    vllm:avg_generation_throughput_toks_per_s{cluster='CLUSTER_NAME_HERE'}
    

선 그래프에서 vLLM 측정항목은 0 (로드 전)에서 값(로드 후)으로 확장됩니다. 이 그래프는 vLLM 측정항목이 Google Cloud Managed Service for Prometheus로 처리되고 있음을 확인합니다.

다음 이미지는 로드 스크립트 실행 후 그래프의 예입니다. 이 경우 모델 서버는 초당 약 2,000개의 생성 토큰을 제공합니다.

테스트

수평형 포드 자동 확장 처리 구성 배포

자동 확장할 측정항목을 결정할 때 vLLM TPU의 경우 다음 측정항목을 사용하는 것이 좋습니다.

  • num_requests_waiting: 이 측정항목은 모델 서버의 대기열에 있는 요청 수와 관련이 있습니다. 이 숫자는 kv 캐시가 가득 차면 눈에 띄게 증가하기 시작합니다.

  • gpu_cache_usage_perc: 이 측정항목은 kv 캐시 사용량과 관련이 있으며, 이는 모델 서버에서 특정 추론 주기에 대해 처리되는 요청 수와 직접적인 연관이 있습니다. 이 측정항목은 GPU 이름 지정 스키마에 연결되어 있지만 GPU와 TPU에서 동일하게 작동합니다.

처리량과 비용을 최적화할 때 및 모델 서버의 최대 처리량으로 지연 시간 목표를 달성할 수 있는 경우 num_requests_waiting를 사용하는 것이 좋습니다.

대기열 기반 확장이 요구사항을 충족하기에 충분히 빠르지 않은 지연 시간에 민감한 워크로드가 있는 경우 gpu_cache_usage_perc를 사용하는 것이 좋습니다.

자세한 내용은 TPU를 사용하여 대규모 언어 모델 (LLM) 추론 워크로드를 자동 확장하기 위한 권장사항을 참고하세요.

HPA 구성의 averageValue 타겟을 선택할 때는 실험적으로 결정해야 합니다. 이 부분을 최적화하는 방법에 관한 추가 아이디어는 GPU 절약: GKE 추론 워크로드의 스마트 자동 확장 블로그 게시물을 참고하세요. 이 블로그 게시물에서 사용된 profile-generator는 vLLM TPU에서도 작동합니다.

num_requests_waiting을 사용하여 수평형 포드 자동 확장 구성을 배포하려면 다음 단계를 따르세요.

  1. 다음 매니페스트를 vllm-hpa.yaml로 저장합니다.

    
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
     name: vllm-hpa
    spec:
     scaleTargetRef:
       apiVersion: apps/v1
       kind: Deployment
       name: vllm-tpu
     minReplicas: 1
     maxReplicas: 2
     metrics:
       - type: Pods
         pods:
           metric:
             name: prometheus.googleapis.com|vllm:num_requests_waiting|gauge
           target:
             type: AverageValue
             averageValue: 10
    

    Google Cloud Managed Service for Prometheus의 vLLM 측정항목은 vllm:metric_name 형식을 따릅니다.

    권장사항:

    처리량 확장에는 num_requests_waiting을 사용하세요. 지연 시간에 민감한 TPU 사용 사례에는 gpu_cache_usage_perc를 사용하세요.

  2. 수평형 포드 자동 확장 처리 구성을 배포합니다.

    kubectl apply -f vllm-hpa.yaml
    

    GKE는 배포할 다른 포드를 예약하고, 이로 인해 노드 풀 자동 확장 처리가 트리거되어 두 번째 vLLM 복제본을 배포하기 전에 두 번째 노드를 추가합니다.

  3. 포드 자동 확장 진행 상황을 확인합니다.

    kubectl get hpa --watch
    

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

    NAME       REFERENCE             TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    vllm-hpa   Deployment/vllm-tpu   <unknown>/5   1         2         0          6s
    vllm-hpa   Deployment/vllm-tpu   34972m/5      1         2         1          16s
    vllm-hpa   Deployment/vllm-tpu   25112m/5      1         2         2          31s
    vllm-hpa   Deployment/vllm-tpu   35301m/5      1         2         2          46s
    vllm-hpa   Deployment/vllm-tpu   25098m/5      1         2         2          62s
    vllm-hpa   Deployment/vllm-tpu   35348m/5      1         2         2          77s
    
  4. 10분 정도 기다린 후 Google Cloud Managed Service for Prometheus에서 측정항목을 처리하는지 확인 섹션의 단계를 반복합니다. Google Cloud Managed Service for Prometheus는 두 vLLM 엔드포인트의 측정항목을 처리합니다.

test2

삭제

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

배포된 리소스 삭제

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

ps -ef | grep load.sh | awk '{print $2}' | xargs -n1 kill -9
gcloud container clusters delete CLUSTER_NAME \
  --location=ZONE

다음 단계