Skip to content

Latest commit

 

History

History
139 lines (70 loc) · 9.7 KB

hydra-configs-deep-learning-experiments.md

File metadata and controls

139 lines (70 loc) · 9.7 KB

Hydra 配置用于深度学习实验

原文:www.kdnuggets.com/2023/03/hydra-configs-deep-learning-experiments.html

Hydra 配置用于深度学习实验

图片来源:编辑

介绍


我们的三大课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业生涯。

2. Google 数据分析专业证书 - 提升你的数据分析技能

3. Google IT 支持专业证书 - 支持你的组织的 IT 需求


Hydra 库提供了一个灵活高效的配置管理系统,支持通过组合和重写配置文件以及命令行动态创建层次化配置。

这个强大的工具提供了一种简单而高效的方式来管理和组织各种配置,构建复杂的多层配置结构,没有任何限制,这在机器学习项目中至关重要。

所有这些功能使你能够轻松切换任何参数,并尝试不同的配置,而无需手动更新代码。通过以灵活和模块化的方式定义参数,迭代新的机器学习模型并更快地比较不同的方法变得更加容易,这可以节省时间和资源,并使开发过程更加高效。

Hydra 可以作为深度学习管道中的核心组件(你可以在 这里 找到我的训练管道模板示例),它将协调所有内部模块。

如何使用 Hydra 运行深度学习管道

hydra.main 装饰器用于在启动管道时加载 Hydra 配置。在这里,配置通过 Hydra 语法解析器进行解析、合并、组合,并传递给管道主函数。

此外,它还可以通过 Hydra Compose API 完成,使用 initializeinitialize_config_moduleinitialize_config_dir,而不是 hydra.main 装饰器:

使用 Hydra 实例化对象

如果配置中包含 _target_ 键和类或函数名称(例如 torchmetrics.Accuracy),则可以从配置实例化对象。此外,配置可能包含其他参数,这些参数应该传递给对象实例化。Hydra 提供了 hydra.utils.instantiate() 函数(及其别名 hydra.utils.call())用于实例化对象和调用类或函数。建议使用 instantiate 创建对象,使用 call 调用函数。

基于此配置,你可以简单地进行实例化:

  • 通过 loss = hydra.utils.instantiate(config.loss) 获取 loss

  • 通过 metric = hydra.utils.instantiate(config.metric) 获取 metric

此外,它支持多种策略来转换配置参数:nonepartialobjectall_convert_ 属性用于管理此选项。你可以在 这里 找到更多细节。

此外,它还提供了 部分实例化,这对于函数实例化或递归对象实例化非常有用。

命令行操作

Hydra 提供了命令行操作来覆盖配置参数:

  • 可以通过传递不同的值来替换现有的配置值。

  • 可以使用 + 操作符添加配置中不存在的新配置值。

  • 如果配置中已有值,可以使用 ++ 操作符覆盖。如果值不存在于配置中,将会被添加。

额外的开箱即用功能

它还支持各种令人兴奋的功能,例如:

  • 结构化配置 具有扩展的可用原始类型列表、嵌套结构、包含原始值的容器、默认值、从下往上的值覆盖等更多功能。这提供了广泛的可能性来以多种不同形式组织配置。

  • hydra/job_logginghydra/hydra_logging 的彩色日志。Hydra Configs for Deep Learning Experiments

  • 无需任何额外代码的超参数搜索器:OptunaNevergradAx

  • 自定义插件

自定义配置解析器

Hydra 通过 OmegaConf 库提供了扩展其功能的机会。它允许将自定义可执行表达式添加到配置中。OmegaConf.register_new_resolver() 函数用于注册这样的解析器。

默认情况下,OmegaConf 支持以下解析器:

  • oc.env:返回环境变量的值

  • oc.create:可用于动态生成配置节点

  • oc.deprecated:可用于将配置节点标记为已弃用

  • oc.decode:使用给定的编解码器解码字符串

  • oc.select:提供一个默认值,以防主插值键未找到,或选择其他非法插值键或处理缺失值

  • oc.dict.{keys,value}:类似于普通 Python 字典中的 dict.keys 和 dict.values 方法

更多细节请查看这里

因此,它是一个强大的工具,可以添加任何自定义解析器。例如,在多个地方的配置中重复编写损失或指标名称可能是乏味且耗时的,比如early_stopping配置、model_checkpoint配置、包含调度器参数的配置或其他地方。通过添加自定义解析器,将__loss____metric__名称替换为实际的损失或指标名称,可以解决这个问题,这些名称会传递给配置并由 Hydra 实例化。

注意:你需要在hydra.mainCompose API调用之前注册自定义解析器。否则,Hydra 配置解析器将无法应用它。

我的快速深度学习实验模板中,它被实现为一个装饰器[utils.register_custom_resolvers](https://github.com/gorodnitskiy/yet-another-lightning-hydra-template/blob/936e99fd6c9d033b4f407b96370fd64656566874/src/utils/utils.py#L328),允许在一个地方注册所有自定义解析器。它支持 Hydra 的主要命令行标志,这些标志是覆盖配置路径、名称或目录所必需的。默认情况下,它允许通过以下语法将__loss__替换为loss.__class__.__name__,将__metric__替换为metric.__class__.__name__${replace:"__metric__/valid"}。在${replace:"..."}中使用引号来定义内部值,以避免与 Hydra 配置解析器的语法问题。

有关utils.register_custom_resolvers的更多细节,请查看这里。你可以轻松扩展它以满足其他需求。

简化复杂模块配置

这个强大的工具显著简化了复杂管道的开发和配置,例如:

  • 实例化具有任何自定义逻辑的模块,例如:

    • 通过 Hydra 递归地实例化整个模块及其内部所有子模块。

    • 主模块和一些内部子模块可以由 Hydra 初始化,其余部分则需手动初始化。

    • 手动初始化主模块和所有子模块。

  • 将动态结构(如数据增强)打包到配置中,你可以轻松设置任何transforms类、参数或适用顺序。参见基于albumentations库的可能实现示例[TransformsWrapper](https://github.com/gorodnitskiy/yet-another-lightning-hydra-template/blob/main/src/datamodules/components/transforms.py),它可以轻松地为任何额外增强包进行修改。配置示例:

  • 创建复杂的多层配置结构。这里 是配置组织的概要:

用于深度学习实验的 Hydra 配置

  • 还有许多其他功能……它的限制非常少,因此你可以在项目中实现任何自定义逻辑。

最后的想法

Hydra 为可扩展的配置管理系统铺平了道路,使你能够扩展工作流程的效率,同时保持对配置的灵活更改能力。能够轻松切换不同的配置,简单地重新组合并尝试不同的方法,而无需手动更新代码,是解决机器学习问题(尤其是深度学习相关任务)时使用此系统的关键优势,因为在这些任务中,额外的灵活性至关重要。

亚历山大·戈罗德尼茨基 是一位机器学习工程师,具备深厚的机器学习、计算机视觉和分析知识。我拥有超过 3 年的经验,专注于使用机器学习创建和改进产品。

更多相关话题