组件最佳实践¶
这列出了您可能希望对组件和 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 和内存分配。命名资源允许 您的组件独立于环境并允许更好的调度 行为。
组合组件¶
对于常见的组件样式,我们提供基本组件定义。这些可以是 从您的自定义组件定义中调用,并且是创建 从头开始提供完整的 AppDef。
看:
torchx.components.base
对于简单的单节点组件。torchx.components.dist.ddp()
对于分布式组件。
对于更复杂的组件,可以合并多个现有的 组件合并为一个。例如,您可以使用度量 UI 组件 并将其中的角色合并到训练组件角色中,以获得 sidecar 服务添加到您的主要训练作业中。
分布式组件¶
如果您正在为分布式训练或其他类似内容编写组件
分布式计算,我们建议使用torchx.components.dist.ddp()
组件,因为它提供了开箱即用的
对工作的支持。torch.distributed.elastic
您可以通过编写一个自定义组件来扩展组件,该组件很简单
导入组件并使用您的应用程序配置调用它。ddp
ddp
定义所有参数¶
最好将所有组件参数定义为函数参数 使用参数字典。这使用户更容易理解 之外的选项,并且可以在与 Pyre 或 MyPy 一起使用时提供静态类型。
单元测试¶
您可以像执行普通 Python 代码一样对组件定义进行单元测试 因为它们是有效的 Python 定义。
我们建议使用ComponentTestCase
以确保您的
组件可以通过 TorchX CLI 进行解析。CLI 需要更严格的格式
在文档字符串上,而不是纯 Python,因为文档字符串用于解析 CLI
args 的
- torchx.components.component_test_base 类。ComponentTestCase(methodName='runTest')[来源]¶
- run_component(组件: Callable[[...], AppDef], args: 可选[Dict[str, Any]] = None, scheduler_params: optional[dict[str, any]] = None,调度器:str = 'local_cwd',间隔:float = 0.1,超时: float = 1) 可选[AppStatus] [来源]¶
隐藏设置运行程序和轮询结果的复杂性的 helper 函数。 注意:在调度程序退出或达到超时之前,方法会阻塞(对于非阻塞调度程序)。
- 参数
components – 组件函数,AppDef 的工厂
args – 可选的组件工厂参数
scheduler_params – 调度程序工厂方法的可选参数
scheduler – 调度程序名称
interval – 调度程序补偿轮询间隔
timeout – 调度程序完成的最大时间
集成测试¶
您可以通过使用 编程运行程序 API 或编写 bash 脚本来调用 CLI。
您可以在核心 TorchX 调度程序集成测试中看到这两种样式的使用。