Ich renne R auf Linux-Box, die 8 Multicore-Prozessoren hat, und habe ein Optimierungsproblem, das ich möchte durch Parallelisierung der Optimierungsroutine selbst beschleunigen. Wichtig ist, dass dieses Problem beinhaltet (1) mehrere Parameter und (2) inhärent langsam Modell läuft. Ein ziemlich häufiges Problem!Parallelisierte Optimierung in R
Wer kennt einen parallelisierten Optimierer für solche Gelegenheiten?
Genauer gesagt, führen Löser wie nlm()
mehrere Modellauswertungen (zwei pro Parameterwert) jedes Mal durch, wenn der Algorithmus einen Schritt im Parameterraum einlegt, also würde die Parallelisierung dieser Instanz mehrerer Modellläufe die Situation in diesen Situationen erheblich beschleunigen Einige Parameterwerte werden angepasst.
Es scheint, wie Code, der Verwendung des Pakets macht parallel
in einer Weise geschrieben werden konnte, dass der Benutzer würde minimal Code-Änderung tun müssen, um aus zu bewegen nlm()
oder optim()
dieser parallelisierten Optimierungsroutine verwendet wird. Das heißt, man könnte diese Routinen grundsätzlich ohne Änderungen schreiben, außer dass der Schritt des mehrfachen Aufrufs des Modells, wie es bei gradientenbasierten Methoden üblich ist, parallel erfolgen würde.
Idealerweise so etwas wie nlmPara() würde Code nehmen, die
fit <- nlm(MyObjFunc, params0);
und erfordern nur geringen Modifikationen wie
aussieht, zum Beispielfit <- nlmPara(MyObjFunc, params0, ncores=6);
Gedanken/Anregungen?
PS: Ich habe Schritte unternommen, um diese Modellläufe zu beschleunigen, aber sie sind aus verschiedenen Gründen langsam (d. H. Ich brauche keinen Rat zur Beschleunigung der Modellläufe! ;-)).
Ein wenig mehr lesen in die verschiedenen Optimierer, und es sieht so aus, als würde diese Art von Hack würde C-Code umschreiben (zB C-Port der OPTIF9-Routine neu schreiben, um mehrere Threads zu verwenden) oder einen nativen R-Optimierer schreiben zu nutzen von der höheren Parallelisierungs-Option wie 'parallel',' multicore', 'snow', etc. –
Das' optimx'/'optimplus' Paket hat native-R Versionen von vielen Optimierungsalgorithmen: vielleicht am einfachsten von dort zu starten. ..? –
Danke Ben :-) Mit optimx können Sie eine Gradientenfunktion eingeben. Ich werde es ausprobieren und sehen, ob ich es nicht einfach einen parallelisierten Block Code übergeben kann, der den Trick tun sollte. –