Jak mogę zoptymalizować wydajność obliczeniową przy wielokrotnym dopasowywaniu złożonego modelu do dużego zestawu danych?

12

Mam problemy z wydajnością przy użyciu MCMCglmmpakietu w R do uruchomienia mieszanego modelu efektów. Kod wygląda następująco:

MC1<-MCMCglmm(bull~1,random=~school,data=dt,family="categorical"
, prior=list(R=list(V=1,fix=1), G=list(G1=list(V=1, nu=0)))
, slice=T, nitt=iter, ,burnin=burn, verbose=F)

Dane zawierają około 20 000 obserwacji i są skupione w około 200 szkołach. Usunąłem wszystkie nieużywane zmienne z ramki danych i usunąłem wszystkie inne obiekty z pamięci przed uruchomieniem. Problem polega na tym, że uruchomienie zajmuje bardzo dużo czasu, chyba że zredukuję iteracje do niedopuszczalnie małej liczby. Przy 50 000 iteracjach zajmuje to 5 godzin i mam wiele różnych modeli do uruchomienia. Chciałbym więc wiedzieć, czy istnieją sposoby na przyspieszenie wykonania kodu lub innych pakietów, których mógłbym użyć. Używam, MCMCglmmponieważ chcę przedziały ufności dla efektów losowych.

Z drugiej strony, miałem nadzieję na nowy komputer w tym roku, ale przy odrobinie szczęścia mogę go rozwinąć, więc zastanawiałem się, jak najlepiej wydać ograniczoną ilość pieniędzy na nowy sprzęt - więcej pamięci RAM , szybszy procesor itp. Patrząc na menedżera zadań, nie sądzę, że problemem jest pamięć RAM (nigdy nie przekracza 50% wykorzystania fizycznego), ale użycie procesora również nie przekracza 50%, co wydaje mi się dziwne . Moja obecna konfiguracja to procesor Intel Core i5 2,66 GHz, 4 GB pamięci RAM, dysk twardy 7200 obr./min. Czy rozsądnie jest uzyskać najszybszy procesor, jak to możliwe, kosztem dodatkowej pamięci RAM? Zastanawiałem się również nad wpływem wielkości pamięci podręcznej procesora poziomu 3 na takie problemy z obliczeniami statystycznymi?

Aktualizacja: Po zapytaniu o meta SO doradzono mi, aby ponownie sformułować pytanie i zamieścić post na Superuser. W tym celu muszę podać więcej szczegółów na temat tego, co dzieje się „pod maską” w MCMCglmm. Czy mam rację, myśląc, że większość czasu na obliczenia poświęcana jest na optymalizację - mam na myśli znalezienie maksimum jakiejś skomplikowanej funkcji? Czy inwersja macierzy i / lub inne operacje algebry liniowej są również częstą operacją, która może powodować wąskie gardła? Wszelkie inne informacje, które mógłbym przekazać społeczności superużytkowników, byłyby bardzo wdzięczne.

Joe King
źródło
Nie sądzę, że powinno być zaskoczeniem, że MCMC długo zajmuje się takimi problemami. Jestem pewien, że są prawdopodobnie sposoby na przyspieszenie działania. Ale znalezienie prawidłowej odpowiedzi wciąż wymaga czasu.
Michael R. Chernick
@Michael Chernick, dziękuję - wiem, że to jeszcze potrwa. Chciałbym tylko zminimalizować to tak bardzo, jak to możliwe, to wszystko. Mój tata ma w swojej pracy Oracle SPARC T4, który dość szybko uruchamia MCMC;)
Joe King
3
@JoeKing, edytowałem twój tytuł, aby był bardziej opisowy i być może przyciągnął więcej użytkowników, którzy mogą ci pomóc. Przekonałem się również, że dopasowanie lmer()modeli do dużych zestawów danych może zająć sporo czasu, zwłaszcza jeśli musisz to zrobić wiele razy. Odpowiedź na twoje pytanie może leżeć w obliczeniach równoległych, chociaż inni użytkownicy (np. @DirkEddelbuettel) byliby o wiele bardziej pomocni ode mnie. Istnieje również szansa, że ​​możesz uzyskać lepsze odpowiedzi na temat przepełnienia stosu.
Makro
Makro, dziękuję za pomocną edycję. Użyłem również glmer(jak wiadomo z moich innych postów) i zajmuje to około 20 sekund, ale problem polega na tym, że nie podaje przedziałów ufności ani standardowych błędów, a z tego, co przeczytałem na liście mailowej, archiwum autora lme4pakiet mówi, że rozkład próbkowania efektów losowych może być bardzo wypaczony, więc te statystyki nie są zgłaszane. Właściwie odkryłem z MCMCglmmtego, że w moim przypadku zbliżają się one normalnie (nie to, że to bardzo pomaga - mówię tylko). Czy byłoby lepiej, gdybym poprosił o migrację do SO?
Joe King
1
Nie znam specyfiki mcmcglmm, ale bardzo często korzystałem z metod MCMC. Zaletą MCMC jest to, że jest kłopotliwie równoległe (to termin techniczny!). Jeśli masz wiele rdzeni, uruchamiasz niezależne łańcuchy na każdym z nich, a następnie łączysz wyniki. W ten sposób uruchamiam MCMC, ale do tego napisałem własne równoległe kody C ++ (używając MPI). Jeśli chodzi o porady dotyczące sprzętu, wybierz coś z jak największą liczbą rdzeni. Zakłada się, że dowolne narzędzie, którego używasz, może korzystać z wielu rdzeni. Jeśli chodzi o informacje, które należy podać SU w pytaniu, dowiedz się, czy możesz użyć rdzeni.
Bogdanovist

Odpowiedzi:

3

Dlaczego nie uruchomić go w chmurze Amazon EC2 lub podobnej usłudze? MCMCpackjest, jeśli dobrze pamiętam, głównie zaimplementowany w C, więc nie będzie dużo szybszy, chyba że zmniejszysz złożoność modelu, iteracje itp. Dzięki EC2 lub podobnym usługom przetwarzania w chmurze możesz mieć wiele instancji w dowolnym specyfikacje, których potrzebujesz, i uruchom wszystkie modele jednocześnie.

Zach
źródło
Jedna modyfikacja tego: uruchamianie na m2.4xlarge (opcja 68,7 GB pamięci RAM) to jedyny sposób, aby zagwarantować, że otrzymujesz pełną maszynę, dzięki czemu niekoniecznie trafisz na problemy z buforowaniem pamięci RAM, które mogą wystąpić na maszynach wirtualnych / AMI), które działają na ułamku komputera.
Iterator