错误传播¶
分布式 PyTorch 作业中的每个主机都运行一个 TorchElastic 代理,以及多个工作进程(作为 TorchElastic 代理的子进程)。由于工作进程是由用户提供的(您的 PyTorch 脚本/作业),TorchElastic 有一种方法可以将训练器上的错误通过代理传播到调度器,调度器最终会告知最终用户作业的状态并应用任何重试策略。
TorchElastic 将错误分为 3 类
类别 |
子类别 |
描述 |
---|---|---|
用户错误 |
输入错误 |
TorchElastic API 的无效输入(例如,min > max 节点) |
工作进程失败 |
工作进程子进程上的任何失败 |
|
平台错误 |
不适用 |
由代理引起的失败 |
基础设施错误 |
不适用 |
代理和工作进程域之外的失败(例如,主机失败) |
除“工作进程失败”之外的所有错误要么从代理进程规范地引发,要么隐式或显式地使代理进程崩溃。因此,标准的语言 (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(e) raise
重要提示
每个进程在顶层方法中使用此装饰器一次,通常这是 main 方法。
示例
@record def main(): pass if __name__=="__main__": main()
- 返回类型
Callable[[…], T]
- class torch.distributed.elastic.multiprocessing.errors.ChildFailedError(name, failures)[源代码][源代码]¶
可以从使用
@record
装饰器注释的函数中引发的特殊异常类型,以使子进程的(根异常)按原样向上传播堆栈(例如,不包装在父进程的回溯中)。在父进程是简单的 nanny 进程,而子进程(工作进程)实际上在进行有意义的计算的情况下很有用。在这种情况下,错误通常发生在子进程上,因为父进程没有做任何非平凡的事情,子进程错误应传播到调度器以进行准确的根本原因诊断。
注意
传播依赖于错误文件而不是异常处理,以支持函数和二进制启动。
示例
# 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)是根本原因,应报告给调度器的 init 进程。在检测到训练器 1 的失败后,torchelastic 代理会引发
ChildFailedError("trainer", {1: "trainer_1/error.json"})
,这会将训练器 1 的错误文件的内容传播到调度器的 init 进程。
- 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
不存在,则时间戳是当前时间戳(自 epoch 以来的秒数)。message
字段是对失败的简明解释。如果错误文件存在,则消息从错误文件中获取。否则,将根据失败签名生成一个。注意
假定
error_file
由torch.distributed.elastic.multiprocessing.errors.error_handler.ErrorHandler
写入。否则,行为未定义。