1、基础环境
- linux
- Ascend 910
- MindSpore 2.22
2、问题描述及报错信息
2.1 问题描述
设置自动混合精度为O2
级别,ms.ops.linspace
始终报类型错误,切换到mindspore
的python
代码里面将对应tensor
打印出来发现符合类型要求,但是一直报错。
最小复现代码如下:
import mindspore as ms
import mindspore.nn as nn
ms.context.set_context(mode=ms.PYNATIVE_MODE, device_target='Ascend')
class LinSpaceTest(nn.Cell):
def __init__(self):
super().__init__()
def construct(self, x):
return ms.ops.linspace(
0.5, 2.5, 2
)
linspace = LinSpaceTest()
linspace.set_train(False)
ms.amp.auto_mixed_precision(linspace, amp_level='O2')
linspace(1)
print('done')
2.2 报错信息
TypeError: For primitive[LinSpace], the input argument[start type] must be a type of {Tensor[Float32], Tensor[Float64]}, but got Tensor[Float16].
3、问题定位及解决
暂时未定位到问题的具体发生位置(查看源码知ms.amp.auto_mixed_precision
中仅对Cell
的实例进行数据类型设置,应该不影响ms.ops.linspace
这种op
才对),初步只能定位到在contruct
代码段内调用ms.ops.linspace
就会报类似的错误,猜测和更深层次的代码(类似context manager之类的、或者是ms.ops.linspace
的底层调用了不在blacklist
中的Cell
类)有关系。
当前使用ms.numpy.linspace
暂时规避该问题,但是并不太好,后续将持续跟进该问题。替换后代码如下:
import mindspore as ms
import mindspore.nn as nn
ms.context.set_context(mode=ms.PYNATIVE_MODE, device_target='Ascend')
class LinSpaceTest(nn.Cell):
def __init__(self):
super().__init__()
def construct(self, x):
# ops -> numpy
return ms.numpy.linspace(
0.5, 2.5, 2
)
linspace = LinSpaceTest()
linspace.set_train(False)
ms.amp.auto_mixed_precision(linspace, amp_level='O2')
linspace(1)
print('done')
4、总结
对MindSpore
的整体运行机制需要花点时间看看,目前定位问题困难较多。