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 est récemment devenu compatible avec les 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 permet d'exécuter facilement votre code dans un conteneur, sans avoir à gérer de cluster.

Aujourd'hui, nous proposons des GPU Nvidia L4 avec 24 Go de VRAM. Il y a un GPU par instance Cloud Run, et l'autoscaling Cloud Run s'applique toujours. Cela inclut le scaling horizontal jusqu'à cinq instances (avec possibilité d'augmentation du quota), ainsi que le scaling à la baisse jusqu'à zéro instance en l'absence de requêtes.

Les GPU peuvent, par exemple, être utilisés pour 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 de frontend et Ollama dans un sidecar 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 pour diffuser un modèle Gemma 2 2B
  • Déployer Open WebUI en tant que conteneur d'entrée de frontend

2. Définir des variables d'environnement et activer les 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 maintenant Ollama en saisissant

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 depuis 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

Maintenant que le modèle est 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 maintenant 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éer 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 de l'interface 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 s'authentifier auprès d'Artifact Registry. Cela vous permettra d'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 sur Cloud Run

Utiliser un fichier YAML pour déployer le service multiconteneurs

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 sur 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 Sélectionner un modèle, choisissez Gemma 2 2B.

Posez maintenant 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 Cloud Run Functions.

Points abordés

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

9. Effectuer un nettoyage

Pour éviter des frais involontaires (par exemple, si les services Cloud Run sont invoqués par inadvertance plus de fois que votre quota mensuel d'invocations 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'intégralité 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 changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.