PaddlePaddle / Paddle-Lite

PaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎)
https://www.paddlepaddle.org.cn/lite
Apache License 2.0
6.95k stars 1.61k forks source link

离线量化的模型精度在lite上下降 #10141

Open zhoufa84 opened 1 year ago

zhoufa84 commented 1 year ago

为使您的问题得到快速解决,在建立 Issue 前,请您先通过如下方式搜索是否有相似问题: 历史 issue, FAQ 文档, 官方文档

建立 issue 时,为快速解决问题,请您根据使用情况给出如下信息:

zhoufa84 commented 1 year ago

第一次conv+bn+relu 相似度是0.975 第二次conv+bn+relu 相似度是0.9488 第三次conv+bn+relu 相似度是0.8722

zhoufa84 commented 1 year ago

import paddle import paddleslim as slim import numpy as np paddle.enable_static()

USE_GPU = False model = slim.models.MobileNet() train_program = paddle.static.Program() startup = paddle.static.Program() with paddle.static.program_guard(train_program, startup): image = paddle.static.data( name='image', shape=[None, 1, 28, 28], dtype='float32') label = paddle.static.data(name='label', shape=[None, 1], dtype='int64') gt = paddle.reshape(label, [-1, 1]) out = model.net(input=image, class_dim=10) scale=1.0 conv1_out = model.conv_bn_layer(input=image,\ filter_size=3, \ channels=3,\ num_filters=int(32 * scale),\ stride=2,\ padding=1,\ name="conv1")

conv2_out = model.depthwise_separable(
                                conv1_out,
                                num_filters1=32,
                                num_filters2=64,
                                num_groups=32,
                                stride=1,
                                scale=scale,
                                name="conv2_1")

conv2_1_out = model.depthwise_separable(
                                conv2_out,
                                num_filters1=64,
                                num_filters2=128,
                                num_groups=64,
                                stride=2,
                                scale=scale,
                                name="conv2_2")

conv3_1_out = model.depthwise_separable(
                                conv2_1_out,
                                num_filters1=128,
                                num_filters2=128,
                                num_groups=128,
                                stride=1,
                                scale=scale,
                                name="conv3_1")

conv3_2_out = model.depthwise_separable(
                                conv3_1_out,
                                num_filters1=128,
                                num_filters2=256,
                                num_groups=128,
                                stride=2,
                                scale=scale,
                                name="conv3_2")

    # 14x14
conv4_1_out = model.depthwise_separable(
                                conv3_2_out,
                                num_filters1=256,
                                num_filters2=256,
                                num_groups=256,
                                stride=1,
                                scale=scale,
                                name="conv4_1")

conv4_2_out = model.depthwise_separable(
                                conv4_1_out,
                                num_filters1=256,
                                num_filters2=512,
                                num_groups=256,
                                stride=2,
                                scale=scale,
                                name="conv4_2")

cost = paddle.nn.functional.loss.cross_entropy(input=out, label=gt)
avg_cost = paddle.mean(x=cost)
acc_top1 = paddle.metric.accuracy(input=out, label=gt, k=1)
acc_top5 = paddle.metric.accuracy(input=out, label=gt, k=5)
opt = paddle.optimizer.Momentum(0.01, 0.9)
opt.minimize(avg_cost)

place = paddle.CUDAPlace(0) if USE_GPU else paddle.CPUPlace() exe = paddle.static.Executor(place) exe.run(startup) val_program = train_program.clone(for_test=True)

import paddle.vision.transforms as T transform = T.Compose([T.Transpose(), T.Normalize([127.5], [127.5])]) train_dataset = paddle.vision.datasets.MNIST( mode="train", backend="cv2", transform=transform) test_dataset = paddle.vision.datasets.MNIST( mode="test", backend="cv2", transform=transform) train_loader = paddle.io.DataLoader( train_dataset, places=place, feed_list=[image, label], drop_last=True, batch_size=64, return_list=False, shuffle=True) test_loader = paddle.io.DataLoader( test_dataset, places=place, feed_list=[image, label], drop_last=True, batch_size=64, return_list=False, shuffle=False)

