1. Различайте четыре состояния, которые экран смешивает
Открытое соединение доказывает лишь то, что вы ещё можете обмениваться данными с машиной. Видимый терминал может содержать shell, вычисление в котором уже завершено. И наоборот, потеря соединения не позволяет заключить, что процесс остановился. Поэтому начните с присвоения имени запуску и месту, где можно найти его следы.
Отслеживайте отдельно существование процесса, его бизнес-прогресс и приёмку результата. Количество строк в журнале — не счётчик успешно обработанных данных: программа может повторять одно и то же предупреждение. Частичный вывод может быть читаемым, но при этом неполным.
Этот метод предполагает, что вы получили и проверили необходимые средства доступа. Он не обещает ни определённого протокола доступа, ни автоматического сохранения файлов. Доступные инструменты и назначения должны быть проверены в фактически предоставленном окружении.
Прокрутите таблицу, чтобы увидеть все столбцы.| Наблюдение | О чём оно говорит | Чего оно не доказывает |
|---|---|---|
| Активное соединение | Канал отвечает. | Вычисление продвигается. |
| Процесс присутствует | Запуск ещё существует. | Он обрабатывает нужные элементы. |
| Подтверждённый счётчик растёт | Запланированные единицы завершены. | Весь корпус обработан. |
| Код возврата равен нулю | Программа сообщает о нормальном завершении. | Результат соответствует вашему контракту. |
| Выходные данные проверены и получены | Выбранные критерии проверены. | Качество выше этих критериев. |
2. Подготовьте опознаваемый запуск, прежде чем отсоединять его
Проверьте данные, фактическую конфигурацию и короткий первый прогон приложения. Диагностика GPU отвечает на другой вопрос: умеет ли backend выполнять вычисление? Она не подтверждает полную загрузку корпуса и логику вашей программы. Выполните эти проверки до запуска на длительное время.
Выберите идентификатор запуска и новую папку. Сохраните команду без секретов, версию кода, идентификацию входных данных и ожидаемый результат. Предусмотрите, куда писать журналы и откуда забирать файлы. Два запуска не должны одновременно писать в одну папку.
Для работы, разделённой на независимые партиции, решите, когда партиция считается завершённой: вычисление закончено, файл закрыт, содержимое проверено и состояние сохранено. Файл в процессе записи не должен означать то же самое, что принятый результат. Также проверьте фактически доступное место перед стартом.
3. Сохраняйте находимый терминал, когда это позволяет контекст
Если окружение предоставляет Unix-оболочку и tmux, этот мультиплексор позволяет отсоединить терминал и вернуться к нему после переподключения. Он защищает этот сценарий от потери клиента подключения; это не механизм восстановления после перезагрузки машины или уничтожения процесса.
Приведённые ниже команды носят учебный характер и не выполняются. Они предполагают Bash, tmux и вашу собственную программу traitement.py с показанными опциями; этот файл не является предоставляемым ресурсом. Сначала проверьте её короткую команду и используйте отдельное имя сессии, чтобы не перепутать два вычисления.
Создайте сессию, затем запустите второй блок внутри неё. Создание папки завершается ошибкой, если она уже существует, что предотвращает незаметное повторное использование её журналов. Код возврата сохраняется, если оболочка доходит до этапа записи; резкая остановка может помешать созданию этого файла. Таким образом, отсутствие кода не является неявным успехом.
С настройками по умолчанию отсоединитесь с помощью Ctrl-b, затем d. После переподключения выведите список сессий, затем подключитесь к нужной. Оболочка может оставаться видимой, когда программа уже завершилась: проверьте журнал и сохранённый код. Не запускайте сразу вторую копию только потому, что ваш прежний терминал исчез.
tmux new -s campagne-amkdir -p runs
mkdir runs/campagne-a && (
code_retour=0
python -u traitement.py --config config.toml --output runs/campagne-a \
> runs/campagne-a/execution.log 2>&1 || code_retour=$?
printf '%s\n' "$code_retour" > runs/campagne-a/exit-code.txt
exit "$code_retour"
)tmux ls
tmux attach -t campagne-a4. Считать принятую работу, а не только активность
Опция Python -u отключает буферизацию его стандартного вывода и вывода ошибок. Она помогает видеть отправляемые сообщения, но не создаёт событий прогресса в приложении. Библиотека или тихий этап всё ещё могут требовать отдельного наблюдения.
Определите понятные фазы: чтение, подготовка, вычисление, запись, проверка. Добавьте счётчик с устойчивой единицей измерения, а также итог, когда он известен. Если вы считаете принятые партиции, не переходите на счётчик прочитанных строк посреди журнала, не изменив его название.
Следующий учебный пример относится к восьми партициям по пятьсот элементов, то есть к четырём тысячам элементов. В показанный момент приняты только пять партиций. Шестая является частичной и не должна раздувать итог. Эти числа показывают правило подсчёта; они не описывают никакого выполнения Kernodeck.
Прокрутите таблицу, чтобы увидеть все столбцы.| Партиции | Состояние | Элементы, засчитанные как принятые | Решение |
|---|---|---|---|
| 1–5 | Проверены | 2 500 | Сохранить их идентификаторы и результаты. |
| 6 | Частичная запись | 0 | Не объявлять эту партицию завершённой. |
| 7 и 8 | Подлежат обработке | 0 | Оставаться в списке работы. |
| Совокупность | Неполный | 2 500 из 4 000 | Не принимать итоговую папку. |
5. Изучить молчание или прерывание, не создавая дубликат
Когда ни один счётчик не движется, определите последнюю известную фазу и её последнюю завершённую единицу. Проверьте, существует ли процесс, появилось ли сообщение об ошибке и остаётся ли место назначения пригодным для использования. Медленный запуск модели и заблокированный цикл могут давать одинаковый неподвижный экран; контекст определяет следующую проверку.
Подготовьте добровольную остановку в вашем приложении: запрос остановки, завершение безопасной единицы, сохранение состояния, затем выход. Сигналы и прерывания зависят от системы. Python не может перехватить SIGKILL, а обработчик Python может дождаться завершения длительного нативного вызова, прежде чем выполниться. Таким образом, сохранение при остановке не заменяет периодических резервных копий.
После потери подключения сначала найдите существующую сессию и выполнение. После подтверждённой остановки определите, что завершено, а что частично. Для обучения возобновление требует подробных состояний модели и оптимизации; посвящённое руководство проверяет этот случай в новом процессе.
6. Возобновлять только то, что допускает договор
В нашем примере возобновление по разделам предполагает, что каждый раздел независим, а входные данные, код и конфигурация остаются неизменными. Оно может сохранить пять проверенных результатов и полностью пересчитать шестой, прежде чем продолжить со следующими двумя. Если эти допущения не выполняются, такое сокращение не оправдано.
Не просто добавляйте новые строки в частичный файл. Вы рискуете получить дубликаты или смешать две конфигурации. Используйте ожидаемые идентификаторы, чтобы различать полный, неполный и отсутствующий. Сохраните прежнее состояние как элемент объяснения, с отдельным местом назначения для новой попытки.
Проверьте свою стратегию на контролируемом прерывании, прежде чем полагаться на неё в большой обработке. Критерий — эквивалентность полезных выходных данных согласно вашему контракту, а не идентичность сообщений о ходе выполнения. Обучение, вычисления с внешними эффектами и распределённая обработка требуют иных гарантий, чем этот пример независимых разделов.
7. Принять и получить результат до завершения работы
Начните с кода возврата, затем сопоставьте выходные данные с манифестом входных. Для нашего примера дождитесь восьми разделов и четырёх тысяч предусмотренных идентификаторов, без пропусков и дубликатов. Проверьте формат, размеры и значимые значения; чтение файла не доказывает, что он содержит правильный результат.
Получите принятые выходные данные, разрешённую конфигурацию, версии и отчёт о проверке. Сравните размеры и, при необходимости, контрольные суммы между источником и копией. Идентичная контрольная сумма помогает проверить перенос байтов; она не доказывает ни качество модели, ни законное происхождение файла.
Наконец, откройте результат из места его хранения с помощью инструмента, который будет его использовать. Предусмотрите этот шаг до окончания вашего доступа к вычислениям. Работа завершена, когда проверенный результат можно получить и интерпретировать, а не когда последний процент достиг ста.