oktoscript / docs /PERFORMANCE_TIPS.md
OktoSeek's picture
Update
5df2c77 verified
# Dicas de Performance para Treinamento
## Configuração de Logs
### logging_steps
Controla com que frequência os logs são exibidos durante o treinamento:
```okt
TRAIN {
epochs: 3
batch_size: 8
learning_rate: 0.0001
logging_steps: 5 # Log a cada 5 steps (mais frequente)
# logging_steps: 20 # Log a cada 20 steps (menos frequente)
}
```
**Valores recomendados:**
- **Datasets pequenos (< 1000 exemplos)**: `logging_steps: 5` ou `10`
- **Datasets médios (1000-10000)**: `logging_steps: 10` ou `20`
- **Datasets grandes (> 10000)**: `logging_steps: 50` ou `100`
### save_steps
Controla com que frequência os checkpoints são salvos:
```okt
TRAIN {
epochs: 3
batch_size: 8
learning_rate: 0.0001
save_steps: 100 # Salva checkpoint a cada 100 steps
# save_steps: 500 # Salva checkpoint a cada 500 steps (padrão)
}
```
**Dica**: Para datasets pequenos, use `save_steps` menor para não perder progresso.
## Otimização de Performance
### 1. Use GPU quando disponível
```okt
ENV {
accelerator: "gpu"
precision: "fp16" # Usa menos memória e é mais rápido
}
MODEL {
base: "t5-small"
device: "cuda" # Força uso de GPU
}
```
**Problema comum**: Se você tem GPU mas vê "No CUDA", instale:
```bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```
### 2. Aumente o batch_size (se tiver memória)
```okt
TRAIN {
epochs: 3
batch_size: 16 # Aumente de 8 para 16 ou 32 (se tiver memória)
learning_rate: 0.0001
}
```
**Trade-off**:
- Batch maior = treinamento mais rápido, mas usa mais memória
- Batch menor = treinamento mais lento, mas usa menos memória
### 3. Use gradient_accumulation para simular batch maior
Se não tiver memória para batch grande, use gradient accumulation:
```okt
TRAIN {
epochs: 3
batch_size: 8
gradient_accumulation: 4 # Efetivamente batch_size = 8 * 4 = 32
learning_rate: 0.0001
}
```
### 4. Reduza o tamanho do input (se possível)
Se seus inputs são muito longos (como JSON de menu embutido), considere:
- **Usar context_fields**: Mova informações longas para campos de contexto
- **Truncar inputs**: O tokenizer já faz isso (max_length: 512), mas inputs menores são mais rápidos
### 5. Use modelos menores para testes
Para desenvolvimento/testes rápidos:
```okt
MODEL {
base: "t5-small" # Mais rápido
# base: "t5-base" # Mais lento, mas melhor qualidade
}
```
### 6. Reduza epochs para testes
```okt
TRAIN {
epochs: 1 # Para testes rápidos
# epochs: 3 # Para treinamento real
batch_size: 8
}
```
## Análise do Seu Caso
Com base no seu dataset (582 exemplos, inputs longos com Menu JSON):
### Por que está lento?
1. **Sem CUDA**: Você está usando CPU, que é ~10-50x mais lento que GPU
2. **Batch size pequeno (8)**: Com 582 exemplos e batch 8, são ~73 steps por epoch
3. **Inputs longos**: O Menu JSON embutido aumenta o tempo de processamento
4. **Modelo T5**: T5-small é relativamente pesado para CPU
### Soluções Imediatas:
1. **Instalar CUDA** (se tiver GPU NVIDIA):
```bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```
2. **Aumentar batch_size** (se tiver RAM):
```okt
TRAIN {
epochs: 3
batch_size: 16 # Dobrar o batch_size
logging_steps: 5 # Logs mais frequentes
}
```
3. **Usar context_fields** (recomendado):
```okt
DATASET {
train: "dataset/train.jsonl"
input_field: "input"
output_field: "target"
context_fields: ["menu"] # Move Menu para contexto
}
```
E no dataset, separe o Menu:
```jsonl
{"input": "What pizzas do you have?", "target": "...", "menu": "{\"Margherita\":34,...}"}
```
4. **Reduzir epochs para testes**:
```okt
TRAIN {
epochs: 1 # Teste rápido
batch_size: 16
logging_steps: 5
}
```
## Tempo Esperado
### CPU (seu caso atual):
- **582 exemplos, batch 8, 3 epochs**: ~30-60 minutos
- **Com batch 16**: ~15-30 minutos
### GPU (com CUDA):
- **582 exemplos, batch 8, 3 epochs**: ~3-5 minutos
- **Com batch 16**: ~2-3 minutos
## Exemplo Otimizado
```okt
# okto_version: "1.2"
PROJECT "pizzaria_optimized"
ENV {
accelerator: "gpu"
precision: "fp16"
backend: "oktoseek"
}
DATASET {
train: "dataset/train.jsonl"
validation: "dataset/val.jsonl"
input_field: "input"
output_field: "target"
context_fields: ["menu"] # Menu separado como contexto
}
MODEL {
base: "t5-small"
device: "cuda"
}
TRAIN {
epochs: 3
batch_size: 16 # Aumentado
learning_rate: 0.0001
logging_steps: 5 # Logs mais frequentes
save_steps: 50 # Salva checkpoints mais frequentemente
}
EXPORT {
format: ["okm"]
path: "export/"
}
```
---
**Última atualização**: 2024