【现象描述】
ascend 后端报错算子不支持,“Can not find any available kernel info for xxx”或者 “Can not select a valid kernel info for xxx in AI CORE or AI CPU kernel info candidates list”
【原因分析】
算子使用时,出现上述报错的有很多,一般有以下几种原因:
1、该算子在ascend平台上真的不支持
2、由于版本配套关系,算子的信息发生变化,没有及时做相应的修改(个人可以尝试修改,但是一般会在mindspore下个版本中完修复)
【解决方法】
1、对于第一种原因,由于平台限制,算子不支持在ascend平台上使用,只能更换算子。算子在各个平台上的支持情况,可以参考:https://www.mindspore.cn/docs/note/zh-CN/master/operator_list.html 。每个算子都会有在各硬件平台上的支持情况。比如 :
2、针对第二种原因,举例说明。
import numpy as np
from mindspore import context
from mindspore.common.tensor import Tensor
from mindspore.nn import Cell
from mindspore.ops import operations as P
from mindspore.train.model import Model
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
class Net(Cell):
def __init__(self):
super(Net, self).__init__()
self.batchmatmul = P.BatchMatMul()
def construct(self, inputa, inputb):
x = self.batchmatmul(inputa, inputb)
return x
def tf_me_batchmatmul(inputa, inputb):
net = Net()
net.set_train()
model = Model(net)
model.predict(Tensor(inputa), Tensor(inputb))
def test_batchmatmul_normal_shape1():
inputa = np.random.randn(128, 16, 128).astype(np.float32)
inputb = np.random.randn(128, 128, 64).astype(np.float32)
tf_me_batchmatmul(Tensor(inputa), Tensor(inputb))
执行上述用例,发现算子在编译阶段报错:
其实我们是知道该算子在ascend平台上是支持的。然后我们再细看报错,会发现有如下信息:
也就是说,我们其实是找到了相关算子,但是在调用算子的相关函数时失败了,说没有check_supported这个函数。此时我们去算子的信息库看一下batchmatmul到底有没有提供这个方法。在run包安装路径下find查找如下文件“aic-ascend910-ops-info.json”,在该文件中找到batchmatmul算子的描述,这时候发现该算子已经没有“needCheckSupport"这个标记了:
也就是说算子已经不再提供check_supported方法。再回头找到mindspore对该算子的注册描述文件mindspore/python/mindspore/ops/_op_impl/tbe/batch_matmul.py,查看发现:
啥意思呢,翻译过来就是算子没有提供check_supported方法,但是你mindspore偏要去调用这个方法,那不是自寻烦恼?我们将这一行代码删除,再次执行,算子可以正常编译,用例执行pass。