You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:24:03