Pyomo + Ipopt. Geschwindigkeitsproblem
Ich benutze Pyomo+ Ipoptals Löser, um ein NLP-Problem zu lösen. Das Problem ist hinsichtlich der Dimensionalität und der Anzahl der Einschränkungen nicht äußerst komplex. Ich muss jedoch mehrere Tausend Instanzen dieses Modells mit unterschiedlichen Eingabeparametern lösen. Derzeit verwende ich eine for loopzum Schleifen. Das Lösen einer einzelnen Instanz dauert auf dem 32 GB RAM WindowsPC ca. 1 Sekunde Python 3.7.3. Das heißt, ich muss stundenlang warten, bevor ich die vollständigen Optimierungsergebnisse abrufen kann.
Ich habe ein Profil erstellt, wo die Zeit verbraucht wird. Die Modellbildung selbst nimmt als solche keine Zeit in Anspruch, aber die Modelllösung über Ipoptdiese ist hier leistungsbestimmend.
Ich würde gerne wissen, ob jemand zuvor auf ein ähnliches Problem gestoßen ist und wie man auf übliche Weise versuchen kann, Leistungssteigerungen zu erzielen.
BEARBEITEN . Aus einer anderswo gestellten Frage habe ich herausgefunden, dass:
Das Standardverhalten von Pyomo besteht darin, eine
*.nlDatei zu schreiben und dann IPOPT aufzurufen, um diese Datei zu verarbeiten und eine*.solDatei zu erstellen. Pyomo analysiert dann die*.solDatei zurück.
Aus diesem Grund scheint es mit Pyomo nicht so einfach zu sein, Geschwindigkeitsgewinne zu erzielen. Ich freue mich immer noch auf die Antwort der Community.
Antworten
Der Mac verfügt wahrscheinlich über ein Solid-State-Laufwerk. Wenn Ihr Windows-Computer also kein Laufwerk hat (oder ein schlechteres), kann die E / A-Geschwindigkeit Ihr Engpass sein.
Für kleine Laufzeiten wie diese kann auch Ihre Version von Python & Pyomo der Schuldige sein.
Wenn es darum geht, den Prozess zu beschleunigen, gibt es leider keine allgemeine Lösung, außer den Python-Code zu profilieren und zu prüfen, ob Sie den Code auf Ihrer Seite optimieren können. Sie möchten sehen, wie viele Sekunden in jeder Python-Routine verbracht werden (im Gegensatz zu Prozentsätzen), damit Sie ableiten können, wo der Großteil Ihrer gesamten Laufzeit verbracht wird.
Eine Sache, die Sie versuchen könnten, um die Dinge zu beschleunigen, wäre, mehrere Instanzen dieser Probleme gleichzeitig mit der Python-Multiprocessing-Toolbox auszuführen. Da die Probleme ähnlich sind, müssen Sie sich keine Gedanken über das Schreiben von asynchronem Code machen, um eine gute Skalierung zu erzielen, was die Dinge viel einfacher macht.
Haftungsausschluss: Dies ist nicht gerade eine Antwort auf diese Frage, aber es ist eine Information, die ich sehr nützlich fand.
Ich habe den gleichen Code sowohl auf dem Windows-PC (32 GB RAM, Windows 10) als auch auf dem Macbook Pro (4 GB RAM, Catalina) ausgeführt und festgestellt, dass der Code auf dem Mac ungefähr fünfmal schneller ist. Ich habe keine Ahnung, warum dies geschieht, aber es könnte an der Pyomo-Dateiverarbeitung liegen.