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:

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:

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

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:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

2. Aumente o batch_size (se tiver memória)

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:

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:

MODEL {
    base: "t5-small"      # Mais rápido
    # base: "t5-base"     # Mais lento, mas melhor qualidade
}

6. Reduza epochs para testes

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):

    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    
  2. Aumentar batch_size (se tiver RAM):

    TRAIN {
        epochs: 3
        batch_size: 16    # Dobrar o batch_size
        logging_steps: 5  # Logs mais frequentes
    }
    
  3. Usar context_fields (recomendado):

    DATASET {
        train: "dataset/train.jsonl"
        input_field: "input"
        output_field: "target"
        context_fields: ["menu"]  # Move Menu para contexto
    }
    

    E no dataset, separe o Menu:

    {"input": "What pizzas do you have?", "target": "...", "menu": "{\"Margherita\":34,...}"}
    
  4. Reduzir epochs para testes:

    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

# 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