Parallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Dieses Lab gibt jeder lernenden Person ein eigenes JupyterLab für die Ideen, auf denen eine GPU beruht: eine Operation über sehr viele Zahlen, eine auf Worker verteilte Aufgabe, die Grenze dessen, was das beschleunigen kann, ein Start von Blöcken aus Threads, die jeweils ihr eigenes Element finden, und die Kosten für das Bewegen von Daten. Im Lab gibt es keine GPU. Es vermittelt das Modell mit NumPy, dem multiprocessing von Python und sechs kurzen Skripten.

Es ist kein Angriffs-Lab. Jede Kopie hat weder eine Verbindung ins Internet noch zu anderen Lernenden, sodass nichts hineingeladen werden kann und nichts darin irgendjemand anderen erreichen kann.

Was die Lernenden lernen

Dass eine einzige NumPy-Operation die Arbeit einer Python-Schleife über ein ganzes Array erledigt: Die Quadratsumme von 1 bis 1000 ist auf beiden Wegen 333833500, mit 2000 Operationen auf Python-Ebene für die Schleife und 1 für NumPy. Dass sich eine Aufgabe in Stücke schneiden und auf zwei Worker verteilen lässt und die Teilsummen dieselbe Gesamtsumme ergeben. Dass sich ein Teil jeder Aufgabe nicht aufteilen lässt: Bei 10 Prozent seriellem Anteil bringen 8 Worker das 4,71-Fache, und keine Anzahl von Workern bringt mehr als das 10,0-Fache. Wie ein GPU-Kernel als Blöcke aus Threads gestartet wird, wobei jeder sein Element als Block mal Blockgröße plus Thread berechnet, was sie in schlichtem Python simuliert sehen. Ob eine Aufgabe durch das Bewegen von Bytes oder durch das Rechnen begrenzt wird, ausgehend von einer vorgegebenen Bandbreite und Rate. Und warum Threads, die benachbarte Zahlen lesen, 1 Zeile Speicher holen, wo Threads mit Schrittweite 8 holen. Das passt zu Einführungen in Rechnerarchitektur, parallele und Hochleistungsrechnen und Grafik; prüfen Sie die genaue Formulierung in der Einheit Ihrer eigenen Prüfungsstelle, hier wird keine zitiert.

Im Browser ausführen

Das Lab startet einen Dienst, jupyter, der das Notebook und die sechs Skripte in seinen Arbeitsordner schreibt und nach wenigen Sekunden bereit ist, innerhalb der 512 MB, die ein Dienst haben darf. JupyterLab fragt nach keinem Token, weil die Tür der Plattform bereits weiß, wer es öffnet. Das Terminal neben dem Lab hat kein eigenes Python, es erreicht das des Labs mit docker exec jupyter, gefolgt vom Befehl, der darin ausgeführt wird. Es wird keine Zeit gemessen, deshalb gibt jedes Skript jedes Mal dasselbe aus.

  1. Container-Seite öffnen. Öffnen Sie in der Leiste „Entwickeln“ und wählen Sie „Einen Container ausführen“. Die Seite kann jeder öffnen, und das Git-Lab und das SQL-Lab starten ohne Konto. Alle anderen Labs brauchen ein kostenloses Konto: Erstellen Sie eines, melden Sie sich an und klicken Sie dann auf „Starten“.
  2. Lab suchen. Die Karte „Beispiel-Labs“ listet alle Beispiele auf. Suchen Sie JupyterLab: Parallelverarbeitung ohne GPU.
  3. Auf „Starten“ klicken. „Starten“ führt das Lab unverändert mit einem einzigen Klick aus. „Zuerst die Datei bearbeiten“ öffnet die Compose-Datei, damit Sie sie vor dem Start ändern können.
  4. Öffnen. Auf der Seite des Labs hat die Lab-Leiste einen Link namens JupyterLab: Klicken Sie darauf, um JupyterLab im Browser zu öffnen, und doppelklicken Sie auf start.ipynb. Klicken Sie dann auf „Terminal öffnen“ und tippen Sie docker exec jupyter python3 steps/vectors.py, um die beiden Ergebnisse gleich bei 333833500 zu sehen, mit 2000 Operationen für die Schleife und 1 für NumPy.

Was die Lernenden abgeben sollen

Eine kurze eigene Änderung an einem Skript, aus JupyterLab mit File, Download heruntergeladen, zum Beispiel eine andere Anzahl von Stücken in chunks.py, ein anderer nicht aufteilbarer Anteil in amdahl.py oder eine andere Startgröße in kernel.py. Dazu ein, zwei Sätze in eigenen Worten dazu, was sich bewegt hat und warum. Nichts wird automatisch bewertet: Der Satz zeigt, ob es verstanden wurde. Für anspruchsvollere Arbeit lassen Sie die neuen Zahlen vor dem Ausführen vorhersagen und sagen, auf welche Grenze, den seriellen Anteil oder den Speicher, sie auf einer echten GPU zuerst stoßen würden.

