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
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.
Antes de começar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
- Instale e inicialize a CLI gcloud.
- 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:
-
Administrador do Artifact Registry (
roles/artifactregistry.admin
) -
Editor do Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador do Cloud Run (
roles/run.admin
) -
Criar contas de serviço (
roles/iam.serviceAccountCreator
) -
Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin
) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser
) -
Consumidor do Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrador de armazenamento (
roles/storage.admin
)
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:
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.
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
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
Crie um arquivo
Dockerfile
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 ambienteOLLAMA_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:
Inicie o proxy e, quando solicitado a instalar o componente
cloud-run-proxy
, escolhaY
:gcloud run services proxy ollama-gemma --port=9090
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
- Exclua outros recursos do Google Cloud criados neste tutorial: