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/04/30 20:16:29 UTC

incubator-systemml git commit: [SYSTEMML-591] Initial attempt to consolidate replicated compilation chain

Repository: incubator-systemml
Updated Branches:
  refs/heads/master d0ab2af19 -> 7a3e95716


[SYSTEMML-591] Initial attempt to consolidate replicated compilation chain

This only consolidates MLContext and DMLScript, but not JMLC and old
MLContext (as it is going to be removed soon).

Closes #471.


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

Branch: refs/heads/master
Commit: 7a3e95716e81c1fc3415c36c357c9d24b710e739
Parents: d0ab2af
Author: Niketan Pansare <np...@us.ibm.com>
Authored: Sun Apr 30 12:15:48 2017 -0800
Committer: Niketan Pansare <np...@us.ibm.com>
Committed: Sun Apr 30 13:15:48 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/sysml/api/DMLScript.java    | 47 ++---------
 .../apache/sysml/api/ScriptExecutorUtils.java   | 83 ++++++++++++++++++++
 .../sysml/api/mlcontext/ScriptExecutor.java     | 55 +++++--------
 3 files changed, 107 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/7a3e9571/src/main/java/org/apache/sysml/api/DMLScript.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/DMLScript.java b/src/main/java/org/apache/sysml/api/DMLScript.java
index bfac48d..7988ff0 100644
--- a/src/main/java/org/apache/sysml/api/DMLScript.java
+++ b/src/main/java/org/apache/sysml/api/DMLScript.java
@@ -88,11 +88,8 @@ import org.apache.sysml.runtime.controlprogram.context.SparkExecutionContext;
 import org.apache.sysml.runtime.controlprogram.parfor.ProgramConverter;
 import org.apache.sysml.runtime.controlprogram.parfor.stat.InfrastructureAnalyzer;
 import org.apache.sysml.runtime.controlprogram.parfor.util.IDHandler;
-import org.apache.sysml.runtime.instructions.gpu.context.GPUContext;
-import org.apache.sysml.runtime.instructions.gpu.context.GPUContextPool;
 import org.apache.sysml.runtime.io.IOUtilFunctions;
 import org.apache.sysml.runtime.matrix.CleanupMR;
-import org.apache.sysml.runtime.matrix.data.LibMatrixDNN;
 import org.apache.sysml.runtime.matrix.mapred.MRConfigurationNames;
 import org.apache.sysml.runtime.matrix.mapred.MRJobConfiguration;
 import org.apache.sysml.runtime.util.LocalFileUtils;
@@ -100,7 +97,6 @@ import org.apache.sysml.runtime.util.MapReduceTool;
 import org.apache.sysml.utils.Explain;
 import org.apache.sysml.utils.Explain.ExplainCounts;
 import org.apache.sysml.utils.Explain.ExplainType;
-import org.apache.sysml.utils.GPUStatistics;
 import org.apache.sysml.utils.Statistics;
 import org.apache.sysml.yarn.DMLAppMasterUtils;
 import org.apache.sysml.yarn.DMLYarnClientProxy;
@@ -825,53 +821,20 @@ public class DMLScript
 		
 		//double costs = CostEstimationWrapper.getTimeEstimate(rtprog, ExecutionContextFactory.createContext());
 		//System.out.println("Estimated costs: "+costs);
-
-		// Whether extra statistics useful for developers and others interested in digging
-		// into performance problems are recorded and displayed
-		GPUStatistics.DISPLAY_STATISTICS = dmlconf.getBooleanValue(DMLConfig.EXTRA_GPU_STATS);
-		LibMatrixDNN.DISPLAY_STATISTICS = dmlconf.getBooleanValue(DMLConfig.EXTRA_DNN_STATS);
-
-		// Sets the maximum number of GPUs per process, -1 for all available GPUs
-		GPUContextPool.PER_PROCESS_MAX_GPUS = dmlconf.getIntValue(DMLConfig.MAX_GPUS_PER_PROCESS);
 		
 		//Step 10: execute runtime program
-		Statistics.startRunTimer();
 		ExecutionContext ec = null;
