动态

基本的动态模块类和hparam类。

DynamicModule

动态模块的基类。

DynamicSpace

一个类,用于表示具有多个子模块的模型上的所有动态模型选择。

class DynamicModule

基础:Module

动态模块的基类。

动态模块通常是从torch.nn.Module扩展而来的。它们动态支持具有不同架构参数的一系列torch.nn.Module,例如输入/输出通道数。

动态模块也可以用于构建搜索空间中的基本可搜索单元,并具有选择和采样候选单元的选项。

候选单元通常使用Hparam对象和动态属性来描述。每个hparam描述一个基本的可搜索单元(例如,DynamicConv2d中的输出通道数)。动态属性是回调函数,用于根据hparam的当前值动态构建属性,例如,DynamicConv2d中依赖于hparamout_channelsweight张量。

此外,动态模块还支持注册在导出模块时被移除的通用属性。这对于存储不是超参数或转换为动态属性的现有属性的临时属性非常有用。

对于一个包含其他动态模块的DynamicModule类,类的实现应确保仅在最外层的类中暴露hparams,并在内部处理其他hparams,包括通常自己暴露的子模块的hparams(例如包含DynamicLinear的块模块实现)。

__init__(*args, **kwargs)

不允许初始化动态模块!

classmethod convert(module)

通过修补其类,将模块就地转换为其动态对应物。

Parameters:

module (Module) – 要转换为动态模块的模块。

Returns:

转换后的动态模块。

Return type:

动态模块

这通常应该是一个最终方法,子类应该继承_setup()来定制转换过程。

通过将模块的__class__属性更新为其动态对应项来实现修补。动态对应项是原始类的子类,因此,我们确保模块与原始类完全兼容。同时,我们可以以标准化和严格的方式注入相应的动态行为。

export()

导出自身(一个动态模块)原地并返回导出的模块。

导出过程将移除顶层的动态模块,并用原始模块类替换它。请注意,原始类可能是另一种类型的动态模块,也可能是一个普通的nn.Module。因此,子类中实现的任何方法(包括属性)都将被移除。Hparams以及动态和临时属性将以特殊方式处理,详见下文。

为了确保导出的模块仍然一致,有几种机制来处理hparams、动态属性和临时属性:

  • Hparams of the current type are replaced with their currently active value.

    请注意,我们不需要显式处理父类的hparams,因为它们是互斥的,即hparams在所有继承级别上都是唯一的。

  • Dynamic Attributes are handled depending on whether they exist in a parent class:
    1. 父类中存在相同的动态属性。在这种情况下,回调被折叠(“附加”)到父类相同动态属性的回调中。这样我们确保属性的最终值保持一致。

    2. 动态属性在父类中不存在。在这种情况下,由于没有更多的回调可以影响该值,该属性不再是动态的。因此,我们只需用当前值覆盖基础原始对象,并将其恢复为常规属性。

  • 临时属性会一直保留到最终导出,即直到生成的类不再是动态模块为止。这是为了确保可能需要访问这些属性的折叠回调仍然可以访问它们。

Return type:

模块

extra_repr()

生成extra_repr,确保所有动态键都存在于self.__dict__中。

Pytorch 大量使用 self.__dict__ 来生成 extra_repr。然而,我们从 self.__dict__ 中移除了某些属性,以便能够动态管理它们。暂时地,在这里将它们添加回来,然后再移除。

force_assign()

强制重新分配所有动态属性到它们的当前值。

警告

请注意,此方法会覆盖实际的缓冲区和参数!仅在特定情况下使用!!

freeze()

将动态模块的超参数限制为原始选项。

这对于强制执行父类的行为很有用。

注意

在此调用之后,模块的hparams将无法再修改,尽管底层类型仍然是动态模块。

get_hparam(target)

查找并返回hparam(类似于“torch.nn.Module.get_parameter()”,但用于hparam)。

Parameters:

target (str) –

Return type:

Hparam

modify(*args, **kwargs)

以标准化和可扩展的方式修改模块的动态选择。

此方法可以被子类覆盖!虽然用户也可以直接修改单个hparams的选择,但此方法应提供一种方式,用相同的参数批量修改动态模块,例如,out_features_ratio 用于 DynamicLinear

