Uruchamianie wnioskowania przy użyciu modelu Gemma w Cloud Run z procesorem graficznym RTX 6000 Pro

1. Wprowadzenie

Przegląd

Czego się nauczysz

  • Wdrażanie modelu Gemma na GPU RTX 6000 Pro w Cloud Run
  • Jak pobrać model z Cloud Storage równolegle podczas uruchamiania kontenera

2. Konfiguracja i wymagania

Ustaw zmienne środowiskowe, które będą używane w tym module:

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

Włączanie interfejsów API potrzebnych w tym ćwiczeniu z programowania

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

Tworzenie folderu z ćwiczeniami z programowania

mkdir codelab-rtx
cd codelab-rtx

Włącz prywatny dostęp do Google w podsieci, aby zoptymalizować wczytywanie modeli ML z Cloud Storage. Więcej informacji znajdziesz w sekcji dokumentu dotyczącego sprawdzonych metod korzystania z procesorów graficznych na temat wczytywania modeli z Cloud Storage.

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

3. Konfigurowanie Cloud Storage

Najpierw utwórz zasobnik Cloud Storage, w którym będą przechowywane wagi modelu.

Tworzenie unikalnego zasobnika

# 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. Pobieranie wag modelu

Następnie pobierz model Gemma 3 do katalogu lokalnego i prześlij go do zasobnika Cloud Storage.

Instalowanie Ollamy

Aby zainstalować Ollamę, możesz uruchomić to polecenie:

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

Pobierz model

Utwórz katalog dla pobranego modelu.

mkdir model-weights

W tym procesie użyjesz 2 kart terminala: jednej do uruchomienia serwera Ollama i drugiej do pobrania modelu.

Terminal 1 (serwer):

Uruchom serwer, przekazując lokalizację pobranego modelu. To polecenie będzie nadal wykonywane.

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

Terminal 2 (klient): otwórz nową kartę terminala i pobierz model. Klient automatycznie komunikuje się z działającym serwerem.

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

Wróć do terminala 1: gdy pobieranie w terminalu 2 się zakończy, wróć do terminala 1 i naciśnij Ctrl+C, aby zatrzymać serwer.

Przesyłanie do Cloud Storage

Teraz prześlij wagi do zasobnika. gcloud storage automatycznie obsługuje równoległe przesyłanie, aby przyspieszyć ten proces.

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

(Opcjonalnie) Czyszczenie lokalnych wag

Model jest już w Cloud Storage, więc usuń lokalną kopię.

rm -rf model-weights

5. Tworzenie usługi

Najpierw utwórz folder dla usługi.

mkdir rtx-service
cd rtx-service

Utwórz plik Dockerfile o tej treści:

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"]

Utwórz plik o nazwie entrypoint.sh z tą zawartością:

#!/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. Wdrożenie w Cloud Run

W tej sekcji wdrożysz usługę za pomocą gcloud run deploy. To polecenie skompiluje kontener ze źródła i wdroży go w Cloud Run z niezbędnymi konfiguracjami procesora graficznego i sieci.

Utwórz konto usługi

Utwórz dla tej aplikacji dedykowane konto usługi i przyznaj mu tylko wymagane uprawnienia.

# 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"

Konfiguracja sieci

Aby uzyskać optymalną wydajność podczas pobierania dużych modeli, użyj bezpośredniej sieci VPC w ruchu wychodzącym. Umożliwia to kontenerowi dostęp do Cloud Storage za pomocą prywatnej sieci Google, z pominięciem publicznego internetu i bram NAT. W poleceniu gcloud run deploy używane są te flagi:

  • --network: łączy się z siecią VPC default (upewnij się, że ta sieć istnieje i ma podsieć w Twoim regionie z włączonym prywatnym dostępem do Google).
  • --subnet: konkretna podsieć w Twoim regionie (zwykle default, jeśli używasz sieci domyślnej).
  • --vpc-egress: ustaw wartość all-traffic, aby wymusić kierowanie całego ruchu wychodzącego przez VPC.

Polecenie wdrożenia

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. Testowanie usługi

Po wdrożeniu możesz korzystać z modelu Gemma 3 za pomocą interfejsu Ollama API.

Pobieranie adresu URL usługi

Pobierz adres URL wdrożonej usługi Cloud Run.

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

Uruchom wnioskowanie

Wyślij prompt do modelu za pomocą curl. Możesz ustawić "stream": false, aby uzyskać pełną odpowiedź w jednym obiekcie JSON, a jq, aby wyodrębnić tylko tekst.

Uwaga: jeśli używasz większego modelu, np. gemma3:27b, musisz zmienić nazwę modelu w poniższym pliku 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. Gratulacje!

Gratulujemy ukończenia ćwiczenia!

Zalecamy zapoznanie się z dokumentacją Cloud Run.

Omówione zagadnienia

  • Wdrażanie modelu Gemma na GPU RTX 6000 Pro w Cloud Run
  • Jak pobrać model z Cloud Storage równolegle podczas uruchamiania kontenera

9. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku, możesz usunąć projekt lub poszczególne zasoby.

Opcja 1. Usuwanie zasobów

Usuwanie usługi Cloud Run

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

Usuwanie konta usługi

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

Usuwanie zasobnika Cloud Storage

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

Usuwanie obrazu kontenera

Ta kompilacja utworzyła obraz kontenera w Artifact Registry. Możesz znaleźć nazwę obrazu i go usunąć.

Wyświetl listę obrazów, aby znaleźć dokładną nazwę (zwykle gcr.io/ID_PROJEKTU/NAZWA_USŁUGI).

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

Usuń obraz (zastąp IMAGE_NAME wynikiem z powyższego kroku).

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

Opcja 2. Usuwanie projektu

Aby usunąć cały projekt, otwórz stronę Zarządzaj zasobami, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Listę wszystkich dostępnych projektów możesz wyświetlić, uruchamiając polecenie gcloud projects list.