RTX 6000 Pro GPU를 사용하여 Cloud Run에서 Gemma 모델을 사용하여 추론 실행

1. 소개

개요

학습할 내용

  • Cloud Run RTX 6000 Pro GPU에 Gemma 모델을 배포하는 방법
  • 컨테이너 시작 시 Cloud Storage에서 모델을 동시에 다운로드하는 방법

2. 설정 및 요구사항

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

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

이 Codelab에 필요한 API 사용 설정

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

Codelab 폴더 만들기

mkdir codelab-rtx
cd codelab-rtx

Cloud Storage에서 ML 모델 로드를 최적화하려면 서브넷에 비공개 Google 액세스를 사용 설정하세요. Cloud Storage에서 모델 로드에 관한 GPU 권장사항 문서 섹션에서 자세히 알아보세요.

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. Cloud Storage 설정

먼저 모델 가중치를 저장할 Cloud Storage 버킷을 만듭니다.

고유한 버킷 만들기

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. 모델 가중치 가져오기

그런 다음 Gemma 3 모델을 로컬 디렉터리에 다운로드한 후 Cloud Storage 버킷에 업로드합니다.

Ollama 설치

다음 명령어를 실행하여 Ollama를 설치할 수 있습니다.

curl -fsSL https://ollama.com/install.sh | sh

모델 다운로드

다운로드한 모델의 디렉터리를 만듭니다.

mkdir model-weights

이 프로세스에서는 두 개의 터미널 탭을 사용합니다. 하나는 Ollama 서버를 실행하는 데 사용하고 다른 하나는 모델을 가져오는 데 사용합니다.

터미널 1 (서버):

다운로드한 모델의 위치를 전달하여 서버를 시작합니다. 이 명령어는 계속 실행됩니다.

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

터미널 2 (클라이언트): 새 터미널 탭을 열고 모델을 다운로드합니다. 클라이언트는 실행 중인 서버와 자동으로 통신합니다.

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

터미널 1로 돌아가기: 터미널 2의 다운로드가 완료되면 터미널 1로 돌아가 Ctrl+C를 눌러 서버를 중지합니다.

Cloud Storage에 업로드

이제 가중치를 버킷에 업로드합니다. gcloud storage는 속도를 높이기 위해 병렬 업로드를 자동으로 처리합니다.

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(선택사항) 로컬 가중치 정리

이제 모델이 Cloud Storage에 있으므로 로컬 복사본을 삭제합니다.

rm -rf model-weights

5. 서비스 만들기

먼저 서비스의 폴더를 만듭니다.

mkdir rtx-service
cd rtx-service

다음 콘텐츠로 Dockerfile을 만듭니다.

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Listen on all interfaces, port 11434
ENV OLLAMA_HOST 0.0.0.0:11434

# Store model weight files in /models
ENV OLLAMA_MODELS /models

# Reduce logging verbosity
ENV OLLAMA_DEBUG false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE -1

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

다음 콘텐츠로 entrypoint.sh이라는 파일을 만듭니다.

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. Cloud Run에 배포

이 섹션에서는 gcloud run deploy를 사용하여 서비스를 배포합니다. 이 명령어는 소스에서 컨테이너를 빌드하고 필요한 GPU 및 네트워크 구성으로 Cloud Run에 배포합니다.

서비스 계정 만들기

이 애플리케이션의 전용 서비스 계정을 만들고 필요한 권한만 부여합니다.

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

네트워크 구성

대규모 모델을 다운로드할 때 최적의 성능을 얻으려면 직접 VPC 이그레스를 사용하세요. 이렇게 하면 컨테이너가 공개 인터넷과 NAT 게이트웨이를 우회하여 Google 비공개 네트워크를 통해 Cloud Storage에 액세스할 수 있습니다. gcloud run deploy 명령어에는 다음 플래그가 사용됩니다.

  • --network: default VPC에 연결됩니다 (이 네트워크가 존재하고 비공개 Google 액세스가 사용 설정된 리전에 서브넷이 있는지 확인).
  • --subnet: 리전의 특정 서브넷입니다 (기본 네트워크를 사용하는 경우 일반적으로 default).
  • --vpc-egress: 모든 이그레스 트래픽이 VPC를 통과하도록 강제하려면 all-traffic로 설정합니다.

배포 명령어

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

7. 서비스 테스트

배포 후 Ollama API를 사용하여 Gemma 3 모델과 상호작용할 수 있습니다.

서비스 URL 가져오기

배포된 Cloud Run 서비스의 URL을 가져옵니다.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

추론 실행

curl를 사용하여 모델에 프롬프트를 보냅니다. "stream": false를 설정하여 단일 JSON 객체로 전체 응답을 가져오고 jq를 사용하여 텍스트만 추출할 수 있습니다.

참고: 더 큰 모델(예: gemma3:27b)을 사용하는 경우 아래의 JSON에서 모델 이름을 변경해야 합니다.

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. 축하합니다.

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

Cloud Run 문서를 검토하는 것이 좋습니다.

학습한 내용

  • Cloud Run RTX 6000 Pro GPU에 Gemma 모델을 배포하는 방법
  • 컨테이너 시작 시 Cloud Storage에서 모델을 동시에 다운로드하는 방법

9. 삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 프로젝트를 삭제하거나 개별 리소스를 삭제하면 됩니다.

옵션 1: 리소스 삭제

Cloud Run 서비스 삭제

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

서비스 계정 삭제

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

Cloud Storage 버킷 삭제

gcloud storage rm --recursive gs://$MODEL_BUCKET

컨테이너 이미지 삭제

이 빌드에서는 Artifact Registry에 컨테이너 이미지를 만들었습니다. 이미지 이름을 찾아 삭제할 수 있습니다.

이미지를 나열하여 정확한 이름을 찾습니다 (일반적으로 gcr.io/PROJECT_ID/SERVICE_NAME).

gcloud container images list --filter="name:$SERVICE_NAME"

이미지를 삭제합니다 (IMAGE_NAME을 위의 결과로 대체).

gcloud container images delete <IMAGE_NAME> --force-delete-tags

옵션 2: 프로젝트 삭제

전체 프로젝트를 삭제하려면 리소스 관리로 이동하여 2단계에서 만든 프로젝트를 선택하고 삭제를 선택합니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list를 실행하여 사용 가능한 모든 프로젝트의 목록을 볼 수 있습니다.