Überblick zu Jupyter Notebooks

Allgemeines

In der Lehre verwenden wir – insbesondere für die Implementierung zentraler Algorithmen und die Visualisierung ihres Verhaltens – die web-basierte, interaktive Programmierumgebung der Jupyter Notebooks für Programmieraufgaben in Python 3. Die Notebook Dokumente besitzen die dung .ipynb und bestehen aus einer vorgegebenen Abfolge von Codezellen und begleitenden Textzellen. Während die Codezellen von NutzerInnen mittels des Kernels – einem Python-spezifischen Rechenprozess – ausgeführt werden können, um Rechnungen und Visualisierungen auszuführen, werden die Textzellen für begleitende Kommentare, Aufgabenstellungen und Freitextantworten von Ihnen verwendet. Insgesamt ergibt sich ein interaktiver Bearbeitungsprozess der Programmierübungen, welcher angeleitetes Umsetzen und Interpretieren wissenschaftlicher Algorithmen mit vergleichbar geringem Programmieraufwand und relativ niedriger Einstiegsschwelle möglich macht.

Ausführung

Jupyter Notebooks basieren auf einer server-client Struktur. Damit die Notebook Dokumente auf der Client-Seite durch die NutzerInnen im Browser ausgeführt werden können, wird also zuerst ein Jupyter Server benötigt, der den Kernel mitbringt. Auf dem laufenden Server können die Zellen des Notebook Dokuments dann über die eingebaute Funktionalität interaktiv ausgeführt werden. Für die Verwendung von Servern gibt es verschiedene Möglichkeiten, wobei der Hauptunterschied dabei liegt, ob der Server lokal auf Ihrer Maschine läuft oder extern gestellt wird. Auf lange Sicht möchten wir den Server gern stellen, können das aber derzeit noch nicht leisten. Die Verwendung von Jupyter Notebooks ist hervorragend dokumentiert, wir bieten also im Folgenden nur einen kurzen Überblick über Ihre Optionen inklusive der Installation von den grundlegenden Python Paketen. Bevorzugt können Sie sich einen lokalen Server auf ihrem Rechner konfigurieren, alternativ gibt es externe Dienste, die solche Server kostenlos zur Verfügung stellen.

Auf lokalem Server unter Linux (Ubuntu/Debian)

Entsprechend der Anleitung hier, können Sie wie folgt vorgehen:

  1. Installation von Python3 und einiger benötigter Pakete über die Kommandozeile:
    sudo apt-get install python3 python3-numpy python3-matplotlib python3-scipy pip
    
  2. Installation der Jupyter Umgebung via pip:
    pip3 install --upgrade pip
    pip3 install jupyter
    
  3. Hinzufügen des Pfads zu den ausführbaren Jupyter Binaries zum lokalen Pfad in der ~/.profile via des Eintrags
    export PATH=$PATH:\
    /home/<user>/.local/bin
    
  4. Wechsel in das Verzeichnis, in dem die auszuführende Notebook Datei liegt, und Aufruf von
    jupyter-notebook
    
    in der Kommandozeile.

Es sollte sich nun ein neuer Browser-Tab mit dem lokalen Notebook-Server unter http://localhost:8888 öffnen, in dem sich die .ipynb-Datei öffnen und ausführen lässt.

Auf lokalem Server unter Windows

Unter Windows ist die Paketverwaltung für Python etwas aufwändiger, wir empfehlen daher die Installation von Anaconda, welche gleich mit allen benötigten Paketen sowie der Notebook Umgebung installiert wird. Gehen Sie dazu wie folgt vor.

  1. Installation von Anaconda, indem Sie die Installationsdatei an dieser Stelle herunterladen, ausführen und dem Installationsprozess folgen.
  2. Starten der Anaconda Power Shell aus dem Home Bereich. Dazu auf Windows Start gehen und nach Anaconda Prompt suchen. Dies öffnet ein neues Terminal.
  3. Wechsel in das Verzeichnis, in dem die auszuführende Notebook Datei liegt, und Aufruf von
    jupyter-notebook
    
    in der Kommandozeile.

Es sollte sich nun ein neuer Browser-Tab mit dem lokalen Notebook-Server unter http://localhost:8888 öffnen, in dem sich die .ipynb-Datei öffnen und ausführen lässt.

Auf externen Servern

Wir empfehlen die Verwendung eines lokalen Notebook Servers, denn das Bereitstellen zusätzlicher Dateien auf den externen Servern ist aufwändiger als bei lokalen.

