This is an automated email from the ASF dual-hosted git repository. niketanpansare pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/systemml.git
The following commit(s) were added to refs/heads/master by this push: new c7b9745 [SYSTEMML-540] Reduce the memory pressure of CP lstm_backward instruction c7b9745 is described below commit c7b9745800e0c71f0c6c76b8284c78e33a5cdb01 Author: Niketan Pansare <npan...@us.ibm.com> AuthorDate: Tue Mar 5 15:48:09 2019 -0800 [SYSTEMML-540] Reduce the memory pressure of CP lstm_backward instruction - When lstm_backward in invoked, this commit avoids memory allocation and left indexing of output and carry activations of the corresponding forward invocation. --- .../runtime/instructions/cp/DnnCPInstruction.java | 6 +++--- .../sysml/runtime/matrix/data/LibMatrixDNN.java | 20 +++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/DnnCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/DnnCPInstruction.java index 50a11de..35ac5b6 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/DnnCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/DnnCPInstruction.java @@ -388,8 +388,6 @@ public class DnnCPInstruction extends UnaryCPInstruction { + "but found [" + dc.getNumRows() + "," + dc.getNumColumns() + "]"); } - MatrixBlock out = new MatrixBlock(N, return_seq ? (T*M) : M, false); - MatrixBlock c = new MatrixBlock(N, M, false); MatrixBlock cache_out = new MatrixBlock(T, N*M, false); MatrixBlock cache_c = new MatrixBlock(T, N*M, false); MatrixBlock cache_ifog = new MatrixBlock(T, N*4*M, false); @@ -401,7 +399,9 @@ public class DnnCPInstruction extends UnaryCPInstruction { cache_ifog.allocateDenseBlock(); LibMatrixDNN.lstm(X, W, b, out0, c0, return_seq, N, T, D, M, - out, c, cache_out, cache_c, cache_ifog, + // Avoid out and c computation in lstm forward call + null, null, + cache_out, cache_c, cache_ifog, _numThreads); MatrixBlock dX = new MatrixBlock(N, T*D, false); diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java index 0005932..3ec9fb3 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDNN.java @@ -20,7 +20,6 @@ package org.apache.sysml.runtime.matrix.data; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; @@ -41,7 +40,6 @@ import org.apache.sysml.runtime.functionobjects.Multiply; import org.apache.sysml.runtime.functionobjects.Plus; import org.apache.sysml.runtime.functionobjects.PlusMultiply; import org.apache.sysml.runtime.functionobjects.Power; -import org.apache.sysml.runtime.functionobjects.Power2; import org.apache.sysml.runtime.functionobjects.SwapIndex; import org.apache.sysml.runtime.functionobjects.Builtin.BuiltinCode; import org.apache.sysml.runtime.instructions.cp.KahanObject; @@ -57,8 +55,6 @@ import org.apache.sysml.runtime.matrix.operators.UnaryOperator; import org.apache.sysml.runtime.util.CommonThreadPool; import org.apache.sysml.runtime.util.DnnUtils; -import com.sun.org.apache.xpath.internal.operations.Minus; - /* * This class allows users to invoke deep learning related operations * (such as conv2d, conv2d_backward_data, conv2d_backward_filter, maxpooling, maxpooling_backward, bias_add) @@ -514,7 +510,7 @@ public class LibMatrixDNN { public static void lstm(MatrixBlock X, MatrixBlock W, MatrixBlock b, MatrixBlock out0, MatrixBlock c0, boolean return_seq, int N, int T, int D, int M, - MatrixBlock out, MatrixBlock c, // output + MatrixBlock out, MatrixBlock c, // output: if null, the output and c are not passed back MatrixBlock cache_out, MatrixBlock cache_c, MatrixBlock cache_ifog, // if null, the cache values are not computed int numThreads) { MatrixBlock out_prev = out0; @@ -624,7 +620,7 @@ public class LibMatrixDNN { updateIfogCache(cache_ifog, ifo, g, t, N, M); } - if(return_seq) { + if(return_seq && out != null) { out = out.leftIndexingOperations(out_t, 0, N-1, (t-1)*M, t*M-1, out, UpdateType.INPLACE); } out_prev = out_t; @@ -635,12 +631,14 @@ public class LibMatrixDNN { reshapeAsRowMatrixAndLeftIndex(cache_c, c_t, t-1, N*M); } } - if(out_t != null && !return_seq) + if(out_t != null && !return_seq && out != null) out.copy(out_t); - if(c_t != null) - c.copy(c_t); - else - c.copy(c0); + if(c != null) { + if(c_t != null) + c.copy(c_t); + else + c.copy(c0); + } if(cache_out != null) { cache_out.recomputeNonZeros(); cache_c.recomputeNonZeros();