Pyomo + Ipopt. Problema de velocidade

Oct 26 2020

Estou usando o Pyomo+ Ipoptcomo solucionador para resolver um problema de PNL. O problema não é extremamente complexo em termos de dimensionalidade e número de restrições. No entanto, preciso resolver vários milhares de instâncias desse modelo com diferentes parâmetros de entrada. Atualmente estou usando um for looploop over. Resolver uma única instância leva cerca de 1 segundo no 32 GB RAM WindowsPC Python 3.7.3,. Isso significa que tenho que esperar horas antes de poder recuperar os resultados de otimização completos.

Fiz o perfil de onde o tempo está sendo consumido. A construção do modelo em si não leva tempo, mas é a solução do modelo Ipoptque determina o desempenho aqui.

Gostaria de saber se alguém já passou por um problema semelhante e quais são as maneiras comuns de tentar obter algum tipo de ganho de desempenho.

EDIT . Em uma pergunta feita em outro lugar, descobri que:

O comportamento padrão do Pyomo é gravar um *.nlarquivo e, em seguida, chamar o IPOPT para processar esse arquivo e produzir um *.solarquivo. Pyomo então analisa de volta no *.solarquivo.

Com isso, parece que conseguir ganhos de velocidade pode não ser tão fácil com o Pyomo. Ainda estou ansioso pela resposta da comunidade.

Respostas

3 NikosKazazakis Oct 27 2020 at 19:21

O Mac provavelmente tem uma unidade de estado sólido, portanto, se sua máquina Windows não tiver uma (ou tiver uma pior), a velocidade de E / S pode ser o seu gargalo.

Para pequenos tempos de execução como esses, sua versão do Python e Pyomo também pode ser a culpada.

Ν ora, quando se trata de tornar o processo mais rápido, não há solução geral que não seja criar o perfil do código Python e ver se você pode otimizar o código do seu lado. O que você quer ver é quantos segundos são gastos em cada rotina do Python (em oposição às porcentagens), para que possa derivar onde a maior parte do seu tempo de execução geral é gasto.

Uma coisa que você poderia tentar agilizar as coisas seria executar várias instâncias desses problemas em paralelo usando a caixa de ferramentas de multiprocessamento do Python. Como os problemas são semelhantes, você não precisa se preocupar em escrever código assíncrono para obter um bom dimensionamento, o que torna as coisas muito mais fáceis.

2 your_boy_gorja Oct 27 2020 at 13:20

Aviso: Esta não é exatamente uma resposta a esta pergunta, mas é uma informação que achei muito útil.

Eu executei o mesmo código no PC com Windows (32 GB de RAM, Windows 10) e no Macbook Pro (4 GB de RAM, Catalina) e descobri que o código era cerca de 5 vezes mais rápido no Mac. Não tenho ideia de por que isso está acontecendo, mas pode ser devido ao processamento do arquivo pyomo.