vLLM 및 OpenAI Python SDK를 사용하여 Cloud Run GPU에서 LLM 추론을 실행하는 방법을 알아봅니다.

1. 소개

개요

Cloud Run에 최근 GPU 지원이 추가되었습니다. 대기자 명단에 등록된 공개 미리보기로 제공됩니다. 기능을 사용해 보고 싶다면 이 양식을 작성하여 대기자 명단에 등록하세요. Cloud Run은 Google Cloud의 컨테이너 플랫폼으로, 클러스터를 관리할 필요 없이 컨테이너에서 코드를 간단하게 실행할 수 있습니다.

현재 Google에서 제공하는 GPU는 vRAM 24GB가 장착된 Nvidia L4 GPU입니다. Cloud Run 인스턴스당 GPU가 하나씩 있으며 Cloud Run 자동 확장은 계속 적용됩니다. 여기에는 최대 5개의 인스턴스를 수평 확장 (할당량 증가 가능)하거나 요청이 없을 때 인스턴스 0개로 축소하는 것이 포함됩니다.

GPU의 한 가지 사용 사례는 자체 개방형 대규모 언어 모델 (LLM)을 실행하는 것입니다. 이 튜토리얼에서는 LLM을 실행하는 서비스를 배포하는 방법을 설명합니다.

이 서비스는 프로덕션 시스템용 추론 엔진인 vLLM을 실행하는 백엔드 서비스입니다. 이 Codelab에서는 20억 개의 매개변수 명령 조정 모델을 갖춘 Google의 Gemma 2를 사용합니다.

학습할 내용

  • Cloud Run에서 GPU를 사용하는 방법을 알아봅니다.
  • Hugging Face를 사용하여 모델을 가져오는 방법
  • vLLM을 추론 엔진으로 사용하여 Cloud Run에 Google의 Gemma 2 2b 명령 조정 모델을 배포하는 방법입니다.
  • 백엔드 서비스를 호출하여 문장을 완성하는 방법

2. 설정 및 요구사항

기본 요건

  • Cloud 콘솔에 로그인했습니다.
  • 이전에 Cloud Run 서비스를 배포했습니다. 예를 들어 소스 코드에서 웹 서비스 배포 빠른 시작의 안내에 따라 시작할 수 있습니다.
  • Hugging Face 계정이 있고 https://huggingface.co/google/gemma-2-2b-it에서 Gemma 2 2b 라이선스를 확인함 그렇지 않으면 모델을 다운로드할 수 없습니다.
  • google/gemma-2-2b-it 모델에 대한 액세스 권한이 있는 액세스 토큰을 생성했습니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화d1264ca30785e435.png를 클릭합니다.

cb81e7c8e34bc8d.png

Cloud Shell을 처음 시작하는 경우에는 무엇이 있는지 설명하는 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.

d95252b003979716.png

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

7833d5e1c5d18f54.png

가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저를 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 자신의 프로젝트 ID로 설정된 것을 확인할 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 결과

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

3. API 사용 설정 및 환경 변수 설정

API 사용 설정

이 Codelab을 사용하기 전에 먼저 사용 설정해야 하는 API가 몇 가지 있습니다. 이 Codelab에서는 다음 API를 사용해야 합니다. 다음 명령어를 실행하여 이러한 API를 사용 설정할 수 있습니다.

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

환경 변수 설정

이 Codelab 전체에서 사용할 환경 변수를 설정할 수 있습니다.

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=us-central1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

4. 서비스 계정 만들기

이 서비스 계정은 Cloud Run 서비스를 빌드하고 Secret Manager의 보안 비밀에 액세스하는 데 사용됩니다.

먼저 다음 명령어를 실행하여 서비스 계정을 만듭니다.

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secrete manager"

둘째, 서비스 계정에 Vertex AI 사용자 역할을 부여합니다.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

이제 Secret Manager에서 Hugging Face 액세스 토큰에 사용할 HF_TOKEN이라는 보안 비밀을 만듭니다. Cloud Build는 서비스 계정을 사용하여 빌드 시 이 보안 비밀에 액세스하여 Hugging Face에서 Gemma 2 (2B) 모델을 가져옵니다. 여기에서 보안 비밀 및 Cloud Build에 대해 자세히 알아볼 수 있습니다.

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

Secret Manager의 HF_TOKEN 보안 비밀에 대한 액세스 권한을 서비스 계정에 부여합니다.

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role='roles/secretmanager.secretAccessor'

5. Artifact Registry에서 이미지 만들기

먼저 Artifact Registry에서 저장소를 만듭니다.

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location us-central1

다음으로 Secret Manager의 보안 비밀을 통합할 Dockerfile를 만듭니다. Docker buildx –secrets 플래그에 대해 자세히 알아보세요.

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

이제 cloudbuild.yaml 파일 만들기

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

마지막으로 빌드를 제출합니다.

gcloud builds submit --config=cloudbuild.yaml

빌드 시간은 약 8분입니다.

6. 서비스 배포

이제 이미지를 Cloud Run에 배포할 준비가 되었습니다.

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

배포하는 데 최대 5분이 걸릴 수 있습니다.

7. 서비스 테스트

배포되면 ID 토큰을 자동으로 추가하는 Cloud Run 개발자 프록시 서비스를 사용하거나 직접 서비스 URL에 curl을 사용할 수 있습니다.

Cloud Run 개발자 프록시 서비스 사용

Cloud Run 개발자 프록시 서비스를 사용하려면 다음 단계를 따르세요.

먼저 다음 명령어를 실행합니다.

gcloud run services proxy $SERVICE_NAME --region us-central1

그런 다음 서비스의 curl을 실행합니다.

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

서비스 URL 직접 사용

먼저 배포된 서비스의 URL을 검색합니다.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

서비스 컬링

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

결과

다음과 비슷한 결과가 표시됩니다.

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. 축하합니다.

축하합니다. Codelab을 완료했습니다.

Cloud Run 문서를 검토하시기 바랍니다.

학습한 내용

  • Cloud Run에서 GPU를 사용하는 방법을 알아봅니다.
  • Hugging Face를 사용하여 모델을 가져오는 방법
  • vLLM을 추론 엔진으로 사용하여 Cloud Run에 Google의 Gemma 2 (2B) 모델을 배포하는 방법입니다.
  • 백엔드 서비스를 호출하여 문장을 완성하는 방법

9. 삭제

Cloud Run 서비스가 무료 등급의 월별 Cloud Run 호출 할당보다 실수로 더 많이 호출되는 경우 실수로 인한 요금이 청구되지 않도록 하려면 Cloud Run을 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.

Cloud Run 서비스를 삭제하려면 Cloud Run Cloud 콘솔(https://console.cloud.google.com/run)으로 이동하여 vllm-gemma-2-2b 서비스를 삭제합니다. vllm-gemma-2-2b 서비스 계정을 삭제할 수도 있습니다.

전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택한 후 삭제를 선택하면 됩니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하면 사용 가능한 모든 프로젝트의 목록을 볼 수 있습니다.