Zurück zur Startseite

Reactive Runtime

Wir machen wissenschaftliche Forschungsergebnisse reproduzierbar und transparent.

ReactiveRuntime ermöglicht die effiziente, automatische Ausführung von numerischen Notebooks. So wird es Wissenschaftler*innen erleichtert, ihre Modelle interaktiv erlebbar zu veröffentlichen.

Projektbeschreibung und Ziel

Veröffentlichungen und Reproduzierbarkeit ist ein Grundstein der wissenschaftlichen Methodik. Zur Bereitstellung von Daten, Analysen und Code erfreuen sich Jupyter Notebooks steigender Beliebtheit. Notebooks sind interaktive Dokumente, in denen man Code entwickeln kann und die Resultate als multi-media output angezeigt bekommt:

Ein klassisches Jupyter Notebook für eine Datenanalyse
Ein klassisches Jupyter Notebook für eine Datenanalyse

Die Veröffentlichung dieser Notebooks und die Interaktivität der generierten Graphiken gestaltet sich jedoch als Anspruchsvoll.

Abhängigkeit der Ausführungsordnung (execution order) und versteckter Zustände (hidden state) verhindern häufig die Reproduktion. Außerdem wird der graphische output oft als statische Bilder exportiert, mit welchen man nicht effizient interagieren kann.

Bei diesem Projekt, wird die Kalkulation ähnlich wie bei Spreadsheets (z. B. Excel) durch einen Graphen dargestellt, der die Abhängigkeiten zwischen den benutzten Variablen beschreibt.

Dies ermöglicht die effiziente, automatische Ausführung des gesamten Notebooks, z. B. wenn sich Inputs verändern. Zusammen mit interaktiven Widgets wie Slidern, kann man so spielerisch komplexe Daten und wissenschaftliche Modelle erforschen.

Eine Hauptinnovation dieses Projekts ist es, dass man durch das Erfassen des gesamten Compute-Graphs alle Berechnungen speichern kann - das heißt, egal ob die Berechnungen auf einem Supercomputer gelaufen sind, oder auf einem Laptop mit einem Komplizierten Setup, ist es möglich die Resultate interaktiv im Internet einem breiten Publikum vorzustellen. Wissenschaftlern wird es so ermöglicht Ihre Forschungen besser zu erklären und macht es dadurch einfacher die Bevölkerung und Politiker zu erreichen. Somit kann ein größerer Teil der Bevölkerung wichtige Zusammenhänge verstehen, was ultimativ dazu führt, als Gesellschaft besser wissenschaftlich fundierte Entscheidungen treffen zu können. Dies ist besonders wichtig in Forschungsgebieten die uns alle betreffen, wie zum Beispiel die Klima-Krise.

Die Programmiersprache der Wahl ist Julia, welche eine neue, performante und einfach zu benutzende Programmiersprache ist – also vergleichbar mit Python, aber mit der Geschwindigkeit von C++. Dies macht Julia die Sprache der Wahl für moderne große Simulationen und Daten Analysen und auch für groß angelegte Klima Modellierungen. Das Projekt setzt auf die von mir geschriebene Plotting Bibliothek Makie.jl auf, welche von Grund auf für interaktive Anwendungen konzipiert worden ist. Mein Vortrag von der JuliaCon 2020 gibt eine Übersicht über die Fähigkeiten:

image

Was bis jetzt fehlte, war ein performantes Web backend und die Möglichkeit die interaktiven Plots ohne einen laufenden Julia Server zu veröffentlichen. Makie hat schon von Anfang an Observables.jl benutzt, um einen Compute-Graph aller Berechnungen zu erstellen. Dies erleichtert es für dieses Projekt einen performanten offline Modus zu erstellen, da man alle nötigen Abhängigkeiten, Inputs und Outputs kennt, und so nur die Daten Speichern muss, die wirklich notwendig sind um online mit der Graphik zu interagieren. So ist es nun möglich, ein mit Makie visualisiertes interaktives Julia Programm auf jeglicher Plattform online zu stellen!

Ergebnisse

Die vollständige Notebookintegration der ReactiveRuntime ist ein wenig in den Hintergrund geraten, da ungleich später das Projekt Pluto.jl gestartet worden ist, welches zu 100 % die Reactive Runtime implementiert, die Ursprünglich von diesem Projekt beschrieben worden ist und welche dem gleichen Ausführungsmodell wie ObservablHQ folgt:

pluto.gif
Pluto.jl in Aktion: interaktive Grafiken sind sehr einfach zu programmieren

Dies hat den Fokus auf Geschwindigkeit und den statischen Export interaktiver Plots von komplexen Modellen verschoben, was Pluto bis jetzt noch nicht unterstützt.

Nichtsdestotrotz, funktionieren alle Elemente von ReactiveRuntime in Jupyter, IJulia, Nextjournal, VSCode und sogar auch in Pluto.jl.

