如何避免原始PyTorch模型被意外转换为IPEX格式
IPEX优化时原始模型被同步修改的问题解决
问题根因
Python的赋值语句默认是对象引用,而非创建新副本。你代码中的model、model_original、model_ipex三个变量指向内存中同一个ResNet50实例,调用model_ipex.to(ipex.DEVICE)时会直接修改这个唯一实例的权重设备类型,导致原始模型的权重也变成了XPUFloatType,和CPU输入的torch.FloatTensor类型不匹配触发报错。
解决方法
创建两个完全独立的模型实例,保证原始模型和IPEX适配模型互不干扰,有两种实现方案:
方案1:直接初始化两次模型
无需额外依赖,代码最直观:
import intel_pytorch_extension as ipex import torchvision import torch import torch.utils.data as Data # 初始化原始模型,留在CPU设备 model_original = torchvision.models.resnet50(pretrained=True) model_original.eval() # 单独初始化IPEX适配模型,转移到对应设备 model_ipex = torchvision.models.resnet50(pretrained=True) model_ipex.eval() model_ipex.to(ipex.DEVICE) 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 ) # IPEX模型推理,输入同步转移到XPU设备 for data, target in loader: print(target) data = data.to(ipex.DEVICE) output = model_ipex(data) # 原始模型推理,输入留在CPU即可 for data, target in loader: print(target) output = model_original(data)
方案2:深拷贝原始模型
如果不想重复加载预训练权重,可以用copy模块的深拷贝创建独立副本:
import copy # 新增导入 model = torchvision.models.resnet50(pretrained=True) model.eval() # 深拷贝得到完全独立的原始模型 model_original = copy.deepcopy(model) # 深拷贝得到IPEX适配用的模型 model_ipex = copy.deepcopy(model) model_ipex.to(ipex.DEVICE)
内容的提问来源于stack exchange,提问作者ArunJose
相关产品推荐
相关产品推荐

