torch.distributed.elastic.rendezvous.api 的源代码
# 版权所有 (c) Facebook, Inc. 及其附属公司。
# 保留所有权利。
#
# 本源代码根据在此源树根目录下的LICENSE文件中找到的BSD风格许可证进行许可。
from abc import ABC, abstractmethod
from typing import Any, Callable, Dict, Optional, Tuple
from torch.distributed import Store
[docs]class RendezvousError(Exception):
"""表示rendezvous错误的基类型。"""
[docs]class RendezvousClosedError(RendezvousError):
"""当rendezvous关闭时引发。"""
[docs]class RendezvousTimeoutError(RendezvousError):
"""当rendezvous未按时完成时引发。"""
[docs]class RendezvousConnectionError(RendezvousError):
"""当与rendezvous后端的连接失败时引发。"""
[docs]class RendezvousStateError(RendezvousError):
"""当rendezvous的状态损坏时引发。"""
[docs]class RendezvousGracefulExitError(RendezvousError):
"""当节点未被包含在rendezvous中并优雅退出时引发。
异常是一种退出堆栈的机制,但这并不意味着失败。
"""
[docs]class RendezvousHandler(ABC):
"""主要rendezvous接口。
注意:
分布式Torch用户通常**不需要**实现自己的``RendezvousHandler``。
基于C10d Store的实现已经提供,并推荐给大多数用户。
"""
[docs] @abstractmethod
def get_backend(self) -> str:
"""返回rendezvous后端的名称。"""
[docs] @abstractmethod
def next_rendezvous(
self,
) -> Tuple[Store, int, int]:
"""rendezvous屏障的主要入口点。
阻塞直到rendezvous完成并且当前进程被包含在形成的worker组中,
或发生超时,或rendezvous被标记为关闭。
返回:
一个包含 :py:class:`torch.distributed.Store`、``rank`` 和
``world size`` 的元组。
引发:
RendezvousClosedError:
rendezvous已关闭。
RendezvousConnectionError:
与rendezvous后端的连接失败。
RendezvousStateError:
rendezvous状态损坏。
RendezvousTimeoutError:
rendezvous未按时完成。
"""
[docs] @abstractmethod
def is_closed(self) -> bool:
"""检查rendezvous是否已关闭。
关闭的rendezvous意味着同一作业中所有未来的重新rendezvous尝试都将失败。
``is_closed()`` 和 :py:meth:`set_closed` 具有最终传播的语义,不应
用于同步。意图是如果至少一个节点决定作业已完成,它将关闭rendezvous,
其他节点将很快观察到这一点并停止运行。
"""
[docs] @abstractmethod
def set_closed(self):
"""将rendezvous标记为关闭。"""
[docs] @abstractmethod
def num_nodes_waiting(self) -> int:
"""返回在rendezvous屏障处迟到的节点数量,因此未被包含在当前worker组中。
调用者应定期调用此方法以检查是否有新节点等待加入作业,如果有,
则通过调用 :py:meth:`next_rendezvous()`(重新rendezvous)来接纳它们。
"""
[docs] @abstractmethod
def get_run_id(self) -> str:
"""返回rendezvous的run id。
run id是用户定义的id,唯一标识分布式应用程序的实例。它通常映射到作业id,
并用于允许节点加入正确的分布式应用程序。
"""
[docs] @abstractmethod
def shutdown(self) -> bool:
"""关闭为rendezvous打开的所有资源。
示例::
rdzv_handler = ...
try:
store, rank, world_size = rdzv_handler.next_rendezvous()
finally:
rdzv_handler.shutdown()
"""
[docs]class RendezvousParameters:
"""持有构造 :py:class:`RendezvousHandler` 的参数。
参数:
backend:
用于处理rendezvous的后端的名称。
endpoint:
rendezvous的端点,通常为 [:] 形式。
run_id:
rendezvous的id。
min_nodes:
允许加入rendezvous的最小节点数。
max_nodes:
允许加入rendezvous的最大节点数。
local_addr:
本地节点的地址。
**kwargs:
指定后端的附加参数。
"""
def __init__(
self,
backend: str,
endpoint: str,
run_id: str,
min_nodes: int,
max_nodes: int,
local_addr: Optional[str] = None,
**kwargs,
):
if not backend:
raise</span