Neste tutorial, mostramos como implantar e disponibilizar um modelo de linguagem grande (LLM) do Gemma 2 usando TPUs no GKE com o framework de veiculação Saxml. Este tutorial oferece uma base para entender e explorar a implantação prática de LLMs para inferência em um ambiente gerenciado do Kubernetes. Você implanta um contêiner pré-criado com o Saxml no GKE. Você também configura o GKE para carregar os pesos do Gemma 2B e 7B do Cloud Storage durante a execução.
Este tutorial é destinado a engenheiros de machine learning (ML), administradores e operadores de plataforma e especialistas em dados e IA interessados em usar os recursos de orquestração de contêineres do Kubernetes para veiculação de LLMs. Para saber mais sobre papéis comuns e tarefas de exemplo que mencionamos no conteúdo doGoogle Cloud , consulte Tarefas e funções de usuário comuns do GKE.
Antes de ler esta página, confira se você conhece os seguintes conceitos:
- Disponibilidade da versão atual da TPU com a arquitetura do sistema do Cloud TPU
- TPUs no GKE
Se você precisa de uma plataforma de IA gerenciada unificada para criar e disponibilizar modelos de ML rapidamente e de maneira econômica, recomendamos testar nossa solução de implantação da Vertex AI.
Contexto
Esta seção descreve as principais tecnologias usadas neste tutorial.
Gemma
O Gemma é um conjunto de modelos de IA generativa leve e abertamente lançados com licença aberta. Esses modelos de IA estão disponíveis para execução em aplicativos, hardware, dispositivos móveis ou serviços hospedados. Use o Modelos Gemma para geração de texto. É possível ajustá-los para tarefas especializadas.
Para saber mais, consulte a documentação do Gemma.
TPUs
TPUs são circuitos integrados de aplicação específica (ASICs, na sigla em inglês) desenvolvidos especialmente pelo Google. Eles são usados para acelerar frameworks de processamento de dados, como TensorFlow, PyTorch e JAX.
Este tutorial serve os modelos Gemma 2B e Gemma 7B. O GKE hospeda esses modelos nos seguintes pools de nós da TPU v5e de host único:
- Gemma 2B: modelo ajustado por instruções hospedado em um pool de nós da TPU v5e com topologia
1x1que representa um chip de TPU. O tipo de máquina dos nós éct5lp-hightpu-1t. - Gemma 7B: modelo ajustado por instruções hospedado em um pool de nós da TPU v5e com topologia
2x2que representa quatro chips de TPU. O tipo de máquina dos nós éct5lp-hightpu-4t.
Saxml
O Saxml é um sistema experimental que exibe modelos Paxml, JAX e PyTorch para inferência. O sistema Saxml inclui os seguintes componentes:
- Célula Saxml ou cluster Sax: um servidor administrador e um grupo de servidores de modelo. O servidor de administrador monitora os servidores de modelos, atribui modelos publicados a servidores de modelo para exibição e ajuda os clientes a localizar servidores de modelos que atendem a modelos publicados específicos.
- Cliente Saxml: a interface de programação voltada ao usuário para o sistema Saxml. O cliente Saxml inclui uma ferramenta de linha de comando (saxutil) e um conjunto de bibliotecas de cliente em Python, C++ e Go.
Neste tutorial, você também vai usar o servidor HTTP Saxml. O servidor HTTP Saxml é um servidor HTTP personalizado que encapsula a biblioteca de cliente em Python Saxmldo e expõe as APIs REST para interagir com o sistema Saxml. As APIs REST incluem endpoints para publicar, listar, cancelar a publicação de modelos e gerar previsões.
Preparar o ambiente para o Gemma
Iniciar o Cloud Shell
Neste tutorial, você vai usar o Cloud Shell para gerenciar recursos hospedados no
Google Cloud. O Cloud Shell vem pré-instalado com o software
necessário para este tutorial, incluindo kubectl e
gcloud CLI.
No Google Cloud console, inicie uma instância do Cloud Shell:
Abrir o Cloud ShellDefina as variáveis de ambiente padrão:
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export LOCATION=LOCATION export CLUSTER_NAME=saxml-tpuSubstitua os seguintes valores:
- PROJECT_ID: o Google Cloud ID do projeto.
- LOCATION: o nome da zona do Compute Engine em que os tipos de máquina TPU v5e estão disponíveis.
Criar um cluster do GKE Standard
Nesta seção, você vai criar o cluster do GKE e o pool de nós.
Gemma 2B-it
Use o Cloud Shell para fazer o seguinte:
Crie um cluster padrão que use a federação de identidade da carga de trabalho do GKE:
gcloud container clusters create ${CLUSTER_NAME} \ --enable-ip-alias \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --release-channel=rapid \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --location=${LOCATION}A criação do cluster pode levar vários minutos.
Crie um pool de nós de TPU v5e com uma topologia
1x1e um nó:gcloud container node-pools create tpu-v5e-1x1 \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-1t \ --num-nodes=1 \ --location=${LOCATION}Você exibe o modelo Gemma 2B neste pool de nós.
Gemma 7B-it
Use o Cloud Shell para fazer o seguinte:
Crie um cluster padrão que use a federação de identidade da carga de trabalho do GKE:
gcloud container clusters create ${CLUSTER_NAME} \ --enable-ip-alias \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --release-channel=rapid \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --location=${LOCATION}A criação do cluster pode levar vários minutos.
Crie um pool de nós de TPU v5e com uma topologia
2x2e um nó:gcloud container node-pools create tpu-v5e-2x2 \ --cluster=${CLUSTER_NAME} \ --machine-type=ct5lp-hightpu-4t \ --num-nodes=1 \ --location=${LOCATION}Você exibe o modelo Gemma 7B neste pool de nós.
Criar os buckets do Cloud Storage
Crie dois buckets do Cloud Storage para gerenciar o estado do servidor Saxml Admin e os checkpoints do modelo.
No Cloud Shell, execute o seguinte:
Crie um bucket do Cloud Storage para armazenar as configurações do servidor administrador do Saxml.
gcloud storage buckets create gs://ADMIN_BUCKET_NAMESubstitua ADMIN_BUCKET_NAME pelo nome do bucket do Cloud Storage que armazena o servidor Administrador do Saxml.
Crie um bucket do Cloud Storage para armazenar checkpoints do modelo:
gcloud storage buckets create gs://CHECKPOINTS_BUCKET_NAMESubstitua CHECKPOINTS_BUCKET_NAME pelo nome do bucket do Cloud Storage que armazena os checkpoints do modelo.
Configurar o acesso das cargas de trabalho usando a federação de identidade da carga de trabalho do GKE
Atribua uma Kubernetes ServiceAccount ao aplicativo e configure-a para atuar como uma conta de serviço do IAM.
Configure
kubectlpara se comunicar com o cluster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${LOCATION}Crie uma conta de serviço do Kubernetes para o aplicativo usar:
gcloud iam service-accounts create wi-saxAdicione uma vinculação de política do IAM para que sua conta de serviço do IAM leia e grave no Cloud Storage:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:wi-sax@${PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/storage.objectUser gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:wi-sax@${PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/storage.insightsCollectorServicePermita que a conta de serviço do Kubernetes atue como a conta de serviço do IAM adicionando uma vinculação de política do IAM entre as duas. Essa vinculação permite que a Kubernetes ServiceAccount atue como a conta de serviço do Google.
gcloud iam service-accounts add-iam-policy-binding wi-sax@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:${PROJECT_ID}.svc.id.goog[default/default]"Anote a conta de serviço do Kubernetes com o endereço de e-mail da conta de serviço do IAM
kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=wi-sax@${PROJECT_ID}.iam.gserviceaccount.com
Receber acesso ao modelo
Para ter acesso aos modelos Gemma para implantação no GKE, faça login na plataforma Kaggle, assine o contrato de consentimento de licença e receba um token de API da Kaggle. Neste tutorial, você usa um Secret do Kubernetes para as credenciais do Kaggle.
Assinar o contrato de consentimento de licença
É necessário assinar o contrato de consentimento para usar o Gemma. Siga estas instruções:
- Acesse a página de consentimento do modelo em Kaggle.com.
- Faça login no Kaggle, caso ainda não o tenha feito.
- Clique em Solicitar acesso.
- Na seção Escolher conta para consentimento, selecione Verificar via conta do Kaggle para usar sua conta do Kaggle para conceder permissão.
- Aceite os Termos e Condições do modelo.
Gerar um token de acesso
Para acessar o modelo pelo Kaggle, você precisa de um token da API Kaggle.
Siga as etapas abaixo para gerar um novo token, caso ainda não tenha um:
- No navegador, acesse as configurações da Kaggle.
- Na seção API, clique em Criar novo token.
O Kaggle faz o download de um arquivo chamado kaggle.json.
Fazer upload do token de acesso no Cloud Shell
No Cloud Shell, é possível fazer upload do token da API Kaggle para seu projeto Google Cloud:
- No Cloud Shell, clique em Mais > Fazer upload.
- Selecione "Arquivo" e clique em Escolher arquivos.
- Abra o arquivo
kaggle.json. - Clique em Fazer upload.
Criar um secret do Kubernetes para credenciais do Kaggle
No Cloud Shell, realize as seguintes etapas:
Configure
kubectlpara se comunicar com o cluster:gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${LOCATION}Crie um Secret para armazenar as credenciais do Kaggle:
kubectl create secret generic kaggle-secret \ --from-file=kaggle.json
Implantar o Saxml
Nesta seção, você vai implantar o servidor de administrador Saxml, os servidores de modelo e o servidor HTTP. Este tutorial usa manifestos de implantação do Kubernetes. Uma implantação é um objeto da API Kubernetes que permite executar várias réplicas de pods distribuídos entre os nós de um cluster.
Implantar o servidor de administrador Saxml
Nesta seção, você vai implantar o servidor de administrador do Saxml.
Crie o seguinte manifesto
saxml-admin-server.yaml:Substitua ADMIN_BUCKET_NAME pelo nome do bucket criado na seção Criar buckets do Cloud Storage. Não inclua o prefixo
gs://.Aplique o manifesto:
kubectl apply -f saxml-admin-server.yamlVerifique a implantação do servidor de administrador:
kubectl get deploymentA saída será assim:
NAME READY UP-TO-DATE AVAILABLE AGE sax-admin-server 1/1 1 1 ##s
Implantar o servidor do modelo Saxml
Siga estas instruções para implantar o servidor para os modelos Gemma 2B ou Gemma 7B.
Gemma 2B-it
Crie o seguinte manifesto
saxml-model-server-1x1.yaml:Substitua ADMIN_BUCKET_NAME pelo nome do bucket criado na seção Criar buckets do Cloud Storage. Não inclua o prefixo
gs://.Aplique o manifesto:
kubectl apply -f saxml-model-server-1x1.yamlVerifique o status da implantação do servidor de modelo:
kubectl get deploymentA saída será assim:
NAME READY STATUS RESTARTS AGE sax-admin-server 1/1 Running 0 ##m sax-model-server-v5e-1x1 1/1 Running 0 ##s
Gemma 7B-it
Crie o seguinte manifesto
saxml-model-server-2x2.yaml:Substitua ADMIN_BUCKET_NAME pelo nome do bucket criado na seção Criar buckets do Cloud Storage. Não inclua o prefixo
gs://.Aplique o manifesto:
kubectl apply -f saxml-model-server-2x2.yamlVerifique o status da implantação do servidor de modelo:
kubectl get deploymentA saída será assim:
NAME READY STATUS RESTARTS AGE sax-admin-server 1/1 Running 0 ##m sax-model-server-v5e-2x2 1/1 Running 0 ##s
Implantar o servidor HTTP Saxml
Nesta seção, você implanta o servidor HTTP Saxml e cria um serviço IP de cluster que você usa para acessar o servidor.
Crie o seguinte manifesto
saxml-http.yaml:Substitua ADMIN_BUCKET_NAME pelo nome do bucket do Cloud Storage que armazena o servidor Administrador do Saxml.
Aplique o manifesto:
kubectl apply -f saxml-http.yamlVerifique o status da implantação do servidor HTTP Saxml:
kubectl get deploymentGemma 2B-it
A saída será assim:
NAME READY STATUS RESTARTS AGE sax-admin-server 1/1 Running 0 ##m sax-model-server-v5e-1x1 1/1 Running 0 ##m sax-http 1/1 Running 0 ##sGemma 7B-it
A saída será assim:
NAME READY STATUS RESTARTS AGE sax-admin-server 1/1 Running 0 ##m sax-model-server-v5e-2x2 1/1 Running 0 ##m sax-http 1/1 Running 0 ##s
Fazer o download do checkpoint do modelo
Nesta seção, você executará um job do Kubernetes que busca, faz o download e armazena o checkpoint do modelo. Um controlador de job no Kubernetes cria um ou mais pods e garante que eles executem uma tarefa específica com sucesso.
Siga as etapas do modelo Gemma que você quer usar:
Gemma 2B-it
Crie o seguinte manifesto
job-2b.yaml:Substitua CHECKPOINTS_BUCKET_NAME pelo nome do bucket criado na seção Criar buckets do Cloud Storage. Não inclua o prefixo
gs://.Aplique o manifesto:
kubectl apply -f job-2b.yamlAguarde a conclusão do job:
kubectl wait --for=condition=complete --timeout=180s job/data-loader-2bA saída será assim:
job.batch/data-loader-2b condition metVerifique se o job foi concluído com sucesso:
kubectl get job/data-loader-2bA saída será assim:
NAME COMPLETIONS DURATION AGE data-loader-2b 1/1 ##s #m##sVisualize os registros do job:
kubectl logs --follow job/data-loader-2b
O job faz upload do checkpoint para gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000.
Gemma 7B-it
Crie o seguinte manifesto
job-7b.yaml:Substitua CHECKPOINTS_BUCKET_NAME pelo nome do bucket criado na seção Criar buckets do Cloud Storage. Inclua o prefixo
gs://.Aplique o manifesto:
kubectl apply -f job-7b.yamlAguarde a conclusão do job:
kubectl wait --for=condition=complete --timeout=360s job/data-loader-7bA saída será assim:
job.batch/data-loader-7b condition metVerifique se o job foi concluído com sucesso:
kubectl get job/data-loader-7bA saída será assim:
NAME COMPLETIONS DURATION AGE data-loader-7b 1/1 ##s #m##sVisualize os registros do job:
kubectl logs --follow job/data-loader-7b
O job faz upload do checkpoint para gs://CHECKPOINTS_BUCKET_NAME/gemma_7b_it/checkpoint_00000000.
Expor o servidor HTTP Saxml
É possível acessar o servidor HTTP Saxml pelo Serviço ClusterIP que você criou durante a implantação do servidor HTTP Saxml. Os serviços ClusterIP só podem ser acessados dentro do cluster. Portanto, para acessar o serviço de fora do cluster, conclua as seguintes etapas:
Estabeleça uma sessão de encaminhamento de portas:
kubectl port-forward service/sax-http-svc 8888:8888Para verificar se é possível acessar o servidor HTTP Saxml, abra um novo terminal e execute o seguinte comando:
curl -s localhost:8888A saída será assim:
{ "Message": "HTTP Server for SAX Client" }
No servidor HTTP Saxml, a interface do cliente é encapsulada no sistema Saxml e ela é exposta por um conjunto de APIs REST. Você usará essas APIs para publicar, gerenciar e interagir com os modelos Gemma 2B e Gemma 7B.
Publicar o modelo Gemma
Em seguida, é possível publicar o modelo Gemma em um
servidor do modelo que é executado em um pool de nós de frações de TPU. Use a API publish do servidor HTTP
Saxml para publicar um modelo. Siga estas etapas para publicar o modelo de parâmetro Gemma 2B ou 7B.
Para saber mais sobre a API do servidor HTTP Saxml, consulte APIs HTTP do Saxml.
Gemma 2B-it
Verifique se a sessão de encaminhamento de portas ainda está ativa:
curl -s localhost:8888Publique o parâmetro Gemma 2B:
curl --request POST \ --header "Content-type: application/json" \ -s \ localhost:8888/publish \ --data \ '{ "model": "/sax/test/gemma2bfp16", "model_path": "saxml.server.pax.lm.params.gemma.Gemma2BFP16", "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000", "replicas": "1" }'A saída será assim:
{ "model": "/sax/test/gemma2bfp16", "model_path": "saxml.server.pax.lm.params.gemma.Gemma2BFP16", "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000", "replicas": 1 }Confira a próxima etapa para monitorar o progresso da implantação.
Monitore o progresso observando os registros em um pod de servidor de modelo da implantação
sax-model-server-v5e-1x1.kubectl logs --follow deployment/sax-model-server-v5e-1x1Essa implantação pode levar até cinco minutos para ser concluída. Aguarde até uma mensagem semelhante a esta aparecer:
I0125 15:34:31.685555 139063071708736 servable_model.py:699] loading completed. I0125 15:34:31.686286 139063071708736 model_service_base.py:532] Successfully loaded model for key: /sax/test/gemma2bfp16Verifique se você pode acessar o modelo exibindo as informações dele:
curl --request GET \ --header "Content-type: application/json" \ -s \ localhost:8888/listcell \ --data \ '{ "model": "/sax/test/gemma2bfp16" }'A saída será assim:
{ "model": "/sax/test/gemma2bfp16", "model_path": "saxml.server.pax.lm.params.gemma.Gemma2BFP16", "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_2b-it/checkpoint_00000000", "max_replicas": 1, "active_replicas": 1 }
Gemma 7B-it
Verifique se a sessão de encaminhamento de portas ainda está ativa:
curl -s localhost:8888Publique o parâmetro Gemma 7B:
curl --request POST \ --header "Content-type: application/json" \ -s \ localhost:8888/publish \ --data \ '{ "model": "/sax/test/gemma7bfp16", "model_path": "saxml.server.pax.lm.params.gemma.Gemma7BFP16", "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_7b-it/checkpoint_00000000", "replicas": "1" }'A saída será assim:
{ "model": "/sax/test/gemma7bfp16", "model_path": "saxml.server.pax.lm.params.gemma.Gemma7BFP16", "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_7b-it/checkpoint_00000000", "replicas": 1 }Confira a próxima etapa para monitorar o progresso da implantação.
Monitore o progresso observando os registros em um pod de servidor de modelo da implantação
sax-model-server-v5e-2x2.kubectl logs --follow deployment/sax-model-server-v5e-2x2Aguarde até uma mensagem semelhante a esta aparecer:
I0125 15:34:31.685555 139063071708736 servable_model.py:699] loading completed. I0125 15:34:31.686286 139063071708736 model_service_base.py:532] Successfully loaded model for key: /sax/test/gemma7bfp16Verifique se o modelo foi publicado exibindo as informações dele:
curl --request GET \ --header "Content-type: application/json" \ -s \ localhost:8888/listcell \ --data \ '{ "model": "/sax/test/gemma7bfp16" }'O resultado será assim:
{ "model": "/sax/test/gemma7bfp16", "model_path": "saxml.server.pax.lm.params.gemma.Gemma7BFP16", "checkpoint": "gs://CHECKPOINTS_BUCKET_NAME/gemma_7b-it/checkpoint_00000000", "max_replicas": 1, "active_replicas": 1 }
use o modelo
É possível interagir com os modelos Gemma 2B ou 7B. Use a API generate
do servidor HTTP Saxml para enviar um prompt ao modelo.
Gemma 2B-it
Disponibilize uma solicitação de prompt usando o endpoint generate do servidor HTTP Saxml:
curl --request POST \
--header "Content-type: application/json" \
-s \
localhost:8888/generate \
--data \
'{
"model": "/sax/test/gemma2bfp16",
"query": "What are the top 5 most popular programming languages?"
}'
Confira a seguir um exemplo de resposta do modelo. A saída real varia de acordo com o comando que você disponibiliza:
[
[
"\n\n1. **Python**\n2. **JavaScript**\n3. **Java**\n4. **C++**\n5. **Go**",
-3.0704939365386963
]
]
É possível executar o comando com diferentes parâmetros query. Também é possível modificar
parâmetros extras, como temperature, top_k e topc_p, usando a
API generate. Para saber mais sobre a API do servidor HTTP Saxml, consulte APIs HTTP do Saxml.
Gemma 7B-it
Disponibilize uma solicitação de prompt usando o endpoint generate do servidor HTTP Saxml:
curl --request POST \
--header "Content-type: application/json" \
-s \
localhost:8888/generate \
--data \
'{
"model": "/sax/test/gemma7bfp16",
"query": "What are the top 5 most popular programming languages?"
}'
Confira a seguir um exemplo de resposta do modelo. A saída pode variar em cada comando exibido:
[
[
"\n\n**1. JavaScript**\n\n* Most widely used language on the web.\n* Used for front-end development, such as websites and mobile apps.\n* Extensive libraries and frameworks available.\n\n**2. Python**\n\n* Known for its simplicity and readability.\n* Versatile, used for various tasks, including data science, machine learning, and web development.\n* Large and active community.\n\n**3. Java**\n\n* Object-oriented language widely used in enterprise applications.\n* Used for web applications, mobile apps, and enterprise software.\n* Strong ecosystem and support.\n\n**4. Go**\n\n",
-16.806324005126953
]
]
É possível executar o comando com diferentes parâmetros query. Também é possível modificar
parâmetros extras, como temperature, top_k e topc_p, usando a
API generate. Para saber mais sobre a API do servidor HTTP Saxml, consulte APIs HTTP do Saxml.
Cancelar a publicação do modelo
Siga estas etapas para cancelar a publicação do modelo:
Gemma 2B-it
Para cancelar a publicação do modelo Gemma 2B-it, execute o seguinte comando:
curl --request POST \
--header "Content-type: application/json" \
-s \
localhost:8888/unpublish \
--data \
'{
"model": "/sax/test/gemma2bfp16"
}'
A saída será assim:
{
"model": "/sax/test/gemma2bfp16"
}
É possível executar o comando com diferentes solicitações transmitidas no parâmetro query.
Gemma 7B-it
Para cancelar a publicação do modelo Gemma 7B-it, execute o seguinte comando:
curl --request POST \
--header "Content-type: application/json" \
-s \
localhost:8888/unpublish \
--data \
'{
"model": "/sax/test/gemma7bfp16"
}'
A saída será assim:
{
"model": "/sax/test/gemma7bfp16"
}
É possível executar o comando com diferentes solicitações transmitidas no parâmetro query.
Resolver problemas
- Se você receber a mensagem
Empty reply from server, é possível que o contêiner não tenha concluído o download dos dados do modelo. Verifique os registros do pod novamente para ver a mensagemConnected, que indica que o modelo está pronto para ser disponibilizado. - Se aparecer
Connection refused, verifique se o encaminhamento de portas está ativo.