# MindSpore中的mindspore.numpy.bincount 大数值情况下报ValueError定位与解决

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): GPU

软件环境: MindSpore 版本: 1.9.0

执行模式（静态图/动态图）： 动态图

Python 版本: 3.7.6

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

mindspore.numpy.bincount GPU环境中在大数值情况下报错。

2.2 报错信息

```
ValueError: The total size of the tensor exceeds the max_limit of 2 Giga-elements, which is 2500000000 elements ([const vector][50000, 50000]).
----------------------------------------------------
- C++ Call Stack: (For framework developers)
----------------------------------------------------
mindspore/ccsrc/plugin/device/gpu/kernel/gpu_kernel.h:402 CheckTensorSize
```

2.3 脚本信息

```
from mindspore import context
import mindspore as ms
import mindspore.numpy as np

b = np.bincount(np.arange(50000))
print(b)
```

**3. 根因分析**

在ModelArts的环境中安装好MindSpore1.9.0，并指定GPU运行这段代码：

```
%%time
ms.set_context(device_target=GPU)

from mindspore import context
import mindspore as ms
import mindspore.numpy as np

b = np.bincount(np.arange(50000))
print(b)
```

运行环境是八核的E5 2690V4，64GB内存，16GB的Tesla P100显卡

得到的结果是：

在卡住了3.4分钟后，报错

![](figures/zh-cn_image_0000002099556442.png)最后的报错内容是：

![](figures/zh-cn_image_0000002099556578.png)报错内容是Tensor的长度超出了限制。

然后我们再运行一遍相同代码，很快啊，就得到了新的报错。

![](figures/zh-cn_image_0000002099396922.png)这次直接告诉我们，显存不够了。

鉴于Notebook的配置中内存是显存的4倍，我们直接切换CPU运行程序

![](figures/zh-cn_image_0000002099397022.png)经过了30秒后，得到了正确的运行结果。因此可以得出结论，显存不够导致了上述代码的报错。

**4. 解决方案**

升级MindSpore版本

根据前面的分析，首先考虑MindSpore升级。

我们升级到2.0.0版本，发现相同代码仍会报错

![](figures/zh-cn_image_0000002099557686.png)因此，无法通过简单的升级版本解决问题。

4.2指定到使用CPU。

无论是1.9.0版本还是2.0.0a版本，都可以指定CPU完成计算

经过多次实验比较，在1.9版本中，运行需要的时间平均是30s

![](figures/zh-cn_image_0000002135078697.png)而在2.0.0alpha版本中，运行所需要的时间大约是20s

![](figures/zh-cn_image_0000002135079209.png)可以发现，升级版本带来了效率的提升。

4.3直接使用Numpy，这里有惊喜

鉴于Numpy只会用CPU进行计算，所以将代码改成使用numpy计算

```
%%time

from mindspore import context
import mindspore as ms
import numpy as np

b = np.bincount(np.arange(50000))
print(b)
```

然后会惊奇的发现，运行时间大大减少

![](figures/zh-cn_image_0000002099400834.png)为了减少误差，进行了多次实验对比，

![](figures/zh-cn_image_0000002099400870.png)![](figures/zh-cn_image_0000002099400962.png)最终取三次实验的平均数，发现Numpy和mindspore.numpy在这个函数的效率上相差上千倍。

综合而言，使用numpy计算完成，再转换Tensor等后续操作是这个报错的最优解。

