Selbststartender MathKernel - ist das in Mathematica möglich?

8

Diese Frage kommt von der letzten Frage " Korrekter Weg zu cap Mathematica Speicher verwenden? "

Ich frage mich, ob es möglich ist, MathKernel programmtechnisch neu zu starten, wobei der aktuelle FrontEnd-Prozess mit dem neuen MathKernel-Prozess verbunden bleibt und Code in der neuen MathKernel-Sitzung ausgewertet wird. Ich meine einen "transparenten" Neustart, der es einem Benutzer erlaubt, weiter mit dem FrontEnd zu arbeiten, während er einen neuen MathKernel-Prozess mit Code aus dem vorherigen Kernel, der darin evaluiert / bewertet wurde, verarbeitet?

Die Motivation für diese Frage besteht darin, den Neustart von MathKernel zu automatisieren, wenn zu viel Speicher verbraucht wird ohne die Berechnung zu unterbrechen . Mit anderen Worten, die Berechnung sollte automatisch im neuen MathKernel-Prozess ohne Interaktion mit dem Benutzer fortgesetzt werden (aber die Fähigkeit des Benutzers beibehalten, mit der Mathematica wie ursprünglich zu interagieren). Die Details darüber, welcher Code im neuen Kernel ausgewertet werden sollte, sind natürlich für jede Rechenaufgabe spezifisch. Ich suche nach einer allgemeinen Lösung, wie man die Berechnung automatisch fortsetzt.

    
Alexey Popkov 23.10.2011, 06:07
quelle

6 Antworten

6

Aus einem Kommentar von Arnoud Buzing gestern im Stack Exchange Mathematica Chat, zitierend ganz:

Wenn Sie in einem Notizbuch mehrere Zellen haben, können Sie Quit selbst in eine Zelle setzen und diese Option festlegen:

%Vor%

Wenn Sie eine Zelle darüber und darunter haben und alle drei auswählen und auswerten, wird der Kernel beendet, aber die Frontend-Evaluierungswarteschlange wird fortgesetzt (und der Kernel für die letzte Zelle neu gestartet).

- Arnoud Buzing

    
Chris Degnen 06.12.2012, 09:29
quelle
5

Der folgende Ansatz führt einen Kernel aus, um ein Frontend mit einem eigenen Kernel zu öffnen, der dann geschlossen und wieder geöffnet wird, wobei der zweite Kernel erneuert wird.

Diese Datei ist die MathKernel-Eingabe, C: \ Temp \ test4.m

%Vor%

Das Demo-Notizbuch C: \ Temp \ run.nb enthält zwei Zellen:

%Vor%

Der ursprüngliche Kernel öffnet ein Frontend und führt die erste Zelle aus, beendet dann das Frontend, öffnet es erneut und startet die zweite Zelle.

Das Ganze kann entweder durch Einfügen (in einem Durchgang) der MathKernel-Eingabe in eine Kernel-Sitzung ausgeführt werden, oder es kann aus einer Batch-Datei, z. C: \ Temp \ RunTest2.bat

%Vor%

Es ist etwas aufwändig einzurichten, und in seiner aktuellen Form hängt es davon ab, wie lange man warten muss, bevor man den zweiten Kernel schließt und neu startet.

    
Chris Degnen 23.10.2011 12:12
quelle
4

Vielleicht könnte dafür die parallele Rechenmaschine verwendet werden? Hier ist ein grober Aufbau, der die Idee illustriert:

%Vor%

Dies ist ein zu aufwändiges Setup, um eine Liste von 1.000 Tripel von Zahlen zu erzeugen. getTheJobDone führt eine Schleife aus, die fortgesetzt wird, bis die Ergebnisliste die gewünschte Anzahl von Elementen enthält. Jede Iteration der Schleife wird in einem Subkern ausgewertet. Wenn die Subkernel-Evaluierung fehlschlägt, wird der Subkernel erneut gestartet. Andernfalls wird der Rückgabewert zur Ergebnisliste hinzugefügt.

Um dies auszuprobieren, bewerten Sie:

%Vor%

Um den Wiederherstellungsmechanismus zu demonstrieren, öffnen Sie das Fenster Paralleler Kernel-Status und beenden Sie den Subkernel von Zeit zu Zeit. getTheJobDone wird den Schmerz fühlen und Autsch! drucken, wenn der Subkernel stirbt. Der Gesamtauftrag wird jedoch fortgesetzt und das Endergebnis wird zurückgegeben.

Die Fehlerbehandlung hier ist sehr grob und müsste wahrscheinlich in einer realen Anwendung verstärkt werden. Ich habe auch nicht untersucht, ob wirklich schwerwiegende Fehlerbedingungen in den Subkernels (wie der Speichermangel) sich nachteilig auf den Hauptkernel auswirken würden. Wenn ja, könnten sich Subkernels möglicherweise selbst töten, wenn MemoryInUse[] einen vorgegebenen Schwellenwert überschritten hat.

