使用MindSpore报错TypeError:Invalid dtype

1 系统环境

硬件环境(Ascend/GPU/CPU): Ascend/GPU/CPU
MindSpore版本: 2.2.0
执行模式(PyNative/ Graph): 不限

2 报错信息

2.1 问题描述

在将Torch的代码转换为MindSpore时,遇到如下代码:

input_data = self.embedding(input_data)

其中input_data为int64类型,Torch的embedding能够处理。
使用MindSpore替换时出现报错,代码如下。

net = nn.Embedding(vocab_size=self.hidden_size, embedding_size=self.embedding_size,dtype=ms.int64)
    
input_data = net(input_data)

使用AutoDL进行debug的时候,发现定义出来的net的dtype仍为float32,导致了类型错误。

2.2 报错信息

(embedding) : Embedding<vocab_size=110, embedding_size=8, use_one_hot=False, embedding table=Parameter (name=embedding. embedding table, shape=(110, 8), dtype=Float32, requires_grad=True), dtype=Float32, padding_idx=None>

3 根因分析

使用MindSpore版本2.2.0中会默认更改格式

4 解决方案

使用2.3版本下的mindspore测试,设置了int64后,算子里不会默认更改。

import mindspore as ms  
from mindspore import Tensor, nn, context  
import numpy as np  
    
context.set_context(device_target='CPU')  
net = nn.Embedding(110, 8, dtype=ms.int64)  
x = Tensor(np.array([[107]*50]),ms.int64)  
    
print(x)  
output = net(x)  
print(net)  
print(output.shape)