# 使用mindpsore.nn.conv3d在GPU上精度不足

**1. 系统环境**

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

软件环境: MindSpore 版本: 2.1

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

Python 版本: 3.7

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

mindpsore.nn.conv3d在GPU上精度不足问题，测试conv3d，在group不等于的场景下，用例概率性失败，失败原因为torch上的output和mindspore的output有部分维度结果不一致。

2.2 脚本信息

```
import mindspore
from mindspore import ops
from mindspore import Tensor, nn
from mindspore.common.api import jit
from mindspore import context
import numpy as np

import torch


input = np.random.uniform(size=(16,3,10,32,32))

ms_input = Tensor(input, mindspore.float32)
conv3d = nn.Conv3d(in_channels=3, out_channels=32, kernel_size=(4, 3, 3), has_bias=True, pad_mode='valid')
ms_out = conv3d(ms_input)

torch_input = torch.Tensor(input)
m = torch.nn.Conv3d(3, 32,kernel_size=(4, 3, 3))
torch_out = m(torch_input)


# 失败
y = np.subtract(ms_out.asnumpy(), torch_out.detach().numpy())
w = np.where(np.abs(y) > 0.00004, 1, 0)
z = np.count_nonzero(w)
```

**3. 根因分析**

由于input为随机数，因此使用np.random.seed\(\)确定随机种子，通过固定随机数的方式确定必现的复现条件。确定复现场景后，将mindspore与torch输出相减，记录指定精度下差异位的个数。

```
y = np.subtract(ms_out.numpy(), torch_out.numpy())
w = np.where(np.abs(y) > 0.00004, 1, 0)
z = np.count_nonzero(w)
```

在此案例中，精度4\*1e-5时有15个结果不一致，在默认绝对精度为1e-5的场景下，mindspore与torch不相等的结果有2500+，因此用例不通过。

**4. 解决方案**

GPU平台上对于较大tensor输入的计算精度可能下降，不满足默认绝对精度值，需要针对单个用例进行调整。此处用例有1e-3的相对精度误差，但是在随机数结果较小的情况下，相对精度误差的影响没有绝对精度误差大，因此并不会缓解mindspore和torch的返回值差异。

