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

1. 소개

개요

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

현재 제공되는 GPU는 24GB의 vRAM이 있는 Nvidia L4 GPU입니다. Cloud Run 인스턴스당 GPU는 1개이며 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

Gemini와 채팅을 마치면 다음을 입력하여 종료할 수 있습니다.

/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. 올라마 이미지 만들기

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

FROM 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 

# Store the model weights in the container image
ENV MODEL gemma2:2b
RUN ollama serve & sleep 5 && ollama pull $MODEL 

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

서비스 이미지를 저장할 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

그런 다음 Google Cloud 사용자 인증 정보를 사용하여 Artifact Registry에 인증하도록 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
        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를 선택합니다.

이제 젬마에게 다음과 같이 질문합니다. "하늘은 왜 파랗지?"

8. 축하합니다.

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

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

학습한 내용

  • 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 콘솔로 이동하여 ollama-sidecar-codelab 서비스를 삭제합니다.

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