1 系统环境
硬件环境(Ascend/GPU/CPU): Ascend910
MindSpore版本: mindspore=2.3.0
执行模式(PyNative/ Graph):不限
Python版本: Python=3.8
操作系统平台: linux
2 报错信息
2.1 问题描述
执行如下脚本时报错
2.2 脚本信息
x = ops.randn((1,216,64,64), dtype=ms.float32)
out = ops.avg_pool2d(x, 2, stride=2, ceil_mode=True)
print(out.shape)
2.3 报错信息
[ERROR] KERNEL (110510, ffff9e802ebe, python) :2024-@9-19-10:20:53.977.250 [mindspore/ccsrc/plugin/device/ascend/kernel/acl/acl_kernel_mod.cc:261] Launch] Kernel launch failed, msg: Acl compile and execute failed, op_type_:AvgPoo0l13D复制
3 根因分析
报错详细信息如下
[ERROR] KERNEL(100,fffe38f9f120,python):2024-10-28-14:49:50.966.185 [mindspore/ccsrc/plugin/device/ascend/kernel/acl/acl_kernel_mod.cc:260] Launch] Kernel launch failed, msg: Acl compile and execute failed, op_type_:AvgPool3D
上面的报错是调用cann的AvgPool3D报错。这该是和cann对接的问题,是mindspore实现的问题。
avg_pool2d的实现如下,最终调用了AvgPool3D算子。而avg_pool3d在Ascend下同样存在问题。在CPU下是正常的。
if not isinstance(input_x, (Tensor, Tensor_)):
raise TypeError("For avg_pool2d, the input input_x must be tensor")
kernel_size = _check_avgpool_2d_kernel_size(kernel_size)
stride = _check_avgpool_2d_stride(stride)
padding = _check_avgpool_2d_padding(padding)
_check_avg_pool2d_type_and_value(ceil_mode, count_include_pad, divisor_override)
squeeze_op = _get_cache_prim(P.Squeeze)(2)
avg_pool_op = _get_cache_prim(P.AvgPool3D)(kernel_size=kernel_size,
strides=stride,
pad_mode='pad',
pad=padding,
ceil_mode=ceil_mode,
count_include_pad=count_include_pad,
divisor_override=divisor_override)
input_x = expand_dims_(input_x, 2)
input_x = avg_pool_op(input_x)
input_x = squeeze_op(input_x)
return input_x
4 解决方案
除了ops的avg_pool2d,nn层也同样有mindspore.nn.AvgPool2d的实现。
注意ceil_mode=True也不能设置。因为底层对应cann只支持输入为NCHW格式。
import mindspore as ms
from mindspore import ops
import numpy as np
pool = ms.nn.AvgPool2d(kernel_size=2, stride=2)
x = ops.randn((1,216,64,64), dtype=ms.float32)
output = pool(x)
print(output.shape)