# 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