目录

组件最佳实践

这列出了您可能希望对组件和 best 执行的常见作 为他们实践。组件设计灵活,因此您可以偏离 如有必要,从这些实践中得出这些,但是这些是我们使用的最佳实践 对于内置的 TorchX 组件。

有关如何编写的信息,请参阅 App Best Practices 使用 TorchX 的应用程序。

入口点

如果可能,最好通过 via 调用可重用组件,而不是指定主模块的路径。这使得它可以 依赖 Docker 和 SLURM 等多种不同环境使用 Python 模块解析,而不是目录结构。python -m <module>

如果您的应用程序不是基于 python 的,则可以将应用程序放在 PATH 上的文件夹中,以便无论目录结构如何,都可以访问它。

def trainer(img_name: str, img_version: str) -> AppDef:
    return AppDef(roles=[
        Role(
            entrypoint="python",
            args=[
                "-m",
                "your.app",
            ],
        )
    ])

简化

在编写组件时,您希望使每个组件都像 可能使其他人更容易重用和理解。

参数处理

参数处理使得在其他环境中使用该组件变得困难。 特别是对于图像,我们希望直接将 image 字段传递给 AppDef 因为任何类型的作都会使其无法在其他 具有不同映像命名约定的环境。

def trainer(image: str):
    return AppDef(roles=[Role(image=image)...)

分支逻辑

您应该避免在组件中分支逻辑。如果您有 感觉您需要在您应该更喜欢的组件中有一个声明 创建具有共享逻辑的多个组件。复杂的论点使 其他人则了解如何使用它。if

def trainer_test():
    return _trainer(num_replicas=1)

def trainer_prod() -> AppDef:
    return _trainer(num_replicas=10)

# not a component just a function
def _trainer(num_replicas: int) -> AppDef:
     return AppDef(roles=[Role(..., num_replicas=num_replicas)])

文档

文档是可选的,但最佳实践是保持组件功能的文档。 特别是如果您想共享您的组件。参见 :ref:Component authoring<components/overview:Authoring> 了解更多详情。

命名资源

在编写组件时,最好使用 TorchX 的命名资源支持 而不是手动指定 CPU 和内存分配。命名资源允许 您的组件独立于环境并允许更好的调度 行为。

torchx.specs.get_named_resources()了解更多信息。

组合组件

对于常见的组件样式,我们提供基本组件定义。这些可以是 从您的自定义组件定义中调用,并且是创建 从头开始提供完整的 AppDef。

看:

对于更复杂的组件,可以合并多个现有的 组件合并为一个。例如,您可以使用度量 UI 组件 并将其中的角色合并到训练组件角色中,以获得 sidecar 服务添加到您的主要训练作业中。

分布式组件

如果您正在为分布式训练或其他类似内容编写组件 分布式计算,我们建议使用torchx.components.dist.ddp()组件,因为它提供了开箱即用的 对工作的支持。torch.distributed.elastic

您可以通过编写一个自定义组件来扩展组件,该组件很简单 导入组件并使用您的应用程序配置调用它。ddpddp

定义所有参数

最好将所有组件参数定义为函数参数 使用参数字典。这使用户更容易理解 之外的选项,并且可以在与 PyreMyPy 一起使用时提供静态类型。

单元测试

您可以像执行普通 Python 代码一样对组件定义进行单元测试 因为它们是有效的 Python 定义。

我们建议使用ComponentTestCase以确保您的 组件可以通过 TorchX CLI 进行解析。CLI 需要更严格的格式 在文档字符串上,而不是纯 Python,因为文档字符串用于解析 CLI args 的

torchx.components.component_test_base 类ComponentTestCasemethodName='runTest'[来源]
run_component组件 Callable[[...] AppDef]args 可选[Dict[str Any]] = Nonescheduler_params: optional[dict[str any]] = None调度器str = 'local_cwd'间隔float = 0.1超时 float = 1 可选[AppStatus][来源]

隐藏设置运行程序和轮询结果的复杂性的 helper 函数。 注意:在调度程序退出或达到超时之前,方法会阻塞(对于非阻塞调度程序)。

参数
  • components – 组件函数,AppDef 的工厂

  • args – 可选的组件工厂参数

  • scheduler_params – 调度程序工厂方法的可选参数

  • scheduler – 调度程序名称

  • interval – 调度程序补偿轮询间隔

  • timeout – 调度程序完成的最大时间

setUp() None[来源]

在执行测试夹具之前设置测试夹具的钩子方法。

tearDown None[来源]

测试夹具测试后解构的钩子方法。

validatemodulemodule function_name: str None[来源]

通过有效地运行来验证组件:

$ torchx run COMPONENT.py:FN --help

集成测试

您可以通过使用 编程运行程序 API 或编写 bash 脚本来调用 CLI。

您可以在核心 TorchX 调度程序集成测试中看到这两种样式的使用。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源