6. Resolução de Problemas e Otimização
Ao utilizar o EvoX, poderá encontrar problemas ou querer ajustar os seus algoritmos. Este capítulo descreve problemas comuns e soluções, juntamente com estratégias de depuração e dicas de ajuste de desempenho para o ajudar a resolver problemas e otimizar a sua experiência.
6.1 Problemas Comuns e Soluções
Aqui estão alguns problemas frequentemente encontrados e como resolvê-los:
(1) Erros de Instalação ou Importação:
- Sintoma: Erro ao executar
import evox. - Solução:
- Verificar a instalação: Execute
pip show evoxpara verificar. Se não estiver instalado, verifique o seu ambiente virtual e reinstale. - Dependências em falta: Se vir
ModuleNotFoundError: No module named 'torch', instale o PyTorch conforme descrito no Capítulo 2. - Incompatibilidade CUDA: Certifique-se de que a sua versão do PyTorch corresponde aos drivers CUDA instalados.
- Verificar a instalação: Execute
(2) GPU Não Está a Ser Utilizada:
- Sintoma: O EvoX está a executar no CPU em vez da GPU.
- Solução:
- Verifique com
torch.cuda.is_available(). SeFalse, reinstale um PyTorch compatível com GPU e verifique a instalação CUDA. - Se
Truemas o EvoX ainda utiliza o CPU, certifique-se de que os seus tensores são movidos para a GPU (consulte o Capítulo 3 para configuração).
- Verifique com
(3) Memória Insuficiente (RAM/VRAM):
- Sintoma: Vê
OutOfMemoryError. - Solução:
- Reduza o tamanho da população, a dimensão do problema ou a frequência de avaliação.
- Utilize float16 (meia precisão) ou divisão de avaliação em lotes.
- Desative os modos de depuração/determinísticos no PyTorch.
- Armazene apenas estatísticas em vez de frentes de Pareto completas (para multi-objetivo).
- A atualização do hardware é a solução definitiva para gargalos de memória.
(4) Estagnação da Convergência:
- Sintoma: O algoritmo fica preso num ótimo local.
- Solução:
- Aumente a diversidade da população (por exemplo, taxa de mutação mais alta).
- Tente diferentes algoritmos ou parâmetros.
- Certifique-se de que a função objetivo está bem definida (não demasiado ruidosa ou plana).
- Execute múltiplas tentativas e escolha a melhor — o EvoX facilita execuções paralelas.
(5) Resultados de Otimização Fracos:
- Sintoma: Os resultados finais estão abaixo das expectativas.
- Solução:
- Verificar a definição do problema: Certifique-se de que a aptidão é calculada corretamente (por exemplo, sinais, escala).
- Adequação do algoritmo: Tente outros ou ajuste hiperparâmetros.
- Utilizar curvas de convergência:
- Estabilização precoce -> convergência prematura.
- Oscilação -> aleatoriedade demasiado alta.
- Ajuste as definições do algoritmo e analise o comportamento ao longo do tempo.
(6) Conflitos de Backend (JAX vs PyTorch):
- Sintoma: Instalou acidentalmente a versão JAX do EvoX enquanto utiliza exemplos PyTorch.
- Solução: O
pip install evoxpadrão dá-lhe a versão PyTorch. Se instalou uma versão JAX, reinstale utilizando as instruções do PyTorch (consulte o Capítulo 2). As funcionalidades JAX estão documentadas separadamente.
(7) Incompatibilidade de Versão:
- Sintoma: As chamadas de API não correspondem à versão instalada.
- Solução:
- As atualizações do EvoX podem alterar nomes de métodos (por exemplo,
ask/tell->step). - Utilize a versão estável mais recente e consulte a sua documentação.
- Ajuste o código para alinhar com a sua versão do EvoX ou considere atualizar.
- As atualizações do EvoX podem alterar nomes de métodos (por exemplo,
6.2 Dicas de Depuração
A depuração de algoritmos evolutivos pode ser complicada devido à sua natureza estocástica. Aqui estão dicas práticas:
(1) Utilizar Testes em Pequena Escala:
- Reduza o tamanho da população e a contagem de iterações para simplificar a depuração.
- Exemplo:
pop_size=5,iterations=20. - Torna mais fácil acompanhar o comportamento da população e isolar problemas.
(2) Inserir Instruções de Impressão:
- Imprima a aptidão da população, os melhores indivíduos e valores intermédios.
- Para tensores grandes, imprima formas ou utilize
.tolist()para os mais pequenos. - Ajuda a compreender a convergência e os efeitos dos operadores.
(3) Utilizar Pontos de Interrupção do IDE:
- Utilize PyCharm ou VS Code para definir pontos de interrupção dentro do
step()do algoritmo ou da lógica de avaliação. - Inspecione valores de variáveis, conteúdos de tensores ou transições de estado.
- Tenha cuidado com tensores grandes — limite o que inspeciona para evitar falhas.
(4) Testar Unitariamente Componentes Personalizados:
- Teste funções de cruzamento/mutação separadamente.
- Utilize entradas sintéticas para validar formas de saída e lógica antes da integração completa.
(5) Analisar a Execução:
- Utilize
torch.autograd.profiler.profileoutime.time()para medir tempos de passos. - Ajuda a localizar gargalos ou ciclos infinitos.
- Identifique se as lentidões estão na avaliação ou na lógica do algoritmo.
(6) Registar Saída em Ficheiro:
- Escreva registos em ficheiros
.csvpara execuções longas. - Inclua a melhor aptidão por geração, estatísticas de diversidade, etc.
- Útil quando falhas impedem que a saída da consola seja vista.
No geral, a depuração de projetos EvoX requer um equilíbrio entre verificações de correção e análise de resultados. Concentre-se primeiro em garantir que o algoritmo executa corretamente, depois otimize a sua eficácia.
6.3 Guia de Ajuste de Desempenho
Estas dicas ajudam-no a extrair mais velocidade e qualidade do EvoX:
(1) Escalonamento Progressivo:
- Comece pequeno: Teste a lógica com entradas pequenas.
- Escale gradualmente e observe como o tempo de execução aumenta.
- Identifique ineficiências se o escalonamento for não-linear (por exemplo, 10x população -> >10x tempo).
(2) Monitorizar Utilização de Hardware:
- Utilize
nvidia-smipara GPU,htoppara CPU. - Alta utilização de GPU (>50%) é ideal.
- Baixa utilização de GPU pode significar que os dados não estão na GPU ou transferências frequentes CPU-GPU estão a abrandar as coisas.
(3) Ajustar Paralelismo:
- Defina threads de CPU:
torch.set_num_threads(n). - Evite sobre-subscrição se utilizar ferramentas de avaliação multi-thread.
- Para GPU, otimize threads do
DataLoaderse utilizar ambientes ou conjuntos de dados em lote.
(4) Aproveitar Avaliação em Lote:
- A avaliação em lote é mais rápida do que a avaliação por indivíduo.
- Vectorize sempre
Problem.evaluate()para processar populações inteiras.
(5) Reduzir Overhead do Python:
- Mova lógica pesada para dentro de
AlgorithmouProblem, evite código Python complexo no ciclo principal. - Utilize
workflow.step()para a maioria das operações. - Minimize diagnósticos por geração se abrandarem as execuções.
(6) Ajustar a Escolha do Algoritmo:
- Tente CMA-ES, GA, PSO, RVEA, etc. — nenhum algoritmo é o melhor para todos os problemas.
- Um algoritmo de convergência mais rápida pode poupar mais tempo do que micro-otimizar um que converge lentamente.
O ajuste de desempenho é iterativo. Com paciência, pode passar de horas de execução para minutos. O EvoX dá-lhe muitos “botões” — utilize-os sabiamente para equilibrar velocidade e qualidade da solução.