Update - Isolieren des Hauptkernels von Subkernel-Abstürzen

Während ich mit diesem Framework herumspielte, entdeckte ich, dass jede Verwendung von gemeinsamen Variablen zwischen dem Hauptkernel und dem Subkernel Mathematica instabil machte, sollte der Subkernel abstürzen. Dies beinhaltet die Verwendung von DistributeDefinitions[resultSoFar] , wie oben gezeigt, und explizite gemeinsame Variablen mit SetSharedVariable .

Um dieses Problem zu umgehen, übertrug ich das resultSoFar durch eine Datei. Dies beseitigte die Synchronisation zwischen den zwei Kerneln mit dem Nettoergebnis, dass der Hauptkernel sich glücklicherweise eines Subkernel-Absturzes nicht bewusst war. Es hatte auch den netten Nebeneffekt, die Zwischenresultate auch bei einem Kernel-Crash beizubehalten. Natürlich macht es auch die Subkernel Anrufe viel langsamer. Aber das ist möglicherweise kein Problem, wenn jeder Aufruf des Subkernels eine erhebliche Menge an Arbeit ausführt.

Hier sind die überarbeiteten Definitionen:

%Vor%     
WReach 29.10.2011 06:12
quelle
3

Ich habe eine ähnliche Anforderung, wenn ich eine CUDAFunktion für eine lange Schleife laufen lasse und CUDALink nicht mehr genügend Speicher hat (ähnlich wie hier: Ссылка ). Auch mit der neuesten Version Mathematica 10.4 gibt es keine Verbesserung des Speicherlecks. Ich finde hier einen Workaround und hoffe, dass Sie es vielleicht nützlich finden. Die Idee ist, dass Sie ein Bash-Skript verwenden, um ein Mathematica-Programm (im Batch-Modus ausgeführt) mehrere Male mit übergebenen Parametern aus dem Bash-Skript aufzurufen. Hier ist die detaillierte Anleitung und Demo (Dies ist für Windows OS):

  • Um bash-script in Win_OS zu verwenden, müssen Sie cygwin ( Ссылка ) installieren.
  • Konvertieren Sie Ihr Mathematica-Notebook in ein Paket (.m), um es im Skriptmodus verwenden zu können. Wenn Sie Ihr Notizbuch mit "Speichern unter ..." speichern, wird der gesamte Befehl in Kommentare umgewandelt (dies wurde von Wolfram Research notiert), daher ist es besser, dass Sie ein Paket erstellen (Datei- & gt; Neues-Paket), dann kopieren und Fügen Sie Ihre Befehle dazu ein.
  • Schreiben Sie das Bash-Skript mit dem Vi-Editor (anstelle von Notepad oder gedit für Fenster), um das Problem von "\ r" zu vermeiden ( Ссылка ).

Hier ist eine Demo der Datei test.m

%Vor%

Dieser Mathematica-Code liest den Parameter von einer Befehlszeile und verwendet ihn zur Berechnung. Hier ist das Bash-Skript (script.sh), um test.m mehrmals mit verschiedenen Parametern auszuführen.

%Vor%

Geben Sie im cygwin-Terminal "chmod a + x script.sh" ein, um das Skript zu aktivieren, und führen Sie es aus, indem Sie "./script.sh" eingeben.

    
entropi99 10.03.2016 16:52
quelle
2

Sie können den Kernel mit Exit[] programmatisch beenden. Das Frontend (Notizbuch) startet beim nächsten Versuch, einen Ausdruck auszuwerten, automatisch einen neuen Kernel.

"Etwas Code vom vorherigen Kernel zu erhalten" wird schwieriger. Sie müssen entscheiden, was Sie bewahren möchten. Wenn du denkst, dass du alles erhalten willst, dann hat es keinen Sinn, den Kernel neu zu starten. Wenn Sie wissen, welche Definitionen Sie speichern möchten, können Sie DumpSave verwenden, um sie vor dem Beenden des Kernels in eine Datei zu schreiben, und dann << verwenden, um diese Datei in den neuen Kernel zu laden.

Wenn Sie andererseits wissen, welche Definitionen zu viel Speicher benötigen, können Sie Unset , Clear , ClearAll oder Remove verwenden, um diese Definitionen zu entfernen. Sie können $ HistoryLength auch auf etwas kleiner als Infinity (die Standardeinstellung) setzen, wenn der Speicherplatz dafür ausreicht.

    
rob mayoff 23.10.2011 06:29
quelle
0

Klingt wie ein Job für CleanSlate.

%Vor%

Von: Ссылка

"CleanSlate, versucht alles zu tun, um den Kernel in den Zustand zurückzuversetzen, in dem er sich befand, als das Paket CleanSlate.m ursprünglich geladen wurde."

    
Chris Degnen 23.10.2011 09:45
quelle