Es gibt aber verschiedene Möglichkeiten, einen Server von externen Anbietern ohne direkte Kosten zu nutzen. In den meisten Fällen, ist eine Anmeldung aber nötig. Wer einen Google account besitzt, kann aber Google Colaboratory mit diesem Account verwenden.

Wir beschreiben hier beispielhaft kurz die Nutzung von Google Colaboratoy für eingeloggte Google Nutzer:

  1. Besuchen Sie https://colab.research.google.com/.
  2. In dem automatischen Pop-Up, wählen Sie Upload und dann die Notebook Datei, die Sie bearbeiten wollen.
  3. Fügen Sie die zusätzlichen .py-Dateien aus der von uns bereitgestellten .zip-Datei ihrem Google-Drive hinzu.
  4. Mounten Sie Ihren Google-Drive in Google-Colab.

Bedienung

Die Umsetzung numerischer Verfahren und die graphische Visualisierung typischer Ergebnisse ist ein essentieller Baustein auf dem Weg zu einem ausgereiften Verständnis der Algorithmen. Um programmiertechnische Schwierigkeiten weitestgehend auszuschließen, bereiten wir einiges an Code für Sie vor und verwenden den Code als eine Art Lückentext. An den Schlüsselstellen der jeweiligen Implementierungen wird der lauffähige Code durch auskommentierte Blöcke der Art

### TODO BEGIN ###
# Compute the preconditioned gradient and the square of its (preconditioner-induced) norm 
# gradient = ...
# norm2_gradient = ...
### TODO END ###

ersetzt, in denen Sie zwischen ### TODO BEGIN ### und ### TODO END ### die entsprechenden Anweisungen (in diesem Beispiel die Berechnung und Initialisierung der Variablen ) entsprechend des Kommentars ausführen, um Lauffähigkeit wieder herzustellen. Welche Berechnungen und Auswertungen an den jeweiligen Stellen benötigt werden, ergibt sich entweder aus dem Kommentar zu dem entsprechenden TODO-Bereich oder können im Skript nachgelesen werden. Beachten Sie Folgendes:

  • Wenn Variablen vorbenannt werden, wie im obigen Beispiel gradient und norm2_gradient, dann müssen Sie Variablen mit den genau diesen Namen schreiben, da sie später im Notebook weiter verwendet werden.
  • Sie dürfen dabei natürlich jederzeit andere Variablen initialisieren (vermeiden Sie Namensdopplungen mit von uns verwendeten Variablen).
  • Im jeweiligen TODO-Block sind lediglich die Variablennamen auskommentiert angegeben, die Sie schreiben müssen, damit der Code im Anschluss lauffähig wird. Im Allgemeinen werden Sie allerdings auch zusätzliche Zeilen schreiben müssen, beispielsweise Abfragen.

Wenn sie den Code vervollständigt haben und der Code lauffähig ist, werden Sie an geeigneter Stelle um die Interpretation der ausgegebenen Ergebnisse gebeten. An den entsprechenden Stellen finden Sie Markierungen der Art “TODO Ihre Antwort hier”.

Bereitstellung der Aufgabennotebooks

Unter den jeweiligen Abschnitten zu den Programmieraufgaben Ihres Kurses finden Sie die benötigten Resourcen. Für gewöhnlich werden das sein:

  • Eine .ipynb-Datei, die ein Notebook Dokument mit vorgefertigtem Lückentext enthält,
  • Verschiedene .py-Dateien, die zusätzliche Funktionalitäten enthalten, welche für die Verwendung des Notebooks notwendig ist – z.B. spezielle plot-Befehle oder vorimplementierte Zielfunktionale.

Bis auf Weiteres werden diese Dateien in einer .zip-Datei zur Verfügung gestellt. Das jeweilige Archiv enthält auf oberster Ebende die .ipynb-Datei und einen Ordner namens src/, der die Hilfsdateien enthält. Sie können das Archiv an einem beliebigen Ort entpacken und die Struktur beibehalten.

Hilfe

Sollten Sie bei der Konfiguration eines lokalen Servers Hilfe benötigen, können Sie sich gern in den Übungen an Ihre ÜbungsleiterInnen wenden oder uns unter scoop-teaching@uni-heidelberg.de kontaktieren.

Für Hilfe bei der tatsächlichen Bearbeitung der Notebooks sind ebenfalls die Übungen der beste Zeitpunkt, sich an Ihre ÜbungsleiterInnen zu wenden.

