×

签到

分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

模型量化后结果出错 已完结 barce2022-09-15 15:05:31 回复 3 查看 技术答疑 使用求助
模型量化后结果出错
分享到:

import torch
import torch_mlu.core.mlu_quantize as mlu_quantize
import torch_mlu
import torch_mlu.core.mlu_model as ct

from nets.facenet import Facenet
from utils.dataloader import LFWDataset
from utils.utils_metrics import test
from utils.utils import preprocess_input
from PIL import Image
import numpy as np

torch.set_grad_enabled(False)

model_path = "model_data/facenet_mobilenet.pth"
backbone = "mobilenet"
model_new_path = "model_data/facenet_mobilenet.pth"
model_int8_path = "model_data/facenet_mobilenet_int8.pth"


def cambricom_save():
    print("###################1################################")
    model = Facenet(mode="predict")
    model.load_state_dict(torch.load(
        model_path, map_location=torch.device('cpu')), strict=False)
    model.eval()
    #torch.save(model, model_new_path, _use_new_zipfile_serialization=False)
    image1 = Image.open("xx.jpg")
    input_data1=torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image1, np.float32)), (2, 0, 1)), 0))
    #input_data = torch.randn((1, 3, 160, 160))
    # step 3
    #net_mlu = net.to(ct.mlu_device())
    #input_mlu1 = input_data1.to(ct.mlu_device())
    # step 4
    output1 = model(input_data1).cpu().numpy()
    
    image2 = Image.open("LYK.jpg")
    input_data2=torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image2, np.float32)), (2, 0, 1)), 0))
    #input_mlu2 = input_data2.to(ct.mlu_device())
    # step 4
    output2 = model(input_data2).cpu().numpy()
    
    print(output1)
    print(output2)
    l1 = np.linalg.norm(output1 - output2, axis=1)
    print(l1)


def fp_to_int():
    model = Facenet(mode="predict")
    model.load_state_dict(torch.load(
        model_new_path, map_location=torch.device('cpu')), strict=False)
    #model.eval()
    mean = []
    std = []
    # 注意此接口,这里不使用firstconv优化,它的作用是将归一化放到第一层去一起加速做,但是有些模型的前处理是不需要这样做的,具体信息,请参考寒武纪官方文档。
    net_quantization = mlu_quantize.quantize_dynamic_mlu(
        model, {'mean': mean, 'std': std, 'firstconv': False}, dtype='int8', gen_quant=True)
    torch.save(net_quantization.state_dict(), model_int8_path)


def test_int():
    print("###################2################################")
    model = Facenet(mode="predict")
    net = mlu_quantize.quantize_dynamic_mlu(model)

    # step 2
    net.load_state_dict(torch.load(model_int8_path))
    #net.eval()
    # 这里是
    image1 = Image.open("xx.jpg")
    input_data1=torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image1, np.float32)), (2, 0, 1)), 0))
    #input_data = torch.randn((1, 3, 160, 160))
    # step 3
    net_mlu = net.to(ct.mlu_device())
    input_mlu1 = input_data1.to(ct.mlu_device())
    # step 4
    output1 = net_mlu(input_mlu1).cpu().numpy()
    
    image2 = Image.open("LYK.jpg")
    input_data2=torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image2, np.float32)), (2, 0, 1)), 0))
    input_mlu2 = input_data2.to(ct.mlu_device())
    # step 4
    output2 = net_mlu(input_mlu2).cpu().numpy()
    
    print(output1)
    print(output2)
    l1 = np.linalg.norm(output1 - output2, axis=1)
    print(l1)


def MLU_offline():
    print("###############################################");
    model = Facenet(mode="predict")
    net = mlu_quantize.quantize_dynamic_mlu(model)

    # step 2
    net.load_state_dict(torch.load(model_int8_path))
    # net.eval()
    # 这里是
    input_data = torch.randn((1, 3, 160, 160), dtype=torch.float)
    # step 3
    net_mlu = net.eval().float().to(ct.mlu_device())
    #input_data = input_data.type(torch.HalfTensor)
    input_data = input_data.half()
    input_mlu = input_data.to(ct.mlu_device())

    # 详细查看文档,一般4
    core_number = 1
    ct.set_core_number(core_number)
    ct.set_core_version('MLU220')
    # torch_mlu.core.mlu_model.set_input_format(input_format)
    ct.save_as_cambricon('half_facenet_mobilenet')

    net_trace = torch.jit.trace(net_mlu, input_mlu, check_trace=False)

    net_trace(input_mlu)

    torch_mlu.core.mlu_model.save_as_cambricon("")


cambricom_save()

fp_to_int()
test_int()
#MLU_offline()


模型量化后,输出不对。量化过程中有个warning   :捕获.JPG


量化前后结果对比:


版权所有 © 2022 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