423 Star 4.3K Fork 419

GVPPaddlePaddle / Paddle

 / 详情

gpu下的scatter op存在随机性的精度误差

已完成
创建于  
2021-10-09 14:46

源自github用户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

评论 (3)

PaddlePaddle-Gardener 创建了任务
展开全部操作日志

源自github用户ForFishes:
这个主要的原因是index有重复元素。在GPU并行的情况下,加法的顺序难以确定,从而导致误差。这个问题在GPU下难以解决。这里如果要对齐精度,可以尝试将这个OP运行在CPU上,其他的op在GPU上运行。

源自github用户agave233:

这个主要的原因是index有重复元素。在GPU并行的情况下,加法的顺序难以确定,从而导致误差。这个问题在GPU下难以解决。这里如果要对齐精度,可以尝试将这个OP运行在CPU上。

好的谢谢。请问单独将某个OP在CPU上执行需要怎么做呢?速度上会不会受到比较大影响?

源自github用户ForFishes:

这个主要的原因是index有重复元素。在GPU并行的情况下,加法的顺序难以确定,从而导致误差。这个问题在GPU下难以解决。这里如果要对齐精度,可以尝试将这个OP运行在CPU上。

好的谢谢。请问单独将某个OP在CPU上执行需要怎么做呢?速度上会不会受到比较大影响?

这种运行可以参考这个文档 https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/device_guard_cn.html#device-guard。
至于速度影响,我无法确定,这个需要测试看下。

PaddlePaddle-Coordinator 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
Python
1
https://gitee.com/paddlepaddle/Paddle.git
git@gitee.com:paddlepaddle/Paddle.git
paddlepaddle
Paddle
Paddle

搜索帮助

14c37bed 8189591 565d56ea 8189591