Repository: incubator-systemml
Updated Branches:
  refs/heads/master 8e5599dd9 -> 1cc219527


[SYSTEMML-1552] Allow Python mllearn estimators to force the usage of GPU

Closes #480.


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

Branch: refs/heads/master
Commit: 1cc219527c88a85b256f3c2230e06b176b4fd679
Parents: 8e5599d
Author: Niketan Pansare <[email protected]>
Authored: Mon May 1 15:55:44 2017 -0800
Committer: Niketan Pansare <[email protected]>
Committed: Mon May 1 16:55:44 2017 -0700

----------------------------------------------------------------------
 .../apache/sysml/api/mlcontext/MLContext.java   | 16 ++++++
 .../sysml/api/mlcontext/ScriptExecutor.java     | 14 +++++
 src/main/python/systemml/mlcontext.py           | 23 ++++++++
 src/main/python/systemml/mllearn/estimators.py  | 60 ++++++++++++++++++--
 .../sysml/api/ml/BaseSystemMLClassifier.scala   |  8 ++-
 5 files changed, 116 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/1cc21952/src/main/java/org/apache/sysml/api/mlcontext/MLContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/mlcontext/MLContext.java 
b/src/main/java/org/apache/sysml/api/mlcontext/MLContext.java
index 41df7fd..7887b7b 100644
--- a/src/main/java/org/apache/sysml/api/mlcontext/MLContext.java
+++ b/src/main/java/org/apache/sysml/api/mlcontext/MLContext.java
@@ -98,6 +98,11 @@ public class MLContext {
         * Whether or not GPU mode should be enabled
         */
        private boolean gpu = false;
+       
+       /**
+        * Whether or not GPU mode should be force
+        */
+       private boolean forceGPU = false;
 
        /**
         * The number of heavy hitters that are printed as part of the 
statistics
@@ -273,6 +278,7 @@ public class MLContext {
                scriptExecutor.setExplain(explain);
                scriptExecutor.setExplainLevel(explainLevel);
                scriptExecutor.setGPU(gpu);
+               scriptExecutor.setForceGPU(forceGPU);
                scriptExecutor.setStatistics(statistics);
                
scriptExecutor.setStatisticsMaxHeavyHitters(statisticsMaxHeavyHitters);
                scriptExecutor.setInit(scriptHistoryStrings.isEmpty());
@@ -419,6 +425,16 @@ public class MLContext {
        public void setGPU(boolean enable) {
                this.gpu = enable;
        }
+       
+       /**
+        * Whether or not to explicitly "force" the usage of GPU.
+        * If a GPU is not available, and the GPU mode is set or if available 
memory on GPU is less, SystemML will crash when the program is run.
+        * @param enable
+        *                                      true if needs to be enabled, 
false otherwise
+        */
+       public void setForceGPU(boolean enable) {
+               this.forceGPU = enable;
+       }
 
        /**
         * Whether or not the GPU mode is enabled.

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/1cc21952/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 bb891ca..2044875 100644
--- a/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java
+++ b/src/main/java/org/apache/sysml/api/mlcontext/ScriptExecutor.java
@@ -118,6 +118,8 @@ public class ScriptExecutor {
        protected boolean explain = false;
        protected boolean gpu = false;
        protected boolean oldGPU = false;
+       protected boolean forceGPU = false;
+       protected boolean oldForceGPU = false;
        protected boolean statistics = false;
        protected boolean oldStatistics = false;
        protected ExplainLevel explainLevel;
@@ -248,7 +250,9 @@ public class ScriptExecutor {
                }
                oldGPU = DMLScript.USE_ACCELERATOR; 
                oldStatistics = DMLScript.STATISTICS;
+               oldForceGPU = DMLScript.FORCE_ACCELERATOR;
                DMLScript.USE_ACCELERATOR = gpu;
+               DMLScript.FORCE_ACCELERATOR = forceGPU;
                DMLScript.STATISTICS = statistics;
        }
 
@@ -335,6 +339,7 @@ public class ScriptExecutor {
        protected void cleanupAfterExecution() {
                restoreInputsInSymbolTable();
                DMLScript.USE_ACCELERATOR = oldGPU;
+               DMLScript.FORCE_ACCELERATOR = oldForceGPU;
                DMLScript.STATISTICS = oldStatistics;
        }
 
@@ -652,5 +657,14 @@ public class ScriptExecutor {
        public void setGPU(boolean enabled) {
                this.gpu = enabled;
        }
+       
+       /**
+        * Whether or not to force GPU usage
+        * @param enabled
+        *                                      true if enabled, false otherwise
+        */
+       public void setForceGPU(boolean enabled) {
+               this.forceGPU = enabled;
+       }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/1cc21952/src/main/python/systemml/mlcontext.py
----------------------------------------------------------------------
diff --git a/src/main/python/systemml/mlcontext.py 
b/src/main/python/systemml/mlcontext.py
index 5619623..fc6d75c 100644
--- a/src/main/python/systemml/mlcontext.py
+++ b/src/main/python/systemml/mlcontext.py
@@ -362,6 +362,17 @@ class MLContext(object):
         self._ml.setGPU(bool(enable))
         return self
     
+    def setForceGPU(self, enable):
+        """
+        Whether or not to force the usage of GPU operators.
+
+        Parameters
+        ----------
+        enable: boolean
+        """
+        self._ml.setForceGPU(bool(enable))
+        return self
+        
     def setStatisticsMaxHeavyHitters(self, maxHeavyHitters):
         """
         The maximum number of heavy hitters that are printed as part of the 
statistics.
@@ -397,6 +408,18 @@ class MLContext(object):
         self._ml.setExplainLevel(explainLevel)
         return self
 
+    def setConfigProperty(self, propertyName, propertyValue):
+        """
+        Set configuration property, such as setConfigProperty("localtmpdir", 
"/tmp/systemml").
+
+        Parameters
+        ----------
+        propertyName: String
+        propertyValue: String
+        """
+        self._ml.setConfigProperty(propertyName, propertyValue)
+        return self
+    
     def version(self):
         """Display the project version."""
         return self._ml.version()

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/1cc21952/src/main/python/systemml/mllearn/estimators.py
----------------------------------------------------------------------
diff --git a/src/main/python/systemml/mllearn/estimators.py 
b/src/main/python/systemml/mllearn/estimators.py
index 195ed9d..deed4c2 100644
--- a/src/main/python/systemml/mllearn/estimators.py
+++ b/src/main/python/systemml/mllearn/estimators.py
@@ -67,19 +67,71 @@ class BaseSystemMLEstimator(Estimator):
         """
         self.label_col = colName
 
-    def setGPU(self, enableGPU):
-        self.estimator.setGPU(enableGPU)
+    def setGPU(self, enable):
+        """
+        Whether or not to enable GPU.
+
+        Parameters
+        ----------
+        enable: boolean
+        """
+        self.estimator.setGPU(enable)
         return self
     
+    def setForceGPU(self, enable):
+        """
+        Whether or not to force the usage of GPU operators.
+
+        Parameters
+        ----------
+        enable: boolean
+        """
+        self.estimator.setForceGPU(enable)
+        return self
+        
     def setExplain(self, explain):
+        """
+        Explanation about the program. Mainly intended for developers.
+
+        Parameters
+        ----------
+        explain: boolean
+        """
         self.estimator.setExplain(explain)
         return self
             
-    def setStatistics(self, stat):
-        self.estimator.setStatistics(stat)
+    def setStatistics(self, statistics):
+        """
+        Whether or not to output statistics (such as execution time, elapsed 
time)
+        about script executions.
+
+        Parameters
+        ----------
+        statistics: boolean
+        """
+        self.estimator.setStatistics(statistics)
         return self
     
+    def setStatisticsMaxHeavyHitters(self, maxHeavyHitters):
+        """
+        The maximum number of heavy hitters that are printed as part of the 
statistics.
+
+        Parameters
+        ----------
+        maxHeavyHitters: int
+        """
+        self.estimator.setStatisticsMaxHeavyHitters(maxHeavyHitters)
+        return self
+        
     def setConfigProperty(self, propertyName, propertyValue):
+        """
+        Set configuration property, such as setConfigProperty("localtmpdir", 
"/tmp/systemml").
+
+        Parameters
+        ----------
+        propertyName: String
+        propertyValue: String
+        """
         self.estimator.setConfigProperty(propertyName, propertyValue)
         return self
     

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/1cc21952/src/main/scala/org/apache/sysml/api/ml/BaseSystemMLClassifier.scala
----------------------------------------------------------------------
diff --git 
a/src/main/scala/org/apache/sysml/api/ml/BaseSystemMLClassifier.scala 
b/src/main/scala/org/apache/sysml/api/ml/BaseSystemMLClassifier.scala
index a104c5c..2dbcc03 100644
--- a/src/main/scala/org/apache/sysml/api/ml/BaseSystemMLClassifier.scala
+++ b/src/main/scala/org/apache/sysml/api/ml/BaseSystemMLClassifier.scala
@@ -69,18 +69,24 @@ trait HasRegParam extends Params {
 
 trait BaseSystemMLEstimatorOrModel {
   var enableGPU:Boolean = false
+  var forceGPU:Boolean = false
   var explain:Boolean = false
   var statistics:Boolean = false
+  var statisticsMaxHeavyHitters:Int = 10
   val config:HashMap[String, String] = new HashMap[String, String]()
   def setGPU(enableGPU1:Boolean):BaseSystemMLEstimatorOrModel = { enableGPU = 
enableGPU1; this}
+  def setForceGPU(enableGPU1:Boolean):BaseSystemMLEstimatorOrModel = { 
forceGPU = enableGPU1; this}
   def setExplain(explain1:Boolean):BaseSystemMLEstimatorOrModel = { explain = 
explain1; this}
   def setStatistics(statistics1:Boolean):BaseSystemMLEstimatorOrModel = { 
statistics = statistics1; this}
+  def 
setStatisticsMaxHeavyHitters(statisticsMaxHeavyHitters1:Int):BaseSystemMLEstimatorOrModel
 = { statisticsMaxHeavyHitters = statisticsMaxHeavyHitters1; this}
   def setConfigProperty(key:String, value:String):BaseSystemMLEstimatorOrModel 
= { config.put(key, value); this}
   def updateML(ml:MLContext):Unit = {
     ml.setGPU(enableGPU); ml.setExplain(explain); 
ml.setStatistics(statistics); config.map(x => ml.setConfigProperty(x._1, x._2))
   }
   def 
copyProperties(other:BaseSystemMLEstimatorOrModel):BaseSystemMLEstimatorOrModel 
= {
-    other.setGPU(enableGPU); other.setExplain(explain); 
other.setStatistics(statistics); config.map(x => other.setConfigProperty(x._1, 
x._2))
+    other.setGPU(enableGPU); other.setForceGPU(forceGPU);
+    other.setExplain(explain); other.setStatistics(statistics); 
other.setStatisticsMaxHeavyHitters(statisticsMaxHeavyHitters);
+    config.map(x => other.setConfigProperty(x._1, x._2))
     return other
   }
 }

Reply via email to