1 系统环境

硬件环境(Ascend/GPU/CPU): Ascend&GPU

MindSpore版本: 1.9.0

执行模式(PyNative/ Graph): 不限

Python版本: 3.7.5

操作系统平台:Linux

2 报错信息

2.1  问题描述

NPU上的切片操作x=x[:,::-1,:,:]不生效,在GPU上生效

2.2  报错信息

GPU运行结果:

import os
import cv2
import sys
import numpy as np
import mindspore
from mindspore import context
from mindspore import nn
if __name__ == '__main__':
    # device_id = int(os.getenv('DEVICE_ID'), 0)
    # context.set_context(mode=context.PYNATIVE_MODE, device_target="Ascend",
                        device_id=device_id, save_graphs=False)
    context.set_context(mode=context.GRAPH_MODE, device_target="GPU", save_graphs=False)
    # create backbone
    x=cv2.imread('0100000000.jpg').transpose(2,0,1).astype(np.float32)
    x=mindspore.Tensor(x)[None,:,:,:]
    x=x[:,::-1,:,:]
    print(x)

Tensor(shape=[1,3,1080,1920],dtype=Float32, value= 
[[[[ 4.000000000+01, 4.100000000+81, 4.180000000+01...1.000080880+88, 1.080808880+80, 1.000000000+00],
   [ 4.100000000+01, 4.100000000+01, 4.100000000+01...1.000000000+80, 1.000008000+00, 1.000000000+00],
   [ 4.900000000+01, 4.980000000+01, 4.900000000+01...1.000000000+00, 1.000008080+00, 1.000000000+00],
   ...
   [ 5.500000000+01, 5.400000080+01, 5.480808080+01...1.000000000+01, 1.000000080+01, 1.000000000+01],
   [ 5.000000000+01, 5.000000000+01, 5.000008000+01...9.000000000+00, 9.000800000+00, 9.000000000+00],
   [ 5.000000000+01, 5.000000000+01, 4.900000000+01...8.000000000+00, 8.080808080+88, 8.000000000+00]],
  [[ 4.400000000+01, 4.400000000+01, 4.400000000+01...1.000000000+01, 1.000008000+01, 1.000000ø00+01],
   [ 4.400000000+01, 4.400000000+01, 4.400000000+01...1.000000000+01, 1.000000000+01, 1.000000000+01],
   [ 4.400000000+01, 4.400000000+01, 4.400000000+01...1.000000000+01, 1.000000080+01, 1.000000000+01],
   ...
   [ 4.500000000+01, 4.400000000+01, 4.400000080+01...1.000000000+01, 1.000000000+01, 1.000800080+01],
   [ 4.100000000+01, 4.100008000+01, 4.100008000+01...9.080080880+80, 9.080808080+88, 9.000000000+00],
   [ 4.100000000+01, 4.100000000+01, 4.000000000+01...8.000000000+00, 8.000000000+00, 8.000000000+00]],
  [[ 4.000000000+01, 4.000000000+01, 4.000000000+01...1.400000000+01, 1.400000000+01, 1.400008000+01],
   [ 4.000000000+01, 4.080000000+01, 4.000000000+01...1.400000000+01, 1.480000000+01, 1.400000000+01],
   [ 4.000000000+01, 4.000000000+01, 4.000000000+01...1.400000000+01, 1.400000000+01, 1.400000000+01],
   ...
   [ 9.500000000+01, 9.400000000+01, 9.480808080+01...7.088000000+01, 7.080808080+01, 7.000000080+01],
   [ 9.100000000+01, 9.100000000+01, 9.100000000+01...7.000000000+00, 7.000000000+00, 7.000000000+00],
   [ 9.100000000+01, 9.100000000+01, 9.000008080+01...7.000000000+00, 7.000000000+00, 7.000000000+00]]]])复制

ASCEND 910上运行结果:

2.3  脚本代码(代码格式,可上传附件)

import os
import cv2
import sys
import numpy as np
import mindspore
from mindspore import context
from mindspore import nn
if __name__ == '__main__':
    device_id = int(os.getenv('DEVICE_ID'), 0)
    context.set_context(mode=context.PYNATIVE_MODE, device_target="Ascend",
                        device_id=device_id, save_graphs=False)
    # context.set_context(mode=context.GRAPH_MODE, device_target="GPU", save_graphs=False)
    #create backbone
    x=cv2.imread('0100000000.jpg').transpose(2,0,1).astype(np.float32)
    x=mindspore.Tensor(x)[None,:,:,:]
    x=x[:,::-1,:,:]
    print(x)

Tensor(shape=[1,3,1080,1920],dtype=Float32, value= 
[[[[ 9.100000000+01, 9.100000000+81, 9.180000000+01...7.000080880+88, 7.080808880+80, 7.000000000+00],
   [ 9.100000000+01, 9.100000000+01, 9.100000000+01...7.000000000+80, 7.000008000+00, 7.000000000+00],
   [ 8.900000000+01, 8.980000000+01, 8.900000000+01...7.000000000+00, 7.000008080+00, 7.000000000+00],
   ...
   [ 5.500000000+01, 5.400000080+01, 5.480808080+01...1.000000000+01, 1.000000080+01, 1.000000000+01],
   [ 5.000000000+01, 5.000000000+01, 5.000008000+01...9.000000000+00, 9.000800000+00, 9.000000000+00],
   [ 5.000000000+01, 5.000000000+01, 4.900000000+01...8.000000000+00, 8.080808080+88, 8.000000000+00]],
  [[ 4.400000000+01, 4.400000000+01, 4.400000000+01...1.000000000+01, 1.000008000+01, 1.000000ø00+01],
   [ 4.400000000+01, 4.400000000+01, 4.400000000+01...1.000000000+01, 1.000000000+01, 1.000000000+01],
   [ 4.400000000+01, 4.400000000+01, 4.400000000+01...1.000000000+01, 1.000000080+01, 1.000000000+01],
   ...
   [ 4.500000000+01, 4.400000000+01, 4.400000080+01...1.000000000+01, 1.000000000+01, 1.000800080+01],
   [ 4.100000000+01, 4.100008000+01, 4.100008000+01...9.080080880+80, 9.080808080+88, 9.000000000+00],
   [ 4.100000000+01, 4.100000000+01, 4.000000000+01...8.000000000+00, 8.000000000+00, 8.000000000+00]],
  [[ 4.000000000+01, 4.000000000+01, 4.000000000+01...1.400000000+01, 1.400000000+01, 1.400008000+01],
   [ 4.000000000+01, 4.080000000+01, 4.000000000+01...1.400000000+01, 1.480000000+01, 1.400000000+01],
   [ 4.000000000+01, 4.000000000+01, 4.000000000+01...1.400000000+01, 1.400000000+01, 1.400000000+01],
   ...
   [ 3.500000000+01, 3.400000000+01, 3.480808080+01...1.088000000+01, 1.080808080+01, 1.000000080+01],
   [ 3.100000000+01, 3.100000000+01, 3.100000000+01...9.000000000+00, 9.000000000+00, 9.000000000+00],
   [ 3.100000000+01, 3.100000000+01, 3.000008080+01...8.000000000+00, 8.000000000+00, 8.000000000+00]]]])复制

3 根因分析

在进行切片操时,是会转换成算子ScatterNdUpdate进行计算,这个算子在ascend 上没有所能支持的规格。

4 解决方案

    x=cv2.imread('0100000000.jpg').transpose(2,0,1).astype(np.float32)复制

可以将要切片的数据在这一步转换成fp16或者fp32的类型。

  • 附件下载

  • 复现及解决问题脚本.rar

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