Utiliser Ollama en tant que side-car avec des GPU Cloud Run et une interface Web ouverte en tant que conteneur d'entrée frontend

1. Introduction

Présentation

Cloud Run a récemment ajouté la prise en charge des GPU. Elle est disponible en version Preview publique sur liste d'attente. Si vous souhaitez essayer cette fonctionnalité, remplissez ce formulaire pour rejoindre la liste d'attente. Cloud Run est une plate-forme de conteneurs sur Google Cloud qui vous permet d'exécuter facilement votre code dans un conteneur, sans avoir à gérer de cluster.

Aujourd'hui, les GPU que nous mettons à disposition sont des GPU Nvidia L4 avec 24 Go de VRAM. Il existe un GPU par instance Cloud Run, et l'autoscaling Cloud Run s'applique toujours. Cela inclut le scaling horizontal jusqu'à cinq instances (avec une augmentation de quota disponible), ainsi que le scaling à zéro instance lorsqu'il n'y a aucune requête.

L'un des cas d'utilisation des GPU consiste à exécuter vos propres grands modèles de langage (LLM) ouverts. Ce tutoriel vous explique comment déployer un service qui exécute un LLM.

Dans cet atelier de programmation, vous allez déployer un service multiconteneur qui utilise Open WebUI comme conteneur d'entrée frontend et Ollama dans un side-car pour diffuser un modèle Gemma 2 2B stocké dans un bucket Google Cloud Storage.

Points abordés

  • Créer un service multiconteneur dans Cloud Run
  • Déployer Ollama en tant que side-car diffusant un modèle Gemma 2 2B
  • Déployer Open WebUI en tant que conteneur d'entrée frontend

2. Définir des variables d'environnement et activer des API

Mettre à niveau gcloud CLI

Vous devez d'abord installer une version récente de gcloud CLI. Vous pouvez mettre à jour la CLI en exécutant la commande suivante :

gcloud components update

Configurer des variables d'environnement

Vous pouvez définir des variables d'environnement qui seront utilisées tout au long de cet atelier de programmation.

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

Activer les API

Avant de pouvoir commencer à utiliser cet atelier de programmation, vous devez activer plusieurs API. Cet atelier de programmation nécessite l'utilisation des API suivantes. Vous pouvez activer ces API en exécutant la commande suivante :

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

Créez un répertoire pour cet atelier de programmation.

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

3. Créer un bucket GCS pour stocker le modèle Gemma 2 2B

Commencez par installer Ollama pour télécharger le modèle. Le modèle sera téléchargé dans /home/$USER/.ollama/models.

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

Exécutez ensuite Ollama en exécutant

ollama serve

Ollama commence à écouter sur le port 11434.

Ouvrez une deuxième fenêtre de terminal pour extraire le modèle Gemma 2 2B vers

ollama pull gemma2:2b

(Facultatif) Vous pouvez interagir avec Gemma à partir de la ligne de commande en exécutant

ollama run gemma2:2b

Lorsque vous avez terminé de discuter avec Gemma, vous pouvez quitter en saisissant

/bye

4. Créer un bucket de stockage

Une fois le modèle téléchargé, vous pouvez le déplacer vers votre bucket GCS.

Commencez par créer le bucket.

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

Déplacez ensuite le dossier des modèles vers GCS.

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

5. Créer l'image Ollama

Créez un fichier Dockerfile avec le contenu suivant :

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

Créez un dépôt Artifact Registry pour stocker les images de votre service.

gcloud artifacts repositories create ollama-sidecar-codelab-repo --repository-format=docker \
    --location=us-central1 --description="Ollama + OpenWebUI website demo" \
    --project=$PROJECT_ID

Créez l'image side-car 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. Créer l'image frontend Open WebUI

Dans cette section, vous allez créer le conteneur d'entrée frontend à l'aide d'Open WebUI.

Utilisez Docker pour extraire l'image Open WebUI.

docker pull ghcr.io/open-webui/open-webui:main

Configurez ensuite Docker pour qu'il utilise vos identifiants Google Cloud afin de vous authentifier auprès d'Artifact Registry. Vous pourrez ainsi utiliser Docker pour transférer une image vers un dépôt Artifact Registry.

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

Ajoutez un tag à votre image, puis transférez-la vers 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. Déployer le service multiconteneur dans Cloud Run

Utiliser un fichier YAML pour déployer le service multiconteneur

Créez un fichier service.yaml avec le contenu suivant :

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

Mettez à jour service.yaml pour remplacer PROJECT_ID par l'ID de votre projet :

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

Déployez-le dans Cloud Run à l'aide de la commande suivante :

gcloud beta run services replace service.yaml

Tester le service Cloud Run

Ouvrez maintenant l'URL du service dans votre navigateur Web.

Une fois l'interface utilisateur chargée, sous Select a model (Sélectionner un modèle), choisissez Gemma 2 2B.

Posez ensuite une question à Gemma, par exemple "Pourquoi le ciel est-il bleu ?".

8. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Nous vous recommandons de consulter la documentation sur les fonctions Cloud Run.

Points abordés

  • Créer un service multiconteneur dans Cloud Run
  • Déployer Ollama en tant que side-car diffusant un modèle Gemma 2 2B
  • Déployer Open WebUI en tant que conteneur d'entrée frontend

9. Effectuer un nettoyage

Pour éviter des frais involontaires (par exemple, si les services Cloud Run sont appelés par inadvertance plus de fois que votre allocation mensuelle d'appels Cloud Run dans le niveau sans frais), vous pouvez supprimer Cloud Run ou le projet que vous avez créé à l'étape 2.

Pour supprimer la fonction Cloud Run, accédez à la console Cloud Run à l'adresse https://console.cloud.google.com/run, puis supprimez le service ollama-sidecar-codelab.

Si vous choisissez de supprimer l'ensemble du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir "Supprimer". Si vous supprimez le projet, vous devrez modifier les projets dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.