-		GPUContext gCtx = null;
-		try 
-		{  
-			//run execute (w/ exception handling to ensure proper shutdown)
+		try {
 			ec = ExecutionContextFactory.createContext(rtprog);
-			if (DMLScript.USE_ACCELERATOR && ec != null){
-				gCtx = GPUContextPool.getFromPool();
-				if (gCtx == null) {
-					throw new DMLRuntimeException("GPU : Could not create GPUContext, either no GPU or all GPUs currently in use");
-				}
-				gCtx.initializeThread();
-				ec.setGPUContext(gCtx);
-			}
-			rtprog.execute( ec );  
-			
+			ScriptExecutorUtils.executeRuntimeProgram(rtprog, ec, dmlconf);
 		}
-		finally //ensure cleanup/shutdown
-		{
-			if(DMLScript.USE_ACCELERATOR && ec.getGPUContext() != null) {
-				GPUContextPool.returnToPool(ec.getGPUContext());
-			}
-
-			if( dmlconf.getBooleanValue(DMLConfig.CODEGEN) )
-				SpoofCompiler.cleanupCodeGenerator();
+		finally {
 			if(ec != null && ec instanceof SparkExecutionContext)
 				((SparkExecutionContext) ec).close();
-			
-			//display statistics (incl caching stats if enabled)
-			Statistics.stopRunTimer();
-			LOG.info(Statistics.display());
 			LOG.info("END DML run " + getDateTime() );
-			
 			//cleanup scratch_space and all working dirs
-			cleanupHadoopExecution( dmlconf );		
-		}	
+			cleanupHadoopExecution( dmlconf );
+		}
 	}		
 	
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/7a3e9571/src/main/java/org/apache/sysml/api/ScriptExecutorUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/ScriptExecutorUtils.java b/src/main/java/org/apache/sysml/api/ScriptExecutorUtils.java
new file mode 100644
index 0000000..543e218
--- /dev/null
+++ b/src/main/java/org/apache/sysml/api/ScriptExecutorUtils.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sysml.api;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.sysml.conf.DMLConfig;
+import org.apache.sysml.hops.codegen.SpoofCompiler;
+import org.apache.sysml.runtime.DMLRuntimeException;
+import org.apache.sysml.runtime.controlprogram.Program;
+import org.apache.sysml.runtime.controlprogram.context.ExecutionContext;
+import org.apache.sysml.runtime.instructions.gpu.context.GPUContext;
+import org.apache.sysml.runtime.instructions.gpu.context.GPUContextPool;
+import org.apache.sysml.runtime.matrix.data.LibMatrixDNN;
+import org.apache.sysml.utils.GPUStatistics;
+import org.apache.sysml.utils.Statistics;
+
+public class ScriptExecutorUtils {
+	private static final Log LOG = LogFactory.getLog(ScriptExecutorUtils.class.getName());
+	
+	/**
+	 * Execute the runtime program. This involves execution of the program
+	 * blocks that make up the runtime program and may involve dynamic
+	 * recompilation.
+	 * 
+	 * @param rtprog runtime program
+	 * @param ec execution context
+	 * @param dmlconf dml configuration
+	 * @throws DMLRuntimeException if error occurs
+	 */
+	public static void executeRuntimeProgram(Program rtprog, ExecutionContext ec, DMLConfig dmlconf) throws DMLRuntimeException {
+		// Whether extra statistics useful for developers and others interested in digging
+		// into performance problems are recorded and displayed
+		GPUStatistics.DISPLAY_STATISTICS = dmlconf.getBooleanValue(DMLConfig.EXTRA_GPU_STATS);
+		LibMatrixDNN.DISPLAY_STATISTICS = dmlconf.getBooleanValue(DMLConfig.EXTRA_DNN_STATS);
+
+		// Sets the maximum number of GPUs per process, -1 for all available GPUs
+		GPUContextPool.PER_PROCESS_MAX_GPUS = dmlconf.getIntValue(DMLConfig.MAX_GPUS_PER_PROCESS);
+		Statistics.startRunTimer();
+		GPUContext gCtx = null;
+		try {  
+			//run execute (w/ exception handling to ensure proper shutdown)
+			if (DMLScript.USE_ACCELERATOR && ec != null){
+				gCtx = GPUContextPool.getFromPool();
+				if (gCtx == null) {
+					throw new DMLRuntimeException("GPU : Could not create GPUContext, either no GPU or all GPUs currently in use");
+				}
+				gCtx.initializeThread();
+				ec.setGPUContext(gCtx);
+			}
+			rtprog.execute( ec );  
+		}
+		finally //ensure cleanup/shutdown
+		{
+			if(DMLScript.USE_ACCELERATOR && ec.getGPUContext() != null) {
+				GPUContextPool.returnToPool(ec.getGPUContext());
+			}
+			if( dmlconf.getBooleanValue(DMLConfig.CODEGEN) )
+				SpoofCompiler.cleanupCodeGenerator();
+			
+			//display statistics (incl caching stats if enabled)
+			Statistics.stopRunTimer();
+			LOG.info(Statistics.display());
+		}
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/7a3e9571/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java b/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java
index 2368c90..bb891ca 100644
--- a/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java
+++ b/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java
@@ -25,6 +25,7 @@ import java.util.Set;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sysml.api.DMLScript;
+import org.apache.sysml.api.ScriptExecutorUtils;
 import org.apache.sysml.api.jmlc.JMLCUtils;
 import org.apache.sysml.api.mlcontext.MLContext.ExplainLevel;
 import org.apache.sysml.conf.ConfigurationManager;
@@ -47,8 +48,6 @@ import org.apache.sysml.runtime.controlprogram.LocalVariableMap;
 import org.apache.sysml.runtime.controlprogram.Program;
 import org.apache.sysml.runtime.controlprogram.context.ExecutionContext;
 import org.apache.sysml.runtime.controlprogram.context.ExecutionContextFactory;
-import org.apache.sysml.runtime.instructions.gpu.context.GPUContext;
-import org.apache.sysml.runtime.instructions.gpu.context.GPUContextPool;
 import org.apache.sysml.utils.Explain;
 import org.apache.sysml.utils.Explain.ExplainCounts;
 import org.apache.sysml.utils.Explain.ExplainType;
@@ -118,7 +117,9 @@ public class ScriptExecutor {
 	protected boolean init = false;
 	protected boolean explain = false;
 	protected boolean gpu = false;
+	protected boolean oldGPU = false;
 	protected boolean statistics = false;
+	protected boolean oldStatistics = false;
 	protected ExplainLevel explainLevel;
 	protected int statisticsMaxHeavyHitters = 10;
 	protected boolean maintainSymbolTable = false;
@@ -245,18 +246,10 @@ public class ScriptExecutor {
 		if (symbolTable != null) {
 			executionContext.setVariables(symbolTable);
 		}
-		try {
-			if (gpu) {
-				GPUContext gCtx = GPUContextPool.getFromPool();
-				if (gCtx == null)
-					throw new MLContextException("GPU : no GPUs or no more free GPUs available");
-				executionContext.setGPUContext(gCtx);
-				gCtx.initializeThread();
-			}
-		} catch (DMLRuntimeException e) {
-			throw new MLContextException("GPU : Exception occurred during initialization");
-		}
-
+		oldGPU = DMLScript.USE_ACCELERATOR; 
+		oldStatistics = DMLScript.STATISTICS;
+		DMLScript.USE_ACCELERATOR = gpu;
+		DMLScript.STATISTICS = statistics;
 	}
 
 	/**
@@ -290,9 +283,6 @@ public class ScriptExecutor {
 	public MLResults execute(Script script) {
 
 		// main steps in script execution
-		if(statistics) {
-			Statistics.startRunTimer();
-		}
 		setup(script);
 		parseScript();
 		liveVariableAnalysis();
@@ -307,19 +297,19 @@ public class ScriptExecutor {
 		countCompiledMRJobsAndSparkInstructions();
 		initializeCachingAndScratchSpace();
 		cleanupRuntimeProgram();
-		createAndInitializeExecutionContext();
-		executeRuntimeProgram();
-		cleanupAfterExecution();
-
+		
+		try {
+			createAndInitializeExecutionContext();
+			executeRuntimeProgram();
+		}
+		finally {
+			cleanupAfterExecution();
+		}
+		
 		// add symbol table to MLResults
 		MLResults mlResults = new MLResults(script);
 		script.setResults(mlResults);
 
-		if (statistics) {
-			Statistics.stopRunTimer();
-			System.out.println(Statistics.display(statisticsMaxHeavyHitters));
-		}
-
 		return mlResults;
 	}
 
@@ -344,14 +334,8 @@ public class ScriptExecutor {
 	 */
 	protected void cleanupAfterExecution() {
 		restoreInputsInSymbolTable();
-		try {
-			if (gpu) {
-				GPUContext gCtx = executionContext.getGPUContext();
-				GPUContextPool.returnToPool(gCtx);
-			}
-		} catch (DMLRuntimeException e) {
-			throw new MLContextException("Exception occurred during cleanup of GPU related resources", e);
-		}
+		DMLScript.USE_ACCELERATOR = oldGPU;
+		DMLScript.STATISTICS = oldStatistics;
 	}
 
 	/**
@@ -394,7 +378,7 @@ public class ScriptExecutor {
 	 */
 	protected void executeRuntimeProgram() {
 		try {
-			runtimeProgram.execute(executionContext);
+			ScriptExecutorUtils.executeRuntimeProgram(runtimeProgram, executionContext, config);
 		} catch (DMLRuntimeException e) {
 			throw new MLContextException("Exception occurred while executing runtime program", e);
 		}
@@ -667,7 +651,6 @@ public class ScriptExecutor {
 	 */
 	public void setGPU(boolean enabled) {
 		this.gpu = enabled;
-		DMLScript.USE_ACCELERATOR = enabled;
 	}
 
 }