Neste tutorial, você vai aprender a treinar o modelo de linguagem grande (LLM) Llama 3 8B no Google Kubernetes Engine (GKE) usando MaxText, Ray Train e TPUs.
Este tutorial oferece um tutorial completo, de ponta a ponta, desde a configuração da infraestrutura em nuvem necessária até o envio e a execução bem-sucedida da carga de trabalho de treinamento em TPUs de vários hosts.
Este tutorial é destinado a administradores e operadores de plataforma e especialistas em dados e IA que querem aprender a treinar modelos grandes em uma fração de TPU distribuída e com vários hosts.
Contexto
A combinação de GKE, KubeRay, MaxText e TPUs oferece uma plataforma poderosa e escalonável para treinamento de modelo em grande escala. Esta seção descreve as principais tecnologias usadas neste guia:
JAX
O JAX é uma biblioteca Python para computação de matrizes e transformação de programas orientada a aceleradores, projetada para computação numérica de alto desempenho e machine learning em grande escala.
O JAX oferece um sistema extensível para transformar funções numéricas como
jax.grad, jax.jit e jax.vmap, usando o compilador XLA para criar
código altamente otimizado que é escalonado de maneira eficiente em aceleradores como GPUs e
TPUs. O principal poder do JAX está na capacidade de composição, que permite aos usuários
combinar essas transformações para criar programas numéricos complexos e de alto desempenho
para execução distribuída.
MaxText
O MaxText é um modelo de linguagem grande (LLM) de código aberto e alto desempenho projetado para escalonabilidade e personalização. O MaxText é criado com base no JAX e otimizado para ser executado com eficiência na Cloud TPU e GPUs.
TPUs
As Unidades de Processamento de Tensor (TPUs) são aceleradores personalizados criados pelo Google para otimizar as cargas de trabalho de machine learning. Ao contrário das CPUs de uso geral ou das GPUs de processamento paralelo, as TPUs são altamente especializadas para cálculos de matrizes e tensores massivos na base do aprendizado profundo, o que as torna eficientes nessa tarefa específica. A principal vantagem das TPUs é o desempenho em escala.
Este tutorial usa a TPU Trillium, que é a sexta geração de TPUs. Para mais informações, consulte Benefícios de usar o Trillium do TPU.
KubeRay
O KubeRay é um operador do Kubernetes que oferece uma maneira unificada de implantar, gerenciar e monitorar aplicativos do Ray no Kubernetes. O operador KubeRay é instalado e gerenciado pelo complemento Ray no GKE, que é a maneira recomendada de implantar e gerenciar clusters do Ray no GKE.
Objetivos
Este tutorial mostra como fazer o seguinte:
- Configure um cluster do GKE com um pool de nós de TPU de vários hosts.
- Configure o KubeRay para gerenciar o ambiente de treinamento distribuído.
- Crie uma imagem Docker personalizada que contenha as dependências do MaxText, do Ray e do JAX.
- Crie um script de treinamento em Python que use o
JaxTrainerdo Ray Train para orquestrar o loop de treinamento do MaxText na fração de TPU. - Defina um recurso personalizado
RayClusterpara provisionar os nós principais e de worker com os recursos de TPU necessários. - Envie o job de treinamento para o
RayClustere monitore o progresso dele. - Use o Cloud Storage para armazenar checkpoints do modelo.
Antes de começar
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs necessárias:
Funções necessárias para ativar APIs
Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (
roles/serviceusage.serviceUsageAdmin), que contém a permissãoserviceusage.services.enable. Saiba como conceder papéis.gcloud services enable container.googleapis.com
cloudbuild.googleapis.com -
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs necessárias:
Funções necessárias para ativar APIs
Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (
roles/serviceusage.serviceUsageAdmin), que contém a permissãoserviceusage.services.enable. Saiba como conceder papéis.gcloud services enable container.googleapis.com
cloudbuild.googleapis.com -
Atribua papéis à sua conta de usuário. Execute o seguinte comando uma vez para cada um dos seguintes papéis do IAM:
roles/container.admin, roles/iam.serviceAccountAdmin, roles/cloudbuild.builds.editorgcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Substitua:
PROJECT_ID: o ID do projeto.USER_IDENTIFIER: o identificador da sua conta de usuário . Por exemplo,myemail@example.com.ROLE: o papel do IAM concedido à sua conta de usuário.
- Como este tutorial usa a TPU Trillium (v6e), selecione uma região ou zona com disponibilidade. Para mais informações, consulte Cotas do Cloud TPU.
Preparar o ambiente
Neste tutorial, você vai usar o Cloud Shell. O Cloud Shell vem
pré-instalado com as ferramentas de linha de comando gcloud, helm e kubectl que
são usadas neste tutorial.
Acesse o console doGoogle Cloud .
Na parte de cima da janela do console do Google Cloud , clique no botão Ativar Cloud Shell
.Uma sessão do Cloud Shell é aberta em um novo frame no consoleGoogle Cloud e exibe um prompt de linha de comando.
Crie e ative um ambiente virtual Python:
python3 -m venv ray-env source ray-env/bin/activateInstale a CLI do Ray e outras dependências:
pip install "ray[default]==2.49.1"Configure as variáveis de ambiente a seguir:
export PROJECT_ID=$(gcloud config get project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export GS_BUCKET=GS_BUCKET export KSA_NAME=KSA_NAME export NAMESPACE=default export CLUSTER_NAME=CLUSTER_NAME export REGION=REGION export ZONE=ZONE export ARTIFACT_REGISTRY=ARTIFACT_REGISTRYSubstitua:
GS_BUCKET: o nome do bucket do Cloud Storage.KSA_NAME: o nome da conta de serviço do Kubernetes.CLUSTER_NAME: o nome do novo cluster;REGION: a região em que sua capacidade de TPU Trillium está disponível.ZONE: a zona em que sua capacidade de TPU Trillium está disponível. Para mais informações, consulte Disponibilidade da TPU no GKE.ARTIFACT_REGISTRY: o nome do repositório do Artifact Registry.
Criar um cluster do GKE
É possível configurar o KubeRay em TPUs em um cluster do GKE Autopilot ou Standard. Recomendamos que você use um cluster do Autopilot para ter uma experiência totalmente gerenciada do Kubernetes. Para escolher o modo de operação do GKE mais adequado para suas cargas de trabalho, consulte Sobre os modos de operação do GKE.
Piloto automático
No Cloud Shell, execute este comando:
gcloud container clusters create-auto $CLUSTER_NAME \ --enable-ray-operator \ --machine-type=n1-standard-16 \ --location=$REGIONPara se comunicar com o cluster, configure
kubectl:gcloud container clusters get-credentials CLUSTER_NAME \ --location=$ZONE
Padrão
No Cloud Shell, crie um cluster Standard que ative o complemento do operador do Ray executando o seguinte comando:
gcloud container clusters create $CLUSTER_NAME \ --addons=RayOperator \ --addons GcsFuseCsiDriver \ --machine-type=n1-standard-16 \ --workload-pool=$PROJECT_ID.svc.id.goog \ --location=$ZONEEsse comando também ativa o
GcsFuseCsiDriver, que permite que os pods ativem buckets do Cloud Storage como sistemas de arquivos locais. A criação do cluster pode levar vários minutos.Para se comunicar com o cluster, configure
kubectl:gcloud container clusters get-credentials CLUSTER_NAME \ --location=LOCATIONCrie um pool de nós de fração de TPU com vários hosts:
gcloud container node-pools create v6e-16 \ --location=$ZONE \ --cluster=$CLUSTER_NAME \ --machine-type=ct6e-standard-4t \ --threads-per-core=1 \ --tpu-topology=4x4 \ --num-nodes=4
O GKE provisiona um pool de nós com quatro VMs TPU Trillium (v6e), que são configuradas juntas como uma fração de TPU de vários hosts, com uma topologia 4x4, pronta para cargas de trabalho de treinamento distribuído.
O cluster do GKE com o operador Ray ativado instala automaticamente o KubeRay e o webhook de TPU do KubeRay no cluster.
Configurar um bucket do Cloud Storage e uma conta de serviço
Crie um bucket do Cloud Storage para checkpoints compartilhados entre os nós de TPU de vários hosts.
gsutil mb -p ${PROJECT_ID} -c STANDARD -l ${REGION} gs://${GS_BUCKET}Para ativar o acesso ao bucket do Cloud Storage, crie uma conta de serviço do Kubernetes:
kubectl create serviceaccount ${KSA_NAME} --namespace ${NAMESPACE}Para ativar o acesso ao bucket do Cloud Storage, adicione as vinculações de política do IAM necessárias à conta de serviço:
gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET} \ --member "principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/${KSA_NAME}" \ --role "roles/storage.objectUser"
criar o script de treinamento;
O script a seguir usa o JaxTrainer do Ray Train para executar um job de treinamento distribuído do MaxText. O script configura o ambiente de treinamento para um pool de nós de fração de TPU de vários hosts e executa o job de treinamento do MaxText em cada nó de trabalho. A função
train_loop_per_worker encapsula o ponto de entrada principal do MaxText e usa
o programador distribuído do Ray para executar o treinador do MaxText em uma fração de TPU
de vários hosts.
Salve o script Python a seguir como
maxtext_ray_trainer.py:Para hospedar a imagem personalizada, crie um repositório do Artifact Registry:
gcloud artifacts repositories create ${ARTIFACT_REGISTRY} \ --repository-format=docker --location=${REGION} && \ gcloud auth configure-docker ${REGION}-docker.pkg.devPara criar uma imagem que inclua dependências do Ray e do MaxText para treinamento, crie um
Dockerfile:Crie, atribua uma tag e envie a imagem Docker para o Artifact Registry:
export DOCKER_IMAGE=${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY}/ray-maxtext:latest gcloud builds submit --tag ${DOCKER_IMAGE}
Treine o modelo
Salve o seguinte manifesto de amostra como
maxtext-tpu-cluster.yaml:A especificação do RayCluster anterior cria um grupo de workers da TPU com quatro workers (
numOfHosts: 4) por réplica. Cada worker solicita quatro chips de TPU (google.com/tpu: "4"). Os workers serão programados em um nó que executa TPU Trillium (tpu-v6e-slice) e faz parte da mesma fração de vários hosts colocados. O KubeRay escalona todos os quatro workers atomicamente, e as variáveis de ambiente JAX necessárias, bem como as afinidades de pod para programação, são inicializadas pelo GKE por um webhook de mutação.Para configurar os valores obrigatórios no arquivo YAML, crie o RayCluster usando
envsubst:envsubst < maxtext-tpu-cluster.yaml | kubectl apply -f -Verifique se o cluster está pronto e em execução:
kubectl get rayclusters maxtext-tpu-clusterA saída será semelhante a esta:
NAME DESIRED WORKERS AVAILABLE WORKERS CPUS MEMORY GPUS STATUS AGE maxtext-tpu-cluster 4 4 40 798027216Ki 0 ready 11mPara acessar o painel do Ray pelo serviço de cabeçalho do Ray, estabeleça uma sessão de encaminhamento de portas:
kubectl port-forward svc/maxtext-tpu-cluster-head-svc 8265:8265 2>&1 >/dev/null &Verifique se o RayCluster pode ser acessado no seu ambiente local:
ray list nodes --address http://localhost:8265A saída será semelhante a esta:
======== List: 2025-09-13 03:53:16.988269 ======== Stats: ------------------------------ Total: 5 Table: ------------------------------ NODE_ID NODE_IP IS_HEAD_NODE STATE STATE_MESSAGE NODE_NAME RESOURCES_TOTAL LABELS 0 92c79d04c34b659c1e3044f7642ad3fd47eb16f290785237149fab56 10.84.0.9 (...)Envie o script JaxTrainer para o RayCluster e verifique se o RayJob foi concluído:
ray job submit \ --address http://localhost:8265 \ -- python /app/maxtext_ray_trainer.py \ /app/maxtext/src/MaxText/configs/base.yml \ base_output_directory=/data/ \ dataset_type=synthetic \ per_device_batch_size=1 \ max_target_length=4096 \ model_name=llama3-8b \ steps=100 \ ici_fsdp_parallelism=4 \ ici_tensor_parallelism=4 \ run_name=rayjob-8b-4096-tp4-4x4O comando anterior envia o script Python, que chama o código do JaxTrainer Ray para o RayCluster. O comando
ray job submitinclui alguns argumentos específicos do MaxText para transmitir à configuração do modelo.No terminal, você vai ver uma saída semelhante a esta:
(RayTrainWorker pid=21663, ip=10.12.3.6) completed step: 99, seconds: 1.100, TFLOP/s/device: 179.739, Tokens/s/device: 3725.218, total_weights: 65536, loss: 0.000 [repeated 3x across cluster] ------------------------------------------ Job 'raysubmit_zCrJcWnuymMQv4C3' succeeded ------------------------------------------
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.
Exclua o RayCluster:
kubectl delete raycluster maxtext-tpu-clusterExclua o cluster do GKE:
gcloud container clusters delete $CLUSTER_NAME --zone=$ZONEExclua o bucket do Cloud Storage:
gsutil rm -r gs://${GS_BUCKET}Exclua o repositório do Artifact Registry:
gcloud artifacts repositories delete ${ARTIFACT_REGISTRY} --location=${REGION} --quiet
A seguir
- Saiba mais sobre o Ray no Kubernetes.
- Saiba como disponibilizar o vLLM no GKE com TPUs.
- Saiba como disponibilizar o SDXL no GKE com TPUs.
- Saiba mais sobre TPUs no GKE.