You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by ni...@apache.org on 2017/08/22 17:25:52 UTC

systemml git commit: [SYSTEMML-540] Avoid unnecessary sparse-to-dense conversion on depthwise convolution layers and probability matrix

Repository: systemml
Updated Branches:
  refs/heads/master 0325da7de -> 4d5a82ecf


[SYSTEMML-540] Avoid unnecessary sparse-to-dense conversion on depthwise convolution layers and probability matrix

```
Network: unet
Setup: 30g driver, K80 GPU (only 1 GPU used)
Performance before this commit:
Total elapsed time:             306.291 sec.
1  leftIndex [106:4-106:42]
139.392   28552  csrlix[114.674s,22649], aqrs[0.021s,23165],
rls[0.069s,57104], s2d[8.691s,258], aqrd[14.199s,33939],
lixcp[1.351s,5903]

Performance after this commit:
Total elapsed time:             220.712 sec.
6  leftIndex [106:4-106:42]
21.066   28552  rls[0.036s,57104], lixcp[5.375s,28552],
aqrd[15.423s,57104]
```

Closes #610.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/4d5a82ec
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/4d5a82ec
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/4d5a82ec

Branch: refs/heads/master
Commit: 4d5a82ecf18c57f3cf614364fdfabaf0680a51fe
Parents: 0325da7
Author: Niketan Pansare <np...@us.ibm.com>
Authored: Tue Aug 22 10:23:20 2017 -0700
Committer: Niketan Pansare <np...@us.ibm.com>
Committed: Tue Aug 22 10:24:59 2017 -0700

----------------------------------------------------------------------
 scripts/nn/layers/conv2d_depthwise.dml                 | 12 ++++++++----
 scripts/nn/layers/conv2d_transpose_depthwise.dml       | 12 ++++++++----
 src/main/scala/org/apache/sysml/api/dl/Caffe2DML.scala |  2 +-
 3 files changed, 17 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/4d5a82ec/scripts/nn/layers/conv2d_depthwise.dml
----------------------------------------------------------------------
diff --git a/scripts/nn/layers/conv2d_depthwise.dml b/scripts/nn/layers/conv2d_depthwise.dml
index ff36ea1..4e4d3e4 100644
--- a/scripts/nn/layers/conv2d_depthwise.dml
+++ b/scripts/nn/layers/conv2d_depthwise.dml
@@ -79,7 +79,9 @@ forward = function(matrix[double] X, matrix[double] W, matrix[double] b,
   Wout = as.integer(floor((Win + 2*padw - Wf)/stridew + 1))
 
   # create output volume
-  out = matrix(0, rows=N, cols=C*M*Hout*Wout)
+  # NOTE: We initialize to 1s vs. 0s to avoid conversions between sparse and dense formats. 
+  # This is a complete hack until the engine is improved.
+  out = matrix(1, rows=N, cols=C*M*Hout*Wout)
 
   # depthwise convolution
   # TODO: Explore usage of parfor loops more to determine if they can provide a performance
@@ -137,9 +139,11 @@ backward = function(matrix[double] dout, int Hout, int Wout,
   C = nrow(W)
 
   # create gradient volumes
-  dX = matrix(0, rows=N, cols=C*Hin*Win)
-  dW = matrix(0, rows=C, cols=M*Hf*Wf)
-  db = matrix(0, rows=C*M, cols=1)
+  # NOTE: We initialize to 1s vs. 0s to avoid conversions between sparse and dense formats. 
+  # This is a complete hack until the engine is improved.
+  dX = matrix(1, rows=N, cols=C*Hin*Win)
+  dW = matrix(1, rows=C, cols=M*Hf*Wf)
+  db = matrix(1, rows=C*M, cols=1)
 
   # partial derivatives for depthwise convolution
   for (c in 1:C) {  # all examples

http://git-wip-us.apache.org/repos/asf/systemml/blob/4d5a82ec/scripts/nn/layers/conv2d_transpose_depthwise.dml
----------------------------------------------------------------------
diff --git a/scripts/nn/layers/conv2d_transpose_depthwise.dml b/scripts/nn/layers/conv2d_transpose_depthwise.dml
index b3e798c..0a9a235 100644
--- a/scripts/nn/layers/conv2d_transpose_depthwise.dml
+++ b/scripts/nn/layers/conv2d_transpose_depthwise.dml
@@ -85,7 +85,9 @@ forward = function(matrix[double] X, matrix[double] W, matrix[double] b,
   Wout = stridew*(Win-1) - 2*padw + Wf + out_padw
 
   # create output volume
-  out = matrix(0, rows=N, cols=C/M*Hout*Wout)
+  # NOTE: We initialize to 1s vs. 0s to avoid conversions between sparse and dense formats. 
+  # This is a complete hack until the engine is improved.
+  out = matrix(1, rows=N, cols=C/M*Hout*Wout)
 
   # depthwise transpose convolution
   # TODO: Explore usage of parfor loops more to determine if they can provide a performance
@@ -146,9 +148,11 @@ backward = function(matrix[double] dout, int Hout, int Wout,
   F = nrow(W)
 
   # create gradient volumes
-  dX = matrix(0, rows=N, cols=C*Hin*Win)
-  dW = matrix(0, rows=C/M, cols=M*Hf*Wf)
-  db = matrix(0, rows=C/M, cols=1)
+  # NOTE: We initialize to 1s vs. 0s to avoid conversions between sparse and dense formats. 
+  # This is a complete hack until the engine is improved.
+  dX = matrix(1, rows=N, cols=C*Hin*Win)
+  dW = matrix(1, rows=C/M, cols=M*Hf*Wf)
+  db = matrix(1, rows=C/M, cols=1)
 
   # depthwise transpose convolution
   for (f in 1:F) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/4d5a82ec/src/main/scala/org/apache/sysml/api/dl/Caffe2DML.scala
----------------------------------------------------------------------
diff --git a/src/main/scala/org/apache/sysml/api/dl/Caffe2DML.scala b/src/main/scala/org/apache/sysml/api/dl/Caffe2DML.scala
index 25d19f6..000fe32 100644
--- a/src/main/scala/org/apache/sysml/api/dl/Caffe2DML.scala
+++ b/src/main/scala/org/apache/sysml/api/dl/Caffe2DML.scala
@@ -613,7 +613,7 @@ class Caffe2DMLModel(val numClasses:String, val sc: SparkContext, val solver:Caf
 	  
 	  val lossLayers = getLossLayers(net)
 	  val lastLayerShape = estimator.getOutputShapeOfLastLayer
-	  assign(tabDMLScript, "Prob", matrix("0", Caffe2DML.numImages, (lastLayerShape._1*lastLayerShape._2*lastLayerShape._3).toString))
+	  assign(tabDMLScript, "Prob", matrix("1", Caffe2DML.numImages, (lastLayerShape._1*lastLayerShape._2*lastLayerShape._3).toString))
 	  estimator.getTestAlgo.toLowerCase match {
       case "minibatch" => {
         ceilDivide(tabDMLScript(), "num_iters", Caffe2DML.numImages, Caffe2DML.batchSize)