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();

Reply via email to