tensorflow / tensorflow/java

java tensorflow and maven version is org.tensorflow:libtensorflow:1.15.0 after session.runner.run() for many times, the memory grow higher and higher then oom

Open
#564 12 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
928
Forks
227
PR merge metrics
No merged PRs in 30d

Description

20241024-155157

my test code with language scala ,this is one predict, we will predict 100 QPS for a docker
val config = ConfigProto.newBuilder
.putDeviceCount("CPU", Runtime.getRuntime.availableProcessors)
.setInterOpParallelismThreads(8)
.setIntraOpParallelismThreads(8)
.setOperationTimeoutInMs(3000)
.build

val options = RunOptions.newBuilder
  .setTimeoutInMs(5000)
  .build 

val modelBundle = SavedModelBundle
  .loader(s"$path")
  .withTags("serve")
  .withConfigProto(config.toByteArray)
  .withRunOptions(options.toByteArray)
  .load

val kernel = modelBundle.session

val data = Map("tensor1" -> Seq(0.1f,0.122f),……)
val runner = kernel.runner()
val inputTensorList: util.ArrayList[Tensor[java.lang.Float]] = new util.ArrayList[Tensor[java.lang.Float]]()
data.map{
  case (tensorName, featureId) => {

    val dataInput:FloatBuffer = FloatBuffer.allocate(featureId.size)
    featureId.foreach(featureValue => {
      dataInput.put(featureValue)
    })
    dataInput.asInstanceOf[Buffer].flip()
    val tensorShape:Array[Long] = Array(1,featureId.size)
    val tensor = Tensor.create(tensorShape,dataInput)
    runner.feed(tensorName,tensor)
    inputTensorList.add(tensor)
  }
}

for(i <- 0 until 2 ){
  runner.fetch("StatefulPartitionedCall",i)
}

val output = runner.run.asScala
val scores:Array[Float] = output.map(ten => {
  val tensorData: Array[Array[Float]] = ten.copyTo(Array.ofDim[Float](ten.shape()(0).toInt, ten.shape()(1).toInt))
  tensorData(0).head
}).toArray
inputTensorList.asScala.foreach(_.close())
output.foreach(_.close())

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the reported workload using SavedModelBundle, session.runner(), runner.run(), and the repeated 100-QPS prediction pattern shown in the issue. Trace ownership and closure of the fed input tensors and returned output tensors while monitoring memory; done means the repeated predictions no longer grow memory until OOM.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, tensorflow
Domain
machine-learning
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.