1. Herausfinden, was der Kernel noch weiß
Die Notebook-Datei und der Zustand des Kernels erzählen nicht immer dieselbe Geschichte. Eine Variable kann aus einer gelöschten Zelle stammen, eine Liste mehrfach geändert worden sein, und ein Objekt, das vor der letzten Codeänderung geladen wurde, kann im Speicher bleiben. Die angezeigten Ergebnisse belegen daher nicht, dass die aktuellen Zellen diese Ergebnisse in ihrer sichtbaren Reihenfolge noch erzeugen.
Behalten Sie eine Arbeitskopie, starten Sie den Kernel neu und führen Sie dann die Zellen von Anfang bis Ende aus. Notieren Sie die erste Zelle, die fehlschlägt oder ihr Ergebnis ändert. Suchen Sie die fehlende Abhängigkeit, statt manuell eine Variable aus einer alten Sitzung wieder einzuspeisen. Der Jupyter-Kernel ist ein eigenständiger Prozess; einen Tab zu schließen ist nicht dasselbe wie eine saubere Umgebung neu aufzubauen.
Erfassen Sie auch die äußeren Effekte: Download, Paketinstallation, Verzeichniswechsel, Lesen einer bereits erzeugten Datei und Verwendung einer Umgebungsvariablen. Eine Zelle, deren Ergebnis sofort zu erscheinen scheint, kann einfach eine alte Datei wiederverwenden. Ihr künftiges Skript muss eine gewollte Eingabe von einem Rest aus einem Testlauf unterscheiden können.
2. Den Vertrag schreiben, bevor der Code verschoben wird
Wählen Sie eine einzige Aufgabe zum Extrahieren. Zum Beispiel: eine Datei mit Scores lesen, die Identifikatoren behalten, deren Score einen Schwellenwert erreicht, und das Ergebnis schreiben. Das Beispiel in diesem Leitfaden ist didaktisch, nicht ausgeführt und ohne GPU. Es dient dazu, die Abhängigkeiten einer Ausführung zu zeigen, nicht dazu, eine Messung oder ein mit Kernodeck geliefertes Werkzeug anzukündigen.
Definieren Sie Eingabe, Parameter und Ausgabe präzise genug, um die Transformation überprüfen zu können. Hier ist der Schwellenwert inklusiv: ein Score gleich 0,5 wird behalten. Die Identifikatoren müssen mit ihren Scores verknüpft bleiben, und die Eingabereihenfolge wird beibehalten. Eine vorhandene Ausgabe darf nicht versehentlich durch einen neuen Versuch ersetzt werden.
Dieser Schritt vermeidet eine mehrdeutige Migration: Wenn das Notebook Scores gleich dem Schwellenwert ausschloss, während das Skript sie behält, haben Sie die Berechnung geändert. Entscheiden Sie ausdrücklich, ob es sich um eine Korrektur oder eine Regression handelt. Behalten Sie einen Fall genau an der Grenze, nicht nur zwei weit auseinanderliegende Werte.
Scrollen Sie durch die Tabelle, um alle Spalten zu lesen.| Element | Wert des Beispiels | Kriterium |
|---|---|---|
| Eingabe | a: 0,4 ; b: 0,8 ; c: 0,5 | Drei verschiedene Identifikatoren, Scores bereits zwischen 0 und 1 validiert. |
| Parameter | Schwellenwert 0,5 | Vergleich größer oder gleich. |
| Erwartete Ausgabe | b, dann c | Zwei Identifikatoren, ohne Duplikate oder Neuordnung. |
3. Eine Funktion extrahieren, die nicht mehr von einer Zelle abhängt
Trennen Sie die Transformation von den Lese- und Schreibvorgängen. Eine Berechnungsfunktion erhält ihre Daten und ihren Schwellenwert und gibt dann die ausgewählten Identifikatoren zurück. Sie greift nicht auf eine globale Variable namens seuil zu, öffnet nicht implizit eine Datei und verändert nicht die Eingabeliste. So können Notebook und Skript genau dieselbe Berechnung aufrufen.
Im Auszug gelten die Daten als bereits gemäß dem vorherigen Vertrag validiert. Die Funktion ist also kein vollständiger Dateivalidator. Diese Grenze ist gewollt: Prüfen Sie die Formate am Programmeingang und halten Sie dann die Transformation leicht verständlich. Das Hinzufügen eines Parameters darf nicht erfordern, die Zelle wiederzufinden, die einen Wert geändert hatte.
Das Notebook kann Ihr Erkundungswerkzeug bleiben. Lassen Sie es diese Funktion importieren, statt eine zweite Kopie zu pflegen. Starten Sie nach einer Änderung des Moduls mit einem frischen Kernel neu, um die beiden Wege zu vergleichen; eine bereits importierte alte Funktion darf die Überprüfung nicht verfälschen.
def retenir_identifiants(records, seuil):
return [
record["id"]
for record in records
if record["score"] >= seuil
]
if __name__ == "__main__":
records = [
{"id": "a", "score": 0.4},
{"id": "b", "score": 0.8},
{"id": "c", "score": 0.5},
]
attendu = ["b", "c"]
obtenu = retenir_identifiants(records, 0.5)
if obtenu != attendu:
raise SystemExit("Sélection inattendue")4. Parameter zu einer sichtbaren Eingabe machen
Der Einstiegspunkt des Skripts verarbeitet die Argumente, validiert die Auswahl und ruft die Funktionen auf. Das Standardmodul argparse beschreibt die Optionen und erzeugt eine Hilfe; es kennt Ihre Geschäftsregeln nicht. Eine syntaktisch akzeptierte Fließkommazahl kann trotzdem außerhalb des zulässigen Intervalls liegen. Der Schwellenwert in diesem Beispiel erfordert daher eine zusätzliche Prüfung.
Legen Sie fest, wie Pfade aufgelöst werden: relativ zum Verzeichnis, aus dem der Befehl gestartet wird, oder zu einem explizit gewählten Projektordner. Verwenden Sie keinen versteckten Verzeichniswechsel mitten in der Berechnung. Der folgende Block zeigt nur die Argumentanalyse; das Lesen der Daten und das Schreiben müssen noch im Leserprogramm angeschlossen werden.
Halten Sie Geheimnisse aus diesen Argumenten heraus. Die teilbaren Parameter beschreiben das Experiment; Zugriffe auf ein Repository oder einen Speicher laufen über einen anderen Kanal. Ein Befehl, der für eine Kollegin nützlich ist, muss kopiert werden können, ohne zugleich ein Token mitzukopieren.
import argparse
from pathlib import Path
def lire_arguments():
parser = argparse.ArgumentParser()
parser.add_argument("--input", required=True, type=Path)
parser.add_argument("--output", required=True, type=Path)
parser.add_argument("--seuil", required=True, type=float)
args = parser.parse_args()
if not 0 <= args.seuil <= 1:
parser.error("Le seuil doit être compris entre 0 et 1.")
return args5. Dem Skript ein Ende und überprüfbare Ausgaben geben
Legen Sie die Orchestrierung in eine Funktion main und lösen Sie sie unter der Bedingung if __name__ == "__main__" aus. So kann das Modul vom Notebook importiert werden, ohne die Verarbeitung sofort zu starten. Die Imports definieren die Werkzeuge; der Haupteinstieg entscheidet, wann gelesen, berechnet und geschrieben wird.
Weisen Sie jedem Lauf einen eigenen Ordner zu. Speichern Sie die tatsächlich verwendeten, nicht sensiblen Parameter und die Identität der Eingabe, und schreiben Sie dann die Ergebnisse. Prüfen Sie für unsere Auswahl die Anzahl der Identifikatoren, ihre Zugehörigkeit zur Eingabe und die Schwellenwertregel. Eine wohlgeformte JSON-Datei kann die falschen Identifikatoren enthalten; ihr bloßes Vorhandensein genügt nicht.
Sehen Sie ein explizites Scheitern vor, wenn die Eingabedatei fehlt oder das Ziel nicht nutzbar ist. Vermeiden Sie es, diese Probleme durch eine leere Liste zu ersetzen: Diese könnte als gültige Auswahl interpretiert werden. Das Programm muss unterscheiden zwischen kein Ergebnis erfüllt den Schwellenwert und kein Ergebnis, weil das Lesen fehlgeschlagen ist.
6. In zwei frischen Ausführungen vergleichen
Verwenden Sie zunächst die drei didaktischen Zeilen. Bei Schwellenwert 0,5 erwarten Sie b und c; bei 0,9 erwarten Sie eine leere Liste; bei 0,4 erwarten Sie die drei Identifikatoren. Diese Antworten ergeben sich aus dem Vertrag und werden hier nicht als ausgeführte Ergebnisse präsentiert. Sie helfen, einen umgekehrten Vergleichsoperator oder eine falsche Reihenfolge zu erkennen.
Führen Sie anschließend Ihr neu gestartetes Notebook und Ihr Skript in einem frischen Prozess mit derselben Eingabe aus. Vergleichen Sie die relevanten Werte, nicht die Screenshots oder die in den Dateien vermerkten Uhrzeiten. Fügen Sie ein zweites repräsentatives Datenset und eine ungültige Eingabe hinzu. Dokumentieren Sie die erwarteten Unterschiede, etwa eine nüchternere Darstellung der Ausgaben.
Eine nbconvert-Konvertierung kann das erste Verschieben der Zellen beschleunigen, doch ihre Magic-Befehle können weiterhin von Jupyter abhängen. Entfernen oder ersetzen Sie notebook-spezifische Anweisungen, unnötige Ausgaben und improvisierte Installationen. Der Export ist ein Ausgangspunkt; der Vergleich aus einem frischen Zustand entscheidet, ob die Migration abgeschlossen ist.
7. Auf die GPU wechseln, ohne versteckten Zustand wieder einzuführen
Sobald der CPU-Ablauf verstanden ist, verbinden Sie das Laden des Modells und das Backend mit derselben expliziten Struktur. Behalten Sie Versionen, Präzision, Eingabe und Ziel bei. Der Wechsel auf die GPU behebt weder eine inkonsistente Zellenreihenfolge noch eine Datei, die aus einem früheren Versuch stammt. Prüfen Sie separat, dass PyTorch tatsächlich auf dem gewählten Gerät rechnen kann.
Wenn zwei Läufe unterschiedliche Werte liefern, unterscheiden Sie vergessenen Zustand, eine Zufallsquelle und die numerischen Grenzen der Berechnung. Ein Seed ist kein universelles Versprechen von Identität zwischen Versionen und Hardware. Verwenden Sie für das unterbrochene Training das spezielle Verfahren für Checkpoints: Dieser Leitfaden wandelt den Einstiegspunkt um, ohne die Zustände von Optimierer oder Generatoren wiederherzustellen.
Das nützliche Ergebnis ist ein Programm, das Sie mit einem einzigen Befehl beschreiben können, samt seiner Voraussetzungen und einer Ergebniskontrolle. Das Notebook bleibt frei zum Erkunden und Visualisieren; es trägt nicht mehr allein die Erinnerung daran, wie die Berechnung gestartet werden muss.