源自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
源自github用户ForFishes:
这个主要的原因是index有重复元素。在GPU并行的情况下,加法的顺序难以确定,从而导致误差。这个问题在GPU下难以解决。这里如果要对齐精度,可以尝试将这个OP运行在CPU上,其他的op在GPU上运行。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
这个主要的原因是index有重复元素。在GPU并行的情况下,加法的顺序难以确定,从而导致误差。这个问题在GPU下难以解决。这里如果要对齐精度,可以尝试将这个OP运行在CPU上。
好的谢谢。请问单独将某个OP在CPU上执行需要怎么做呢?速度上会不会受到比较大影响?
这个主要的原因是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。
至于速度影响,我无法确定,这个需要测试看下。
登录 后才可以发表评论