Entgeltliche Optimierung eines Agent-based models

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Anti

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von Anti »

jogo hat geschrieben: Do Nov 15, 2018 3:26 pmStimmt es, dass pro Parameterkombination der gesamte Dataframe runlist (mit seinen 26 Mio Zeilen) jeweils in eine CSV-Datei geschrieben werden soll?
Wie groß ist eine solche Datei? (ups, das war schon die zweite Frage)
Ja, das stimmt, da ich für den besten Lauf die gesamte Historie haben wollte, um daraus auch tatsächliche Migrationsraten und die Mikroevolution berechnen wollte. Natürlich wäre es eleganter zunächst nur das Qualitätsmerkmal der Runs aufzunehmen und im Nachhinein für den besten Run die runlist zu schreiben. Wird das Ergebnis ja dennoch stark zufallsbeeinflußt sein (siehe die ganzen sample-Funktionen).
jogo hat geschrieben: Do Nov 15, 2018 3:26 pmHier noch eine heiße Spur zu dem Fehler bei sample():

Code: Alles auswählen

print(which(fertiles==fer))
[1] 299
Fehler in sample.int(length(x), size, replace, prob) : 
  ungültiges erstes Argument
> traceback()
2: sample.int(length(x), size, replace, prob)
1: sample(partner.candidates, 1)
> partner.candidates
integer(0)
(ich hatte noch einen kleinen Aufruf message("print(which(fertiles==fer))") eingefügt)
Es gibt also eine Stelle, an der partner.candidates null Elemente hat.
Auch dafür nochmals Danke!

Aber hast Du irgendeine Idee, wie ich das Ganze schneller laufen lassen kann? Das macht mich echt fertig (schlafe schon seit einigen Tagen schlecht deswegen).

Gruß
Anti
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von jogo »

Hallo Anti,
Anti hat geschrieben: Fr Nov 16, 2018 9:22 am
jogo hat geschrieben: Do Nov 15, 2018 3:26 pmStimmt es, dass pro Parameterkombination der gesamte Dataframe runlist (mit seinen 26 Mio Zeilen) jeweils in eine CSV-Datei geschrieben werden soll?
Wie groß ist eine solche Datei? (ups, das war schon die zweite Frage)
Ja, das stimmt, da ich für den besten Lauf die gesamte Historie haben wollte, um daraus auch tatsächliche Migrationsraten und die Mikroevolution berechnen wollte. Natürlich wäre es eleganter zunächst nur das Qualitätsmerkmal der Runs aufzunehmen und im Nachhinein für den besten Run die runlist zu schreiben. Wird das Ergebnis ja dennoch stark zufallsbeeinflußt sein (siehe die ganzen sample-Funktionen).
hm, und wie groß ist eine solche Datei?

Gleich daneben steht in Deinem Code, dass auch die Datei runsummary.csv bei jedem Schleifendurchlauf überschrieben wird.
Ist das so gewollt (das Überschreiben)?
Aber hast Du irgendeine Idee, wie ich das Ganze schneller laufen lassen kann? Das macht mich echt fertig (schlafe schon seit einigen Tagen schlecht deswegen).
Für den Test des Codes habe ich erstmal die 26 Mio auf 2 Mio abgeändert ...
Die Mittelwertbildung kann aggregate() erledigen o.ä. (z.B. tapply())
Ansonsten werden ähnliche Maßnahmen wie der Einsatz von aggregate() an anderen Stellen dadurch verhindert, dass der ganze Code nicht vektororientiert geschrieben wurde. - Also eigentlich kommst Du viel zu spät mit Deinem Anliegen, durch Umstrukturierung des Quelltextes die Laufzeit zu verkürzen.
Ein weiterer Hinderungsgrund ist, dass der Code bisher nicht fehlerfrei läuft. Eine Laufzeitverkürzung kann man nur dann vernünftig angehen, wenn die Laufzeit bekannt ist. Bisher kommt der Code ja nichtmal bis zum Schreiben der CSV-Dateien.

Einige meiner Vorschläge hast Du nicht berücksichtigt. Deshalb bin ich jetzt vorsichtiger mit konkreten Code-Vorschlägen; da experimentiere ich lieber erstmal alleine. Insgesamt bleibt aber zu bedenken, dass die Operationen auf einer derartigen Masse von Daten einfach eine gewisse Zeit kosten und die Frage ist ganz einfach, welcher Faktor der Beschleunigung der Laufzeit überhaupt Deiner Meinung nach erzielt werden muss, damit das Ergebnis für Dich annehmbar ist? Hast Du dazu eine Schätzung?

