# π₀ (Pi0)

π₀ é um **modelo Vision-Language-Action para controle geral de robôs**, da Physical Intelligence. A implementação do LeRobot é adaptada do repositório de código aberto [OpenPI](https://github.com/Physical-Intelligence/openpi) deles.

## Visão geral do modelo

π₀ representa um avanço na robótica, sendo o primeiro modelo de fundação para robôs de uso geral desenvolvido pela [Physical Intelligence](https://www.physicalintelligence.company/blog/pi0). Diferente dos programas de robôs tradicionais, que são especialistas estreitos programados para movimentos repetitivos, o π₀ é projetado como uma política generalista capaz de compreender entradas visuais, interpretar instruções em linguagem natural e controlar uma variedade de robôs diferentes em diversas tarefas.

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/lerobot-pi0%20(1).png"
  alt="An overview of Pi0"
  width="85%"
/>

### A Visão para a Inteligência Física

Conforme descrito pela Physical Intelligence, embora a IA tenha alcançado um sucesso notável em domínios digitais, desde o jogo de xadrez até a descoberta de medicamentos, a inteligência humana ainda supera drasticamente a IA no mundo físico. Para parafrasear o paradoxo de Moravec, vencer uma partida de xadrez representa um problema "fácil" para a IA, mas dobrar uma camisa ou limpar uma mesa exige a resolução de alguns dos problemas de engenharia mais difíceis já concebidos. O π₀ representa um primeiro passo em direção ao desenvolvimento de uma inteligência física artificial que permita aos usuários simplesmente pedir a robôs que executem qualquer tarefa desejada, assim como podem fazer com modelos de linguagem de grande escala.

### Arquitetura e Abordagem

π₀ combina várias inovações-chave:

- **Flow Matching**: Utiliza um método inovador para aumentar VLMs pré-treinadas com saídas de ação contínuas por meio de flow matching (uma variante de modelos de difusão)
- **Treinamento Cross-Embodiment**: Treinado com dados de 8 plataformas de robôs distintas, incluindo UR5e, Bimanual UR5e, Franka, Bimanual Trossen, Bimanual ARX, Mobile Trossen e Mobile Fibocom
- **Pré-treinamento em escala de internet**: Herda conhecimento semântico de um Modelo de Visão-Linguagem pré-treinado com 3B parâmetros
- **Controle de alta frequência**: Emite comandos de motor em até 50 Hz para manipulação ágil em tempo real

## Requisitos de instalação

1. Instale o LeRobot seguindo nosso [Guia de Instalação](./installation).
2. Instale as dependências do Pi0 executando:

   ```bash
   pip install -e ".[pi]"
   ```

## Dados de Treinamento e Capacidades

π₀ é treinado no maior conjunto de dados de interação com robôs até o momento, combinando três fontes de dados principais:

1. **Pré-treinamento em escala de internet**: Dados de visão-linguagem da web para compreensão semântica
2. **Conjunto de dados Open X-Embodiment**: Conjuntos de dados de manipulação robótica de código aberto
3. **Conjunto de dados da Physical Intelligence**: Conjunto de dados grande e diversificado de tarefas de destreza em 8 robôs distintos

## Uso

Para usar π₀ no LeRobot, especifique o tipo de política como:

```python
policy.type=pi0
```

## Treinamento

Para treinar o π₀, você pode usar o script de treinamento padrão do LeRobot com a configuração apropriada:

```bash
lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi0 \
    --output_dir=./outputs/pi0_training \
    --job_name=pi0_training \
    --policy.pretrained_path=lerobot/pi0_base \
    --policy.repo_id=your_repo_id \
    --policy.compile_model=true \
    --policy.gradient_checkpointing=true \
    --policy.dtype=bfloat16 \
    --policy.freeze_vision_encoder=false \
    --policy.train_expert_only=false \
    --steps=3000 \
    --policy.device=cuda \
    --batch_size=32
```

### Parâmetros Principais de Treinamento

- **`--policy.compile_model=true`**: Habilita a compilação do modelo para um treinamento mais rápido
- **`--policy.gradient_checkpointing=true`**: reduz significativamente o uso de memória durante o treinamento
- **`--policy.dtype=bfloat16`**: Use treinamento com precisão mista para eficiência
- **`--batch_size=32`**: Tamanho do lote para o treinamento, adapte com base na memória da sua GPU
- **`--policy.pretrained_path=lerobot/pi0_base`**: O modelo base π₀ que você deseja fazer o finetuning. As opções são:
  - [lerobot/pi0_base](https://huggingface.co/lerobot/pi0_base)
  - [lerobot/pi0_libero](https://huggingface.co/lerobot/pi0_libero) (treinado especificamente no conjunto de dados Libero)
- **`--policy.optimizer_fused=true`**: Usa AdamW fundido para etapas de otimizador mais rápidas; essa flag é ignorada ao retomar uma execução

### Parâmetros de Treinamento Explicados

| Parâmetro               | Padrão | Descrição                                 |
| ----------------------- | ------- | ------------------------------------------- |
| `freeze_vision_encoder` | `false` | Não congele o codificador de visão            |
| `train_expert_only`     | `false` | Não congele o VLM, treine todos os parâmetros |

**💡 Dica**: Definir `train_expert_only=true` congela o VLM e treina apenas o especialista de ação e as projeções, permitindo o ajuste fino com uso reduzido de memória.

## Ações Relativas

Por padrão, o π₀ prevê ações absolutas. Você pode habilitar **ações relativas** para que o modelo preveja deslocamentos em relação ao estado atual do robô. Isso pode melhorar a estabilidade do treinamento para certas configurações.

Para usar ações relativas, primeiro recalcule as estatísticas do seu conjunto de dados no espaço relativo via CLI:

```bash
lerobot-edit-dataset \
    --repo_id your_dataset \
    --new_repo_id your_dataset \
    --operation.type recompute_stats \
    --operation.overwrite true \
    --operation.relative_action true \
    --operation.chunk_size 50 \
    --operation.relative_exclude_joints "['gripper']" \
    --push_to_hub true
```

Ou, equivalentemente, em Python:

```python
from lerobot.datasets import LeRobotDataset, recompute_stats

dataset = LeRobotDataset("your_dataset")
recompute_stats(dataset, relative_action=True, chunk_size=50, relative_exclude_joints=["gripper"])
dataset.push_to_hub()
```

O `chunk_size` deve corresponder ao `chunk_size` da sua política (padrão 50 para π₀). `relative_exclude_joints` lista os nomes das juntas que devem permanecer no espaço absoluto (por exemplo, comandos do garra). Use `--push_to_hub true` para enviar as estatísticas atualizadas para o Hub.

Depois, treine com ações relativas habilitadas:

```bash
lerobot-train \
    --dataset.repo_id=your_dataset \
    --policy.type=pi0 \
    --policy.use_relative_actions=true \
    --policy.relative_exclude_joints='["gripper"]' \
    ...
```

## Licença

Este modelo segue a **Apache 2.0 License**, em conformidade com o repositório original [OpenPI](https://github.com/Physical-Intelligence/openpi).