Grundlegende Python Pakete

Für das wissenschaftliche Arbeiten mit Python in unseren Veranstaltungen sind einige der unzähligen Python Pakete von besonderer Relevanz. Die folgenden werden Sie installieren müssen, um die von uns erstellten Notebooks zu verwenden.

NumPy

Das Paket NumPy bezeichnet sich selbst als “das fundamentale Paket für wissenschaftliches Rechnen mit Python” und stellt die weit genutzten Datentypen und Funktionalitäten für den Umgang mit mehrdimensionalen Arrays wie Matrizen und Vektoren. Funktionalitäten der linearen Algebra werden insbesondere in numpy.linalg bereitgestellt, siehe insbesondere numpy.linalg.solve für das Lösen von linearen Gleichungssystemen.

Ist Python bereits installiert, so kann NumPy via pip3 install numpy installiert werden.

SciPy

Das Paket SciPy ist eine NumPy-basierte Bibliothek für mathematische Algorithmen mit einem gewissen Überlapp zu den Kernfunktionalitäten in NumPy – wobei die bessere Wahl der Funktionalitäten aus den Paketen situationsabhängig ist. Beispielsweise bietet scipy.linalg.eig die Möglichkeit, verallgemeinerte Eigenwertprobleme zu lösen.

Ist Python bereits installiert, so kann SciPy via pip3 install scipy installiert werden.

MatPlotLib

Das Paket https://matplotlib.org/ bietet umfassende Funktionalitäten bezüglich der Erstellung von Visualisierungen in Python. Das Paket ist zwar Voraussetzung für die Nutzung der plot-Funktionalitäten in unseren Notebooks, wird von Ihnen aber nicht bedient werden müssen, da wir die Funktionen zur grafischen Veranschaulichung der Algorithmen voraussichtlich stellen werden.

Ist Python bereits installiert, so kann MatPlotLib via pip3 install matplotlib installiert werden.

Nützliche Python Kommandos

Einige nützliche Python Kommandos sind die folgenden:

  • Lösen linearer Gleichungssysteme auch mit mehreren rechten Seiten B (spaltenweise) der Form Ax=B, siehe numpy.linalg.solve:
    X = numpy.linalg.solve( A, B )
    
    Dabei können durch slices einfach Untermatrizen und die dazugehörigen rechten Seiten ausgewählt werden:
    X = numpy.linalg.solve( A[rows,A_columns], B[rows,B_columns] )
    
  • Berechnung der p-Norm eines Vektors x, siehe numpy.linalg.norm:
    x = numpy.linalg.norm( x, p )
    
  • Aus einer Matrix A eine Matrix B erstellen, die nur die Diagonale von A auf der Diagonalen hat uns sonst Null ist, siehe numpy.diag:
    B = numpy.diag(numpy.diag(A))
    
  • Die verallgemeinerten Eigenwerte des Problems Ax=s Bx berechnen, siehe scipy.linalg.eigh:
    s = scipy.linalg.eigh(A, B, eigvals_only = True)
    
  • Aus einer Liste oder einem Vektor x den (kleinsten) Index eines kleinsten/größten Elements erhalten, siehe numpy.argmin/numpy.argmax:
    imin = numpy.argmin(x)
    imax = numpy.argmax(x)
    
  • Auswahl oder Modifikation bestimmter Elemente aus einem Vektor x anhand einer Bedingung, siehe numpy.where:
    nonnegative_indices = numpy.where(x >= 0)
    nonnegative_part = numpy.where(x >= 0, x, 0)
    
  • Doppeleinträge aus einer Liste B entfernen:
    B = list(set(B))
    
  • Element x aus einer Liste B entfernen oder hinzufügen:
    B = list(set(B) - set([x]))
    B = list(set(B) | set([x]))
    
  • Vektorpotenzen berechnen:
    np.power(base, exponents)
    np.power(bases, exponent)
    

Feedback

Wir sind daran interessiert, Ihnen den Zugang zur numerischen Umsetzung der Algorithmen möglichst reibungsfrei zu gestalten und für viele von Ihnen einen Lerneffekt bei der Bearbeitung der Notebooks zu erzielen. Wir sind über jede Form von Rückmeldung zu dem von uns vorgeschlagenen Prozess dankbar. Konstruktive Kritik können Sie also bitte per mail an scoop-teaching@uni-heidelberg.de senden.