我正在使用在CPU上运行的Tensorflow DNNClassifier
。我已经完成了训练,现在我反复打电话给estimator.predict
,经过几千次电话后,我得到了以下内容。我很困惑,因为我认为做出预测本身不会增加内存(我看到其他一些人犯了类似的错误,但他们使用GPU并在训练期间看到错误)。
....
File "C:\Users\Zvi\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\framework\ops.py", line 1654, in __init__
self._traceback = self._graph._extract_stack() # pylint: disable=protected-access
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[973771,128] and type float on /job:localhost/replica:0/task:0/device:CPU:0 by allocator cpu
[[Node: save/AssignVariableOp = AssignVariableOp[dtype=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](dnn/input_from_feature_columns/input_layer/product_hub_module_embedding/module/embeddings/part_0, save/Identity_7)]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
答案 0 :(得分:0)
我感到困惑,因为我认为做出预测本身不会增加记忆力。
实际上这不是真的,所以它是OOM的可能原因。 Estimator.predict()
在每次调用时从头开始重建图形并从磁盘加载权重以进行推理。有关详细信息,请参阅this question和this issue on GitHub。是的,图表,张量是呼叫后可用于GC的其他对象,但并不意味着所有对象都会立即收集。
当调用此方法一千次时,整个应用程序的稳定性取决于先前分配的内存可以回收的速度。但是python GC can be postponed很长一段时间了。即使GC定期收集垃圾,您仍可能面临碎片整理问题。
这意味着您应该尝试使用更多输入数据来预测Estimator.predict()
次,或者从估算器API迁移到keras,从而实现精简或纯粹的张量流实现。