Что вы будете запускать
Мини-проект Kernodeck содержит небольшой синтетический набор данных, сеть с dropout, цикл обучения и проверяющее устройство. Протокол принудительно использует CPU, чтобы изолировать логику сохранения и возобновления. Он не является квалификацией CUDA, ROCm, многокарточного режима или измерением производительности арендованного GPU.
Проверяющее устройство открывает новые процессы для непрерывного прохождения, прерывания, полного возобновления и отрицательного случая, в котором генераторы случайных чисел не восстанавливаются. Смысл последнего в том, чтобы проверить, что контроль умеет обнаруживать неполное возобновление, даже если веса и номер шага выглядят корректно.
Прокрутите таблицу, чтобы увидеть все столбцы.| Сценарий | Запуск | Проверяемый вопрос |
|---|---|---|
| Непрерывный | 10 обновлений от начального состояния. | Какого состояния мы достигаем без прерывания? |
| Прерывание | 5 обновлений, затем сохранение и остановка. | Содержит ли промежуточная точка ожидаемые состояния? |
| Полное возобновление | Новый процесс, загрузка точки 5, затем 5 обновлений. | Получаем ли мы ту же последовательность входов, скоростей обучения и параметров в пределах выбранного допуска? |
| Возобновление без RNG | Новый процесс, та же точка возобновления, но восстановление случайности пропущено. | Обнаруживает ли тест расхождение, которое пропустила бы простая загрузка весов? |
Предварительные требования и запуск протокола
Скачайте архив, распакуйте его в рабочий каталог, затем перейдите в каталог, содержащий train.py и verify_resume.py. Используйте окружение Python с PyTorch и NumPy. Архив содержит код и синтетические данные; он не скачивает никакую модель и не требует аккаунта Kernodeck для выполнения упражнения.
Предоставленное доказательство было выполнено с Python 3.14.6, PyTorch 2.11.0+cu128 и NumPy 2.4.4. Программа принудительно использует CPU, точность float64 и один поток PyTorch. Таким образом, суффикс пакета не означает, что возобновление использовало CUDA. В другом окружении выполните собственную проверку.
Выберите выходной каталог, который ещё не существует. Каждый сценарий создаёт checkpoint.pt, его хеш checkpoint.pt.sha256 и summary.json. Проверяющее устройство собирает сравнение в verification.json. Опция --steps считает дополнительные шаги: после прерывания на 5 команда возобновления выполняет 5, чтобы достичь 10. Опция Python -B предотвращает создание кэшей байт-кода в каталоге упражнения.
python -B verify_resume.py --output runs/preuve-cpupython -B train.py --steps 10 --output runs/continu
python -B train.py --steps 5 --output runs/coupure
python -B train.py --steps 5 --resume runs/coupure/checkpoint.pt --output runs/repriseЭкспорт весов и checkpoint возобновления имеют разные задачи
Начните с выбора того, что вы хотите восстановить. Экспорт для инференса служит для получения предсказаний с обученной моделью. Возобновление обучения должно также восстановить состояние, определяющее следующие обновления. Пакетная обработка инференса по файлам требует надёжного списка уже завершённых элементов. Эти три задачи создают разные сохранения.
Не путайте это персистентное сохранение с activation checkpointing. Эта техника сокращает объём некоторых активаций, хранимых в памяти, пересчитывая их во время обратного распространения; сама по себе она не создаёт файл, позволяющий возобновить работу после остановки. Поэтому уточните в своём проекте, означает ли слово checkpoint оптимизацию памяти или точку возобновления.
Состояния, которые нужно хранить вместе
state_dict модели содержит параметры и зарегистрированные буферы; у оптимизатора собственное состояние. Здесь Adam, StepLR, dropout и три генератора случайных чисел влияют на следующие обновления. Checkpoint должен представлять один и тот же момент для всех этих элементов.
Документируйте также версию кода, параметры эксперимента и идентичность данных. В середине эпохи знать только её номер недостаточно: нужно иметь возможность восстановить порядок примеров и следующую группу для обработки. Ошибка в этом месте может пропустить входные данные или обработать их дважды.
Набор из 24 строк описывает синтетическую связь между двумя переменными и целевым значением. Сеть содержит 33 параметра, со слоем из восьми нейронов и dropout 0,25. Батч содержит четыре строки. После пяти обновлений курсор равен 20 из 24: разрыв приходится на середину эпохи. Десять обновлений потребляют 40 наблюдений, что вынуждает контроль пройти через новую перестановку данных.
Прокрутите таблицу, чтобы увидеть все столбцы.| Состояние | Роль | Проверка, которую нужно выполнить |
|---|---|---|
| Модель | Сохранить веса и буферы. | Сравнить итоговые параметры и результат оценки. |
| Оптимизатор | Сохранить состояния, используемые при следующем обновлении. | Проверить его загрузку, а не только гиперпараметры. |
| Scheduler | Продолжить последовательность скоростей обучения. | Сравнить следующую применяемую скорость, а затем последующие. |
| RNG Python, NumPy и PyTorch | Продолжить фактически использованные выборки. | Проверить, что негативное упражнение без восстановления расходится. |
| Данные | Возобновить перестановку и курсор. | Сравнить идентификаторы входных данных после разрыва. |
| Прогресс | Интерпретировать шаги и эпохи. | Дойти до 10 обновлений всего, не повторив и не пропустив ни одного. |
| Конфигурация | Воспроизвести тот же эксперимент. | Сохранить размерности, точность, настройки и версии. |
Восстанавливать в правильном порядке
Восстановите модель, оптимизатор и scheduler перед загрузкой их состояний. Scheduler должен быть создан до optimizer.load_state_dict(): иначе его создание может перезаписать восстановленные скорости обучения. Загрузите также его собственное состояние, затем проверьте скорость, фактически используемую на следующем шаге.
Восстанавливайте генераторы случайных чисел после создания объектов, потребляющих выборки, непосредственно перед продолжением работы. Простой возврат начального seed запустил бы последовательность с начала; это не восстановление состояния, достигнутого после пятого обновления. В вашем проекте найдите все используемые генераторы, включая генераторы преобразований и загрузки данных.
В этом упражнении Python задаёт небольшое усиление на входах, генератор NumPy PCG64 производит шум и перестановки, а PyTorch производит dropout. Checkpoint сохраняет их состояния, достигнутые на момент разрыва. Проверяющий также наблюдает их следующие выборки, немедленно восстанавливая состояние, чтобы не нарушить дальнейший ход вычислений.
optimizer = torch.optim.Adam(model.parameters(), lr=0.03)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.5)
# В сценарии возобновления, после создания объектов:
state = load_checkpoint(resume)
model.load_state_dict(state["model"])
scheduler.load_state_dict(state["scheduler"])
optimizer.load_state_dict(state["optimizer"])
progress = state["progress"]
history = state["history"]
restore_rng(state["rng"], generator)
model.train()Выбрать согласованную границу сохранения
Задайте явную границу, например после полного обновления оптимизатора. Если вы накапливаете несколько микробатчей перед этим обновлением, сохранение в середине вынуждает управлять также промежуточным состоянием. Первую реализацию проще проверить, когда она сохраняется на границе, где накопленные градиенты уже использованы.
Сохраняйте несколько поколений резервных копий. Записывайте новый файл под отдельным именем, дождитесь завершения записи, проверьте его читаемость, а затем помечайте его как пригодный к использованию. Не заменяйте свой единственный валидный checkpoint до этой проверки. Частота зависит от объёма работы, которую вы готовы переделать, и от наблюдаемого времени записи; её нельзя вывести только из длительности аренды.
Мини-проект сохраняет состояние после завершённой итерации, затем экспортирует файл и его отпечаток. Он использует новую папку для каждого прогона и не заменяет предыдущее доказательство. Если ваше обучение использует смешанную точность с GradScaler, его состояние также является частью возобновления. Этот вариант не покрывается упражнением на CPU.
Чтение сравнения и его допуска
Протокол сравнивает продолжение после шага 5: потреблённые данные, скорость обучения, функции потерь и достигнутые параметры. Совпадения только номера шага недостаточно. Сброшенный оптимизатор может продолжить цикл, но при этом выдавать другие обновления.
Выбранный для этого упражнения допуск является абсолютным: 1e-12, при относительном допуске 0. Этот порог является частью предоставленного протокола CPU; он не является универсальным правилом для ваших моделей. Сравнение должно сигнализировать о нефинитных значениях и различиях структуры, а не молча принимать непригодный для использования результат.
PyTorch не гарантирует идентичность результатов между версиями, платформами, CPU и GPU. Если вы переносите упражнение, заново проведите доказательство на целевой платформе и объясните выбранный допуск. Не расширяйте порог просто для того, чтобы устранить сбой, причину которого вы не поняли.
В предоставленном доказательстве все расхождения полного прогона равны нулю: параметры, состояние оптимизатора, функции потерь, скорости и MSE. Порядок строк, прогресс, состояние scheduler и следующие выборки также совпадают. Следующая скорость обучения после шага 10 равна 0,00375 в обоих прогонах. Таким образом, результат не зависит только от конечной метрики, которая могла бы скрыть промежуточные различия.
Прокрутите таблицу, чтобы увидеть все столбцы.| Сравнение | Полное возобновление | Возобновление без восстановления RNG |
|---|---|---|
| Максимальное расхождение весов | 0 | 0,011669328447718508 |
| Итоговая MSE | 0,09538858591775097 | 0,0936034144665111 |
| Расхождение MSE относительно непрерывного прогона | 0 | 0,001785171451239867 |
| Вердикт подтеста на согласованность | Согласовано в пределах допуска 1e-12 | Обнаружено расхождение |
Зачем сохранять негативный случай без восстановленного случайного состояния
Проверка полезнее, когда вы знаете, какую ошибку она обнаруживает. Негативный вариант перезагружает те же веса, состояния оптимизатора, scheduler и прогресс, но намеренно пропускает восстановление RNG. Процесс может завершиться без исключения Python, но при этом пойти по другой траектории.
В предоставленном доказательстве этот пропуск даёт максимальное расхождение весов более 0,011 и разницу MSE более 0,0017. Негативная MSE здесь ниже, чем у непрерывного прогона: это не делает возобновление корректным. Цель состоит в том, чтобы воспроизвести тот же эксперимент, а не ранжировать две модели по их итоговой ошибке.
Верификатор завершается успешно только тогда, когда полный прогон согласован, а негативный случай расходится. Тогда он выводит all_checks_passed: true, positive: true и negative_divergence_detected: true. Его код завершения равен 0 при успешном прохождении протокола, 1 если сравнение не прошло, и 2 если проверку не удалось завершить.
python -B train.py --steps 5 --resume runs/coupure/checkpoint.pt --omit-rng-restore --output runs/reprise-incompleteЗагрузить файл упражнения без ослабления защитных мер
Проект загружает только тот checkpoint, который вы создали в рамках этого упражнения и сохранили под своим контролем. Он явно использует torch.load(..., map_location="cpu", weights_only=True). Состояние Python содержит примитивы, состояние генератора NumPy PCG64 — целые числа и строки, а состояние PyTorch CPU — тензор байтов. В сохранённое состояние RNG не помещается никакой произвольный массив NumPy.
Загрузчик проверяет связанный отпечаток, размер, схему, прогресс, версии, а также идентичность кода и данных. При несовместимом состоянии он отказывается работать, а не сбрасывает молча отсутствующий элемент. Отпечаток обнаруживает изменение; он не подтверждает подлинность отправителя файла.
Не добавляйте weights_only=False просто чтобы заглушить ошибку загрузки. Сохранённый формат и его восстановление должны быть согласованы. Ограниченная загрузка сокращает возможности десериализации, но не делает неизвестный файл заслуживающим доверия.
Что меняется для распределённого обучения
При нескольких процессах или состояниях, распределённых между GPU, проверьте, кто что записывает. Файл, созданный одним процессом, не обязательно является полной резервной копией распределённой работы. Используйте процедуру резервного копирования, предусмотренную вашей стратегией, и дождитесь её завершения на соответствующих участниках. Чётко обозначьте фрагменты, относящиеся к одной и той же точке возобновления.
Изменение числа GPU может потребовать перераспределения состояний и изменить распределение данных. Механизмы распределённых контрольных точек могут обрабатывать некоторые изменения, но эту возможность нужно проверить для вашего формата и конфигурации. Выполните пробную загрузку на целевой среде. Добавление пакетов в команду не превращает автоматически одноускорительную резервную копию в распределённую программу.
Завершить реально восстановимым экспортом
До истечения срока экспортируйте нужные контрольные точки вместе с их конфигурацией, метриками, инструкциями по загрузке и идентификаторами данных. Проверьте размер и отпечаток скопированных файлов, затем загрузите хотя бы одну резервную копию из места назначения. Совпадающий отпечаток контролирует копию; перезагрузка проверяет, что содержимого действительно достаточно для восстановления работы.
Загружайте только файлы, происхождение которых вам известно, и выбирайте подходящий формат и параметры десериализации. Сохраняйте последнюю проверенную точку возобновления до тех пор, пока новая не пройдёт ваши проверки. Ожидаемый результат — восстановимая папка и краткое подтверждение возобновления: выполненная команда, найденный этап, пройденная проверка и экспортированный результат. Заложите это время в свои 3, 7 или 30 дней.
Границы доказательства и выбор аренды
Доказательство от 24 сентября 2026 года сравнивает четыре новых процесса на CPU с абсолютным допуском 1e-12 и без относительного допуска. Оно не охватывает ни CUDA, ни ROCm, ни AMP, ни распределённое обучение, ни обработчики загрузки данных. Оно подтверждает логику возобновления предоставленной версии в описанной среде и не измеряет возможности арендованного GPU.
После этого небольшого упражнения перенесите тот же протокол на свою модель, свои данные и свой бэкенд. Карта на 80 ГБ или карта на 192 ГБ не исправляет неполную контрольную точку: сначала выберите совместимую цепочку, затем рассчитайте память для реального этапа. Предложения, связанные ниже, не представлены как оборудование, протестированное для этого доказательства.
Заложите в свой период в 3, 7 или 30 дней первый цикл сохранение–остановка–возобновление и время финального экспорта. Полезный результат — папка, для которой вы можете объяснить версии, точку возобновления, сравнительную проверку и ограничения; само по себе наличие файла .pt такой гарантии не даёт.