Neste tutorial, mostramos como orquestrar um ambiente de treinamento distribuído para aprendizado por reforço (RL, na sigla em inglês) no Google Kubernetes Engine (GKE). Você usa o Ray e o framework NVIDIA NeMo RL para configurar um ambiente de treinamento distribuído e ajustar um modelo.
Este tutorial se concentra no pipeline de treinamento da otimização de política relativa a grupos (GRPO) no GKE com Ray e NeMo RL. O GRPO é um algoritmo de aprendizado por reforço projetado para melhorar a capacidade de raciocínio de um modelo. Esse algoritmo com eficiência de memória simplifica o processo de RL ao eliminar o Critic, ou modelo de valor, e usar um cálculo relativo baseado em grupo.
Antes de executar este tutorial, conclua o tutorial Ajustar e escalonar o aprendizado por reforço com o verl no GKE. Este tutorial usa a mesma configuração e configuração de cluster do tutorial de ajuste e escalonamento de RL com verl.
Contexto
As seções a seguir oferecem uma breve visão geral dos conceitos usados neste tutorial.
Aprendizado por reforço (RL)
A RL ensina modelos por experiência, exploração e feedback, em vez de imitação estática. Embora o pré-treinamento ensine um modelo a falar, o aprendizado por reforço com feedback humano (RLHF) ensina como ser útil, seguro e lógico. O RL serve como ponte entre um modelo de base e um modelo refinado para um caso de uso especializado.
Para mais informações, consulte O que é aprendizado por reforço?
Otimização de política relativa a grupos (GRPO)
O GRPO, um algoritmo popularizado pela DeepSeek, oferece uma alternativa com eficiência de memória à otimização de política proximal (PPO) para o alinhamento de LLMs ao remover o modelo de crítica. Em vez de uma rede de críticos, o GRPO gera um grupo de respostas para o mesmo comando e usa a recompensa média desse grupo como base.
Para mais informações, consulte GRPO.
NVIDIA NeMo RL
O NeMo RL é uma biblioteca de código aberto da NVIDIA para pós-treinamento criada para RL escalonável. Parte do ecossistema mais amplo do framework NeMo, o NeMo RL permite experimentos em pequena escala em uma única GPU e implantações de vários nós em milhares de GPUs.
Para mais informações, consulte NVIDIA NeMo RL.
Conjunto de dados GSM8k
Neste tutorial, você vai usar o conjunto de dados GSM8k, que contém 8.500 problemas de matemática de alta qualidade e linguisticamente diversos para o ensino fundamental.
Ao usar o GSM8k e o GRPO, o modelo gera um grupo de n respostas diferentes para o mesmo problema. O GRPO compara essas respostas com a média do grupo. O modelo é mais recompensado por caminhos que são consistentemente corretos e logicamente válidos em comparação com o restante do grupo. Com o tempo, o modelo aprende que articular as etapas com clareza é a maneira mais confiável de maximizar a recompensa, reduzindo efetivamente a recompensa por respostas de baixa performance.
Para mais informações, consulte GSM8k.
Objetivos
Neste tutorial, mostramos como configurar o RL no GKE com o NeMo RL seguindo estas etapas:
- Prepare seu ambiente.
- Configure um cluster do GKE com GPUs B200 ou H200.
- Configure o KubeRay para gerenciar um cluster distribuído do Ray.
- Use o Managed Lustre para armazenamento de alta performance.
- Execute um job de treinamento do GRPO que usa o NeMo RL.
Antes de começar
-
Instale a CLI do Google Cloud.
-
Configure a CLI gcloud para usar sua identidade federada.
Para mais informações, consulte Fazer login na CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, 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 APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.gcloud services enable container.googleapis.com
storage.googleapis.com compute.googleapis.com -
Atribua papéis à sua conta de usuário. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM:
roles/container.admin, roles/iam.serviceAccountAdmin, roles/storage.admingcloud 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 conta. Para exemplos, consulte Representar usuários do pool de força de trabalho nas políticas do IAM.ROLE: o papel do IAM concedido à sua conta de usuário.
- Crie uma conta do Hugging Face caso ainda não tenha uma.
- Verifique se você tem um
token do Hugging Face com
read access. - Crie uma conta do Weights & Biases (Wandb), caso ainda não tenha uma.
- Crie uma chave de API do Wandb.
- Verifique se o projeto Google Cloud tem cota suficiente para GPUs B200 e H200. Para saber mais, consulte Planejar a cota de GPU e Cota de GPU.
Preparar o ambiente
Neste tutorial, você vai usar o Cloud Shell.
Acesse o console doGoogle Cloud .
Na parte de cima da janela do console do Google Cloud , clique no botão Ativar Cloud Shell.
Configure as variáveis de ambiente a seguir:
Substitua os seguintes valores:
YOUR_REGION: a região do Compute Engine para o plano de controle do cluster do GKE.YOUR_NODE_ZONE: a zona dos nós. Selecione uma zona em que as GPUs NVIDIA B200 ou H200 estejam disponíveis.YOUR_CLUSTER_NAME: o nome do cluster do GKE.YOUR_GPU_TYPE: o acelerador que você reservou na reserva de capacidade do Compute Engine. Precisa ser um dos valores abaixo:nvidia-b200: NVIDIA B200 (180 GB)nvidia-h200-141gb: NVIDIA H200 (141 GB)
YOUR_MACHINE_TYPE: o tipo de máquina a ser usado:- Para GPUs NVIDIA B200 (180 GB), use
a4-highgpu-8gou mais recente. - Para GPUs NVIDIA H200 (141 GB), use
a3-ultragpu-8gou mais recente.
- Para GPUs NVIDIA B200 (180 GB), use
YOUR_RESERVATION_NAME: o nome da sua reserva de GPU.CHOSEN_LUSTRE_NAME: o nome da instância do Lustre.YOUR_HF_TOKEN: seu token do Hugging Face.YOUR_WANDB_API_KEY: sua chave de API do Wandb.
Crie as seguintes variáveis de ambiente para a rede:
Substitua os seguintes valores:
NETWORK_NAME: o nome da rede para o GKE.GVNIC_NAME: o prefixo do nome da rede gVNIC. Você pode usar qualquer prefixo.RDMA_NAME: o prefixo da rede de acesso direto à memória (RDMA) remota. Você pode usar qualquer prefixo.
Configurar a infraestrutura
Nesta seção, você cria redes VPC e um cluster do GKE.
Crie uma rede VPC
Crie uma rede VPC para a interface gVNIC:
Crie uma rede e sub-redes VPC para RDMA que incluam oito sub-redes para oito GPUs:
Criar o cluster do GKE
É possível definir o NeMo RL em um cluster GKE Standard.
Criar um cluster padrão
Receba as credenciais do cluster:
Crie o pool de nós de GPU:
Instale o instalador do NCCL RDMA:
Configurar mapeamentos de rede
Salve o seguinte manifesto como
network-mapping.yaml:Aplique o manifesto:
Preparar o armazenamento
Nesta seção, você vai criar uma instância do Managed Lustre, que provisiona o armazenamento de alta performance necessário para sua carga de trabalho de RL.
Alocar um intervalo de endereços IP para acesso a serviços particulares:
Conecte o peering:
Crie uma instância do Managed Lustre:
Acesse uma instância do Managed Lustre usando o driver CSI do Managed Lustre.
Extraia o endereço IP da instância do Managed Lustre.
Inspecione o manifesto
lustre-pv.yaml.Aplique o manifesto:
Inspecione o manifesto
lustre-pvc.yaml.Aplique o manifesto:
Implantar o RayCluster
Nesta seção, você vai clonar o repositório de exemplo, preparar os manifestos e implantar o cluster do Ray:
Clone o repositório de amostra:
Navegue até o diretório de trabalho:
Inspecione o manifesto
values.yaml:Substitua
NCCL_TUNER_CONFIG_PATHpor qualquer um dos valores a seguir, com base no acelerador usado neste tutorial:- NVIDIA B200 (180 GB):
/usr/local/gib/configs/tuner_config_a4.txtpb - NVIDIA H200 (141 GB):
/usr/local/gib/configs/tuner_config_a3u.txtpb
Neste manifesto, o nó principal gerencia o job e hospeda o painel do Ray. Os nós de trabalho executam os jobs de treinamento.
- NVIDIA B200 (180 GB):
Implante o cluster do Ray:
Neste tutorial, você vai usar dois nós de trabalho. Se quiser mudar o número de nós de worker, altere o valor de
REPLICA_COUNT.Verifique se os nós de trabalho e de cabeçalho estão em execução:
O resultado será o seguinte:
NAME READY STATUS RESTARTS AGE ray-cluster-kuberay-head-sw7dp 2/2 Running 0 33h ray-cluster-kuberay-worker-grp-0-worker-gkbxw 2/2 Running 0 33h ray-cluster-kuberay-worker-grp-0-worker-kdg62 2/2 Running 0 33hVerifique se o cluster do Ray está em execução:
O resultado será o seguinte:
NAME NAMESPACE DESIRED WORKERS AVAILABLE WORKERS CPUS GPUS TPUS MEMORY CONDITION STATUS AGE ray-cluster-kuberay default 2 2 618 17 0 1573741824k RayClusterProvisioned ready 33h
Iniciar o job do GRPO
Depois que o cluster do Ray estiver pronto, envie um job do Ray para o cluster do Ray em execução no GKE. O NeMo RL baixa automaticamente o modelo durante a execução do job de treinamento de RL.
Para enviar um job do Ray, inicie uma sessão interativa para executar o job.
Para estabelecer uma conexão local com o cluster do Ray, execute este comando:
Esse comando inicia o encaminhamento de porta entre a máquina local e o nó principal do Ray no cluster do GKE. Observe que o terminal vai ficar ocupado enquanto essa sessão estiver ativa. Para continuar, abra uma instância de terminal separada.
Em um terminal separado, navegue até
kubernetes-engine-samples/ai-ml/nemo-rl-on-gke/nemoRL/gemma3-27b-ite edite o arquivogemma3-27b-gsm8k.sh:Substitua os seguintes valores no arquivo
gemma3-27b-gsm8k.sh:YOUR_WANDB_API_KEY: sua chave de API do WandB.YOUR_HF_TOKEN: seu token do Hugging Face.
Nesse arquivo, você pode conferir a configuração para executar um job com o modelo gemma3-27b-it no conjunto de dados GSM8k. Para concluir o pipeline de treinamento do GRPO, esse script define os seguintes parâmetros:
num_prompts_per_step: 16enum_generations_per_prompt: 32: o modelo Gemma3-27b-it gera um grande grupo de respostas para cada comando. Nessa configuração, o modelo produz 512 respostas no total (16 × 32 = 512).policy.generation.colocated.enabled=False: esse parâmetro desativa o recurso de geração colocada, o que significa que o modelo não gera respostas no mesmo nó que o processo de treinamento. Na RL padrão, as mesmas GPUs processam o treinamento e a geração. Nessa configuração do NeMo RL, você dedica nós específicos (gerenciados com o parâmetropolicy.generation.colocated.resources) apenas à inferência vLLM, enquanto o restante do cluster se concentra na matemática de treinamento pesado. Ao separar essas cargas de trabalho, você evita a disputa de recursos entre os buffers de treinamento que exigem muita memória e as cargas de trabalho de inferência que exigem muita computação.
Para enviar o job, execute o seguinte comando:
Quando o job está em execução, a saída mostra os resultados do treinamento, o tempo e as métricas de performance.
Monitorar a integridade do job de GRPO
Depois que o Ray termina o job, o NeMo RL armazena os pontos de verificação no caminho configurado.
Para verificar a saída do job do GRPO, crie uma sessão SSH para o contêiner
ray-head:Instale o utilitário de árvore apt no terminal do contêiner
ray-head:Liste a estrutura de diretórios do contêiner
ray-head:O resultado será o seguinte:
root@ray-cluster-kuberay-worker-grp-0-worker-gkbxw:/opt/nemo-rl# tree /data/nemo_rl_gemma3_27b_3_17/ /data/nemo_rl_gemma3_27b_3_17/ `-- step_10 |-- config.yaml |-- policy | |-- optimizer | | |-- __0_0.distcp | | |-- __10_0.distcp | | |-- __11_0.distcp | | |-- __12_0.distcp | | |-- __13_0.distcp | | |-- __14_0.distcp | | |-- __15_0.distcp | | |-- __1_0.distcp | | |-- __2_0.distcp | | |-- __3_0.distcp | | |-- __4_0.distcp | | |-- __5_0.distcp | | |-- __6_0.distcp | | |-- __7_0.distcp | | |-- __8_0.distcp | | `-- __9_0.distcp | |-- tokenizer | | |-- chat_template.jinja | | |-- special_tokens_map.json | | |-- tokenizer.json | | `-- tokenizer_config.json | `-- weights | |-- __0_0.distcp | |-- __10_0.distcp | |-- __11_0.distcp | |-- __12_0.distcp | |-- __13_0.distcp | |-- __14_0.distcp | |-- __15_0.distcp | |-- __1_0.distcp | |-- __2_0.distcp | |-- __3_0.distcp | |-- __4_0.distcp | |-- __5_0.distcp | |-- __6_0.distcp | |-- __7_0.distcp | |-- __8_0.distcp | `-- __9_0.distcp |-- train_dataloader.pt `-- training_info.json 6 directories, 39 files
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua os recursos individuais ou o projeto que os contém.
Excluir os recursos
Exclua o cluster do Slurm:
Exclua seu Cluster do GKE:
Exclua o sistema de arquivos Lustre:
Exclua o peering de VPC:
Exclua o intervalo de endereços IP privados do Lustre:
Exclua as sub-redes RDMA e gVNIC:
Exclua as regras de firewall e as redes:
Excluir o projeto
Excluir um projeto do Google Cloud :
gcloud projects delete PROJECT_ID