Nextjournal funktioniert besonders gut, da ReactiveRuntime hier automatisch jegliche Plots offline, interaktiv und reproduzierbar exportiert so, dass es sehr leicht ist diese einem breiten Publikum vorzustellen. Wenn man möchte, kann man sogar jegliche Artikel remixen um weiterführende Analysen zu erstellen, und so aufeinander aufbauende Wissenschaft zu betreiben.

Ein Demo Artikel, der alle Daten und jegliche Software installiert hat, zeigt interaktive Visualisierungen die zusammen mit den wissenschaftlichen Partnern dieses Projekts entwickelt worden sind. Außerdem, habe ich auch einige demos mit Beschreibung auf github.io gestellt:

MIMI Climate impact Bodenfeuchte & Temperatur von homogenen Grasland
mimis soil
Temperatur & Niederschlag in Deutschland Ozean Simulation
german_heat ocean

Technische Details

Wie schon erwähnt ist die Basis für ReactiveRuntime die Plotting Bibliothek Makie.jl. Dieses Projekt hat das high Performance Web backend (WGLMakie) weiter ausgebaut und optimiert. WGLMakie benutzt JSServe.jl um interaktive Grafiken von Julia aus mit ThreeJS & WebGL im Browser zu rendern. JSServe ist eine Bibliothek um in Julia interaktive HTML + Javascript Anwendungen zu bauen, welche nun auch ohne einen laufenden Julia Server präsentiert werden können. JSServe ist auch außerhalb von Makie nutzbar, was die Anwendung der neuen Funktionen noch relevanter macht. Einen kurzen Überblick über JSServe habe ich zur JuliaCon 2020 vorgetragen:

image

Da JSServe auch Observables.jl benutzt, funktioniert es perfekt mit Makie und dessen Compute-Graph zusammen. Zum Beispiel, in einem interaktiven Plot, bei dem nur die Farbe + marker Größe bei einer Interaktion verändert wird, macht Observables es möglich nur diese zum Browser zu schicken, was nur wenigen Bytes entspricht. Dies hilft auch sehr bei dem offline Modus, da durch das Fehlen des Julia Prozesses alle Daten im Voraus berechnet werden müssen. In ReactiveRuntime haben wir vollständiges Wissen, welche Daten wirklich gespeichert werden müssen, um eine interaktive Graphik zu erstellen. Wenn auf dem Weg zur Graphik Gigabytes an Daten verarbeitet werden müssen, aber am Ende nur ein paar Positionen und Farben verändert werden, speichert ReactiveRuntime nur diese! So ist die Statemap für folgende Visualisierung nur ~0.1MB groß (klick für interaktiven Demo):

simple

Die Statemap kann für jegliche JSServe Applikationen generiert werden. Es werden automatisch alle Input Elemente wie Slider in der Julia App gefunden und die Kommunikation mit dem Julia Prozess wird durch einen lookup in Javascript ersetzt. Dies funktioniert natürlich nur für pure Funktionen und Input Elemente mit einer finiten Anzahl an states, wie Slider und Dropdowns. Die Input Elemente werden durch ein Trait System definiert, also jeder Benutzer kann eigene Inputs definieren, indem man folgende Funktionen überlädt:

is_widget(::MyWidget) = true
function value_range(x::MyWidget)
return any_iterable_over_possible_states
end
function update_value!(x::MyWidget, value)
# logic to update observable
end

Ein Beispiel dafür, wie man diese Funktionen überläd und Benutzer definierte Widgets erstellt, findet sich in der Ozean Simulations Demo.

Zukunft

Makie ist schon sehr erfolgreich innerhalb der kleinen aber stark wachsenden Julia Community. Wenn man sich in dem Julia-Slack anmeldet, kann man in dem inzwischen 348 starken Channel Hilfe bekommen und Fragen zu Makie stellen! Der neue interaktive Modus, den man auf statische Webseiten und in den meisten Notebook Plattformen einbetten kann, macht Makie noch um einiges relevanter, da dies die Publikation komplexer Analysen um einiges vereinfacht. Makie und JSServe werden auch von einigen Firmen verwendet, was dem Wachstum in Zukunft deutlich helfen wird. Es wird auch an einer Julia Kompilation zu JavaScript und WebAssembly gearbeitet ¹ ², so, dass es in Zukunft vorstellbar ist, dass noch komplexere Interaktionen im Browser zur Verfügung gestellt werden können! Wir arbeiten auch weiterhin aktiv an einer besseren Integration mit Pluto.jl und anderen Notebook Plattformen, um überall schnelle und publizierbare, interaktive Grafiken verfügbar zu machen. Man kann dem Fortschritt des Projektes auch in Zukunft unter @MakiePlots verfolgen!

Alles deutet daraufhin, dass Makie, JSServe & ReactiveRuntime weiterhin wachsen und viel in der Forschung verwendet werden. Dies ist schlussendlich auch dem Prototype Fund zu verdanken, der dieses Projekt gefördert hat, welcher durch den BMBF finanziert wird und durch den Projektträger DLR ausgetragen wurde.