Как использовать Ollama в качестве вспомогательного устройства с графическими процессорами Cloud Run и Open WebUI в качестве входного контейнера внешнего интерфейса.

1. Введение

Обзор

В Cloud Run недавно добавили поддержку графических процессоров (GPU). Она доступна в режиме публичного предварительного просмотра (с возможностью ожидания). Если вы заинтересованы в тестировании этой функции, заполните эту форму , чтобы присоединиться к списку ожидания. Cloud Run — это контейнерная платформа на Google Cloud, которая упрощает запуск кода в контейнере, не требуя управления кластером.

Сегодня мы предоставляем только графические процессоры Nvidia L4 с 24 ГБ видеопамяти. На каждый экземпляр Cloud Run приходится один графический процессор, и автоматическое масштабирование Cloud Run по-прежнему применяется. Это включает масштабирование до 5 экземпляров (с возможностью увеличения квоты), а также масштабирование до нуля экземпляров при отсутствии запросов.

Один из вариантов использования графических процессоров — запуск собственных открытых больших языковых моделей (LLM). В этом руководстве показано, как развернуть сервис, который запускает LLM.

В этом практическом занятии вы развернете многоконтейнерный сервис, использующий Open WebUI в качестве контейнера для входящего трафика на стороне клиента и Ollama в качестве сайдкара для обслуживания модели Gemma 2 2B, хранящейся в хранилище Google Cloud Storage.

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

  • Как создать сервис с несколькими контейнерами в Cloud Run
  • Как использовать Ollama в качестве вспомогательного сервиса для модели Gemma 2 2B
  • Как развернуть Open WebUI в качестве контейнера для входящего трафика на стороне фронтенда.

2. Установите переменные среды и включите API.

Обновите интерфейс командной строки gcloud.

Для начала вам потребуется установить последнюю версию интерфейса командной строки gcloud. Обновить интерфейс можно, выполнив следующую команду:

gcloud components update

Настройка переменных среды

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=us-central1
gcloud config set project $PROJECT_ID

Включить API

Прежде чем начать использовать этот практический пример, вам потребуется включить несколько API. Для работы с этим практическим примером необходимы следующие API. Вы можете включить эти API, выполнив следующую команду:

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

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

mkdir ollama-sidecar-codelab
cd ollama-sidecar-codelab

3. Создайте хранилище GCS для модели Gemma 2 2B.

Сначала установите Ollama, чтобы загрузить модель. Это загрузит модель в /home/$USER/.ollama/models

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

Теперь запустите ламу, пробежав

ollama serve

Ollama начинает прослушивание порта 11434.

Откройте второе окно терминала, чтобы загрузить модель Gemma 2 2B.

ollama pull gemma2:2b

(Необязательно) Вы можете взаимодействовать с Джеммой из командной строки, выполнив команду...

ollama run gemma2:2b

После завершения общения с Джеммой вы можете выйти, набрав [адрес электронной почты].

/bye

4. Создайте корзину хранения.

Теперь, когда модель загружена, вы можете переместить её в свою базу данных GCS.

Сначала создайте контейнер.

gcloud storage buckets create gs://$PROJECT_ID-gemma2-2b-codelab

Теперь переместите папку models в GCS.

gsutil cp -r /home/$USER/.ollama/models gs://$PROJECT_ID-gemma2-2b-codelab

5. Создайте изображение ламы.

Создайте 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

Создайте изображение коляски ламы.

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

Затем настройте Docker для использования ваших учетных данных Google Cloud для аутентификации в Artifact Registry. Это позволит вам использовать Docker для отправки образа в репозиторий Artifact Registry.

gcloud auth configure-docker us-central1-docker.pkg.dev

Пометьте изображение тегом, а затем загрузите его в Реестр артефактов.

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 на идентификатор вашего проекта:

sed -i "s/YOUR_PROJECT_ID/${PROJECT_ID}/g" service.yaml

Разверните приложение в Cloud Run, используя следующую команду.

gcloud beta run services replace service.yaml

Протестируйте службу Cloud Run.

Теперь откройте URL-адрес сервиса в своем веб-браузере.

После завершения загрузки пользовательского интерфейса в разделе « Выберите модель» выберите Gemma 2 2B .

Теперь задайте Джемме вопрос, например: «Почему небо голубое?»

8. Поздравляем!

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

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

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

  • Как создать сервис с несколькими контейнерами в Cloud Run
  • Как использовать Ollama в качестве вспомогательного сервиса для модели Gemma 2 2B
  • Как развернуть Open WebUI в качестве контейнера для входящего трафика на стороне фронтенда.

9. Уборка

Чтобы избежать непреднамеренных списаний средств (например, если сервисы Cloud Run будут случайно запущены больше раз, чем предусмотрено вашим ежемесячным лимитом на запуск Cloud Run в бесплатном тарифе ), вы можете либо удалить Cloud Run, либо удалить проект, созданный на шаге 2.

Чтобы удалить функцию Cloud Run, перейдите в консоль Cloud Run по адресу https://console.cloud.google.com/run и удалите службу ollama-sidecar-codelab .

Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .