tensorflow 如果在图模式下创建tf.queue.FIFOQueue,则在入队/出队时会抛出NotFoundError,

2vuwiymt  于 6个月前  发布在  其他
关注(0)|答案(3)|浏览(47)

系统信息

  • 是否编写了自定义代码(与在TensorFlow中使用的库存示例脚本相反):是
  • OS平台和发行版:Windows 7和Ubuntu 18.04.3 LTS(colab)
  • 从哪里安装的TensorFlow(源代码或二进制文件):通过pip install tf-nightly-gpu安装
  • TensorFlow版本(使用以下命令):v1.12.1-32502-g2544e4e277 2.3.0-dev20200523(Windows和colab)
  • Python版本:3.6.6(Windows),3.6.9(colab)
  • CUDA/cuDNN版本:10.1/7.6.3.30(Windows),未知(colab)
  • GPU型号和内存:NVidia 1080Ti ~11GB(Windows),未知(colab)
    描述当前行为

当在tf.function装饰的函数中创建tf.FIFOQueue时,从队列中入队/出队Tensor会失败,并出现NotFoundError,提到名为"localhost/{Some number}/{C++ mangled name of class tensorflow::QueueInterface}"的不存在资源。如果在急切模式下创建队列,所有操作都可以正常工作。

描述预期行为

要么像在急切模式下一样成功执行图形模式执行,要么将队列创建的不适用于图形模式的情况作为API文档记录。

重现问题的独立代码

Linux情况:
https://colab.research.google.com/drive/1OQ68ibI-9u-6f4nslwIzDuMzdztxVGwX?usp=sharing
Windows情况:

import tensorflow as tf

@tf.function
def foo():	
	queue = tf.queue.FIFOQueue(-1, [tf.string], tf.TensorShape([]))
	queue.enqueue('Hello')
	s = queue.dequeue()
	tf.print(s)

foo()

日志已附加
log.txt

f4t66c6m

f4t66c6m1#

我已经在Colab中尝试使用TF-GPU的夜间版本,并能够重现这个问题。请查看gist here。谢谢!

3b6akqbq

3b6akqbq2#

当前,您需要在函数外部保留拥有队列资源的Python对象,如下所示:
tensorflow/tensorflow/python/kernel_tests/fifo_queue_test.py
第145行到第157行
| | class_M(module.Module): |
| | |
| | def init(self): |
| | self.q1=data_flow_ops.FIFOQueue(10, [dtypes_lib.int32], shapes=[()]) |
| | self.q2=None |
| | |
| | @def_function.function |
| | def uses_queues(self, x): |
| | if self.q2 is None: |
| | self.q2=data_flow_ops.FIFOQueue(10, [dtypes_lib.int32], shapes=[()]) |
| | self.q2.enqueue(x) |
| | self.q2.enqueue(x+3) |
| | self.q1.enqueue(self.q2.dequeue()) |
如果我们抛出一个错误消息,或者让函数每次运行时创建和销毁一个 transient 队列资源,那就太好了。所以我暂时把这个bug留着。

uyhoqukh

uyhoqukh3#

请使用2.11V和tf-nightly 2.12.0-dev20221228版本重现此问题,并查看以下代码片段:2.11Vnightly。谢谢!

相关问题