ncnn icon indicating copy to clipboard operation
ncnn copied to clipboard

PNNX failed to convert Pytorch eager mode QAT model with single Conv2d layer

Open Archerwz opened this issue 2 years ago • 1 comments

error log | 日志或报错信息 | ログ

pnnxparam = model.pnnx.param
pnnxbin = model.pnnx.bin
pnnxpy = model_pnnx.py
pnnxonnx = model.pnnx.onnx
ncnnparam = model.ncnn.param
ncnnbin = model.ncnn.bin
ncnnpy = model_ncnn.py
fp16 = 1
optlevel = 2
device = cpu
inputshape = [1,8,60,80]f32
inputshape2 =
customop =
moduleop =
############# pass_level0
inline module = torch.ao.nn.quantized.modules.DeQuantize
inline module = torch.ao.nn.quantized.modules.Quantize
inline module = torch.ao.nn.quantized.modules.conv.Conv2d
inline module = torch.ao.nn.quantized.modules.DeQuantize
inline module = torch.ao.nn.quantized.modules.Quantize
inline module = torch.ao.nn.quantized.modules.conv.Conv2d

----------------

############# pass_level1
Segmentation fault (core dumped)

context | 编译/运行环境 | バックグラウンド

linux pytorch 2.0.0 libtorch 2.0.0+cpu

how to reproduce | 复现步骤 | 再現方法

python code for converting torchscript

import copy

import torch
import torch.nn as nn


class Model(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(Model, self).__init__()
        self.quant = torch.ao.quantization.QuantStub()
        self.dequant = torch.ao.quantization.DeQuantStub()
        self.layer1 = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=3, padding=1)

    def forward(self, x):
        x = self.quant(x)
        x = self.layer1(x)
        x = self.dequant(x)
        return x

    # def fuse_model(self):
    #     pass


if __name__ == '__main__':
    model = Model(8, 32)
    # model.fuse_model()
    model.qconfig = torch.ao.quantization.get_default_qat_qconfig('x86')

    torch.ao.quantization.prepare_qat(model, inplace=True)

    model.apply(torch.ao.quantization.enable_observer)
    model.apply(torch.ao.quantization.enable_fake_quant)
    model.train()
    out = model(torch.rand((1, 8, 60, 80)))

    with torch.inference_mode():
        quantized_model = copy.deepcopy(model)
        quantized_model.eval()
        torch.ao.quantization.convert(quantized_model, inplace=True)
    print(quantized_model)

    torch.jit.trace(quantized_model, torch.rand((1, 8, 60, 80))).save("model.pt")

I'm using the following command for pnnx convertion

pnnx model.pt inputshape=[1,8,60,80]

more | 其他 | その他

I'm also curious about whether pnnx support module fusion that pytorch recommanded when doing model quantization.

Archerwz avatar Jan 03 '24 06:01 Archerwz

ncnn支持QAT模型的转换吗

wuyanzhang avatar Apr 14 '25 10:04 wuyanzhang