FTH 1 · Ensinar a andar|INEMA.CLUB-PRO

Aula 5 · 16 min

PPO com milhares de robôs em paralelo

O algoritmo que treina quase toda marcha de humanoide hoje é o PPO, rodando milhares de cópias do robô na GPU. Nesta aula você entende o laço coletar, estimar e atualizar, roda um PPO de ~120 linhas com os valores do mjlab em CPU, com 16 robôs, e vê o comando que faz o mesmo com 4.096.

Começar a aula
Monitor numa sala escura mostrando dezenas de pequenos robôs humanoides idênticos andando em simulação, organizados em grade.

Nesta aula você vai

  1. 1O laço: coletar 24 passos por robô, estimar a vantagem, atualizar a rede
  2. 2Os hiperparâmetros do G1 no mjlab: lr 1e-3 adaptativo, clip 0,2, 5 épocas
  3. 320 iterações em CPU: checkpoint e progresso.csv
  4. 4Em escala (mostrado): 4.096 ambientes na GPU, 30.000 iterações

Objetivo: rodar um treino curto de PPO em CPU que grava checkpoint e log, e ler os valores de um treino de verdade no mjlab.

01Uma iteração de PPO

Clique em cada bloco. O treino repete esse laço milhares de vezes.

Clique em cada bloco do diagrama para ver o que ele faz.

Rede do ator e do crítico: 512-256-128 com ELU, observações normalizadas, como no mjlab para o G1.

02Os valores, copiados do mjlab

O kit/ppo.py usa os nomes e os padrões do rl_cfg.py do G1 no mjlab (commit 8bb2bc9, 18/10/2026; biblioteca rsl-rl-lib 5.5.1).

Trecho · kit/ppo.py
PADRAO = dict(clip_param=0.2, entropy_coef=0.01, value_loss_coef=1.0, num_learning_epochs=5,
              num_mini_batches=4, learning_rate=1.0e-3, desired_kl=0.01, gamma=0.99, lam=0.95,
              max_grad_norm=1.0, num_steps_per_env=24, init_std=1.0, hidden_dims=(512, 256, 128))

03Treinar 20 iterações em CPU

16 G1 em paralelo no MuJoCo, um núcleo, com a recompensa da aula 4. O teto de 900 s é folga: aqui levou segundos.

Terminal · treino curto
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
timeout 900 python3 kit/treinar.py --iters 20; echo "saída: $?"
test -f $F/treino/ppo/modelo_20.pt && echo "arquivo existe: modelo_20.pt"
wc -l < $F/treino/ppo/progresso.csv
Exemplo do repositório
PPO em CPU: 16 ambientes × 24 passos = 384 amostras por iteração · obs 96 → ação 29
it   1/20 · recompensa média  -1.75 · episódio médio  24.0 passos · quedas  0
it   2/20 · recompensa média  -3.33 · episódio médio  42.8 passos · quedas  5
it   3/20 · recompensa média  -4.85 · episódio médio  58.6 passos · quedas 10
it   4/20 · recompensa média  -3.90 · episódio médio  50.2 passos · quedas  4
it   5/20 · recompensa média  -4.38 · episódio médio  52.6 passos · quedas  7
it   6/20 · recompensa média  -4.38 · episódio médio  56.5 passos · quedas  4
it   7/20 · recompensa média  -5.37 · episódio médio  69.7 passos · quedas  9
it   8/20 · recompensa média  -5.28 · episódio médio  68.0 passos · quedas  4
it   9/20 · recompensa média  -4.68 · episódio médio  56.8 passos · quedas  9
it  10/20 · recompensa média  -4.73 · episódio médio  61.6 passos · quedas  7
it  11/20 · recompensa média  -4.45 · episódio médio  52.6 passos · quedas  5
it  12/20 · recompensa média  -4.68 · episódio médio  56.9 passos · quedas  9
it  13/20 · recompensa média  -4.22 · episódio médio  52.6 passos · quedas  7
it  14/20 · recompensa média  -4.56 · episódio médio  55.0 passos · quedas  5
it  15/20 · recompensa média  -4.81 · episódio médio  57.1 passos · quedas  8
it  16/20 · recompensa média  -4.88 · episódio médio  59.0 passos · quedas  4
it  17/20 · recompensa média  -4.56 · episódio médio  56.6 passos · quedas  9
it  18/20 · recompensa média  -5.19 · episódio médio  63.4 passos · quedas  7
it  19/20 · recompensa média  -4.47 · episódio médio  51.8 passos · quedas  6
it  20/20 · recompensa média  -4.64 · episódio médio  57.5 passos · quedas  8
checkpoint salvo: ~/fth/treino/ppo/modelo_20.pt
log: ~/fth/treino/ppo/progresso.csv (20 linhas) · tempo total: 9 s
saída: 0
arquivo existe: modelo_20.pt
21

