快捷键

torch.ao.quantization.qconfig_mapping 的源代码

# mypy: 允许未类型化定义
from 未来 导入 注释

from 集合 导入 OrderedDict
from 打字 导入 任何, 可调用, 联合

导入 火炬

from .fake_quantize 导入 默认权重伪量化, FixedQParamsFakeQuantize
from .观察者 导入 (
    _部分包装,
    默认固定量化参数范围 0 到 1 的观察者,
    默认固定 Q 参数范围-1 到 1 观察者,
    默认占位符观察者,
    默认权重观察者,
)
from .qconfig 导入 (
    默认 quint8 权重 Q 配置,
    默认重用输入 Q 配置,
    默认对称 QNNPACK QAT Q 配置,
    默认对称 qnnpack_qconfig,
    获取默认 qat_qconfig,
    获取默认 qconfig,
    QConfig,
    QConfigAny,
)


全部 = [
    "获取默认 Qconfig 映射",
    "获取默认 QAT Qconfig 映射",
    "Q 配置映射",
]


# TODO: 将所有使用替换为这些常量
全局字典键 = 请提供需要翻译的文本
对象类型字典键 = "对象类型"
模块名称正则表达式字典键 = "模块名称正则表达式"
_模块名称字典键 = "模块名称"
_模块名称对象类型顺序字典键 = 模块名称对象类型顺序

# TODO: 从 BackendConfig 导出此映射
_FIXED_QPARAMS_OP_TO_OBSERVER: 字典[联盟[可调用, 字符串], _部分包装] = {
    火把.神经网络.硬饱和度: 默认固定 q 参数范围 0 到 1 观察者,
    火把.神经网络.功能性.硬件 sigmoid: 默认固定 q 参数范围 0 到 1 观察者,
    硬饱和度: 默认固定 q 参数范围 0 到 1 观察者,
    hardsigmoid_: 默认固定 q 参数范围 0 到 1 观察者,
    火把.神经网络.Sigmoid: 默认固定 q 参数范围 0 到 1 观察者,
    火把.Sigmoid 函数: 默认固定 q 参数范围 0 到 1 观察者,
    "S 形": 默认固定参数范围 0 到 1 观察者,
    "sigmoid_": 默认固定参数范围 0 到 1 观察者,
    火把.神经网络.Softmax: 默认固定 q 参数范围 0 到 1 观察者,
    火把.神经网络.双曲正切函数: 默认固定 q 参数范围-1 到 1 观察者,
    火把.双曲正切: 默认固定 q 参数范围-1 到 1 观察者,
    双曲正切: 默认固定 q 参数范围-1 到 1 观察者,
    tanh_: 默认固定 q 参数范围-1 到 1 观察者,
}


def _获取默认 q 配置映射(
    是否启用 QAT: 布尔, 后端: 字符串, 版本: 整型
) -> QConfig 映射:
    ""
