算子编译
Q: 在使用ops.concat
算子时,因为数据规模有点大,导致报错Error:Input and (output + workspace) num should <=192!
,可以怎么处理?
A: 这种报错,主要为ops.concat
算子提示shape
过大。建议对dataset
对象创建迭代器时可设置输出为numpy
, 如下设置:
gallaryloader.create_dict_iterator(output_numpy=True)
另外在上述后处理环节(非网络计算过程中,即非construct
函数里面),可以采用numpy
直接计算,如采用numpy.concatenate
代替上述ops.concat
进行计算。
Q: 请问在静态图模式的construct
函数里,如何把一个tensor
中所含有的负数值全部去除掉?
A: 建议使用ops.clip_by_value
接口,把负数全变成0来进行计算。
Q: TransData
算子的功能是什么,能否优化性能?
A: TransData
算子出现的场景是: 如果网络中相互连接的算子使用的数据格式不一致(如NC1HWC0),框架就会自动插入transdata
算子使其转换成一致的数据格式,然后再进行计算。华为Ascend支持5D格式运算,通过transdata
算子将数据由4D转为5D以提升性能。
Q: 算子Concat
拼接包含多个Tensor的元组出错,似乎传入的tensor list
元素个数>=192就会报错。如果要Concat
包含多个Tensor的元组,有什么较好的解决方案?
A: 这个昇腾算子底层规格限制一次拼接的Tensor个数不能超过192个,可以尝试分开两次进行拼接。
Q: 在使用Conv2D
进行卷积定义的时候使用到了group
的参数,group
的值不是只需要保证可以被输入输出的维度整除即可了吗?group
参数的传递方式是怎样的呢?
A: Conv2D
算子是有这个约束条件的: 当group
大于1 时,其值必须要与输入输出的通道数相等。不要使用ops.Conv2D
,这个算子目前不支持group
>1。目前MindSpore只有nn.Conv2D
接口支持组卷积,但是有group
要与输入输出的通道数相等的约束。
Q: MindSpore支持矩阵转置吗?
A: 支持,请参考mindspore.ops.Transpose
的算子教程。
Q: 请问MindSpore能算给定任意一个tensor
的方差吗?
A: 可以使用mindspore.Tensor.var接口计算Tensor的方差,你可以参考mindspore.Tensor.var(axis=None, ddof=0, keepdims=False)来实现。
Q: nn.Embedding
层与PyTorch相比缺少了Padding
操作,有其余的算子可以实现吗?
A: 在PyTorch中padding_idx
的作用是将embedding矩阵中padding_idx
位置的词向量置为0,并且反向传播时不会更新padding_idx
位置的词向量。在MindSpore中,可以手动将embedding的padding_idx
位置对应的权重初始化为0,并且在训练时通过mask
的操作,过滤掉padding_idx
位置对应的Loss
。
Q: Operations中Tile
算子执行到__infer__
时value
值为None
,丢失了数值是怎么回事?
A: Tile
算子的multiples input
必须是一个常量(该值不能直接或间接来自于图的输入)。否则构图的时候会拿到一个None
的数据,因为图的输入是在图执行的时候才传下去的,构图的时候拿不到图的输入数据。
相关的资料可以看静态图语法支持。
Q: 使用conv2d算子将卷积核设置为(3,10),Tensor设置为[2,2,10,10],在ModelArts上利用Ascend跑,报错: FM_W+pad_left+pad_right-KW>=strideW
,CPU下不报错。
A: TBE(Tensor Boost Engine)算子是华为自研的Ascend算子开发工具,在TVM框架基础上扩展,进行自定义算子开发。上述问题是这个TBE算子的限制,x的width必须大于kernel的width。CPU的这个算子没有这个限制,所以不报错。
Q: 请问MindSpore实现了反池化操作了吗?类似于nn.MaxUnpool2d
这个反池化操作?
A: 目前 MindSpore 还没有反池化相关的接口。用户可以通过自定义算子的方式自行开发算子,详情请见自定义算子。
Q: Ascend环境,训练模型的时候,遇到了无法在当前环境上进行其他操作怎么办?
A: 遇到这种情况,可能是由于算子并行编译的时候把资源占满了。这时候可以尝试配置环境变量MS_BUILD_PROCESS_NUM
,减小算子编译并行数,减小对当前环境的资源抢占。具体配置信息请参考环境变量。
Q: Ascend环境上,一些尽管经过调优工具调试过的算子,性能依旧很差,这时候该怎么办?
A: 遇到这种情况,
看一下这些算子是否为融合算子,如果是融合算子,可以尝试使用环境变量
export MS_DEV_DISABLE_PREBUILD=True
来关闭算子预编译。因为算子预编译可能会改变算子的fusion_type属性,而该属性会影响算子的融合,导致原本不应该融合的小算子融合成了大算子,这些融合出来的大算子性能不一定比小算子性能好。其次,如果排除了上述融合算子的影响,可以尝试使用环境变量
MS_COMPILER_OP_LEVEL
来生成算子编译的debug调试信息,然后找算子开发人员根据这些调试信息进一步定位,具体配置信息可以参考环境变量。
Q: 使用ExpandDims算子报错: Pynative run op ExpandDims failed
。具体代码:
set_context(mode=GRAPH_MODE,device_target='Ascend')
input_tensor=Tensor(np.array([[2,2],[2,2]]),mindspore.float32)
expand_dims=ops.ExpandDims()
output=expand_dims(input_tensor,0)
A: 这边的问题是选择了Graph模式却使用了PyNative的写法,所以导致报错,MindSpore支持两种运行模式,在调试或者运行方面做了不同的优化:
PyNative模式: 也称动态图模式,将神经网络中的各个算子逐一下发执行,方便用户编写和调试神经网络模型。
Graph模式: 也称静态图模式或者图模式,将神经网络模型编译成一整张图,然后下发执行。该模式利用图优化等技术提高运行性能,同时有助于规模部署和跨平台运行。
Q: Ascend后端报错:AI CORE
和AI CPU
中都找不到有效的kernel info
这个Kernel Select Failed时,如何定位?
A: Ascend后端,算子有AI CORE算子和AI CPU算子之分,部分算子AI CORE支持,部分算子AI CPU支持,部分算子两者同时支持。根据报错信息:
如果
AI CORE
候选算子信息为空,则可能是在算子check support
阶段,所有的算子信息均校验未通过。可以在日志中搜索关键字CheckSupport
找到未通过的原因,根据具体信息修改shape或data type,或者找开发人员进一步定位;如果
AI CPU
候选算子信息不为空,或者AI CORE
和AI CPU
候选算子信息都不为空,则可能是用户给到该算子的输入数据类型不在候选列表中,在选择阶段被过滤掉导致,可以根据候选列表尝试修改该算子的输入data type。
用户可以参考官网教程选择合适、统一的模式和写法来完成训练。
Q: MindSpore的算子输入的类型转换规则是什么?如果输入中存在零维Tensor,是否遵循这个规则?
A: MindSpore的算子输入的类型转换,可以参考类型转换规则。与PyTorch不同的是,算子输入中存在零维Tensor时,MindSpore同样遵循这一规则。示例代码如下:
import torch
import mindspore as ms
out_ms = ms.Tensor([1], dtype=ms.int32) + ms.Tensor(1, dtype=ms.int64)
out_torch = torch.tensor([1], dtype=torch.int32) + torch.tensor(1, dtype=torch.int64)
print(out_ms.dtype) # 输出是:Int64
print(out_torch.dtype) # 输出是:torch.int32