多处理¶
启动和管理由函数或二进制文件指定的 n 个工作程序子进程副本的库。
对于函数,它使用 torch.multiprocessing(因此使用 python multiprocessing)来生成/派生工作程序进程。对于二进制文件,它使用 python subprocessing.Popen 来创建工作程序进程。
用法 1:以函数形式启动两个训练器
from torch.distributed.elastic.multiprocessing import Std, start_processes
def trainer(a, b, c):
    pass # train
# runs two trainers
# LOCAL_RANK=0 trainer(1,2,3)
# LOCAL_RANK=1 trainer(4,5,6)
ctx = start_processes(
        name="trainer",
        entrypoint=trainer,
        args={0: (1,2,3), 1: (4,5,6)},
        envs={0: {"LOCAL_RANK": 0}, 1: {"LOCAL_RANK": 1}},
        log_dir="/tmp/foobar",
        redirects=Std.ALL, # write all worker stdout/stderr to a log file
        tee={0: Std.ERR}, # tee only local rank 0's stderr to console
      )
# waits for all copies of trainer to finish
ctx.wait()
用法 2:以二进制形式启动 2 个 echo 工作程序
# same as invoking
# echo hello
# echo world > stdout.log
ctx = start_processes(
        name="echo"
        entrypoint="echo",
        log_dir="/tmp/foobar",
        args={0: "hello", 1: "world"},
        redirects={1: Std.OUT},
       )
与 torch.multiprocessing 一样,函数 start_processes() 的返回值是一个进程上下文(api.PContext)。如果启动了一个函数,则返回一个 api.MultiprocessContext,如果启动了一个二进制文件,则返回一个 api.SubprocessContext。两者都是父 api.PContext 类的具体实现。
启动多个工作程序¶
- torch.distributed.elastic.multiprocessing.start_processes(name, entrypoint, args, envs, logs_specs, log_line_prefixes=None, start_method='spawn')[source]¶
- 使用提供的选项启动 - n份- entrypoint进程。- entrypoint是- Callable(函数)或- str(二进制文件)。副本的数量由- args和- envs参数的条目数量决定,这些参数需要具有相同的键集。- args和- env参数是传递给由副本索引(本地等级)映射的入口点的参数和环境变量。必须考虑所有本地等级。也就是说,键集应该是- {0,1,...,(nprocs-1)}。- 注意 - 当 - entrypoint是二进制文件(- str)时,- args只能是字符串。如果给出了任何其他类型,则将其强制转换为字符串表示形式(例如- str(arg1))。此外,只有当主函数用- torch.distributed.elastic.multiprocessing.errors.record注释时,二进制文件故障才会写入- error.json错误文件。对于函数启动,这是默认完成的,无需使用- @record注释手动注释。- 重定向和- 三通是指定将哪些 std 流重定向到- log_dir中的日志文件的位掩码。有效的掩码值在- Std中定义。要仅重定向/三通某些本地等级,请将- 重定向作为映射传递,其中键为本地等级,以指定重定向行为。任何缺失的本地等级都将默认为- Std.NONE。- 三通的作用类似于 Unix “tee” 命令,因为它重定向 + 打印到控制台。要避免工作进程 stdout/stderr 打印到控制台,请使用- 重定向参数。- 对于每个进程, - log_dir将包含- {local_rank}/error.json:如果进程失败,则包含错误信息的日志文件
- {local_rank}/stdout.json:如果- 重定向 & STDOUT == STDOUT
- {local_rank}/stderr.json:如果- 重定向 & STDERR == STDERR
 - 注意 - 预期 - log_dir存在、为空且为目录。- 示例 - log_dir = "/tmp/test" # ok; two copies of foo: foo("bar0"), foo("bar1") start_processes( name="trainer", entrypoint=foo, args:{0:("bar0",), 1:("bar1",), envs:{0:{}, 1:{}}, log_dir=log_dir ) # invalid; envs missing for local rank 1 start_processes( name="trainer", entrypoint=foo, args:{0:("bar0",), 1:("bar1",), envs:{0:{}}, log_dir=log_dir ) # ok; two copies of /usr/bin/touch: touch file1, touch file2 start_processes( name="trainer", entrypoint="/usr/bin/touch", args:{0:("file1",), 1:("file2",), envs:{0:{}, 1:{}}, log_dir=log_dir ) # caution; arguments casted to string, runs: # echo "1" "2" "3" and echo "[1, 2, 3]" start_processes( name="trainer", entrypoint="/usr/bin/echo", args:{0:(1,2,3), 1:([1,2,3],), envs:{0:{}, 1:{}}, log_dir=log_dir ) 
进程上下文¶
- class torch.distributed.elastic.multiprocessing.api.PContext(name, entrypoint, args, envs, logs_specs, log_line_prefixes=None)[source]¶
- 标准化通过不同机制启动的一组进程操作的基本类。 - 名称 - PContext故意与- torch.multiprocessing.ProcessContext区分开来。- 警告 - stdout 和 stderr 应始终是 tee_stdout 和 tee_stderr(分别)的超集,这是因为 tee 是作为重定向 + tail -f <stdout/stderr.log> 实现的 
- 类 torch.distributed.elastic.multiprocessing.api.MultiprocessContext(name, entrypoint, args, envs, start_method, logs_specs, log_line_prefixes=None)[源代码]¶
- PContext作为函数调用的工作进程。
- 类 torch.distributed.elastic.multiprocessing.api.SubprocessContext(name, entrypoint, args, envs, logs_specs, log_line_prefixes=None)[源代码]¶
- PContext作为二进制文件调用的工作进程。
- 类 torch.distributed.elastic.multiprocessing.api.RunProcsResult(return_values=<工厂>, failures=<工厂>, stdouts=<工厂>, stderrs=<工厂>)[源代码]¶
- 使用 - start_processes()启动的进程完成运行的结果。由- PContext返回。- 请注意以下内容 - 所有字段均按本地等级映射 
- return_values- 仅填充函数(而非二进制文件)。
- stdouts- stdout.log 的路径(如果没有重定向,则为空字符串)
- stderrs- stderr.log 的路径(如果没有重定向,则为空字符串)
 
- class torch.distributed.elastic.multiprocessing.api.DefaultLogsSpecs(log_dir=None, redirects=Std.NONE, tee=Std.NONE, local_ranks_filter=None)[source]¶
- 默认 LogsSpecs 实现 - log_dir 将在不存在时创建 
- 为每次尝试和等级生成嵌套文件夹。 
 
- class torch.distributed.elastic.multiprocessing.api.LogsDest(stdouts=<factory>, stderrs=<factory>, tee_stdouts=<factory>, tee_stderrs=<factory>, error_files=<factory>)[source]¶
- 对于每种日志类型,保存本地等级 ID 到文件路径的映射。