Executar inferência de LLM em GPUs do Cloud Run com o Ollama


Neste tutorial, você vai aprender a implantar o Gemma 2 do Google, um modelo de linguagem grande (LLM) e aberto, em um serviço do Cloud Run ativado para GPU (para inferência rápida).

Você vai usar o Ollama, um servidor de inferência de LLM para modelos abertos. Depois de concluir o tutorial, sinta-se à vontade para explorar também outros modelos abertos que são compatível com Ollama, incluindo Llama 3.1 (8B), Mistral (7B) e Qwen2 (7B).

Objetivos

  • Implante o Ollama com o modelo Gemma 2 em um serviço do Cloud Run com GPU.
  • Envie comandos para o serviço Ollama no endpoint particular.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. Instale e inicialize a CLI gcloud.
  8. Solicite a cota Total Nvidia L4 GPU allocation, per project per region na API Cloud Run Admin na página Cotas e limites do sistema para concluir este tutorial.

Funções exigidas

Para conseguir as permissões necessárias para concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no seu projeto:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Configurar a gcloud

Para configurar a CLI do Google Cloud para seu serviço do Cloud Run:

  1. Defina seu projeto padrão:

    gcloud config set project PROJECT_ID

    Clique no ícone . para substituir a variável PROJECT_ID pelo nome do projeto que você criou para este tutorial. Isso garante que todas as listagens nesta página com referência a PROJECT_ID tenham o valor correto preenchido.

  2. Configure a CLI do Google Cloud para usar a região us-central1 nos comandos do Cloud Run.

    gcloud config set run/region us-central1

Criar um repositório Docker do Artifact Registry

Crie um repositório do Docker para armazenar as imagens do contêiner deste tutorial:

gcloud artifacts repositories create REPOSITORY \
  --repository-format=docker \
  --location=us-central1

Substitua REPOSITORY pelo nome do repositório. Por exemplo, repo.

Use o Docker para criar uma imagem de contêiner com o Ollama e o Gemma

  1. Crie um diretório para o serviço Ollama e mude o diretório existente para esse novo diretório:

    mkdir ollama-backend
    cd ollama-backend
  2. Crie um arquivo Dockerfile

    FROM ollama/ollama:0.3.6
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # 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:9b
    RUN ollama serve & sleep 5 && ollama pull $MODEL 
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]

Armazene pesos do modelo na imagem do contêiner para inicializações de instância mais rápidas

O Google recomenda armazenar os pesos do modelo para Gemma 2 (9B) e modelos de tamanho semelhante diretamente na imagem do contêiner.

Os pesos do modelo são os parâmetros numéricos que definem o comportamento de um LLM. O Ollama precisa ler esses arquivos completamente e carregar os pesos na memória da GPU (VRAM) durante a inicialização da instância do contêiner, antes que ela possa começar a atender a solicitações de inferência.

No Cloud Run, uma inicialização rápida de instância de contêiner é importante para minimizar latência de solicitação. Se a instância do contêiner tiver um tempo de inicialização lento, o serviço leva mais tempo para escalonar de zero a uma instância e precisa de mais tempo para escalonar durante um pico de tráfego.

Para garantir uma inicialização rápida, armazene os arquivos do modelo na própria imagem do contêiner. Isso é mais rápido e confiável do que fazer o download dos arquivos de um local remoto durante a inicialização. O armazenamento interno de imagens de contêineres do Cloud Run é otimizado para lidar com picos de tráfego, permitindo que ele configure rapidamente o sistema de arquivos do contêiner quando uma instância é iniciada.

Os pesos do modelo do Gemma 2 (9B) ocupam 5,4 GB de armazenamento. Modelos maiores têm arquivos de peso de modelo maiores, e eles podem ser impraticáveis para armazenar na imagem do contêiner. Consulte Práticas recomendadas: inferência de IA no Cloud Run com GPUs para ter uma visão geral das compensações.

Crie a imagem do contêiner usando o Cloud Build

Para criar a imagem do contêiner com o Cloud Build e fazer o push para o repositório do Artifact Registry:

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
   --machine-type e2-highcpu-32

Observe as considerações a seguir:

  • Para um build mais rápido, esse comando seleciona um tipo de máquina poderoso com mais CPU e largura de banda de rede.
  • O build deve levar cerca de 7 minutos.
  • Uma alternativa é criar a imagem localmente com o Docker e enviá-la para o Artifact Registry. Isso pode ser mais lento do que a execução no Cloud Build, dependendo da largura de banda da rede.

Implantar o Ollama como um serviço do Cloud Run