Eine Grundlagenlektion zu diesem Lab

Parallel Computing Basics ist eine kleine Lektion, die in diesem Lab abläuft. Darin listet eine lernende Person die Skripte auf, addiert Quadrate mit einer Schleife und mit einer einzigen NumPy-Operation, teilt eine Summe auf zwei Worker auf, liest eine Tabelle mit Beschleunigungen, führt den simulierten Start von Blöcken aus Threads aus, sieht, welche von zwei Aufgaben vom Speicher begrenzt wird, und öffnet dann dieselbe Arbeit im Start-Notebook.

Sie ist absichtlich klein: Sie zeigt einer Lehrkraft, was eine Lektion in einem Lab ist, und das Lab erledigt den Rest. Kopieren Sie sie in ein eigenes Modul, um sie zu ändern.

Der Code auf GitHub

Die Compose-Datei hat kein Dockerfile: Sie startet ein einziges öffentliches Standard-Image, das scipy-notebook der Jupyter Docker Stacks selbst, auf ein datiertes Tag festgelegt, mit einem eigenen Konto ohne Sonderrechte und 512 MB Speicher. Das Image steht unter BSD-3-Clause und wird nicht von uns verteilt. Die Datei schreibt die Skripte beim Start aus festen Zahlen, deshalb gibt jede Kopie dasselbe aus und nichts wird heruntergeladen. Die Grenzen sind ehrlich: Es gibt keine GPU, der Kernel-Start wird also in Python simuliert, und die Zahlen zum Bewegen von Daten sind Rechnerei mit einem erfundenen Gerät, nie eine Messung. Aus dem Internet lässt sich nichts installieren. Beim Stoppen des Labs bleibt nichts erhalten, deshalb laden die Lernenden ihre Arbeit vorher herunter.

Als Aufgabe stellen

Schreiben Sie in die Aufgabe, was abzugeben ist.

  1. Lab erstellen. Fügen Sie in Ihrem Modul eine Aufgabe hinzu und wählen Sie die Karte „Container-Lab“, dann „In einem GitHub-Repository“. Geben Sie https://github.com/mitsurutech/lab-parallel-lab mit dem Branch main an. Die Compose-Datei ist standardmäßig compose.yaml. Forken Sie das Repository zuerst, wenn Sie es ändern möchten, zum Beispiel um die Zahlen zu ändern, die ein Skript verwendet.
  2. Veröffentlichen und ausprobieren. „Veröffentlichen“ legt den Commit fest, den Sie gesehen haben. Eine spätere Änderung im Repository verändert also kein Lab, das Sie bereits gestellt haben. Starten Sie zuerst Ihre eigene Kopie.
  3. Zuweisen. Weisen Sie es wie jede Aufgabe zu, auf Wunsch mit Fälligkeitsdatum, und schreiben Sie in die Aufgabe, was zu tun ist und was abgegeben werden soll.
  4. Abgaben bewerten. Öffnen Sie die Kopie einer lernenden Person und die abgegebene Arbeit, bewerten Sie sie und geben Sie sie mit einer Begründung zur Überarbeitung zurück, wenn mehr nötig ist.

Dieses Lab ausprobieren, und was es kostet

Mit einem kostenlosen persönlichen Konto können Sie die Grundlagenlektionen in diesem Lab durcharbeiten, mit genug kostenlosem Guthaben pro Monat für die meisten Lektionen und ohne Karte. Für eine Klasse sind die ersten 365 Tage für eine Schule kostenlos, für bis zu 50 Lernende; danach zahlt sie je lernender Person und Jahr, alle Labs inklusive und Lehrkräfte kostenlos.

Häufige Fragen

Gibt es im Lab eine GPU?
Nein. Das Lab vermittelt das Modell, auf dem eine GPU gebaut ist, mit NumPy, dem multiprocessing von Python und kurzen Skripten. Der Kernel-Start wird in schlichtem Python simuliert, und die Zahlen zum Bewegen von Daten sind Rechnerei mit einem erfundenen Gerät, sodass die Lernenden lernen, über eine GPU nachzudenken, ohne eine zu haben.
Warum benutzt das Terminal docker exec jupyter?
Das Terminal des Labs bringt curl, psql und ein paar andere Clients mit, aber kein Python. docker exec jupyter führt einen Befehl im Container des Labs aus, der Python und NumPy hat. JupyterLab hat auch ein eigenes Terminal unter File, New, Terminal.
Warum gibt nichts eine Zeit aus?
Eine Zeit ändert sich von Lauf zu Lauf und von Rechner zu Rechner, die Lektion könnte also nicht sagen, was die Lernenden sehen sollen. Die Skripte zählen stattdessen Operationen und berechnen Zahlen aus einer vorgegebenen Bandbreite und Rate: Jeder Lauf gibt dasselbe aus, und jede Antwort lässt sich von Hand prüfen.