【PyTorch】torch.quantization.quantize_dynamic() 函数:动态量化(Dynamic Quantization)

该文章已生成可运行项目,

torch.quantization.quantize_dynamic 函数

torch.quantization.quantize_dynamicPyTorch 提供的动态量化(Dynamic Quantization)函数,用于 减少模型大小加速推理,特别适用于 CPU 设备


1. 作用

  • 仅对 权重(Weights) 进行量化,而 激活(Activations)仍然保持 FP32
  • 适用于 Transformer、LSTM、GRU、全连接网络(Linear layers)
  • 量化后,模型计算更快,占用更少的存储空间。

2. 语法

torch.quantization.quantize_dynamic(
    model,  # 需要量化的模型
    qconfig_spec=None,  # 需要量化的层(默认所有支持的层)
    dtype=torch.qint8,  # 量化数据类型(默认 INT8)
    inplace=False  # 是否在原模型上修改
)
参数说明
model需要量化的模型
qconfig_spec需要量化的层(如 nn.Linear, nn.LSTM),默认所有支持的层
dtype目标数据类型(默认 torch.qint8
inplace是否在原模型上修改(默认 False,返回新模型)

3. 示例:对 nn.Linear 层进行动态量化

import torch
import torch.nn as nn
import torch.quantization

# 定义一个简单的全连接网络
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(128, 64)
        self.fc2 = nn.Linear(64, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 创建模型
model = SimpleModel()

# 对全连接层进行动态量化
quantized_model = torch.quantization.quantize_dynamic(
    model, {nn.Linear}, dtype=torch.qint8
)

print(quantized_model)

输出

SimpleModel(
  (fc1): DynamicQuantizedLinear(in_features=128, out_features=64, dtype=torch.qint8)
  (fc2): DynamicQuantizedLinear(in_features=64, out_features=10, dtype=torch.qint8)
)

解析

  • fc1fc2 被量化为 DynamicQuantizedLinear,使用 INT8 存储权重。
  • 计算时,输入仍然是 FP32,但权重使用 INT8 计算,提升推理速度

4. 示例:对 LSTM 进行动态量化

class LSTMModel(nn.Module):
    def __init__(self):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size=128, hidden_size=64, num_layers=1, batch_first=True)
        self.fc = nn.Linear(64, 10)

    def forward(self, x):
        x, _ = self.lstm(x)
        x = self.fc(x[:, -1, :])
        return x

# 创建 LSTM 模型
model = LSTMModel()

# 进行动态量化
quantized_model = torch.quantization.quantize_dynamic(
    model, {nn.LSTM, nn.Linear}, dtype=torch.qint8
)

print(quantized_model)

解析

  • nn.LSTMnn.Linear 被量化,提高计算效率。
  • 适用于 NLP 任务,如 Transformer、LSTM、BERT 推理优化

5. 动态量化的优缺点

优点缺点
减少存储(权重从 FP32 → INT8,压缩 4 倍)计算仍然部分使用 FP32
提高 CPU 推理速度仅适用于 nn.Linear, nn.LSTM, nn.GRU
无需标定数据精度略低于静态量化

6. 适用场景

  • Transformer/BERT、LSTM、GRU(自然语言处理)
  • 全连接网络(Linear)
  • 服务器端 CPU 推理(Intel AVX2, AVX-512)

7. 结论

  • torch.quantization.quantize_dynamic 用于减少模型大小并加速推理,特别适用于 CPU 部署
  • 适用于 Transformer、LSTM、GRU、全连接层
  • 无需标定数据,易于使用,是 低成本优化推理性能的最佳方案
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值