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