torch.distributed.elastic.rendezvous.etcd_rendezvous_backend 源代码
# mypy: 允许未类型化定义
版权所有(c)Facebook,Inc.及其关联公司
版权所有
#
此源代码遵循在源树根目录中的 LICENSE 文件中找到的 BSD 风格许可协议。
有关许可证文件,请参阅源树根目录。
导入 binascii
来自 base64
导入
base64 解码,
base64 编码
来自
打字
导入
角色,
可选
导入 urllib3.exceptions # type: ignore[import]
try:
导入 etcd # type: ignore[import]
除了
模块未找到错误:
来自 .
导入 _etcd_stub
作为 etcd
来自 torch.distributed
导入
店铺
来自 .api
导入
约会连接错误,
会合参数, RendezvousStateError
来自
.动态 rendezvous
导入
rendezvous 后端,
令牌
来自
.etcd 存储
导入
Etcd 存储
来自
.工具
导入
解析预约端点
[文档]
类
Etcd rendezvous 后端(
rendezvous 后端):
表示一个基于 etcd 的 rendezvous 后端。
参数:
客户端:
使用以与 etcd 通信的 `etcd.Client` 实例。
run_id:
约会运行的 ID。
key 前缀
在 etcd 中存储 rendezvous 状态的路径。
ttl:
rendezvous 状态的 TTL。如未指定,默认为两小时。
```python
# 假设输入文本为:
input_text = '"""'
# 翻译函数(此处仅为示例,实际翻译功能需要调用真实的翻译 API)
def translate_to_simplified_chinese(text):
# 这里应该调用真实的翻译 API 进行翻译
# 由于示例中不使用真实的 API,以下为模拟翻译结果
return text
# 输出翻译结果
translated_text = translate_to_simplified_chinese(input_text)
print(translated_text)
```
默认 TTL = 7200
# 2 小时
_客户端: etcd.
客户端
_键:
字符串
_ttl: 整型
def 初始化(
自身,
客户端: etcd.
客户端,
run_id: 字符串,
key_prefix: 可选[
字符串] =
无,
ttl: 可选[int] =
无,
) -> 无:
如果 not run_id:
提升 ValueError(
"运行 ID 必须是非空字符串。")
自身._client =
客户端
如果 key_prefix:
自身.
_键 = key_prefix +
根目录 +
运行 ID
否则:
自身.
_键 =
运行 ID
如果 ttl
和 ttl > 0:
自身._ttl = ttl
否则:
自身._ttl =
自身._DEFAULT_TTL
@property
def 名称(
自身) ->
字符串:
"查看基类。"
返回
etcd-v2
[文档] def get_state(self) -> Optional[tuple[bytes, Token]]:
“查看基类。”
try:
result = self._client.read(self._key)
except etcd.EtcdKeyNotFound:
返回 None
except (etcd.EtcdException, urllib3.exceptions.TimeoutError) as exc:
raise RendezvousConnectionError(
"连接到 etcd 失败。请查看内部异常以获取详细信息。"
) 来自异常
返回 self._decode_state(result)
[文档] def 设置状态(
self, 状态: bytes, 令牌: Optional[Token] = None
) -> Optional[tuple[bytes, Token, bool]]:
"""查看基类。"""
base64_state = b64encode(state).decode()
kwargs = {}
def get_state():
result = self.get_state()
if result is not None:
tmp = *result, False
Python 3.6 不支持返回语句中的元组解包
语句。
返回 tmp
返回 None
if token:
try:
token = int(token)
except ValueError:
返回获取状态()
如果有 token:
kwargs["prevIndex"] = token
否则:
kwargs["prevExist"] = False
try:
result = self._client.write(self._key, base64_state, self._ttl, **kwargs)
except (etcd.EtcdAlreadyExist, etcd.EtcdCompareFailed):
result = None
except (etcd.EtcdException, urllib3.exceptions.TimeoutError) as exc:
raise RendezvousConnectionError(
"The connection to etcd has failed. See inner exception for details."
) 来自异常
如果结果为 None:
返回 get_state()
tmp = *self._decode_state(result), True
返回 tmp
def _解码状态(
自身,
结果: etcd.
Etcd 结果) ->
元组[
字节,
令牌
]:
基础状态 =
结果.
值.
编码()
try:
状态 =
base64 解码(
基础状态)
除了 binascii.
错误
作为
异常:
提升
预约状态错误(
状态对象已损坏。请查看内部异常以获取详细信息。
) 来自 exc
返回
状态,
结果.modifiedIndex
def 创建 etcd 客户端(
参数:
会合参数) -> etcd.
客户端:
主机,
端口 =
解析会话端点(
参数.
端点,
默认端口=2379)
超时
读取超时 =
角色(int,
参数.
获取整数值(
"读取超时", 60))
如果
读取超时
≤ 0:
提升 ValueError(
"读取超时必须是正整数。")
# 通信协议
协议 =
参数.
获取(
"协议", "http").strip().
小写()
如果
协议 != "http"
和
协议 != "https":
提升 ValueError(
"协议必须是 HTTP 或 HTTPS。")
SSL 客户端证书
ssl 证书 =
参数.
获取(
"ssl 证书")
如果 ssl_cert:
ssl 证书密钥 =
参数.
获取(
"ssl 证书密钥")
如果
ssl 证书密钥:
etcd 客户端期望证书密钥作为第二个元素
`cert` 元组的数量
ssl 证书 = (ssl_cert,
ssl 证书密钥)
根证书
证书颁发机构 =
参数.
获取(
"证书颁发机构")
try:
返回 etcd.
客户端(
主机,
端口,
read_timeout=read_timeout,
协议=
协议,
证书=ssl_cert,
ca 证书=
ca 证书,
允许重连=True,
)
除了 (etcd.
Etcd 异常, urllib3.
异常.
超时错误)
作为
异常:
提升
约会连接错误(
"etcd 连接失败。请查看内部异常以获取详细信息。"
) 来自 exc
[文档]def create_backend(params: RendezvousParameters) -> tuple[EtcdRendezvousBackend, Store]
"""从指定的参数创建一个新的 :py:class:`EtcdRendezvousBackend`。
+--------------+-----------------------------------------------------------+
| 参数 | 描述 |
+==============+===========================================================+
| read_timeout | etcd 操作的读取超时,以秒为单位。 |
| | 默认为 60 秒。 |
+--------------+-----------------------------------------------------------+
| etcd 通信所使用的协议。有效值是 "http" 和 "https"。默认为 "http"。
| | 默认值为 "http"。
+--------------+-----------------------------------------------------------+
ssl_cert | SSL 客户端证书的路径,用于配合使用 |
HTTPS. 默认为 `None`。
+--------------+-----------------------------------------------------------+
SSL 证书密钥 | SSL 客户端证书的私钥路径
与 HTTPS 一起使用。默认为`None`。
+--------------+-----------------------------------------------------------+
ca_cert | SSL 根证书的路径。默认值
将 `None` 设置为 `None`。
+--------------+-----------------------------------------------------------+
"""
client = _create_etcd_client(params)
backend = EtcdRendezvousBackend(
client, params.run_id, key_prefix="/torch/elastic/rendezvous"
)
store = EtcdStore(client, "/torch/elastic/store")
return backend, store