Bezüglich der Parameterkombinationen denke ich sogar darüber nach, den Code etwas zu verlangsamen im Sinne von:

Code: Alles auswählen

myfu <- function(Time, demand) message(sprintf("Ti: %10.2e und dem: %e", Time, demand))
for (i in 1:nrow(BOD)) do.call(myfu, BOD[i, ])
Gruß, Jörg
Anti

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von Anti »

jogo hat geschrieben: Fr Nov 16, 2018 9:45 amhm, und wie groß ist eine solche Datei?
Ich gehe mal von ca. 25 Mio Individuen aus, die in der gesamten Historie auftauchen. Die Datei wird dann imho schon ziemlich groß werden, also mehrere MB bis 1 GB (geschätzt).
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amGleich daneben steht in Deinem Code, dass auch die Datei runsummary.csv bei jedem Schleifendurchlauf überschrieben wird. Ist das so gewollt (das Überschreiben)?
Das war zur Sicherung der Ergebnisse aller Runs gedacht, um bei unvorhersehbaren technischen Ausfällen die Runs nicht nochmal von vorne starten zu müssen.
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amDie Mittelwertbildung kann aggregate() erledigen o.ä. (z.B. tapply())
Ansonsten werden ähnliche Maßnahmen wie der Einsatz von aggregate() an anderen Stellen dadurch verhindert, dass der ganze Code nicht vektororientiert geschrieben wurde. - Also eigentlich kommst Du viel zu spät mit Deinem Anliegen, durch Umstrukturierung des Quelltextes die Laufzeit zu verkürzen.
Ich sehe hier halt nicht, wie ich das Ganze weiter Vektorisieren kann. Hättest Du hier und da noch ein paar Tipps? Oder wo habe ich vorherige Tipps übersehen/nicht umgesetzt?
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amEin weiterer Hinderungsgrund ist, dass der Code bisher nicht fehlerfrei läuft. Eine Laufzeitverkürzung kann man nur dann vernünftig angehen, wenn die Laufzeit bekannt ist. Bisher kommt der Code ja nichtmal bis zum Schreiben der CSV-Dateien.
Da gebe ich Dir natürlich Recht. Aber bis auf die Sache mit dem Sample läuft der Code mittlerweile ohne weitere Fehlermeldungen (zumindest solange, bis ich ihn nach Stunden abwürge).
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amEinige meiner Vorschläge hast Du nicht berücksichtigt. Deshalb bin ich jetzt vorsichtiger mit konkreten Code-Vorschlägen; da experimentiere ich lieber erstmal alleine. Insgesamt bleibt aber zu bedenken, dass die Operationen auf einer derartigen Masse von Daten einfach eine gewisse Zeit kosten und die Frage ist ganz einfach, welcher Faktor der Beschleunigung der Laufzeit überhaupt Deiner Meinung nach erzielt werden muss, damit das Ergebnis für Dich annehmbar ist? Hast Du dazu eine Schätzung?
Mein Wunsch wäre es, einen Run in 2 Minuten durchlaufen lassen zu können. Wie realistisch das aber ist, kann ich leider überhaupt nicht abschätzen.

Gruß
Anti
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von Athomas »

Kannst Du bitte nochmal verständlich zusammenfassen, was Du simulieren willst - bitte ohne auf die konkrete Umsetzung (Programmierung) einzugehen, aber detailliert in der Sache!?
Stammt das Programm von Dir oder gibt es eine "Basis" (evtl. in einer anderen Sprache), auf der Du aufbaust?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von jogo »