返回给定量化类型和后端的默认 QConfigMapping。
"文档"
    如果 是否启用 QAT:
        qconfig = 获取默认 QAT 配置(后端, 版本)
    否则:
        qconfig = 获取默认配置(后端, 版本)
    默认权重 = 默认权重伪量化 如果 是否为 QAT 否则 默认权重观察者

    # default_per_channel_weight_observer 目前与 fbgemm 后端不兼容
    # 因此我们必须修改为 default_weight_observer 或其他支持每个张量的观察者
    # 的观察者。
    # 请参阅 https://github.com/pytorch/pytorch/issues/47535
    如果 后端  (fbgemm, x86):
        qconfig_transpose = QConfig(
            激活=qconfig.激活, 重量=默认权重
        )
    否则:
        qconfig_transpose = qconfig

    目前 layernorm 仅支持浮点权重
    我们必须添加这个,否则会有额外的量化和反量化对
    qconfig_layernorm = QConfig(
        激活=qconfig.激活, 重量=默认占位符观察者
    )

    qconfig 映射 = (
        QConfig 映射()
        .set_global(qconfig)
        .设置对象类型(重新塑形, 默认重用输入 qconfig)
        .设置对象类型(火把.神经网络.ConvTranspose1d, qconfig_transpose)
        .设置对象类型(火把.神经网络.ConvTranspose2d, qconfig_transpose)
        .set_object_type(火把.神经网络.ConvTranspose3d, qconfig_transpose)
        .set_object_type(火把.神经网络.功能性.卷积转置 1D, qconfig_transpose)
        .set_object_type(火把.神经网络.功能性.转置卷积 2D, qconfig_transpose)
        .set_object_type(火把.神经网络.功能性.3D 转置卷积, qconfig_transpose)
        .set_object_type(火把.神经网络.功能性.层归一化, qconfig_layernorm)
        .set_object_type(火把.神经网络.层归一化, qconfig_layernorm)
        .设置对象类型(火把.神经网络.PReLU, 默认 quint8 权重 qconfig)
    )
    为具有固定 qparams 的操作使用特殊观察者
    固定 qparams 观察者到 qconfig: 字典[任何, QConfigAny] = {}
    for 固定 qparams 操作, 观察者  _FIXED_QPARAMS_OP_TO_OBSERVER.项目():
        如果 观察者  fixed_qparams_observer_to_qconfig:
            fixed_qparams_qconfig = fixed_qparams_observer_to_qconfig[观察者]
        否则:
            如果 是否启用 QAT:
                激活 = FixedQParamsFakeQuantize.带参数(观察者=观察者)
            否则:
                激活 = 观察者
            固定_qparams_qconfig = QConfig(
                激活=激活, 重量=默认权重
            )
            fixed_qparams_observer_to_qconfig[观察者] = fixed_qparams_qconfig
        QConfig 映射.set_object_type(fixed_qparams_op, fixed_qparams_qconfig)

    # TODO 目前要求在融合操作/模块中,分离的操作必须具有相同的 qconfig。
    #      需要能够支持不同 qconfig 的操作融合

    返回 qconfig 映射


