0

我一直在尝试 pytorch( ipex ) 的英特尔扩展来优化我的推理。我正在使用来自 torchvision 的预训练模型。我想比较使用和不使用 ipex 的改进,所以我创建了一个模型副本,将其转换为 ipex。

现在我尝试对我的原始模型和转换为 ipex 的模型进行推理。

对于转换为 ipex 的模型,我没有问题,但对于我的原始模型,我收到以下错误。

RuntimeError: Input type (torch.FloatTensor) and weight type (XPUFloatType) should be the same

这个错误看起来是由于我的实际模型也转换为 ipex 我如何防止实际模型即 model_original 不转换为 ipex

下面是一个最小的复制器。

import intel_pytorch_extension as ipex
import torchvision
import torch
import torch.utils.data as Data
model = torchvision.models.resnet50(pretrained=True)
model.eval()
model_original=model                             #original pytorch model which does not use ipex
model_ipex=model        
model_ipex.to(ipex.DEVICE)                         # a copy of a model converted to use IPEX
transform = torchvision.transforms.Compose([
        torchvision.transforms.Resize((500, 400)),
        torchvision.transforms.ToTensor(),
        torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
dataset = torchvision.datasets.ImageFolder(
            root='dataset',
            transform=transform,
    )
loader = Data.DataLoader(
            dataset=dataset,
            batch_size=1
    )

for data, target in loader:              #inference with ipex this works fine
    print(target)
    output=model_ipex(data)
    
for data, target in loader:             #inference with original model this fails
    print(target)
    output=model_original(data)
4

1 回答 1

0

当您尝试将 pytorch 模型分配给代码中的新变量时,model_ipex=model复制是使用浅拷贝完成的,因此您的模型和 model_ipex 指向相同的内存。这意味着您在模型副本中所做的任何更改,model_original 也会更改。这意味着您卸载模型以使用 ipex 与model_ipex.to(ipex.DEVICE)您的原始模型也被卸载,并且您的模型的权重变为XPUFloatType您尝试将torch.FloatTensor导致问题的输入传递给的数据类型。

如果您需要分离模型的副本,您应该考虑使用 deep copy

import copy
model_copy = copy.deepcopy(model)

https://www.geeksforgeeks.org/copy-python-deep-copy-shallow-copy/

于 2021-09-24T04:29:27.470 回答