outputs = [acc_top1.name, acc_top5.name, avg_cost.name] def train(prog): iter = 0 for data in train_loader(): acc1, acc5, loss = exe.run(prog, feed=data, fetch_list=outputs) if iter % 100 == 0: print('train iter={}, top1={}, top5={}, loss={}'.format(iter, acc1.mean(), acc5.mean(), loss.mean())) iter += 1

def test(prog, outputs=outputs): iter = 0 res = [[], []] for data in test_loader(): acc1, acc5, loss = exe.run(prog, feed=data, fetch_list=outputs) if iter % 100 == 0:

        print('test iter={}, top1={}, top5={}, loss={}'.format(iter, acc1.mean(), acc5.mean(), loss.mean()))
    res[0].append(acc1.mean())
    res[1].append(acc5.mean())
    iter += 1
print('final test result', np.array(res[0]).mean(), np.array(res[1]).mean())

outputs2 = [conv1_out.name] def test_out(prog, outputs=outputs2): iter = 0 for data in test_loader(): conv1_out = exe.run(prog, feed=data, fetch_list=outputs) if iter % 100 == 0: print('test iter={}, conv1_out={}'.format(iter, conv1_out)) iter += 1

train(train_program) test(val_program)

###################################for paddlelite_test######################################## ############################################################################################## paddle.fluid.io.save_inference_model( dirname='./inference_model_lite_out1', feeded_var_names=[image.name], target_vars=[out], main_program=val_program, executor=exe, model_filename='fp32.pdmodel', params_filename='fp32.pdiparams')

slim.quant.quant_post_static(

executor=exe,

model_dir='./inference_model_lite_out1',

quantize_model_path='./quant_post_static_model_lite_out1',

sample_generator=paddle.dataset.mnist.test(),

model_filename='fp32.pdmodel',

params_filename='fp32.pdiparams',

batch_nums=10)

##############################################################################################

###################################for slim_test############################################## ############################################################################################## paddle.fluid.io.save_inference_model( dirname='./inference_model_lite_outn', feeded_var_names=[image.name], target_vars=[out,conv1_out,conv2_out,conv2_1_out,conv3_1_out,conv3_2_out,conv4_1_out,conv4_2_out], main_program=val_program, executor=exe, model_filename='fp32.pdmodel', params_filename='fp32.pdiparams')

slim.quant.quant_post_static(

executor=exe,

model_dir='./inference_model_lite_outn',

quantize_model_path='./quant_post_static_model_lite_outn',

sample_generator=paddle.dataset.mnist.test(),

model_filename='fp32.pdmodel',

params_filename='fp32.pdiparams',

batch_nums=10)

##############################################################################################

zhoufa84 commented 1 year ago

为什么没人去对应?

yingshengBD commented 1 year ago

mobilenet特别是v3 对量化非常敏感 非常不建议使用该模型做量化

zhoufa84 commented 1 year ago

这就是解决问题的方式吗?

zhoufa84 commented 1 year ago

我自己量化了第一个conv_relu_bn,精度与slim比较是0.9998. [然后lite的量化精度是0.97874. 最后发现一个问题,每个feature_map右下角的数据畸变很大。

zhoufa84 commented 1 year ago

期待有人复现问题,去对应。谢谢!

ouyanghaley commented 1 year ago

我自己量化了第一个conv_relu_bn,精度与slim比较是0.9998. [然后lite的量化精度是0.97874. 最后发现一个问题,每个feature_map右下角的数据畸变很大。 请问你这个lite的量化精度怎么算的,贴一下代码看看

zhoufa84 commented 1 year ago

利用余弦相似度 这个是误差

在 2023-04-20 16:58:06,"ouyanghaley" @.***> 写道:

我自己量化了第一个conv_relu_bn,精度与slim比较是0.9998. [然后lite的量化精度是0.97874. 最后发现一个问题,每个feature_map右下角的数据畸变很大。 请问你这个lite的量化精度怎么算的,贴一下代码看看

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

zhoufa84 commented 1 year ago

希望有人直接跟我对接。

在 2023-04-20 17:14:39,"ouyanghaley" @.***> 写道:

我自己量化了第一个conv_relu_bn,精度与slim比较是0.9998. [然后lite的量化精度是0.97874. 最后发现一个问题,每个feature_map右下角的数据畸变很大。 请问你这个lite的量化精度怎么算的,贴一下代码看看

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>