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
그런 다음 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
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를 실행하여 사용 가능한 모든 프로젝트의 목록을 볼 수 있습니다.