gpt4 book ai didi

python - GPU 上的 tf.reduce_sum 结合占位符作为输入形状失败

转载 作者:IT老高 更新时间:2023-10-28 20:56:08 31 4
gpt4 key购买 nike

更新:在 Tensorflow 1.14.0 中修复(可能更早,没有检查)

更新:仍在 Tensorflow 1.7.0 中发生

更新:我写了一个协作笔记本,在 google 的 gpu 硬件上重现了这个 bug:https://drive.google.com/file/d/13V87kSTyyFVMM7NoJNk9QTsCYS7FRbyz/view?usp=sharing

更新:在这个问题的第一个修订版中错误地指责 tf.gather 之后,我现在将其缩小到 tf.reduce_sum 并结合占位符作为形状:

tf.reduce_sum 为形状取决于占位符的大张量生成零(仅在 GPU 上)。

在向占位符 batch_size(在我的例子中为 >700000)提供一个大整数的同时运行以下代码:

import tensorflow as tf
import numpy as np

graph = tf.Graph()
with graph.as_default():
batch_size = tf.placeholder(tf.int32,shape=[])
ones_with_placeholder = tf.ones([batch_size,256,4])
sum_out = tf.reduce_sum(ones_with_placeholder,axis=2)
min_sum_out = tf.reduce_min(sum_out)

sess = tf.Session(graph=graph)

sum_result,min_sum_result = sess.run([sum_out,min_sum_out],feed_dict={batch_size: 1000000})
print("Min value in sum_out processed on host with numpy:", np.min(sum_result))
print("Min value in sum_out tensor processed in graph with tf:", min_sum_result)

显示以下错误结果:

Min value in sum_out processed on host with numpy: 0.0
Min value in sum_out tensor processed in graph with tf: 0.0

我原以为在轴 2 上应用 reduce_sum 应该会导致到处都是 4.0!

在 CPU 上运行这个精确的代码会导致正确的结果。同样使用 tf.ones 的固定形状运行它会在 CPU 和 GPU 上产生正确的结果:

ones_with_fixed_shape = tf.ones([1000000,256,4])
sum_out = tf.reduce_sum(ones_with_fixed_shape,axis=2)

GPU 上的占位符有什么问题?

最佳答案

基本问题是速度/准确性之间的权衡。尽管您的示例看起来微不足道,但将整个张量初始化为 1,但仍有 1.024B 个条目。注意 int32 可以表示范围内的整数[-2,147,483,648 到 2,147,483,647] 不损失精度:

因此,如果我们累积所有条目并执行计算,我们预计会看到一些错误。这也解释了为什么较小的矩阵没有出现问题(较小的 Batch 大小)。

关于python - GPU 上的 tf.reduce_sum 结合占位符作为输入形状失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49520394/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com