You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by GitBox <gi...@apache.org> on 2018/08/09 18:13:42 UTC
[GitHub] lanking520 closed pull request #11408: [MXNET-600][WIP] Memory leak
fix in the Scala training
lanking520 closed pull request #11408: [MXNET-600][WIP] Memory leak fix in the Scala training
URL: https://github.com/apache/incubator-mxnet/pull/11408
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/scala-package/core/src/main/scala/org/apache/mxnet/ExecutorManager.scala b/scala-package/core/src/main/scala/org/apache/mxnet/ExecutorManager.scala
index 22914a558b4..09851225e38 100644
--- a/scala-package/core/src/main/scala/org/apache/mxnet/ExecutorManager.scala
+++ b/scala-package/core/src/main/scala/org/apache/mxnet/ExecutorManager.scala
@@ -241,6 +241,7 @@ private[mxnet] object ExecutorManager {
require(sliced.shape == dst.shape,
s"src shape ${sliced.shape} mismatch dst shape ${dst.shape}")
sliced.copyTo(dst)
+ sliced.dispose()
}
}
}
@@ -524,8 +525,11 @@ private class DataParallelExecutorGroup private(sym: Symbol,
// Update evaluation metric with label and current outputs
def updateMetric(metric: EvalMetric, labels: IndexedSeq[NDArray]): Unit = {
(trainExecs zip slices).foreach { case (texec, islice) =>
- val labelsSlice = labels.map(_.slice(islice))
+ val labelsSlice = labels.map(ele =>
+ ele.slice(islice)
+ )
metric.update(labelsSlice, texec.outputs)
+ labelsSlice.foreach(_.dispose())
}
}
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 87c9bc72be0..59ac8db8647 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
@@ -146,7 +146,8 @@ class FeedForward private(
for ((k, v) <- argParams) {
if (_argParams != null && _argParams.contains(k) && (!overwrite)) {
- argParams(k).set(_argParams(k))
+ v.set(_argParams(k))
+ _argParams(k).dispose()
} else {
initializer(k, v)
}
@@ -154,12 +155,12 @@ class FeedForward private(
for ((k, v) <- auxParams) {
if (_auxParams != null && _auxParams.contains(k) && (!overwrite)) {
- auxParams(k).set(_auxParams(k))
+ v.set(_auxParams(k))
+ _auxParams(k).dispose()
} else {
initializer(k, v)
}
}
-
_argParams = argParams
_auxParams = auxParams
(argNames, paramNames, auxNames)
diff --git a/scala-package/core/src/main/scala/org/apache/mxnet/Model.scala b/scala-package/core/src/main/scala/org/apache/mxnet/Model.scala
index ad6fae5765c..fe1f8851d8f 100644
--- a/scala-package/core/src/main/scala/org/apache/mxnet/Model.scala
+++ b/scala-package/core/src/main/scala/org/apache/mxnet/Model.scala
@@ -319,6 +319,7 @@ object Model {
if (epochSize != -1 && nBatch >= epochSize) {
doReset = false
}
+ dataBatch.dispose()
}
if (doReset) {
trainData.reset()
@@ -344,6 +345,7 @@ object Model {
executorManager.loadDataBatch(evalBatch)
executorManager.forward(isTrain = false)
executorManager.updateMetric(evalMetric, evalBatch.label)
+ evalBatch.dispose()
}
val (name, value) = evalMetric.get
diff --git a/scala-package/core/src/main/scala/org/apache/mxnet/NDArray.scala b/scala-package/core/src/main/scala/org/apache/mxnet/NDArray.scala
index 49f4d35136f..1215b68b549 100644
--- a/scala-package/core/src/main/scala/org/apache/mxnet/NDArray.scala
+++ b/scala-package/core/src/main/scala/org/apache/mxnet/NDArray.scala
@@ -99,10 +99,13 @@ object NDArray {
val outputs = ArrayBuffer.empty[NDArrayHandle]
checkCall(_LIB.mxImperativeInvoke(function.handle, ndArgs.map(_.handle).toArray, outputVars,
outputs, updatedKwargs.size, updatedKwargs.keys.toArray, updatedKwargs.values.toArray))
- new NDArrayFuncReturn(Option(oriOutputs).getOrElse {
+ new NDArrayFuncReturn(if (oriOutputs == null) {
val outputArrs = outputs.map(new NDArray(_)).toArray
addDependency(ndArgs.toArray, outputArrs)
outputArrs
+ } else {
+ addDependency(ndArgs.toArray, oriOutputs)
+ oriOutputs
})
}
diff --git a/scala-package/core/src/main/scala/org/apache/mxnet/Operator.scala b/scala-package/core/src/main/scala/org/apache/mxnet/Operator.scala
index 6630d5ff53d..406aab63f8d 100644
--- a/scala-package/core/src/main/scala/org/apache/mxnet/Operator.scala
+++ b/scala-package/core/src/main/scala/org/apache/mxnet/Operator.scala
@@ -82,6 +82,7 @@ abstract class CustomOp {
this.forward(isTrain = isTrain, req = reqsArr,
inData = tensors(0).toArray, outData = tensors(1).toArray,
aux = tensors(4).toArray)
+ tensors.foreach(arr => arr.foreach(_.dispose()))
} catch {
case ex: Throwable => {
success = false
@@ -112,6 +113,7 @@ abstract class CustomOp {
inData = tensors(0).toArray, outData = tensors(1).toArray,
inGrad = tensors(2).toArray, outGrad = tensors(3).toArray,
aux = tensors(4).toArray)
+ tensors.foreach(arr => arr.foreach(_.dispose()))
} catch {
case ex: Throwable => {
success = false
diff --git a/scala-package/core/src/main/scala/org/apache/mxnet/io/MXDataIter.scala b/scala-package/core/src/main/scala/org/apache/mxnet/io/MXDataIter.scala
index 2a0c333ebf1..ef178d5e07c 100644
--- a/scala-package/core/src/main/scala/org/apache/mxnet/io/MXDataIter.scala
+++ b/scala-package/core/src/main/scala/org/apache/mxnet/io/MXDataIter.scala
@@ -101,6 +101,9 @@ private[mxnet] class MXDataIter(private[mxnet] val handle: DataIterHandle,
private def iterNext(): Boolean = {
val next = new RefInt
checkCall(_LIB.mxDataIterNext(handle, next))
+ if (currentBatch != null) {
+ currentBatch.dispose()
+ }
currentBatch = null
if (next.value > 0) {
currentBatch = new DataBatch(data = getData(), label = getLabel(),
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services