[文档]def get_default_qconfig_mapping(backend="x86", version=0) -> QConfigMapping: """ 返回用于训练后量化的默认 QConfigMapping。 Args: * ``backend`` (str) : 默认 qconfig 映射的量化后端,应该是 ["x86"(默认), "fbgemm", "qnnpack", "onednn"之一] ``版本``(整数): 默认 qconfig 映射的版本 """ # TODO: 为后端选择添加断言 return _get_default_qconfig_mapping(False, backend, version)
[文档]def get_default_qat_qconfig_mapping(backend="x86", version=1) -> QConfigMapping: """ 返回量化感知训练的默认 QConfigMapping。 Args: * ``backend`` (str) : 默认 qconfig 映射的量化后端,应该是 ["x86" (默认), "fbgemm", "qnnpack", "onednn"] 之一 * ``version`` (int) : 默认 qconfig 映射的版本 """ 返回 _get_default_qconfig_mapping(True, backend, version)
def _get_symmetric_qnnpack_qconfig_mapping() -> QConfig 映射: "" 返回一个使用 `torch.ao.quantization.default_symmetric_qnnpack_qconfig` 的 QConfigMapping 作为默认的 QConfig。 "文档" 默认_qconfig
= 默认_symmetric_qnnpack_qconfig 返回 _get_default_qconfig_mapping_with_default_qconfig( 错误, qnnpack, 默认_qconfig ) def _get_symmetric_qnnpack_qat_qconfig_mapping() -> QConfig 映射: "" 返回使用 `torch.ao.quantization.default_symmetric_qnnpack_qat_qconfig` 的 QConfigMapping 作为默认的 QConfig "文档" 默认_qconfig = default_symmetric_qnnpack_qat_qconfig 返回 _get_default_qconfig_mapping_with_default_qconfig( , qnnpack, 默认_qconfig ) def _get_default_qconfig_mapping_with_default_qconfig( 是否启用 QAT: 布尔, 后端: 字符串, 默认_qconfig: QConfig, ) -> QConfig 映射: "" 返回一个使用提供的 qconfig 作为默认 QConfig 的 QConfigMapping。 "文档" 如果 是否启用 QAT: qconfig 映射 = 获取默认 QAT Qconfig 映射(后端) 否则: qconfig 映射 = 获取默认 Qconfig 映射(后端) QConfig 映射.设置全局(默认 qconfig) for 模式 QConfig 映射.对象类型配置.(): 如果 模式 _将固定 Q 参数操作转换为观察者: QConfig 映射.设置对象类型(模式, 默认 Q 配置) 返回 qconfig 映射 _QCONFIG 样式顺序: 列表[字符串] = [ 全局_qconfig, 对象类型_qconfig, 模块名称正则_qconfig, "module_name_qconfigs", "module_name_object_type_order_qconfigs", ]
[文档] QConfig 映射: "" 模型操作到 :class:`torch.ao.quantization.QConfig` 的映射。 用户可以使用以下方法指定 QConfigs(按匹配优先级递增): ``set_global`` : 设置全局(默认)QConfig ``set_object_type`` : 设置特定模块类型、函数或方法名的 QConfig ``set_module_name_regex`` : 设置匹配给定正则表达式的模块的 QConfig ``set_module_name`` : 设置匹配给定模块名的模块的 QConfig 设置匹配组合的模块的 QConfig 对象类型顺序 给定模块名称、对象类型以及模块出现的位置索引 演示用法: qconfig_mapping = QConfigMapping() 设置全局(global_qconfig) .set_object_type(torch.nn.Linear, qconfig1) .set_object_type(torch.nn.ReLU, qconfig1) .set_module_name_regex("foo.*bar.*conv[0-9]+", qconfig1) .set_module_name_regex("foo.*", qconfig2) .set_module_name("module1", qconfig1) .set_module_name("module2", qconfig2) .set_module_name_object_type_order("foo.bar", torch.nn.functional.linear, 0, qconfig3) "文档" def __init__() -> : # 按照匹配优先级递增: .全局配置: QConfigAny = .对象类型配置: 有序字典[ 联盟[可调用, 字符串], QConfigAny ] = 有序字典() .模块名称正则表达式配置: 有序字典[字符串, QConfigAny] = 有序字典() .模块名称配置: 有序字典[字符串, QConfigAny] = 有序字典() .module_name_object_type_order_qconfigs: 有序字典[ 元组[字符串, 可调用, 整数], QConfigAny ] = 有序字典()
[文档] def set_global(self, global_qconfig: QConfigAny) -> QConfigMapping: """ 设置全局(默认)QConfig。 """ self.global_qconfig = global_qconfig 返回 self
[文档] def 设置对象类型( self, 对象类型: Union[Callable, str], qconfig: QConfigAny ) -> QConfigMapping: """ 设置给定模块类型、函数或方法名称的 QConfig。 如果已设置现有对象类型的 QConfig,则新 QConfig 将覆盖旧的一个。 """ self.object_type_qconfigs[object_type] = qconfig 返回 self
[文档] def 设置模块名称正则表达式( self, module_name_regex: str, qconfig: QConfigAny ) -> QConfigMapping: """ 设置与给定正则表达式字符串匹配的模块的 QConfig。 正则表达式将按照它们通过此方法注册的顺序进行匹配。 因此,调用者应首先注册更具体的模式,例如:: qconfig_mapping = QConfigMapping() .set_module_name_regex("foo.*bar.*conv[0-9]+", qconfig1) .set_module_name_regex("foo.*bar.*", qconfig2) .set_module_name_regex("foo.*", qconfig3) 在本例中,"foo.bar.conv0" 将匹配 qconfig1,"foo.bar.linear" 将匹配 qconfig2, "and "foo.baz.relu" would match qconfig3." 的简体中文翻译为:并且 "foo.baz.relu" 会匹配 qconfig3。 如果现有模块名称正则表达式的 QConfig 已设置,则新 QConfig 将覆盖它 保留原始正则表达式注册的顺序。 ```python # 输入文本 input_text = '"""' # 翻译函数(此处为示例,实际翻译功能需调用真实的翻译 API) def translate_to_simplified_chinese(text): # 假设的翻译结果 return text # 输出翻译结果 translated_text = translate_to_simplified_chinese(input_text) print(translated_text) ``` self.module_name_regex_qconfigs[module_name_regex] = qconfig return self
[文档] def set_module_name(self, module_name: str, qconfig: QConfigAny) -> QConfigMapping: """ 设置与给定模块名称匹配的模块的 QConfig。 如果已设置现有模块名称的 QConfig,则新的 QConfig 将覆盖旧的 QConfig。 """ self.module_name_qconfigs[module_name] = qconfig 返回自身
[文档] def 设置模块名称对象类型顺序( self, 模块名称: str, 对象类型: Callable, 索引: int, qconfig: QConfigAny ) -> QConfigMapping: """ 设置匹配给定模块名称、对象类型和模块出现位置的索引的模块的 QConfig。 如果已经设置了现有(模块名称、对象类型、索引)的 QConfig,则新的 QConfig 将不会被设置。 如果已经设置了现有(模块名称、对象类型、索引)的 QConfig,则新的 QConfig 将不会被设置。 将覆盖旧的。 """ self.module_name_object_type_order_qconfigs[ (模块名称,对象类型,索引) ] = qconfig return self
def __repr__(
) -> 字符串: 输出 = ..__name__ + " (" for 样式名称 _QCONFIG 样式顺序: 输出 += f"输入文本翻译为简体中文为:\n {样式名称}" q 配置 = getattr(, 样式名称) 如果 isinstance(q 配置, 有序字典) 并且 长度(q 配置) > 0: for , qconfig q 配置.项目(): 输出 += f"输入文本翻译为简体中文为:\n {}: {qconfig}" 否则: 输出 += f"输入文本翻译为简体中文为:\n {qconfigs}" 返回 输出 + "输入文本翻译为简体中文为:\n)" # TODO: 删除此行
[文档] def to_dict(self) -> dict[str, Any]: """ 将此 ``QConfigMapping`` 转换为具有以下键的字典: ""(用于全局 QConfig) 对象类型 模块名称正则表达式 模块名称 模块名称对象类型顺序 这个字典的值是元组的列表。 """ 返回 { _GLOBAL_DICT_KEY: self.global_qconfig, _OBJECT_TYPE_DICT_KEY: 列出(self.object_type_qconfigs.items()), _MODULE_NAME_REGEX_DICT_KEY: 列出(self.module_name_regex_qconfigs.items()), _MODULE_NAME_DICT_KEY: 列出(self.module_name_qconfigs.items()), _MODULE_NAME_OBJECT_TYPE_ORDER_DICT_KEY: [ (k, v) for k, v in self.module_name_object_type_order_qconfigs.items() ] }
# TODO: 删除此行
[文档] @classmethod def from_dict(cls, qconfig_dict: dict[str, Any]) -> QConfigMapping: """ 从具有以下键(所有为可选)的字典创建 ``QConfigMapping``: 全局 QConfig 对象类型 模块名称正则表达式 模块名称 模块名称对象类型顺序 这个字典的值预期为元组列表。 ```python # 输入文本 input_text = '"""' # 翻译函数(此处为示例,实际翻译功能需调用真实的翻译 API) def translate_to_simplified_chinese(text): # 假设的翻译结果 return text # 输出翻译结果 translated_text = translate_to_simplified_chinese(input_text) print(translated_text) ``` conf = cls() 如果 _GLOBAL_DICT_KEY 在 qconfig_dict 中: conf.set_global(qconfig_dict[_GLOBAL_DICT_KEY]) for object_type, qconfig in qconfig_dict.get(_OBJECT_TYPE_DICT_KEY, []): conf.set_object_type(object_type, qconfig) for module_name_regex, qconfig in qconfig_dict.get( _MODULE_NAME_REGEX_DICT_KEY, [] ): conf.set_module_name_regex(module_name_regex, qconfig) for module_name, qconfig in qconfig_dict.get(_MODULE_NAME_DICT_KEY, []): conf.set_module_name(module_name, qconfig) for module_name, object_type, index, qconfig in qconfig_dict.get( _MODULE_NAME_OBJECT_TYPE_ORDER_DICT_KEY, [] ): conf.set_module_name_object_type_order( module_name, object_type, index, qconfig ) 返回 conf

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源