快捷键

torch.distributed.tensor.parallel.api 的源代码

© Meta Platforms, Inc. 及其关联公司
导入 警告
来自 fnmatch 导入 fnmatch
来自 打字 导入 可选, 联合

导入 火炬
导入 torch.nn 作为 然后
来自 torch.distributed.device_mesh 导入 _网状资源, 设备网格
来自 torch.distributed.tensor.parallel._utils 导入 _validate_tp_mesh_dim
来自 torch.distributed.tensor.parallel.style 导入 并行样式


__all__ = [并行化模块]


[文档]def 并行化模块( # type: ignore[return] 模块: nn.模块, 装置网状结构: 可选[设备网状结构] = , 并行化计划: 可选[联盟[并行样式, 字典[字符串, 并行样式]]] = , *, src_data_rank: 可选[int] = 0, ) -> nn.模块: "" 通过根据用户指定的计划并行化模块或子模块,在 PyTorch 中应用张量并行性。 我们根据并行化计划 parallelize_plan 并行化模块或 sub_modules。 `:class:`ParallelStyle`,表示用户希望模块或子模块的样式 待并行化。 用户还可以为每个模块的完全限定名(FQN)指定不同的并行样式。 请注意,`parallelize_module` 只接受 1-D :class:`DeviceMesh`,如果您有 2-D 或 N-D :class:`DeviceMesh`, 首先将 DeviceMesh 切片成 1-D 子 DeviceMesh,然后传递给此 API(即`device_mesh["tp"]`) 参数: 模块(:class:`nn.Module`) 待并行化的模块。 device_mesh(:class:`DeviceMesh`,可选): 描述 DTensor 设备网格拓扑的对象。 如果未指定,调用必须在 DeviceMesh 上下文中进行。 parallelize_plan (Union[:class:`ParallelStyle`, Dict[str, :class:`ParallelStyle`]], optional): 用于并行化模块的计划。它可以是 包含我们如何准备 :class:`ParallelStyle` 对象的类 输入/输出用于张量并行或它可以是模块的字典 完全限定名及其对应的 :class:`ParallelStyle` 对象。如果没有指定,当前调用将不执行任何操作。 目前,如果没有指定,调用将不执行任何操作。 关键字参数: src_data_rank (int, 可选): 源数据的排名,对于逻辑/全局张量,它被用于 meth:`distribute_tensor` 来分散/广播碎片/副本到其他排名。默认情况下, 我们在每个 DeviceMesh 维度上使用 ``group_rank=0`` 作为源数据以保持单设备 语义。如果显式传递 ``None``,:meth:`parallelize_module` 将简单地使用其本地数据 尝试通过散点/广播保留单设备语义。默认:0 返回: 一个并行化的 :class:`nn.Module` 对象。 示例:: >>> # xdoctest: +SKIP("distributed") >>> 从 torch.distributed.tensor.parallel 导入 parallelize_module, ColwiseParallel >>> 从 torch.distributed.device_mesh 导入 init_device_mesh ... >>> # 定义模块。 >>> m = Model(...) >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> m = parallelize_module(m, tp_mesh, {"w1": ColwiseParallel(), "w2": RowwiseParallel()}) ... .. note:: 对于像 Attention、MLP 层这样的复杂模块架构,我们建议使用组合 将不同的并行样式(即 ``ColwiseParallel`` 和 ``RowwiseParallel``)一起() 作为并行化计划,以实现所需的分片计算。 ```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) ``` 火炬._C._log_api_usage_once("torch.distributed.tensor.parallel.parallelize_module") 设备网状 = 设备网状 _网状资源.获取当前网状() _validate_tp_mesh_dim(装置网状结构) 如果 parallelize_plan : warnings.警告( "未提供 parallelize_plan 且不支持自动并行" 目前,所以这个 parallelize_module 调用将不会做任何事情。 ) 返回 模块 # 注意:如果尚未初始化,RNG 跟踪器将在 distribute_tensor()调用中初始化。 # 未被初始化。 如果 isinstance(parallelize_plan, 并行风格): 并行化计划.src_data_rank 源数据排名 = src_data_rank 源数据排名 返回 并行化计划.应用(模块, 装置网状结构) elif isinstance(并行化计划, 字典): 模块路径, 并行化风格 并行化方案.项目(): 路径分割 = 模块路径.分割(“点”) 如果 长度(路径分割) == 0: 提升 ValueError( "期望模块路径非空,但获取到空字符串!" ) while 路径分割: 原子 = 路径分割.弹出(0) 匹配的子项 = 过滤( `t[0]` 是子名称 lambda t: fnmatch(t[0] 原子), 模块.命名子项(), ) 将计划应用于所有匹配的子模块 _, 子模块 匹配的子项: 如果 路径分割: # 我们还没有到达叶子节点,应用字典风格 叶子路径 = “点”.加入( 路径分割 ) 原路径后部分 并行化模块( 子模块, 装置网状结构, {叶路径: 并行化风格}, src_data_rank=src_data_rank, ) 否则: 否则,直接应用此子模块的样式 并行化模块( 子模块, 装置网状结构, 并行化样式, src_data_rank=src_data_rank, ) 返回 模块 否则: 提升 类型错误( # pyre 忽略[7] "期望为 Union[ParallelStyle, Dict[str, ParallelStyle]] 类型" f"并行化计划,"{类型(parallelize_plan)}找到了! )

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源