1. З'ясуйте, що ядро ще пам'ятає
Файл ноутбука та стан ядра не завжди розповідають ту саму історію. Змінна може походити з видаленої комірки, список міг бути змінений кілька разів, а об'єкт, завантажений до останньої зміни коду, може залишатися в пам'яті. Тож показані результати не доводять, що поточні комірки все ще дають ці результати в їхньому видимому порядку.
Збережіть робочу копію, перезапустіть ядро, а потім виконайте комірки від початку до кінця. Занотуйте першу комірку, яка зазнає помилки або змінює результат. Шукайте відсутню залежність замість того, щоб вручну повторно вводити змінну з попереднього сеансу. Ядро Jupyter — це окремий процес; закриття вкладки не рівнозначне відтворенню чистого середовища.
Також проінвентаризуйте зовнішні впливи: завантаження, встановлення пакунка, зміну каталогу, читання вже створеного файлу та використання змінної середовища. Комірка, результат якої здається миттєвим, може просто повторно використовувати старий файл. Ваш майбутній скрипт повинен уміти відрізняти навмисне введення від залишку експерименту.
2. Напишіть контракт перед перенесенням коду
Виберіть одне завдання для виокремлення. Наприклад: прочитати файл оцінок, залишити ідентифікатори, оцінка яких досягає порогу, і записати результат. Приклад у цьому посібнику є навчальним, не виконується і не використовує GPU. Він слугує для демонстрації залежностей виконання, а не для оголошення вимірювання чи інструмента, що постачається з Kernodeck.
Визначте вхід, параметр і вихід достатньо точно, щоб перевірити перетворення. Тут поріг є включним: оцінка, що дорівнює 0,5, зберігається. Ідентифікатори мають залишатися пов'язаними зі своїми оцінками, а порядок входу зберігається. Наявний вихід не повинен бути ненавмисно замінений новим експериментом.
Цей крок запобігає неоднозначній міграції: якщо блокнот відкидав оцінки, рівні порогу, а скрипт їх зберігає, ви змінили обчислення. Вирішіть явно, це виправлення чи регресія. Збережіть випадок, розташований точно на межі, а не лише два далекі значення.
Прокрутіть таблицю, щоб побачити всі стовпці.| Елемент | Значення прикладу | Критерій |
|---|---|---|
| Вхід | a: 0,4; b: 0,8; c: 0,5 | Три різні ідентифікатори, оцінки вже перевірені в межах від 0 до 1. |
| Параметр | Поріг 0,5 | Порівняння «більше або дорівнює». |
| Очікуваний вихід | b, потім c | Два ідентифікатори, без дублювання та зміни порядку. |
3. Виокремте функцію, яка більше не залежить від комірки
Відокремте перетворення від операцій читання та запису. Функція обчислення отримує свої дані та поріг, а потім повертає вибрані ідентифікатори. Вона не звертається до глобальної змінної з назвою seuil, не відкриває неявно файл і не змінює вхідний список. Це дає змогу блокноту й скрипту викликати точно те саме обчислення.
У фрагменті дані вважаються вже перевіреними згідно з попереднім контрактом. Тому функція не є повним валідатором файлу. Це обмеження навмисне: перевіряйте формати на вході програми, а потім зберігайте перетворення легким для розуміння. Додавання параметра не повинно вимагати пошуку комірки, яка змінила значення.
Блокнот може залишатися вашим інструментом дослідження. Нехай він імпортує цю функцію, а не підтримує другу копію. Після зміни модуля почніть із чистого ядра, щоб порівняти обидва шляхи; стара вже імпортована функція не повинна спотворювати перевірку.
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. Зробіть параметри видимим входом
Точка входу скрипта обробляє аргументи, перевіряє вибір і викликає функції. Стандартний модуль argparse описує опції та створює довідку; він не знає ваших бізнес-правил. Число з плаваючою комою, прийнятне синтаксично, все ще може бути поза дозволеним діапазоном. Тому поріг у цьому прикладі вимагає додаткової перевірки.
Уточніть розв'язання шляхів: відносно каталогу, з якого запущено команду, або явно вибраної теки проєкту. Не використовуйте приховану зміну каталогу посеред обчислення. Блок нижче показує лише аналіз аргументів; читання даних і запис ще потрібно під'єднати в програмі читача.
Тримайте секрети поза цими аргументами. Спільні параметри описують експеримент; доступи до репозиторію чи сховища йдуть іншим каналом. Команда, корисна колезі, має копіюватися без копіювання токена.
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. Надайте скрипту завершення та перевірювані виводи
Розмістіть оркестрацію у функції main і викликайте її за умови if __name__ == "__main__". Так модуль можна імпортувати з ноутбука, не запускаючи одразу обробку. Імпорти визначають інструменти; головна точка входу вирішує, коли читати, обчислювати й записувати.
Призначте окрему теку для кожного запуску. Збережіть фактично використані нечутливі параметри та ідентичність входу, а потім запишіть результати. Для нашої вибірки перевірте кількість ідентифікаторів, їхню належність входу та правило порогу. Добре сформований JSON-файл може містити неправильні ідентифікатори; самої лише його наявності недостатньо.
Передбачте явну помилку, якщо вхідний файл відсутній або призначення непридатне для використання. Не замінюйте ці проблеми порожнім списком: його можна витлумачити як дійсну вибірку. Програма має розрізняти відсутність результатів, що відповідають порогу, і відсутність результатів через невдале читання.
6. Порівняння у двох нових запусках
Спершу скористайтеся трьома навчальними рядками. З порогом 0,5 очікуйте b і c; з 0,9 очікуйте порожній список; з 0,4 очікуйте всі три ідентифікатори. Ці відповіді випливають із контракту й не подаються як виконані тут результати. Вони дають змогу виявити перевернутий оператор порівняння або неправильний порядок.
Потім запустіть перезапущений ноутбук і свій скрипт у новому процесі на тому самому вході. Порівнюйте корисні значення, а не знімки екрана чи години, записані у файлах. Додайте другий репрезентативний набір і недійсний вхід. Задокументуйте очікувані відмінності, як-от стриманіше подання виводів.
Перетворення nbconvert може прискорити початкове перенесення комірок, але його магічні команди все ще можуть залежати від Jupyter. Вилучіть або замініть інструкції, властиві ноутбуку, зайві виводи та імпровізовані встановлення. Експорт — це лише відправна точка; порівняння з нового стану вирішує, чи завершено міграцію.
7. Перехід на GPU без повернення прихованого стану
Коли шлях на CPU стане зрозумілим, під'єднайте завантаження моделі та бекенд до тієї самої явної структури. Збережіть версії, точність, вхід і призначення. Перехід на GPU не виправляє ні неузгоджений порядок комірок, ні файл, створений давньою спробою. Окремо перевірте, що PyTorch справді може обчислювати на вибраному пристрої.
Якщо два запуски дають різні значення, розрізняйте забутий стан, випадкове джерело та числові межі обчислення. Зерно не є універсальною обіцянкою ідентичності між версіями й обладнанням. Для перерваного навчання скористайтеся окремою процедурою для контрольних точок: цей посібник перетворює точку входу, не відтворюючи стани оптимізатора чи генераторів.
Корисний результат — це програма, яку ви можете описати однією командою, разом з її передумовами та перевіркою результату. Notebook залишається вільним для дослідження й візуалізації; він більше не несе одноосібно пам'ять про те, як саме має запускатися обчислення.