Anti hat geschrieben: Fr Nov 16, 2018 10:00 am
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amhm, und wie groß ist eine solche Datei?
Ich gehe mal von ca. 25 Mio Individuen aus, die in der gesamten Historie auftauchen. Die Datei wird dann imho schon ziemlich groß werden, also mehrere MB bis 1 GB (geschätzt).
Und wie ich das momentan sehe, möchtest Du mindestens 96000 solcher Dateien anlegen ... :shock:
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amGleich daneben steht in Deinem Code, dass auch die Datei runsummary.csv bei jedem Schleifendurchlauf überschrieben wird. Ist das so gewollt (das Überschreiben)?
Das war zur Sicherung der Ergebnisse aller Runs gedacht, um bei unvorhersehbaren technischen Ausfällen die Runs nicht nochmal von vorne starten zu müssen.
ok, sei's drum.
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amDie Mittelwertbildung kann aggregate() erledigen o.ä. (z.B. tapply())
Ansonsten werden ähnliche Maßnahmen wie der Einsatz von aggregate() an anderen Stellen dadurch verhindert, dass der ganze Code nicht vektororientiert geschrieben wurde. - Also eigentlich kommst Du viel zu spät mit Deinem Anliegen, durch Umstrukturierung des Quelltextes die Laufzeit zu verkürzen.
Ich sehe hier halt nicht, wie ich das Ganze weiter Vektorisieren kann.
richtig, jetzt ist das sehr viel schwieriger, den Code so umzustellen, dass vektorisiert gearbeitet wird.
Hättest Du hier und da noch ein paar Tipps? Oder wo habe ich vorherige Tipps übersehen/nicht umgesetzt?
Z.B. das Zusammenfassen der Bedingungen (mehr logical Indizes statt ID-Nummern).
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amEin weiterer Hinderungsgrund ist, dass der Code bisher nicht fehlerfrei läuft. Eine Laufzeitverkürzung kann man nur dann vernünftig angehen, wenn die Laufzeit bekannt ist. Bisher kommt der Code ja nichtmal bis zum Schreiben der CSV-Dateien.
Da gebe ich Dir natürlich Recht. Aber bis auf die Sache mit dem Sample läuft der Code mittlerweile ohne weitere Fehlermeldungen (zumindest solange, bis ich ihn nach Stunden abwürge).
Du solltest unbedingt eine Laufzeitanalyse durchführen:
Wie verändert sich die Laufzeit, wenn statt 1 Mio Individuen 2 Mio berechnet werden? Du merkst ja selbst, wie lange es mit 26 Mio Individuen dauert.
... und entsprechend bei anderen Parametern.
Es kann ja sein, dass bezüglich einiger dieser Stellgrößen die Laufzeit nicht linear anwächst sondern quadratisch oder kubisch ...
Bei kubisch bedeutet eine Verdopplung des Wertes der Stellgröße eine 8-fache Laufzeit.
jogo hat geschrieben: Fr Nov 16, 2018 9:45 amEinige meiner Vorschläge hast Du nicht berücksichtigt. Deshalb bin ich jetzt vorsichtiger mit konkreten Code-Vorschlägen; da experimentiere ich lieber erstmal alleine. Insgesamt bleibt aber zu bedenken, dass die Operationen auf einer derartigen Masse von Daten einfach eine gewisse Zeit kosten und die Frage ist ganz einfach, welcher Faktor der Beschleunigung der Laufzeit überhaupt Deiner Meinung nach erzielt werden muss, damit das Ergebnis für Dich annehmbar ist? Hast Du dazu eine Schätzung?
Mein Wunsch wäre es, einen Run in 2 Minuten durchlaufen lassen zu können. Wie realistisch das aber ist, kann ich leider überhaupt nicht abschätzen.
Dann stelle ich die Frage nochmal anders:
Das, wofür Du Dir die Laufzeit von 2 min wünschst, dauert bisher wie lange :?:

Gruß, Jörg
Anti

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von Anti »

Athomas hat geschrieben: Fr Nov 16, 2018 10:05 am Kannst Du bitte nochmal verständlich zusammenfassen, was Du simulieren willst - bitte ohne auf die konkrete Umsetzung (Programmierung) einzugehen, aber detailliert in der Sache!?
Stammt das Programm von Dir oder gibt es eine "Basis" (evtl. in einer anderen Sprache), auf der Du aufbaust?
Hi Athomas,

vorweg: Das Programm stammt von mir. Motiviert wurde ich dazu durch http://www.genetics.org/content/genetic ... 9.full.pdf. Im Prinzip habe ich die Vorgehensweise von dort genommen und für meine Fragestellung die Geographie und einen Parameter erweitert.

HINTERGRUND

