Выполнение инференции с использованием модели Gemma в Cloud Run с графическим процессором RTX 6000 Pro.

1. Введение

Обзор

Что вы узнаете

  • Как развернуть модель Gemma на графическом процессоре Cloud Run RTX 6000 Pro
  • Как одновременно загрузить модель из облачного хранилища во время запуска контейнера?

2. Настройка и требования

Установите переменные окружения, которые будут использоваться на протяжении всего этого практического занятия:

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

Включите API, необходимые для этого практического занятия.

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

Создайте папку для практического занятия.

mkdir codelab-rtx
cd codelab-rtx

Включите частный доступ Google к вашей подсети, чтобы оптимизировать загрузку моделей машинного обучения из облачного хранилища. Подробнее об этом можно узнать в разделе документации по лучшим практикам использования графических процессоров при загрузке моделей из облачного хранилища .

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

3. Настройка облачного хранилища

Сначала создайте хранилище Cloud Storage для хранения весов модели.

Создайте уникальное ведро

# 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. Получение весов модели

Далее загрузите модель Gemma 3 в локальную папку, а затем загрузите её в своё облачное хранилище.

Установите Ollama

Для установки Ollama можно выполнить следующую команду:

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

Скачать модель

Создайте папку для загруженной модели.

mkdir model-weights

Для этого процесса вам понадобятся две вкладки терминала: одна для запуска сервера Ollama, а другая — для получения модели.

Терминал 1 (Сервер):

Запустите сервер, указав путь к загруженной модели. Эта команда будет продолжать выполняться.

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

Терминал 2 (клиент): Откройте новую вкладку терминала и загрузите модель. Клиент автоматически взаимодействует с работающим сервером.

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

Вернувшись в Терминал 1: После завершения загрузки в Терминале 2 вернитесь в Терминал 1 и нажмите Ctrl+C , чтобы остановить сервер.

Загрузка в облачное хранилище

Теперь загрузите данные о весе в свой бакет. gcloud storage автоматически обрабатывает параллельную загрузку для повышения скорости.

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

(Необязательно) Очистка локальных весов

Поскольку модель теперь находится в облачном хранилище, удалите локальную копию.

rm -rf model-weights

5. Создайте сервис.

Сначала создайте папку для сервиса.

mkdir rtx-service
cd rtx-service

Создайте Dockerfile со следующим содержимым.

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

Создайте файл с именем entrypoint.sh со следующим содержимым:

#!/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. Развертывание в облаке.

В этом разделе вы развернете сервис с помощью gcloud run deploy . Эта команда соберет ваш контейнер из исходного кода и развернет его в Cloud Run с необходимыми настройками графического процессора и сети.

Создать учетную запись службы

Создайте для этого приложения отдельную учетную запись службы и предоставьте ей только необходимые права доступа.

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

Сетевая конфигурация

Для оптимальной производительности при загрузке больших моделей используйте Direct VPC Egress . Это позволяет контейнеру получать доступ к Cloud Storage через частную сеть Google, минуя общедоступный интернет и NAT-шлюзы. В команде gcloud run deploy используются следующие флаги:

  • --network : Подключается к VPC default (убедитесь, что эта сеть существует и имеет подсеть в вашем регионе с включенным частным доступом Google).
  • --subnet : Конкретная подсеть в вашем регионе (обычно default если используется сеть по умолчанию).
  • --vpc-egress : Установите значение all-traffic , чтобы весь исходящий трафик проходил через VPC.

Командование развертывания

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. Проверьте работу сервиса.

После развертывания вы сможете взаимодействовать с вашей моделью Gemma 3, используя API Ollama.

Получить URL-адрес сервиса

Получите URL-адрес развернутой вами службы Cloud Run.

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

Вывод о ходе выполнения

Отправьте запрос модели с помощью curl . Вы можете установить параметр "stream": false , чтобы получить полный ответ в виде одного JSON-объекта, и использовать jq для извлечения только текста.

Примечание: если вы используете более крупную модель, например gemma3:27b, вам потребуется изменить имя модели в приведенном ниже 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. Поздравляем!

Поздравляем с завершением практического занятия!

Мы рекомендуем ознакомиться с документацией Cloud Run .

Что мы рассмотрели

  • Как развернуть модель Gemma на графическом процессоре Cloud Run RTX 6000 Pro
  • Как одновременно загрузить модель из облачного хранилища во время запуска контейнера?

9. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этом руководстве, вы можете либо удалить проект, либо удалить отдельные ресурсы.

Вариант 1: Удалить ресурсы

Удалите службу Cloud Run.

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

Удалите учетную запись службы.

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

Удалите корзину облачного хранилища.

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

Удалите изображение контейнера

В результате сборки в реестре артефактов был создан образ контейнера. Вы можете найти имя образа и удалить его.

Чтобы найти точное название изображения (обычно gcr.io/PROJECT_ID/SERVICE_NAME), выполните следующие действия:

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

Удалите изображение (замените IMAGE_NAME на результат, полученный выше).

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

Вариант 2: Удалить проект

Чтобы удалить весь проект, перейдите в раздел «Управление ресурсами» , выберите проект, созданный на шаге 2, и нажмите «Удалить». Если вы удалите проект, вам потребуется изменить проекты в вашем Cloud SDK. Вы можете просмотреть список всех доступных проектов, выполнив gcloud projects list .