You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by an...@apache.org on 2018/06/14 17:51:05 UTC
[incubator-mxnet] branch v1.2.0 updated: Scala inference memory
leak fix #11204 (#11216)
This is an automated email from the ASF dual-hosted git repository.
anirudh2290 pushed a commit to branch v1.2.0
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/v1.2.0 by this push:
new 864c750 Scala inference memory leak fix #11204 (#11216)
864c750 is described below
commit 864c750fb5c689731adac4e79c582c40a9c88b23
Author: Andrew Ayres <an...@gmail.com>
AuthorDate: Thu Jun 14 10:50:43 2018 -0700
Scala inference memory leak fix #11204 (#11216)
* Fixes Scala memory leak (#10436)
* Replaced the copy and disposed of sliced ndArray to resolve memory leak
* Wrapped disposes in a finally to ensure they are called.
---
.../main/scala/org/apache/mxnet/FeedForward.scala | 25 ++++++++++++++++------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/scala-package/core/src/main/scala/org/apache/mxnet/FeedForward.scala b/scala-package/core/src/main/scala/org/apache/mxnet/FeedForward.scala
index 7289df1..87c9bc7 100644
--- a/scala-package/core/src/main/scala/org/apache/mxnet/FeedForward.scala
+++ b/scala-package/core/src/main/scala/org/apache/mxnet/FeedForward.scala
@@ -224,13 +224,24 @@ class FeedForward private(
var i = 0
while (data.hasNext && i != numBatch) {
val batch = data.next()
- i += 1
- ExecutorManager.loadData(batch, dataArrays)
- predExec.forward(isTrain = false)
- val padded = batch.pad
- val realSize = batchSize - padded
- for ((list, nd) <- outputs zip predExec.outputs) {
- list += nd.slice(0, realSize).copy()
+ try {
+ i += 1
+ ExecutorManager.loadData(batch, dataArrays)
+ predExec.forward(isTrain = false)
+ val padded = batch.pad
+ val realSize = batchSize - padded
+ for ((list, nd) <- outputs zip predExec.outputs) {
+ // The slice is being written to a value so that dispose can be called after the copy.
+ // The one liner nd.slice().copy() leads to leaking the memory of the slice.
+ val ndSliced = nd.slice(0, realSize)
+ try {
+ list += ndSliced.copy()
+ } finally {
+ ndSliced.dispose()
+ }
+ }
+ } finally {
+ batch.dispose()
}
}
// TODO(Yizhi): we can use Symbol.concat to do the same thing. Can it be more efficient?
--
To stop receiving notification emails like this one, please contact
anirudh2290@apache.org.