Während der letzten Eiszeit waren die Inseln Indonesiens zu 2 großen Inseln verbunden, so daß damals eine Besiedelung Papuas (Neuguineas) von Malaysien aus möglich war. Nach der letzten Eiszeit stieg der Meeresspiegel wieder und die Papuaner waren von den Populationen Asiens isoliert. Beide entwickelten sich genetisch auseinander. Vor ca. 4500 Jahren entwickelten sich jedoch auf dem asiatischen Festland nautische Kenntnisse, so daß diese modernen Asiaten zur Besiedelung des Pazifiks aufbrachen. Sie besiedelten schließlich auch Polynesien. In wie weit sich diese modernen Asiaten aber mit den indigenen Papuanern vermischt haben, ist nicht ganz klar, da einige Daten (z. B. Y-chromosomale Marker) für eine starke Durchmischung (Admixture) beider "Ethnien" sprechen, andere Daten (z. B. die mitochondriale DNA) dagegen. Dementsprechend gibt es im Hinblick auf die Besiedelung Polynesiens im Wesentlichen 2 sich widersprechende Hypothesen ("Slow Boat" - langsame Ausbreitung der modernen Asiaten und Durchmischung mit den Papuanern; und "Express Train" - schnelle Wanderungsbewegung, so daß es kaum Admixture mit Papuanern gab). Eine mögliche Erklärung für diese Unterschiede könnte die sein, daß sich asiatische Frauen mit papuanischen Männern bevorzugt verpaart haben. Dies könnte einen guten Teil der Unterschiede, die man heute sieht, erklären.

Ich möchte beide Szenarien im Agenten-basierten Modell simulieren. Das Modell, das für das ich hier den Code hochgeladen habe, simuliert eine Ausbreitung nach dem "Slow Boat"-Szenario, weshalb die Verteilung von Individuen über den Pazifik als Diffusion verstanden werden kann. Für die Simulation des "Express Train"-Modells werden hingegen über einige Jahre Individuen von einer Ausgangs-Population in eine weiter entfernte Ziel-Population befördert. Den geschätzten Anteil asiatischer Gene in jeder simulierten Population (sog. Deme) vergleiche ich letzten Endes mit aus echten Daten geschätzten Admixture-Anteilen, um so hoffentlich die unterschiedlichen Einflußfaktoren validieren zu können.
Anti

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von Anti »

Danke!
jogo hat geschrieben: Fr Nov 16, 2018 10:23 amDas, wofür Du Dir die Laufzeit von 2 min wünschst, dauert bisher wie lange :?:
... vermutlich mehrere Wochen (habs bislang nie die 4500 Jahre simulieren lassen, da bereits 1 Jahr ca. 1.5 h braucht) :?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von jogo »

Anti hat geschrieben: Fr Nov 16, 2018 10:31 am Danke!
jogo hat geschrieben: Fr Nov 16, 2018 10:23 amDas, wofür Du Dir die Laufzeit von 2 min wünschst, dauert bisher wie lange :?:
... vermutlich mehrere Wochen (habs bislang nie die 4500 Jahre simulieren lassen, da bereits 1 Jahr ca. 1.5 h braucht) :?
Die 1,5 Stunden sind ein Durchlauf in der Schleife

Code: Alles auswählen

  for (t in 0:4500) {     #run simulations (actions for one year)
richtig?
Anti

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von Anti »

jogo hat geschrieben: Fr Nov 16, 2018 10:38 am
Anti hat geschrieben: Fr Nov 16, 2018 10:31 am Danke!
jogo hat geschrieben: Fr Nov 16, 2018 10:23 amDas, wofür Du Dir die Laufzeit von 2 min wünschst, dauert bisher wie lange :?:
... vermutlich mehrere Wochen (habs bislang nie die 4500 Jahre simulieren lassen, da bereits 1 Jahr ca. 1.5 h braucht) :?
Die 1,5 Stunden sind ein Durchlauf in der Schleife

Code: Alles auswählen

  for (t in 0:4500) {     #run simulations (actions for one year)
richtig?
Exakt
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Entgeltliche Optimierung eines Agent-based models

Beitrag von jogo »

Dann benötigst Du also eine Beschleunigung um den Faktor 200000. :shock:
Wenn es um einen Faktor von 20 bis 50 ginge, wäre ich halbwegs optimistisch, dass sich das durch besseren Code realisieren lässt.
Anti hat geschrieben: Fr Nov 16, 2018 10:39 am
jogo hat geschrieben: Fr Nov 16, 2018 10:38 am Die 1,5 Stunden sind ein Durchlauf in der Schleife

Code: Alles auswählen

  for (t in 0:4500) {     #run simulations (actions for one year)
richtig?
Exakt
Gruß, Jörg
Antworten