GPU для ваших проектов · оплата криптовалютой без KYC Как арендовать
Русский
Открыть консоль
Практическое руководство / KERNODECK

Ваш ноутбук работает. Сможете ли вы перезапустить его без его ячеек?

Чтобы перейти от ноутбука к скрипту, начните с пустого ядра, определите входные данные и вынесите вычисления в функции. Затем задайте программе явные аргументы и отдельное место для вывода. Успех проверяется в новом процессе с ожидаемым результатом; экспорта ячеек в файл Python недостаточно, чтобы сделать опыт воспроизводимым.

6 мин чтения · Руководство для разработчиков

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 args

5. Дайте скрипту завершение и проверяемые выходные данные

Поместите оркестрацию в функцию main и запускайте её при условии if __name__ == "__main__". Тогда модуль можно импортировать из ноутбука, не запуская обработку немедленно. Импорты определяют инструменты; точка входа решает, когда читать, вычислять и записывать.

Выделите отдельную папку для каждого запуска. Сохраните фактически использованные несекретные параметры и идентичность входа, затем запишите результаты. Для нашей выборки проверьте количество идентификаторов, их принадлежность входу и правило порога. Корректно оформленный файл JSON может содержать неверные идентификаторы; одного его наличия недостаточно.

Предусмотрите явную ошибку, если входной файл отсутствует или назначение непригодно. Не подменяйте эти проблемы пустым списком: его могут принять за допустимую выборку. Программа должна различать отсутствие результатов, отвечающих порогу, и отсутствие результатов из-за сбоя чтения.

6. Сравните в двух чистых запусках

Сначала используйте три учебные строки. При пороге 0,5 ожидайте b и c; при 0,9 ожидайте пустой список; при 0,4 ожидайте все три идентификатора. Эти ответы выводятся из контракта и не представлены как результаты, выполненные здесь. Они позволяют заметить перевёрнутый оператор сравнения или неверный порядок.

Затем выполните перезапущенный ноутбук и скрипт в свежем процессе на одном и том же входе. Сравнивайте значимые значения, а не снимки экрана и не время, записанное в файлах. Добавьте второй показательный набор и некорректный вход. Задокументируйте ожидаемые различия, например более сдержанное представление выходных данных.

Преобразование nbconvert может ускорить первоначальный перенос ячеек, но его магические команды всё ещё могут зависеть от Jupyter. Удалите или замените специфичные для ноутбука инструкции, лишние выводы и импровизированные установки. Экспорт — это отправная точка; сравнение из чистого состояния решает, завершена ли миграция.

7. Переход на GPU без возврата скрытого состояния

Когда путь на CPU понятен, подключите загрузку модели и бэкенд к той же явной структуре. Сохраните версии, точность, вход и назначение. Переход на GPU не исправляет ни несогласованный порядок ячеек, ни файл, созданный старым запуском. Отдельно проверьте, что PyTorch действительно может вычислять на выбранном устройстве.

Если два запуска дают разные значения, различите забытое состояние, случайный источник и численные пределы вычисления. Зерно — не универсальная гарантия идентичности между версиями и оборудованием. Для прерванного обучения используйте специальную процедуру работы с checkpoints: это руководство преобразует точку входа, не восстанавливая состояния оптимизатора или генераторов.

Полезный результат — это программа, которую можно описать одной командой, с её предварительными условиями и проверкой результата. Ноутбук остаётся свободным для исследования и визуализации; он больше не несёт единолично память о том, как должен запускаться расчёт.

Ваши вопросы

Стоит ли отказаться от ноутбуков, чтобы сделать проект воспроизводимым?

Нет. Оставьте ноутбук для исследования и презентации, но перенесите переиспользуемый расчёт в функции или модули, вызываемые также из скрипта. Проверка должна начинаться с чистого ядра и явных входных данных.

Достаточно ли экспортировать ноутбук в .py?

Нет. Экспорт переносит видимый код; он не исправляет порядок зависимостей и эффекты уже выполненных ячеек. Магические команды могут по-прежнему требовать Jupyter. Проверьте скрипт в новом процессе.

Нужно ли получать файлы, идентичные байт в байт?

Только если этот критерий значим для вашего формата. Сначала сравните ожидаемые идентификаторы, значения и бизнес-правила. Даты или метаданные могут различаться, не меняя расчёт; числовые допуски должны быть явными.