1. Terugvinden wat de kernel nog weet
Het notebookbestand en de status van de kernel vertellen niet altijd hetzelfde verhaal. Een variabele kan uit een verwijderde cel komen, een lijst kan meerdere keren zijn gewijzigd en een object dat vóór de laatste codewijziging is geladen, kan in het geheugen blijven staan. De weergegeven resultaten bewijzen dus niet dat de huidige cellen die resultaten in hun zichtbare volgorde nog steeds produceren.
Bewaar een werkkopie, herstart de kernel en voer de cellen van begin tot eind uit. Noteer de eerste cel die faalt of een ander resultaat geeft. Zoek de ontbrekende dependency in plaats van handmatig een variabele uit een oude sessie opnieuw te injecteren. De Jupyter-kernel is een apart proces; een tabblad sluiten is niet hetzelfde als een verse omgeving opbouwen.
Inventariseer ook de externe effecten: downloaden, een pakket installeren, van map wisselen, een al geproduceerd bestand lezen en het gebruik van een omgevingsvariabele. Een cel waarvan het resultaat meteen lijkt te verschijnen, kan simpelweg een oud bestand hergebruiken. Je toekomstige script moet een bewuste invoer kunnen onderscheiden van een restje van een eerdere poging.
2. Schrijf het contract voordat je de code verplaatst
Kies één enkele taak om te extraheren. Bijvoorbeeld: een bestand met scores lezen, de identifiers behouden waarvan de score een drempel bereikt en het resultaat wegschrijven. Het voorbeeld in deze gids is didactisch, niet uitgevoerd en zonder GPU. Het dient om de afhankelijkheden van een uitvoering te tonen, niet om een meting of een met Kernodeck meegeleverd hulpmiddel aan te kondigen.
Definieer de invoer, de parameter en de uitvoer met genoeg precisie om de transformatie te verifiëren. Hier is de drempel inclusief: een score gelijk aan 0,5 wordt behouden. De identifiers moeten aan hun scores gekoppeld blijven en de invoervolgorde blijft behouden. Een bestaande uitvoer mag niet onbedoeld door een nieuwe poging worden vervangen.
Deze stap voorkomt een dubbelzinnige migratie: als de notebook de scores gelijk aan de drempel wegliet terwijl het script ze behoudt, heb je de berekening gewijzigd. Beslis expliciet of dit een correctie of een regressie is. Houd een geval dat precies op de grens ligt, niet alleen twee ver uiteenliggende waarden.
Scroll door de tabel om alle kolommen te lezen.| Element | Voorbeeldwaarde | Criterium |
|---|---|---|
| Invoer | a: 0,4; b: 0,8; c: 0,5 | Drie afzonderlijke identifiers, scores al gevalideerd tussen 0 en 1. |
| Parameter | Drempel 0,5 | Vergelijking groter dan of gelijk aan. |
| Verwachte uitvoer | b, dan c | Twee identifiers, zonder duplicatie of herordening. |
3. Een functie extraheren die niet meer van een cel afhangt
Scheid de transformatie van de lees- en schrijfbewerkingen. Een berekeningsfunctie ontvangt haar gegevens en haar drempel en geeft vervolgens de geselecteerde identifiers terug. Ze raadpleegt geen globale variabele met de naam seuil, opent niet impliciet een bestand en wijzigt de invoerlijst niet. Zo kunnen de notebook en het script exact dezelfde berekening aanroepen.
In het fragment wordt aangenomen dat de gegevens al gevalideerd zijn volgens het vorige contract. De functie is dus geen volledige validator van een bestand. Deze beperking is bewust: controleer de formaten bij de invoer van het programma en houd de transformatie daarna gemakkelijk te begrijpen. Een parameter toevoegen mag niet betekenen dat je de cel moet terugvinden die een waarde had gewijzigd.
De notebook kan je verkenningstool blijven. Laat hem deze functie importeren in plaats van een tweede kopie te onderhouden. Vertrek na het wijzigen van de module vanaf een nieuwe kernel om de twee routes te vergelijken; een oude, al geïmporteerde functie mag de verificatie niet vertekenen.
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. Parameters tot een zichtbare invoer maken
Het ingangspunt van het script verwerkt de argumenten, valideert de keuzes en roept de functies aan. De standaardmodule argparse beschrijft de opties en produceert een helpfunctie; hij kent je bedrijfsregels niet. Een syntactisch aanvaarde float kan nog steeds buiten het toegestane interval liggen. De drempel in dit voorbeeld vraagt dus een extra controle.
Geef de resolutie van paden aan: relatief aan de map van waaruit de opdracht wordt gestart, of aan een expliciet gekozen projectmap. Gebruik geen verborgen mapwisseling midden in de berekening. Het onderstaande blok toont alleen het parsen van de argumenten; het lezen van data en het schrijven moeten nog in het lezersprogramma worden aangesloten.
Houd secrets buiten deze argumenten. Deelbare parameters beschrijven de ervaring; toegang tot een repository of opslag verloopt via een ander kanaal. Een opdracht die nuttig is voor een collega moet kunnen worden gekopieerd zonder ook een token mee te kopiëren.
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. Geef het script een einde en verifieerbare uitvoer
Plaats de orchestratie in een functie main en activeer die onder de voorwaarde if __name__ == "__main__". Zo kan de module door de notebook worden geïmporteerd zonder de verwerking meteen te starten. De imports definiëren de hulpmiddelen; het hoofdentree bepaalt wanneer wordt gelezen, gerekend en geschreven.
Geef elke uitvoering een aparte map. Sla de niet-gevoelige parameters die daadwerkelijk zijn gebruikt en de identiteit van de invoer op, en schrijf daarna de resultaten. Controleer voor onze selectie het aantal identifiers, of ze tot de invoer behoren en de drempelregel. Een goed gevormd JSON-bestand kan de verkeerde identifiers bevatten; de aanwezigheid ervan alleen is niet voldoende.
Voorzie een expliciete fout als het invoerbestand ontbreekt of als de bestemming niet bruikbaar is. Vervang deze problemen niet door een lege lijst: die zou als een geldige selectie kunnen worden geïnterpreteerd. Het programma moet onderscheid maken tussen geen enkel resultaat dat aan de drempel voldoet en geen enkel resultaat omdat het lezen is mislukt.
6. Vergelijken in twee verse uitvoeringen
Gebruik eerst de drie didactische regels. Met drempel 0,5 verwacht je b en c; met 0,9 verwacht je een lege lijst; met 0,4 verwacht je de drie identifiers. Deze antwoorden volgen uit het contract en worden hier niet als uitgevoerde resultaten gepresenteerd. Ze helpen een omgekeerde vergelijkingsoperator of een verkeerde volgorde op te sporen.
Voer daarna je opnieuw gestarte notebook en je script uit in een vers proces, op dezelfde invoer. Vergelijk de nuttige waarden, niet de schermafbeeldingen of de tijden die in de bestanden staan. Voeg een tweede representatieve set en een ongeldige invoer toe. Documenteer de verwachte verschillen, zoals een soberder weergave van de uitvoer.
Een conversie met nbconvert kan het initiële verplaatsen van de cellen versnellen, maar de magic-commando's kunnen nog van Jupyter afhangen. Verwijder of vervang de notebookspecifieke instructies, de overbodige weergaven en de geïmproviseerde installaties. De export is een vertrekpunt; de vergelijking vanuit een verse staat bepaalt of de migratie klaar is.
7. Naar de GPU gaan zonder verborgen staat opnieuw in te voeren
Zodra het CPU-traject duidelijk is, sluit je het laden van het model en de backend aan op dezelfde expliciete structuur. Behoud versies, precisie, invoer en bestemming. De overstap naar de GPU verhelpt noch een onsamenhangende volgorde van cellen noch een bestand dat door een oude poging is geproduceerd. Controleer apart of PyTorch daadwerkelijk op het gekozen apparaat kan rekenen.
Als twee starts verschillende waarden opleveren, maak dan onderscheid tussen een vergeten staat, een willekeurige bron en de numerieke beperkingen van de berekening. Een seed is geen universele belofte van identiteit tussen versies en hardware. Gebruik voor onderbroken training de speciale procedure voor checkpoints: deze gids transformeert het entrypoint, zonder de staten van optimizer of generatoren te herstellen.
De bruikbare output is een programma dat je in één commando kunt beschrijven, met de vereisten en een resultaatcontrole. De notebook blijft vrij om te verkennen en te visualiseren; hij draagt niet langer alleen de herinnering aan hoe de berekening moet worden gestart.