请注意,通过规则系统暴露给用户的modify方法的参数应指定为仅关键字参数。当它们作为仅关键字参数暴露时,_DMRegistryCls可以自动生成相应的配置类,让用户提供配置,然后在传递给modify方法之前自动验证这些配置。

如果可能,modify()的关键字参数应具有默认值,以便在未提供时保持hparams不变,例如,可以调用some_dynamic_module.modify()而不带任何参数,模块将保持不变。

named_hparams(configurable=None)

返回模块所有超参数的迭代器。

Parameters:

configurable (bool | None) – 是否包含可配置的超参数。

Yields:

(name, Hparam) – 包含名称和hparam的元组。

Return type:

迭代器[元组[字符串, Hparam]]

默认行为是迭代可配置和不可配置的hparams。相应地设置configurable以仅迭代其中一种。如果configurable设置为True,则仅迭代可配置的符号。如果configurable设置为False,则跳过可配置的符号(仅迭代不可配置的符号)。

property original_cls: Type[Module]

返回动态模块的原始类。

reset_dynamic_attributes()

上下文管理器,用于临时移除任何动态属性并重新注册值。

此上下文管理器旨在用于当我们想要访问动态属性的原始未修改版本时,即不希望此类干扰其原始值及其相应的getattr/setattr/delattr行为。

退出上下文管理器时,动态属性会重新注册,并且相同的回调函数会与新值一起重新注册。

class DynamicSpace

基础类:object

一个类,用于表示具有多个子模块的模型上的所有动态模型选择。

__init__(model)

从模型初始化动态空间。

Parameters:

模型 (模块) –

Return type:

config(configurable=None)

返回所有超参数的配置字典。

Parameters:
  • model – 包含DynamicModule的模型。

  • 可配置 (布尔型 | ) – 无 -> 所有超参数, 真 -> 可配置的超参数, 假 -> 不可配置的超参数

Returns:

一个(parameter_name, choice)的字典,用于指定一个活动的子网。

Return type:

Dict[str, Any]

convert_to_dynamic(rules, dm_registry)

根据规则和提供的注册表将模型转换为动态模块。

Parameters:
  • 规则 (字典[字符串, 字典[字符串, 任意类型] | | 字典[字符串, 字典[字符串, 任意类型] | ]] | ) – 包含动态模块规则的字典。

  • dm_registry (_DMRegistryCls) – 一个包含要转换的动态模块的注册表。

Returns:

一个字典,包含转换后的模块,其中子模块名称作为键,转换后的动态模块作为值。

Return type:

Dict[str, Module]

export(dm_registry)

递归导出模块,包括自身,并返回结果。

Parameters:

dm_registry (_DMRegistryCls) – 一个动态模块注册表,用于检查应该导出的动态模块。

Returns:

导出注册表中找到的动态模块后的模型。

Return type:

模块

get_hparam(name)

获取具有给定名称的hparam。

Parameters:

name (str) –

Return type:

Hparam

is_configurable()

检查模型是否有任何可配置的超参数。

Parameters:

model – 一个需要检查是否包含具有可配置超参数的DynamicModule的模型。

Returns:

如果模型包含具有可配置超参数的DynamicModule(s),并且这些超参数有多个选择,则为True。

Return type:

bool

is_dynamic()

检查是否有任何模块是动态的。

Returns:

如果模型包含DynamicModule(s),则为True。

Return type:

bool

named_dynamic_modules()

递归地生成所有 DynamicModules 的名称和实例。

Yields:

(name, DynamicModule) – 包含名称和模块的元组。

Return type:

迭代器[元组[字符串, 动态模块]]

named_hparams(configurable=None)

递归地生成所有 hparams的名称和实例。

Parameters:

configurable (bool | None) – 是否包含可配置的超参数。

Yields:

(name, Hparam) – 包含名称和hparam的元组。

Return type:

迭代器[元组[字符串, Hparam]]

默认行为是遍历所有超参数。如果configurable设置为True,则只遍历可配置的、非重复的符号。

select(config, strict=True)

选择配置提供的子网。

如果设置了strict,那么config必须包含表示可配置和不可配置hparams的精确键集。

Parameters:
  • config (Dict[str, Any]) –

  • strict (bool) –

Return type:

size()

获取模型的搜索空间大小。

Returns:

一个表示模型搜索空间大小的整数。

Return type:

整数