Com a imagem do contêiner armazenada em um repositório do Artifact Registry, tudo está pronto para implantar o Ollama como um serviço do Cloud Run.

Criar uma conta de serviço dedicada

Crie uma conta de serviço dedicada que o serviço do Ollama use como sua identidade do serviço:

gcloud iam service-accounts create OLLAMA_IDENTITY \
  --display-name="Service Account for Ollama Cloud Run service"

Substitua OLLAMA_IDENTITY pelo nome da conta de serviço que você quer criar, por exemplo, ollama.

É recomendável criar uma conta de serviço dedicada para cada serviço do Cloud Run com o conjunto mínimo de permissões necessárias. O serviço Ollama não precisa chamar nenhuma API do Google Cloud, ou seja, não é preciso conceder permissões à conta de serviço.

Implante o serviço

Implante o serviço no Cloud Run:

gcloud beta run deploy ollama-gemma \
  --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 7 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
  --timeout=600

Observe as seguintes flags importantes neste comando:

  • --concurrency 4 está definido para corresponder ao valor da variável de ambiente OLLAMA_NUM_PARALLEL.
  • --gpu 1 com --gpu-type nvidia-l4 atribui uma GPU NVIDIA L4 a cada instância do Cloud Run no serviço.
  • --no-allow-authenticated restringe o acesso não autenticado ao serviço. Ao manter o serviço privado, você pode confiar na API integrada do Cloud Run Autenticação do Identity and Access Management (IAM) para comunicação de serviço a serviço. Consulte Como gerenciar o acesso usando o IAM.
  • --no-cpu-throttling é necessário para ativar a GPU.
  • --service-account define a identidade do serviço.

Como definir a simultaneidade para performance ideal

Nesta seção, fornecemos contexto sobre as configurações de simultaneidade recomendadas. Para uma latência de solicitação ideal, verifique se a configuração --concurrency é igual à variável de ambiente OLLAMA_NUM_PARALLEL do Ollama.

  • OLLAMA_NUM_PARALLEL determina quantos slots de solicitação estão disponíveis para cada modelo para processar solicitações de inferência simultaneamente.
  • O --concurrency determina quantas solicitações o Cloud Run envia para uma instância do Ollama ao mesmo tempo.

Se --concurrency exceder OLLAMA_NUM_PARALLEL, o Cloud Run poderá enviar mais solicitações a um modelo em Ollama do que os slots disponíveis para ele. Isso leva à formação de filas de solicitações no Ollama, aumentando a latência das solicitações na fila. Isso também leva a um escalonamento automático menos responsivo, já que as solicitações em fila não acionam o Cloud Run para escalonar horizontalmente e iniciar novas instâncias.

O Ollama também oferece suporte à exibição de vários modelos de uma GPU. Para evitar completamente a fila de solicitações na instância do Ollama, defina --concurrency para corresponder a OLLAMA_NUM_PARALLEL.

É importante observar que aumentar OLLAMA_NUM_PARALLEL também faz com que as solicitações paralelas demorem mais.

Otimização da utilização

Para uma utilização ideal da GPU, aumente --concurrency, mantendo-o dentro do dobro do valor de OLLAMA_NUM_PARALLEL. Embora isso leve à fila de solicitações no Ollama, ele pode ajudar a melhorar a utilização: as instâncias do Ollama podem processar imediatamente as solicitações da fila, e as filas ajudam a absorver picos de tráfego.

Testar o serviço Ollama implantado com curl

Agora que você implantou o serviço Ollama, é possível enviar solicitações para ele. No entanto, se você enviar uma solicitação diretamente, o Cloud Run responderá com HTTP 401 Unauthorized. Isso é intencional, porque uma API de inferência de LLM é destinada a outros serviços para chamada, como um aplicativo de front-end. Para mais informações sobre serviços no Cloud Run, consulte Como autenticar serviço a serviço.

Para enviar solicitações ao serviço do Ollama, adicione um cabeçalho com um token OIDC válido às solicitações, por exemplo, usando o proxy de desenvolvedor do Cloud Run:

  1. Inicie o proxy e, quando solicitado a instalar o componente cloud-run-proxy, escolha Y:

    gcloud run services proxy ollama-gemma --port=9090
  2. Envie uma solicitação para ele em uma guia de terminal separada, deixando o proxy em execução. Observe que o proxy é executado em localhost:9090:

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma2:9b",
      "prompt": "Why is the sky blue?"
    }'

    O comando vai fornecer uma saída de streaming semelhante a esta:

    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false}
    ...
    

Limpar

  1. Exclua outros recursos do Google Cloud criados neste tutorial:

A seguir