Shortcuts

高级用法

TorchX 定义了插件点,以便您配置 TorchX 以最好地支持您的基础设施设置。大部分配置是通过 Python 的 entry points 完成的。

注意

入口点需要一个包含它们的Python包被安装。 如果你没有Python包,我们建议你创建一个,这样你就可以在你的团队和组织中共享你的资源定义、调度器和组件。

下面描述的入口点可以在你的项目的setup.py文件中指定为

from setuptools import setup

setup(
    name="project foobar",
    entry_points={
        "torchx.schedulers": [
            "my_scheduler = my.custom.scheduler:create_scheduler",
        ],
        "torchx.named_resources": [
            "gpu_x2 = my_module.resources:gpu_x2",
        ],
    }
)

注册自定义调度器

您可以通过实现 .. py::class torchx.schedulers.Scheduler 接口来实现自定义调度器。

create_scheduler 函数应具有以下函数签名:

from torchx.schedulers import Scheduler

def create_scheduler(session_name: str, **kwargs: object) -> Scheduler:
    return MyScheduler(session_name, **kwargs)

然后,您可以通过在您的python项目中添加一个entry_points定义来注册这个自定义调度器。

# setup.py
...
entry_points={
    "torchx.schedulers": [
        "my_scheduler = my.custom.scheduler:create_schedule",
    ],
}

注册命名资源

命名资源是一组预定义的资源规格,这些规格被赋予了一个字符串名称。这在您的集群具有固定实例类型集时特别有用。例如,如果您的深度学习训练Kubernetes集群在AWS上仅由p3.16xlarge(64 vcpu,8 gpu,488GB)组成,那么您可能希望为容器枚举T恤尺寸的资源规格,如下所示:

from torchx.specs import Resource

def gpu_x1() -> Resource:
    return Resource(cpu=8,  gpu=1, memMB=61_000)

def gpu_x2() -> Resource:
    return Resource(cpu=16, gpu=2, memMB=122_000)

def gpu_x3() -> Resource:
    return Resource(cpu=32, gpu=4, memMB=244_000)

def gpu_x4() -> Resource:
    return Resource(cpu=64, gpu=8, memMB=488_000)

为了使这些资源定义可用,您需要通过entry_points注册它们:

# setup.py
...
entry_points={
    "torchx.named_resources": [
        "gpu_x2 = my_module.resources:gpu_x2",
    ],
}

一旦你安装了包含entry_points定义的包,命名资源就可以以下列方式使用:

>>> from torchx.specs import get_named_resources
>>> get_named_resources("gpu_x2")
Resource(cpu=16, gpu=2, memMB=122000, ...)
# my_module.component
from torchx.specs import AppDef, Role, get_named_resources

def test_app(resource: str) -> AppDef:
    return AppDef(name="test_app", roles=[
        Role(
            name="...",
            image="...",
            resource=get_named_resources(resource),
        )
    ])

test_app("gpu_x2")

注册自定义组件

您可以使用torchx CLI编写并注册一组自定义组件作为CLI的内置组件。这使得您可以定制一组对您的团队或组织最相关的组件,并将其作为CLI的内置组件进行支持。这样,当用户运行命令时,他们将看到您的自定义组件。

$ torchx builtins

自定义组件可以通过[torchx.components]入口点进行注册。 如果my_project.bar具有以下目录结构:

$PROJECT_ROOT/my_project/bar/
    |- baz.py

并且 baz.py 有一个名为 trainer 的单一组件(函数):

# baz.py
import torchx.specs as specs

def trainer(...) -> specs.AppDef: ...

入口点已添加为:

# setup.py
...
entry_points={
    "torchx.components": [
        "foo = my_project.bar",
    ],
}

TorchX 将搜索模块 my_project.bar 中所有定义的组件,并将找到的组件分组到 foo.* 前缀下。在这种情况下,组件 my_project.bar.baz.trainer 将以名称 foo.baz.trainer 注册。

注意

仅搜索Python包(那些包含__init__.py文件的目录), TorchX不会尝试递归到命名空间包(不包含__init__.py文件的目录)。 但是,您可以注册一个顶级命名空间包。

torchx CLI 将通过以下方式显示已注册的组件:

$ torchx builtins
Found 1 builtin components:
1. foo.baz.trainer

自定义组件可以如下使用:

$ torchx run foo.baz.trainer -- --name "test app"

当您注册自己的组件时,TorchX 不会包含其内置组件。要添加 TorchX 的内置组件,您必须指定另一个条目,如下所示:

# setup.py
...
entry_points={
    "torchx.components": [
        "foo = my_project.bar",
        "torchx = torchx.components",
    ],
}

这将重新添加TorchX内置组件,但使用torchx.*组件名称前缀(例如torchx.dist.ddp与默认的dist.ddp相比)。

如果有两个注册表条目指向同一个组件,例如

# setup.py
...
entry_points={
    "torchx.components": [
        "foo = my_project.bar",
        "test = my_project",
    ],
}

对于my_project.bar中的那些组件,将会有两组具有不同前缀别名的重叠组件:foo.*test.bar.*。具体来说,

$ torchx builtins
Found 2 builtin components:
1. foo.baz.trainer
2. test.bar.baz.trainer

为了省略分组并使组件名称更短,请使用下划线(例如 __0, _1, 等)。 例如:

# setup.py
...
entry_points={
    "torchx.components": [
        "_0 = my_project.bar",
        "_1 = torchx.components",
    ],
}

这样做的效果是将训练器组件暴露为baz.trainer(而不是foo.baz.trainer),并且像在torchx的原始安装中一样添加回内置组件,但没有torchx.*前缀。

$ torchx builtins
Found 11 builtin components:
1. baz.trainer
2. dist.ddp
3. utils.python
4. ... <more builtins from torchx.components.* ...>