gpu下的scatter op存在随机性的精度误差
Created by: agave233
版本、环境信息: 1)PaddlePaddle版本:1.8.4 2)CPU:Intel(R) Xeon(R) Gold 5117 CPU @ 2.00GHz 3)GPU:Tesla P40,cuda 10.2,cudnn 7.6 4)系统环境:Red Hat 4.8.2-16、Python 3.7
在GPU下训练模型时,会由于scatter操作的并行加运算带来随机性的精度误差(也可以参考问题https://github.com/PaddlePaddle/PGL/issues/129#issuecomment-697228621) 问题复现如下,其实可以发现scatter op的输入长度越长,最后带来的误差就越大,长度是10w时已经带来很明显的误差了。不知道能否修复这个问题呢?或者要没有可以避免这种随机性的实现策略?
问题复现代码:
import numpy as np
import paddle.fluid as fluid
use_cuda = True
np.random.seed(123)
input = fluid.layers.data(name='data', shape=[None, 1], dtype='float32', append_batch_size=False)
index = fluid.layers.data(name='index', shape=[None, ], dtype='int32', append_batch_size=False)
output = fluid.layers.scatter(input, index, input, overwrite=False)
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
in_data = np.random.randn(100000).astype(np.float32)
index_data = np.array([0]*100000).astype(np.int32)
for i in range(5):
inp, res = exe.run(fluid.default_main_program(), feed={'data':in_data, "index":index_data}, fetch_list=[input, output])
print(res[0])
运行结果:
131.48222
131.47939
131.48051
131.48076
131.47928