Confira o formato, não o valor: 20 linhas it, checkpoint salvo:, o arquivo existe e o progresso.csv tem 21 linhas (cabeçalho + 20). A recompensa média negativa e as quedas mostram que 20 iterações não ensinam o G1 a andar; o mjlab usa max_iterations=30_000. O tempo total muda de uma máquina para outra.

04O mesmo treino em escala (mostrado, não roda aqui)

Comandos dos READMEs oficiais. Pedem GPU NVIDIA e um ambiente próprio para cada ferramenta: não misture no venv do curso.

Mostrado · mjlab (README, commit 8bb2bc9)
uv run train Mjlab-Velocity-Flat-Unitree-G1 --env.scene.num-envs 4096
Mostrado · unitree_rl_lab (README, Isaac Lab)
python scripts/rsl_rl/train.py --headless --task Unitree-G1-29dof-Velocity

05Onde roda o treino de verdade

Três caminhos atuais, todos na GPU. Clique em cada um.

1. mjlab

A API "manager-based" do Isaac Lab sobre o MuJoCo Warp 3.16, Apache-2.0, com uv. Exige GPU NVIDIA (no macOS, só avalia). É o parente mais próximo deste kit: os mesmos nomes de termos.

06Prática

Ver o laço rodar inteiro antes de tentar fazê-lo aprender.

E1 · Treino curto

5 min

Rode o bloco do treino de 20 iterações.

Pronto quando: timeout 900 python3 kit/treinar.py --iters 20; echo "saída: $?" → checkpoint salvo: ~/fth/treino/ppo/modelo_20.pt, saída: 0, arquivo existe: modelo_20.pt e 21.

E2 · Mais robôs

10 min

Rode de novo com --envs 32 --iters 10 --saida ~/fth/treino/ppo32 e compare as amostras por iteração e o tempo total.

Pronto quando: a primeira linha diz 32 ambientes × 24 passos = 768 amostras por iteração e existe ~/fth/treino/ppo32/modelo_10.pt.

E3 · Conta da escala

5 min

Com os valores do mjlab (4.096 ambientes, 24 passos, 30.000 iterações), calcule quantas amostras um treino completo coleta. Escreva quantas vezes isso é maior que o seu treino de 20 iterações.

Pronto quando: você escreveu 98.304 amostras por iteração e cerca de 2,9 bilhões no treino completo (384 × 20 = 7.680 no seu: cerca de 384 mil vezes mais).

07Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 3

O que o recorte (clip 0,2) faz no PPO?competência

08Em três frases

LaçoColetar 24 passos por robô, estimar a vantagem com GAE, atualizar com recorte e taxa adaptativa.
Prática20 iterações em CPU gravam checkpoint e log; confere-se o formato, não o valor.
EscalaO mjlab usa os mesmos valores com 4.096 robôs na GPU e 30.000 iterações.

Para ir além

Aula anteriorPróxima aula