Repository: systemml Updated Branches: refs/heads/master aaaa903cb -> 8c11b5d82
[HOTFIX] Disable transposed matrix multiplication optimization as cusparseDcsrmm2 failures. - Also, added minor fixes for GPU tests. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/8c11b5d8 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/8c11b5d8 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/8c11b5d8 Branch: refs/heads/master Commit: 8c11b5d828c1ec7aa6cb4d668ec793f571bff7cb Parents: aaaa903 Author: Niketan Pansare <npan...@us.ibm.com> Authored: Thu Dec 7 07:43:04 2017 -0800 Committer: Niketan Pansare <npan...@us.ibm.com> Committed: Thu Dec 7 07:44:56 2017 -0800 ---------------------------------------------------------------------- .../java/org/apache/sysml/hops/AggBinaryOp.java | 10 ++-- .../runtime/matrix/data/LibMatrixCUDA.java | 1 + .../org/apache/sysml/api/ml/ScriptsUtils.scala | 2 +- .../sysml/test/gpu/AggregateUnaryOpTests.java | 1 + .../org/apache/sysml/test/gpu/AppendTest.java | 1 + .../apache/sysml/test/gpu/BinaryOpTests.java | 1 + .../org/apache/sysml/test/gpu/GPUTests.java | 52 +++++++++++++++----- .../gpu/MatrixMatrixElementWiseOpTests.java | 1 + .../test/gpu/MatrixMultiplicationOpTest.java | 1 + .../sysml/test/gpu/NeuralNetworkOpTests.java | 1 + .../org/apache/sysml/test/gpu/ReorgOpTests.java | 1 + .../sysml/test/gpu/RightIndexingTests.java | 1 + .../gpu/ScalarMatrixElementwiseOpTests.java | 1 + .../org/apache/sysml/test/gpu/UnaryOpTests.java | 1 + 14 files changed, 58 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/main/java/org/apache/sysml/hops/AggBinaryOp.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/AggBinaryOp.java b/src/main/java/org/apache/sysml/hops/AggBinaryOp.java index 30dc5e7..a7b6599 100644 --- a/src/main/java/org/apache/sysml/hops/AggBinaryOp.java +++ b/src/main/java/org/apache/sysml/hops/AggBinaryOp.java @@ -157,7 +157,7 @@ public class AggBinaryOp extends Hop implements MultiThreadedHop input2.getDim1(), input2.getDim2(), mmtsj, chain, _hasLeftPMInput ); switch( _method ){ case TSMM: - return true; + return false; // TODO: Disabling any fused transa optimization in 1.0 release. case MAPMM_CHAIN: return false; case PMM: @@ -668,8 +668,12 @@ public class AggBinaryOp extends Hop implements MultiThreadedHop if (et == ExecType.GPU) { Hop h1 = getInput().get(0); Hop h2 = getInput().get(1); - boolean leftTrans = HopRewriteUtils.isTransposeOperation(h1); - boolean rightTrans = HopRewriteUtils.isTransposeOperation(h2); + // Since GPU backend is in experimental mode, rewrite optimization can be skipped. + // CuSPARSE's cusparsecsrmm2 fails with only following parameters, but passes for all other settings: + // transa=1 transb=1 m=300 n=300 k=300 ldb=300 ldc=300 + // Hence, we disable hope rewrite optimization. + boolean leftTrans = false; // HopRewriteUtils.isTransposeOperation(h1); + boolean rightTrans = false; // HopRewriteUtils.isTransposeOperation(h2); Lop left = !leftTrans ? h1.constructLops() : h1.getInput().get(0).constructLops(); Lop right = !rightTrans ? h2.constructLops() : http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java index bbc4727..1433b5a 100644 --- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java +++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixCUDA.java @@ -480,6 +480,7 @@ public class LibMatrixCUDA { } if (ec.getGPUContext(0) != gCtx) throw new DMLRuntimeException("GPU : Invalid internal state, the GPUContext set with the ExecutionContext is not the same used to run this LibMatrixCUDA function"); + if(isInSparseFormat(gCtx, left)) { // For sparse TSMM, invoke matmult (TODO: possible performance improvement) LibMatrixCuMatMult.matmult(ec, gCtx, instName, left, left, outputName, isLeftTransposed, !isLeftTransposed); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/main/scala/org/apache/sysml/api/ml/ScriptsUtils.scala ---------------------------------------------------------------------- diff --git a/src/main/scala/org/apache/sysml/api/ml/ScriptsUtils.scala b/src/main/scala/org/apache/sysml/api/ml/ScriptsUtils.scala index 016457e..ffbdf2f 100644 --- a/src/main/scala/org/apache/sysml/api/ml/ScriptsUtils.scala +++ b/src/main/scala/org/apache/sysml/api/ml/ScriptsUtils.scala @@ -25,7 +25,7 @@ import java.io.InputStreamReader import org.apache.sysml.runtime.DMLRuntimeException object ScriptsUtils { - var systemmlHome = System.getenv("SYSTEMML_HOME") + var systemmlHome:String = null // System.getenv("SYSTEMML_HOME") type SparkDataType = org.apache.spark.sql.Dataset[_] // org.apache.spark.sql.DataFrame for Spark 1.x http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/AggregateUnaryOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/AggregateUnaryOpTests.java b/src/test/java/org/apache/sysml/test/gpu/AggregateUnaryOpTests.java index 59e9cb1..78a7c1b 100644 --- a/src/test/java/org/apache/sysml/test/gpu/AggregateUnaryOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/AggregateUnaryOpTests.java @@ -31,6 +31,7 @@ public class AggregateUnaryOpTests extends UnaryOpTestsBase { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/AppendTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/AppendTest.java b/src/test/java/org/apache/sysml/test/gpu/AppendTest.java index 930241b..f359d48 100644 --- a/src/test/java/org/apache/sysml/test/gpu/AppendTest.java +++ b/src/test/java/org/apache/sysml/test/gpu/AppendTest.java @@ -41,6 +41,7 @@ public class AppendTest extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/BinaryOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/BinaryOpTests.java b/src/test/java/org/apache/sysml/test/gpu/BinaryOpTests.java index f3d2b21..7949fcb 100644 --- a/src/test/java/org/apache/sysml/test/gpu/BinaryOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/BinaryOpTests.java @@ -37,6 +37,7 @@ public class BinaryOpTests extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/GPUTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/GPUTests.java b/src/test/java/org/apache/sysml/test/gpu/GPUTests.java index a83b110..501e545 100644 --- a/src/test/java/org/apache/sysml/test/gpu/GPUTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/GPUTests.java @@ -24,6 +24,8 @@ import java.util.Formatter; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import org.apache.spark.sql.SparkSession; import org.apache.sysml.api.mlcontext.MLContext; @@ -79,9 +81,17 @@ public abstract class GPUTests extends AutomatedTestBase { else if(FLOATING_POINT_PRECISION.equals("single")) return SINGLE_PRECISION_THRESHOLD; else throw new RuntimeException("Unsupported precision:" + FLOATING_POINT_PRECISION); } - + + // force junit to run only 1 GPU test at a time to avoid cascading failures. + Lock sequential = new ReentrantLock(); + @Override + public void setUp() { + sequential.lock(); + + } @After public void tearDown() { + sequential.unlock(); clearGPUMemory(); super.tearDown(); } @@ -242,6 +252,16 @@ public abstract class GPUTests extends AutomatedTestBase { */ private void assertEqualMatrices(Matrix expected, Matrix actual) { try { + // Faster way to compare two matrices + MLContext cpuMLC = new MLContext(spark); + String scriptStr = "num_mismatch = sum((abs(X - Y) / X) > " + getTHRESHOLD() + ");"; + Script script = ScriptFactory.dmlFromString(scriptStr).in("X", expected).in("Y", actual).out("num_mismatch"); + long num_mismatch = cpuMLC.execute(script).getLong("num_mismatch"); + cpuMLC.close(); + if(num_mismatch == 0) + return; + + // If error, print the actual incorrect values MatrixBlock expectedMB = expected.toMatrixObject().acquireRead(); MatrixBlock actualMB = actual.toMatrixObject().acquireRead(); @@ -323,19 +343,25 @@ public abstract class GPUTests extends AutomatedTestBase { */ protected List<Object> runOnGPU(SparkSession spark, String scriptStr, Map<String, Object> inputs, List<String> outStrs) { - MLContext gpuMLC = new MLContext(spark); - gpuMLC.setConfigProperty("sysml.floating.point.precision", FLOATING_POINT_PRECISION); - gpuMLC.setGPU(true); - gpuMLC.setForceGPU(true); - gpuMLC.setStatistics(true); - List<Object> outputs = new ArrayList<>(); - Script script = ScriptFactory.dmlFromString(scriptStr).in(inputs).out(outStrs); - for (String outStr : outStrs) { - Object output = gpuMLC.execute(script).get(outStr); - outputs.add(output); + // Ensure that only one instance of ml.execute runs at a time to avoid incorrect memory estimates + // and other side effects. + synchronized(GPUTests.class) { + MLContext gpuMLC = new MLContext(spark); + gpuMLC.setConfigProperty("sysml.floating.point.precision", FLOATING_POINT_PRECISION); + if(IGNORE_CLEAR_MEMORY_BUG) + gpuMLC.setConfigProperty("sysml.gpu.eager.cudaFree", "true"); + gpuMLC.setGPU(true); + gpuMLC.setForceGPU(true); + gpuMLC.setStatistics(true); + List<Object> outputs = new ArrayList<>(); + Script script = ScriptFactory.dmlFromString(scriptStr).in(inputs).out(outStrs); + for (String outStr : outStrs) { + Object output = gpuMLC.execute(script).get(outStr); + outputs.add(output); + } + gpuMLC.close(); + return outputs; } - gpuMLC.close(); - return outputs; } /** http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/MatrixMatrixElementWiseOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/MatrixMatrixElementWiseOpTests.java b/src/test/java/org/apache/sysml/test/gpu/MatrixMatrixElementWiseOpTests.java index 490befa..c949924 100644 --- a/src/test/java/org/apache/sysml/test/gpu/MatrixMatrixElementWiseOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/MatrixMatrixElementWiseOpTests.java @@ -42,6 +42,7 @@ public class MatrixMatrixElementWiseOpTests extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/MatrixMultiplicationOpTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/MatrixMultiplicationOpTest.java b/src/test/java/org/apache/sysml/test/gpu/MatrixMultiplicationOpTest.java index cbc3563..227d0e8 100644 --- a/src/test/java/org/apache/sysml/test/gpu/MatrixMultiplicationOpTest.java +++ b/src/test/java/org/apache/sysml/test/gpu/MatrixMultiplicationOpTest.java @@ -36,6 +36,7 @@ public class MatrixMultiplicationOpTest extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/NeuralNetworkOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/NeuralNetworkOpTests.java b/src/test/java/org/apache/sysml/test/gpu/NeuralNetworkOpTests.java index c57e997..d11af5e 100644 --- a/src/test/java/org/apache/sysml/test/gpu/NeuralNetworkOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/NeuralNetworkOpTests.java @@ -92,6 +92,7 @@ public class NeuralNetworkOpTests extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/ReorgOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/ReorgOpTests.java b/src/test/java/org/apache/sysml/test/gpu/ReorgOpTests.java index b5b71f8..6a11c9c 100644 --- a/src/test/java/org/apache/sysml/test/gpu/ReorgOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/ReorgOpTests.java @@ -40,6 +40,7 @@ public class ReorgOpTests extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/RightIndexingTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/RightIndexingTests.java b/src/test/java/org/apache/sysml/test/gpu/RightIndexingTests.java index 90b08ae..63cbdd1 100644 --- a/src/test/java/org/apache/sysml/test/gpu/RightIndexingTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/RightIndexingTests.java @@ -39,6 +39,7 @@ public class RightIndexingTests extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/ScalarMatrixElementwiseOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/ScalarMatrixElementwiseOpTests.java b/src/test/java/org/apache/sysml/test/gpu/ScalarMatrixElementwiseOpTests.java index 7ceeb0f..2e3321f 100644 --- a/src/test/java/org/apache/sysml/test/gpu/ScalarMatrixElementwiseOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/ScalarMatrixElementwiseOpTests.java @@ -42,6 +42,7 @@ public class ScalarMatrixElementwiseOpTests extends GPUTests { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME); http://git-wip-us.apache.org/repos/asf/systemml/blob/8c11b5d8/src/test/java/org/apache/sysml/test/gpu/UnaryOpTests.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/gpu/UnaryOpTests.java b/src/test/java/org/apache/sysml/test/gpu/UnaryOpTests.java index 510766e..9b1f79e 100644 --- a/src/test/java/org/apache/sysml/test/gpu/UnaryOpTests.java +++ b/src/test/java/org/apache/sysml/test/gpu/UnaryOpTests.java @@ -31,6 +31,7 @@ public class UnaryOpTests extends UnaryOpTestsBase { @Override public void setUp() { + super.setUp(); TestUtils.clearAssertionInformation(); addTestConfiguration(TEST_DIR, TEST_NAME); getAndLoadTestConfiguration(TEST_NAME);