RuntimeError: InnerRun:build/CMakeFiles/torch_npu.dir/compiler_depend.ts:218 OPS function error: ResizeD, error code is 500002
问题根源
错误发生在使用F.interpolate(mode=“bicubic”)进行图像缩放时,当前使用的NPU硬件(如华为昇腾)或其软件栈(如CANN、PyTorch-NPU)不支持bicubic插值所需的算子ResizeD。
解决方案
修改插值模式(推荐)
直接更换为NPU支持的插值模式(如bilinear或nearest),这是最快速的修复方式。
假设修改前代码:
mask_downsample = F.interpolate(mask.unsqueeze(0), size=(mask_h, mask_w), mode="bicubic").squeeze(0)
修改后:
mask_downsample = F.interpolate(mask.unsqueeze(0), size=(mask_h, mask_w), mode="bilinear").squeeze(0)
或者:
mask_downsample = F.interpolate(mask.unsqueeze(0), size=(mask_h, mask_w), mode="nearest").squeeze(0)
注意:bilinear插值速度较快且广泛支持,但平滑度略低于bicubic。修改后需验证生成结果是否满足质量要求。
强制在CPU执行插值(备用方案)
如果必须使用bicubic插值,可将张量临时转移到CPU处理,再传回NPU。
修改代码为:
mask = mask.cpu() # 将数据移动到CPU
mask_downsample = F.interpolate(mask.unsqueeze(0), size=(mask_h, mask_w), mode="bicubic").squeeze(0)
mask_downsample = mask_downsample.to("npu") # 移回NPU(根据实际设备名调整,如"cuda"或"ascend")
优点: 保留bicubic插值精度。
缺点: CPU与NPU之间的数据传输会增加延迟,影响性能。
自定义插值实现(高级)
若必须使用bicubic且环境不可升级,可尝试用其他库(如OpenCV)实现插值,再转回Tensor。
import cv2
import torch
# 将Tensor转为NumPy并处理
mask_np = mask.squeeze().cpu().numpy()
mask_resized = cv2.resize(mask_np, (mask_w, mask_h), interpolation=cv2.INTER_CUBIC)
mask_downsample = torch.from_numpy(mask_resized).unsqueeze(0).to("npu")
注意:需处理张量维度(如添加/移除batch或channel维度)。可能引入额外的数据转换开销。
验证方案
- 插值质量测试:使用bilinear后,检查生成的视频是否存在明显锯齿或模糊。对比CPU和NPU的插值结果差异。
- 性能测试:若使用CPU插值,统计单次推理时间是否在可接受范围内。
ImportError: libxxx: cannot open shared object file: No such file or directory
cd /usr/local/Ascend/ascend-toolkit
source set_env.sh
find / --name libpython3.10.so.1.0
/usr/local/Python3.10.0/lib/libpython3.10.so.1.0
export LD_LIBARAY_PATH=/usr/local/Python3.10.0/lib:$LD_LIBRARY_PATH
[Error]: The internal ACL of the system is incorrect.
问题根源
有可能是torch_npu版本问题,笔者出现这个问题安装的是torch_npu 2.4.0
换用torch_npu 2.3.1
或torch_npu 2.1.0
就解决了这一问题