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 compatibilité avec les GPU. Elle est disponible en version Preview publique sur liste d'attente. Si vous souhaitez tester cette fonctionnalité, remplissez ce formulaire pour vous inscrire sur 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 à votre disposition sont des GPU Nvidia L4 avec 24 Go de vRAM. Vous avez un GPU par instance Cloud Run, et l'autoscaling Cloud Run s'applique toujours. Cela inclut le scaling horizontal jusqu'à cinq instances (avec augmentation de quota disponible), ainsi que le scaling à la baisse jusqu'à zéro instance en l'absence de requêtes.

Les GPU peuvent être utilisés, par exemple, 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 multi-conteneur qui utilise Open WebUI comme conteneur d'entrée de façade 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 sidecar diffusant un modèle Gemma 2B
  • Déployer Open WebUI en tant que conteneur d'entrée de façade

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

Mettre à niveau la CLI gcloud

Vous devez d'abord disposer d'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 commencer à utiliser cet atelier de programmation, vous devez activer plusieurs API. Cet atelier de programmation nécessite d'utiliser les 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 est alors téléchargé dans /home/$USER/.ollama/models.

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

Exécutez maintenant ollama en exécutant

ollama serve

Ollama commence à écouter sur le port 11434.

Ouvrez une deuxième fenêtre de terminal pour télécharger le modèle Gemma 2 2B dans

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 la discussion en saisissant

/bye

4. Créer un bucket de stockage

Maintenant que le modèle a été 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

À présent, déplacez le dossier "templates" 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 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 

# Store the model weights in the container image
ENV MODEL gemma2:2b
RUN ollama serve & sleep 5 && ollama pull $MODEL 

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

Créez un dépôt Artifact Registry pour stocker vos images de 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 du sidecar 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 du frontend à l'aide d'Open WebUI.

Utilisez Docker pour extraire l'image de l'interface utilisateur Web Open.

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

Configurez ensuite Docker pour qu'il utilise vos identifiants Google Cloud pour 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 multiconteneurs sur Cloud Run

Utiliser un fichier YAML pour déployer le service multi-conteneur

Créez un 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
        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 votre ID de 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 le chargement de l'interface utilisateur terminé, sous Sélectionner un modèle, choisissez Gemma 2 2B.

Maintenant, posez une question à Gemma, par exemple « Pourquoi le ciel est bleu ? »

8. Félicitations !

Félicitations ! 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 de conteneurs multiples dans Cloud Run
  • Déployer Ollama en tant que sidecar diffusant un modèle Gemma 2B
  • Déployer Open WebUI en tant que conteneur d'entrée de façade

9. Effectuer un nettoyage

Pour éviter les frais involontaires (par exemple, si les services Cloud Run sont appelés par inadvertance plus de fois que votre quota d'appels Cloud Run mensuels 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 et 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 cliquer sur "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.