Cloud Run GPU와 Open WebUI를 프런트엔드 인그레스 컨테이너로 사용하여 Ollama를 사이드카로 사용하는 방법

1. 소개

개요

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

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

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

이 Codelab에서는 Open WebUI를 프런트엔드 인그레스 컨테이너로 사용하고 사이드카에서 Ollama를 사용하여 Google Cloud Storage 버킷에 저장된 Gemma 2 2B 모델을 제공하는 다중 컨테이너 서비스를 배포합니다.

학습할 내용

  • Cloud Run에서 다중 컨테이너 서비스를 만드는 방법
  • Gemma 2 2B 모델을 제공하는 사이드카로 Ollama를 배포하는 방법
  • Open WebUI를 프런트엔드 인그레스 컨테이너로 배포하는 방법

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

gcloud CLI 업그레이드

먼저 최신 버전의 gcloud CLI가 설치되어 있어야 합니다. 다음 명령어를 실행하여 CLI를 업데이트할 수 있습니다.

gcloud components update

환경 변수 설정

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=us-central1
gcloud config set project $PROJECT_ID

API 사용 설정

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

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

이 Codelab의 디렉터리를 만듭니다.

mkdir ollama-sidecar-codelab
cd ollama-sidecar-codelab

3. Gemma 2 2B 모델을 저장할 GCS 버킷 만들기

먼저 Ollama를 설치하여 모델을 다운로드합니다. 이렇게 하면 모델이 /home/$USER/.ollama/models에 다운로드됩니다.

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

이제 다음을 실행하여 ollama를 실행합니다.

ollama serve

Ollama가 포트 11434에서 수신 대기를 시작합니다.

두 번째 터미널 창을 열어 Gemma 2 2B 모델을 가져옵니다.

ollama pull gemma2:2b

(선택사항) 다음을 실행하여 명령줄에서 Gemma와 상호작용할 수 있습니다.

ollama run gemma2:2b

Gemma와의 채팅이 끝나면 다음을 입력하여 종료할 수 있습니다.

/bye

4. 스토리지 버킷 만들기

이제 모델이 다운로드되었으므로 모델을 GCS 버킷으로 이동할 수 있습니다.

먼저 버킷을 만듭니다.

gcloud storage buckets create gs://$PROJECT_ID-gemma2-2b-codelab

이제 모델 폴더를 GCS로 이동합니다.

gsutil cp -r /home/$USER/.ollama/models gs://$PROJECT_ID-gemma2-2b-codelab

5. Ollama 이미지 만들기

다음 콘텐츠가 포함된 dockerfile을 만듭니다.

FROM --platform=linux/amd64 ollama/ollama

# 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

서비스 이미지를 저장할 Artifact Registry 저장소를 만듭니다.

gcloud artifacts repositories create ollama-sidecar-codelab-repo --repository-format=docker \
    --location=us-central1 --description="Ollama + OpenWebUI website demo" \
    --project=$PROJECT_ID

ollama 사이드카 이미지를 빌드합니다.

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/ollama-gemma-2b \
   --machine-type e2-highcpu-32

6. Open WebUI 프런트엔드 이미지 만들기

이 섹션에서는 Open WebUI를 사용하여 프런트엔드 인그레스 컨테이너를 만듭니다.

docker를 사용하여 Open WebUI 이미지를 가져옵니다.

docker pull ghcr.io/open-webui/open-webui:main

그런 다음 Artifact Registry로 인증하기 위해 Google Cloud 사용자 인증 정보를 사용하도록 Docker를 구성합니다. 이렇게 하면 docker를 사용하여 이미지를 Artifact Registry 저장소로 푸시할 수 있습니다.

gcloud auth configure-docker us-central1-docker.pkg.dev

이미지에 태그를 지정한 후 Artifact Registry로 푸시합니다.

docker tag ghcr.io/open-webui/open-webui:main us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui

docker push us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui

7. Cloud Run에 다중 컨테이너 서비스 배포

yaml 파일을 사용하여 다중 컨테이너 서비스 배포

다음 콘텐츠가 포함된 service.yaml을 만듭니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: ollama-sidecar-codelab
  labels:
    cloud.googleapis.com/location: us-central1
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: '5'
        run.googleapis.com/cpu-throttling: 'false'
        run.googleapis.com/startup-cpu-boost: 'true'
        run.googleapis.com/container-dependencies: '{"openwebui":["ollama-sidecar"]}'
    spec:
      containerConcurrency: 80
      timeoutSeconds: 300
      containers:
      - name: openwebui
        image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/openwebui
        ports:
        - name: http1
          containerPort: 8080
        env:
        - name: OLLAMA_BASE_URL
          value: http://localhost:11434
        - name: WEBUI_AUTH
          value: 'false'
        resources:
          limits:
            memory: 1Gi
            cpu: 2000m
        volumeMounts:
        - name: in-memory-1
          mountPath: /app/backend/data
        startupProbe:
          timeoutSeconds: 240
          periodSeconds: 240
          failureThreshold: 1
          tcpSocket:
            port: 8080
      - name: ollama-sidecar
        image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/ollama-gemma-2b
        env:
          - name: OLLAMA_MODELS
            value: /root/.ollama/models
        resources:
          limits:
            cpu: '6'
            nvidia.com/gpu: '1'
            memory: 16Gi
        volumeMounts:
        - name: gcs-1
          mountPath: /root/.ollama
        startupProbe:
          timeoutSeconds: 1
          periodSeconds: 10
          failureThreshold: 3
          tcpSocket:
            port: 11434
      volumes:
      - name: gcs-1
        csi:
          driver: gcsfuse.run.googleapis.com
          volumeAttributes:
            bucketName: YOUR_PROJECT_ID-gemma2-2b-codelab
      - name: in-memory-1
        emptyDir:
          medium: Memory
          sizeLimit: 10Gi
      nodeSelector:
        run.googleapis.com/accelerator: nvidia-l4

service.yaml을 업데이트하여 PROJECT_ID를 프로젝트 ID로 바꿉니다.

sed -i "s/YOUR_PROJECT_ID/${PROJECT_ID}/g" service.yaml

다음 명령어를 사용하여 Cloud Run에 배포합니다.

gcloud beta run services replace service.yaml

Cloud Run 서비스 테스트

이제 웹브라우저에서 서비스 URL을 엽니다.

UI 로드가 완료되면 모델 선택에서 Gemma 2 2B를 선택합니다.

이제 Gemma에게 '하늘이 파란 이유는 무엇인가요?'와 같은 질문을 합니다.

8. 축하합니다.

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

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

학습한 내용

  • Cloud Run에서 다중 컨테이너 서비스를 만드는 방법
  • Gemma 2 2B 모델을 제공하는 사이드카로 Ollama를 배포하는 방법
  • Open WebUI를 프런트엔드 인그레스 컨테이너로 배포하는 방법

9. 삭제

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

Cloud Run 함수를 삭제하려면 https://console.cloud.google.com/run에서 Cloud Run Cloud Console로 이동하여 ollama-sidecar-codelab 서비스를 삭제합니다.

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