以下测试代码泄漏内存:
private static final float[] X = new float[]{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
public void testTensorFlowMemory() {
// create a graph and session
try (Graph g = new Graph(); Session s = new Session(g)) {
// create a placeholder x and a const for the dimension to do a cumulative sum along
Output x = g.opBuilder("Placeholder", "x").setAttr("dtype", DataType.FLOAT).build().output(0);
Output dims = g.opBuilder("Const", "dims").setAttr("dtype", DataType.INT32).setAttr("value", Tensor.create(0)).build().output(0);
Output y = g.opBuilder("Cumsum", "y").addInput(x).addInput(dims).build().output(0);
// loop a bunch to test memory usage
for (int i=0; i<10000000; i++){
// create a tensor from X
Tensor tx = Tensor.create(X);
// run the graph and fetch the resulting y tensor
Tensor ty = s.runner().feed("x", tx).fetch("y").run().get(0);
// close the tensors to release their resources
tx.close();
ty.close();
}
System.out.println("non-threaded test finished");
}
}
有什么明显的事情我做错了吗?基本流程是在该图上创建图形和会话,创建占位符和常量,以便在以x为单位的张量上执行累积和。运行生成的y操作后,我关闭x和y张量以释放其内存资源。
我相信目前为止提供的帮助:
Tensor ty
行可以消除泄漏,因此它似乎就在那里。有什么想法吗?谢谢!此外,here's a Github project that demonstrates this issue同时进行线程测试(以更快地增长内存)和无线测试(以显示它不是由于线程)。它使用maven,可以简单地运行:
mvn test
答案 0 :(得分:5)
我相信确实存在泄漏(尤其是与allocation in JNI code对应的遗失TF_DeleteStatus
)(感谢您提供重播的详细说明)
我鼓励您在http://github.com/tensorflow/tensorflow/issues提交问题 并希望它应该在最终的1.2版本之前修复。
(相关地,由于Tensor
创建的Tensor.create(0)
对象未被关闭,因此您在循环外部也有泄漏。
更新:这已修复,1.2.0-rc1不应再出现此问题。