Распространение ошибок
Создано: 4 мая 2021 г. | Последнее обновление: 8 мая 2026 г.
На каждом узле распределённого задания PyTorch работает один агент TorchElastic и несколько рабочих процессов (дочерних процессов агента TorchElastic). Поскольку рабочие процессы предоставляются пользователем (вашим скриптом или заданием PyTorch), TorchElastic может передавать ошибки обучающих процессов через агент планировщику, который в итоге сообщает конечному пользователю о состоянии задания и применяет политики повторных попыток.
TorchElastic распределяет ошибки по 3 категориям:
Категория | Подкатегория | Описание |
|---|---|---|
Ошибка пользователя | Ошибка входных данных | недопустимые входные данные для API TorchElastic (например, min > max nodes) |
Сбой рабочего процесса | любые сбои дочернего рабочего процесса | |
Ошибка платформы | н/д | сбои, вызванные агентом |
Ошибка инфраструктуры | н/д | сбои за пределами области ответственности агента и рабочих процессов (например, сбои узла) |
Все ошибки, кроме «Сбоя рабочего процесса», либо стандартным образом возбуждаются в процессе агента, либо явно или неявно приводят к его аварийному завершению. Поэтому применимы стандартные средства обработки исключений языка Python.
Сбои рабочих процессов — особый случай, поскольку исключение или сбой возникает в процессе, отличном от процесса агента, поэтому ошибку нужно передать между процессами (например, агент не может просто try-catch исключение, возникшее в процессе рабочего процесса).
Агенты TorchElastic используют torch.distributed.elastic.multiprocessing.start_processes() для запуска рабочих процессов. Эта функция включает простой механизм передачи ошибок между процессами на основе файлов.
Любая функция или двоичная точка входа, декорированная с помощью record(), записывает неперехваченные исключения (с информацией о трассировке) в файл, указанный переменной окружения TORCHELASTIC_ERROR_FILE. Родительский процесс (например, агент) задаёт эту переменную окружения для каждого запускаемого дочернего процесса, затем собирает файлы ошибок всех дочерних процессов и передаёт ошибку с наименьшей временной меткой (например, первую ошибку).
Методы и классы
-
torch.distributed.elastic.multiprocessing.errors.record(fn, error_handler=None)[исходный код] -
Синтаксический сахар для записи ошибок и исключений, возникших в декорированной функции, с помощью предоставленного
error_handler.Использование этого декоратора эквивалентно следующему:
error_handler = get_error_handler() error_handler.initialize() try: foobar() except ChildFailedError as e: _, failure = e.get_first_failure() error_handler.dump_error_file(failure.error_file, failure.exitcode) raise except Exception as e: error_handler.record_exception(e) raiseВажно
Используйте этот декоратор один раз в каждом процессе для метода верхнего уровня, обычно это главный метод.
Пример
@record def main(): pass if __name__ == "__main__": main()- Тип возвращаемого значения:
-
Callable[[~_P], _R | None]
-
class torch.distributed.elastic.multiprocessing.errors.ChildFailedError(name, failures)[исходный код] -
Специальный тип исключения, которое можно возбудить из функции, аннотированной декоратором
@record, чтобы исключение (корневая ошибка) дочернего процесса передавалось вверх по стеку без изменений (например, без обёртывания в трассировку стека родительского процесса).Полезно в случаях, когда родительский процесс — простой управляющий процесс, а дочерние процессы (рабочие процессы) выполняют реальные вычисления. В этом случае ошибки обычно возникают в дочернем процессе, поскольку родительский не выполняет ничего существенного, и ошибки дочерних процессов следует передавать планировщику для точной диагностики первопричины.
Примечание
Для передачи используются файлы ошибок, а не обработка исключений, чтобы поддерживать запуск как функций, так и двоичных файлов.
Пример:
# process tree on a host (container) 0: scheduler-init-process: |- 1: torchelastic_agent: |- 2: trainer_0 (ok) |- 3: trainer_1 (fail) -> error.json |- ... |- n+2: trainer_n (ok) |- n+3: other processes |- ...В приведённом выше примере сбой обучающего процесса 1 (записанный в error.json) является первопричиной и должен быть передан процессу инициализации планировщика. Агент torchelastic при обнаружении сбоя обучающего процесса 1 возбуждает
ChildFailedError("trainer", {1: "trainer_1/error.json"}), которое передаёт содержимое файла ошибок обучающего процесса 1 процессу инициализации планировщика.
-
class torch.distributed.elastic.multiprocessing.errors.ErrorHandler[исходный код] -
Записывает предоставленный объект исключения вместе с дополнительными метаданными об ошибке в структурированном формате JSON в файл ошибок, указанный переменной окружения:
TORCHELASTIC_ERROR_FILE. Если эта переменная окружения не задана, содержимое, которое должно было быть записано в файл ошибок, просто заносится в журнал.Этот обработчик можно расширить подклассом, чтобы настроить обработку ошибок. Подклассы должны переопределять
initialize()иrecord_exception().
-
class torch.distributed.elastic.multiprocessing.errors.ProcessFailure(local_rank, pid, exitcode, error_file)[исходный код] -
Представляет результат сбоя процесса. При сбое рабочего процесса в файл может быть записана первопричина сбоя.
Пытается прочитать временную метку сбоя из предоставленного
error_file. Еслиerror_fileне существует, используется текущая временная метка (количество секунд с начала эпохи).Поле
messageсодержит краткое описание сбоя. Если файл ошибок существует, сообщение берётся из него. В противном случае сообщение создаётся на основе сигнатуры сбоя.Примечание
Предполагается, что
error_fileзаписывается с помощьюtorch.distributed.elastic.multiprocessing.errors.error_handler.ErrorHandler. В противном случае поведение не определено.
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/elastic/errors.html