Como usar o Ollama como um arquivo secundário com as GPUs do Cloud Run e o Open WebUI como um contêiner de entrada de front-end

1. Introdução

Visão geral

O Cloud Run adicionou recentemente suporte a GPU. Ele está disponível como uma prévia pública em lista de espera. Se você quiser testar o recurso, preencha este formulário para entrar na lista de espera. O Cloud Run é uma plataforma de contêineres no Google Cloud que facilita a execução do código em um contêiner, sem a necessidade de gerenciar um cluster.

Atualmente, as GPUs disponíveis são as Nvidia L4 com 24 GB de vRAM. Há uma GPU por instância do Cloud Run, e o escalonamento automático do Cloud Run ainda é aplicado. Isso inclui o escalonamento horizontal de até cinco instâncias (com aumento de cota disponível) e o escalonamento vertical para zero instâncias quando não há solicitações.

Um caso de uso para GPUs é executar seus próprios modelos de linguagem grandes (LLMs) abertos. Neste tutorial, você aprende a implantar um serviço que executa um LLM.

Neste codelab, você vai implantar um serviço de vários contêineres que usa o Open WebUI como um contêiner de entrada de front-end e o Ollama em um arquivo secundário para disponibilizar um modelo Gemma 2 2B armazenado em um bucket do Google Cloud Storage.

O que você vai aprender

  • Como criar um serviço de vários contêineres no Cloud Run
  • Como implantar o Ollama como um sidecar que serve um modelo Gemma 2 2B
  • Como implantar o Open WebUI como um contêiner de entrada de front-end

2. Definir variáveis de ambiente e ativar APIs

Fazer upgrade da CLI gcloud

Primeiro, você precisa ter uma versão recente da gcloud CLI instalada. Atualize a CLI executando o seguinte comando:

gcloud components update

Configurar as variáveis de ambiente.

Você pode definir variáveis de ambiente que serão usadas neste codelab.

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

Ativar APIs

Antes de começar a usar este codelab, você precisa ativar várias APIs. Este codelab exige o uso das seguintes APIs. Para ativar essas APIs, execute o seguinte comando:

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

Crie um diretório para este codelab.

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

3. Crie um bucket do GCS para armazenar o modelo Gemma 2 2B

Primeiro, você vai instalar o Ollama para fazer o download do modelo. O modelo será salvo em /home/$USER/.ollama/models

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

Agora execute o Ollama, executando

ollama serve

O Ollama começa a ouvir na porta 11434.

Abra uma segunda janela do terminal para puxar o modelo Gemma 2 2B para

ollama pull gemma2:2b

(Opcional) Você pode interagir com o Gemma na linha de comando executando

ollama run gemma2:2b

Quando terminar de conversar com o Gemma, você pode sair digitando

/bye

4. Crie um bucket de armazenamento

Agora que o modelo foi baixado, você pode movê-lo para o bucket do GCS.

Primeiro, crie o bucket.

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

Agora, mova a pasta de modelos para o GCS.

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

5. Criar a imagem do Ollama

Crie um dockerfile com o seguinte conteúdo

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

Crie um repositório do Artifact Registry para armazenar as imagens de serviço.

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

Criar a imagem do 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. Criar a imagem de front-end da Open WebUI

Nesta seção, você vai criar o contêiner de entrada do front-end usando o Open WebUI.

Use o Docker para extrair a imagem Open WebUI.

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

Em seguida, configure o Docker para usar suas credenciais do Google Cloud e fazer a autenticação com o Artifact Registry. Isso permite que você use o Docker para enviar uma imagem a um repositório do Artifact Registry.

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

Marque sua imagem e envie para o 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. Implantar o serviço de vários contêineres no Cloud Run

Use um arquivo YAML para implantar o serviço de vários contêineres

Crie um service.yaml com os conteúdos a seguir.

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

Atualize service.yaml para substituir PROJECT_ID pelo ID do seu projeto:

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

Implante no Cloud Run usando o comando a seguir.

gcloud beta run services replace service.yaml

testar o serviço do Cloud Run

Agora abra o URL do serviço no navegador da Web.

Depois que a IU terminar de carregar, em Selecionar um modelo, escolha Gemma 2 2B.

Agora faça uma pergunta para Gemma. Por exemplo: "Por que o céu é azul?"

8. Parabéns!

Parabéns por concluir o codelab.

Recomendamos a leitura da documentação sobre as funções do Cloud Run.

O que vimos

  • Como criar um serviço de vários contêineres no Cloud Run
  • Como implantar o Ollama como um sidecar que serve um modelo Gemma 2 2B
  • Como implantar o Open WebUI como um contêiner de entrada de front-end

9. Limpar

Para evitar cobranças acidentais (por exemplo, se os serviços do Cloud Run forem invocados por engano mais vezes do que sua alocação mensal de invocação do Cloud Run no nível sem custo financeiro), exclua o Cloud Run ou o projeto criado na etapa 2.

Para excluir a função do Cloud Run, acesse o console do Cloud Run do Cloud em https://console.cloud.google.com/run e exclua o serviço ollama-sidecar-codelab.

Se você optar por excluir o projeto inteiro, acesse https://console.cloud.google.com/cloud-resource-manager, selecione o projeto criado na etapa 2 e escolha "Excluir". Se você excluir o projeto, precisará alterar os projetos no SDK Cloud. Para conferir a lista de todos os projetos disponíveis, execute gcloud projects list.