Pyomo + Ipopt. Problem z prędkością
Używam Pyomo+ Ipoptjako solwera do rozwiązania problemu NLP. Problem nie jest niezwykle złożony pod względem wymiarowości i liczby ograniczeń. Jestem jednak zobowiązany do rozwiązania kilku tysięcy egzemplarzy tego modelu z różnymi parametrami wejściowymi. Obecnie używam for looppętli. Rozwiązywanie pojedynczą instancję zajmuje mi ~ 1 sekundę na 32 GB RAM WindowsPC Python 3.7.3. Oznacza to, że muszę czekać godzinami, zanim będę mógł pobrać pełne wyniki optymalizacji.
Profilowałem się, gdzie czas jest pochłaniany. Samo zbudowanie modelu nie zajmuje czasu jako takiego, ale jego rozwiązanie Ipoptpolega na tym, że wydajność jest tutaj określana.
Chciałbym wiedzieć, czy ktoś wcześniej napotkał podobny problem i jakie są typowe sposoby, w jakie można próbować osiągnąć jakiś wzrost wydajności.
EDYTUJ . Z pytania zadanego gdzie indziej dowiedziałem się, że:
Domyślnym zachowaniem Pyomo jest zapisanie
*.nlpliku, a następnie wywołanie IPOPT w celu przetworzenia tego pliku i utworzenia*.solpliku. Pyomo następnie analizuje z powrotem w*.solpliku.
Z tego wynika, że osiągnięcie przyrostów prędkości może nie być takie łatwe z Pyomo. Wciąż czekam na odpowiedź społeczności.
Odpowiedzi
Mac prawdopodobnie ma dysk SSD, więc jeśli Twój komputer z systemem Windows go nie ma (lub ma gorszy), wąskim gardłem może być prędkość we / wy.
W przypadku małych środowisk wykonawczych, takich jak te, winowajcą może być również Twoja wersja Pythona i Pyomo.
Jeśli chodzi o przyspieszenie procesu, obawiam się, że nie ma innego rozwiązania niż profilowanie kodu Pythona i sprawdzenie, czy możesz zoptymalizować kod po swojej stronie. To, co chcesz zobaczyć, to liczba sekund spędzonych na każdej procedurze Pythona (w przeciwieństwie do wartości procentowych), abyś mógł określić, gdzie spędzana jest większość całkowitego czasu działania.
Jedną z rzeczy, które możesz spróbować przyspieszyć, byłoby uruchomienie wielu wystąpień tych problemów równolegle przy użyciu zestawu narzędzi wieloprocesorowych Pythona. Ponieważ problemy są podobne, nie musisz się martwić pisaniem kodu asynchronicznego, aby uzyskać dobre skalowanie, co znacznie ułatwia pracę.
Zastrzeżenie: To nie jest dokładnie odpowiedź na to pytanie, ale jest to informacja, która okazała się całkiem przydatna.
Uruchomiłem ten sam kod zarówno na komputerze z systemem Windows (32 GB pamięci RAM, Windows 10), jak i na Macbooku Pro (4 GB pamięci RAM, Catalina) i okazało się, że kod jest około 5 razy szybszy na komputerze Mac. Nie mam pojęcia, dlaczego tak się dzieje, ale może to być spowodowane przetwarzaniem pliku pyomo.