目录

组件最佳实践

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

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

入口点

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

如果您的应用程序不是基于 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)])

命名资源

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

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

组合组件

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

看:

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

分布式组件

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

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

定义所有参数

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

单元测试

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

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

torchx.components.component_test_base 类ComponentTestCasemethodName='runTest'[来源]

ComponentTestCase 是 TestCase 的扩展,带有可供使用的辅助方法 使用 testing 组件定义。

>>> import unittest
>>> from torchx.components.component_test_base import ComponentTestCase
>>> from torchx.components import utils
>>> class MyComponentTest(ComponentTestCase):
...     def test_my_comp(self):
...         self._validate(utils, "copy")
>>> MyComponentTest("test_my_comp").run()
<unittest.result.TestResult run=1 errors=0 failures=0>
_validatemodule module function_name: strNone[来源]

_validate 接受一个模块和一个组件函数的名称 定义,并验证它是否为有效的 组件 def.

集成测试

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

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

文档

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

查看文档

教程

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

查看教程

资源

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

查看资源