torch_npu使用中遇到的问题以及解决方案

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.1torch_npu 2.1.0就解决了这一问题