You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2018/08/06 00:55:36 UTC

systemml git commit: [SYSTEMML-2299] Cleanup paramserv language API, incl defaults

Repository: systemml
Updated Branches:
  refs/heads/master 19b310c6b -> 78e9d836e


[SYSTEMML-2299] Cleanup paramserv language API, incl defaults

Closes #817.


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

Branch: refs/heads/master
Commit: 78e9d836ea16296fcf3bbd647b60638ce2bc24c3
Parents: 19b310c
Author: EdgarLGB <gu...@atos.net>
Authored: Sun Aug 5 14:36:09 2018 +0200
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sun Aug 5 17:56:22 2018 -0700

----------------------------------------------------------------------
 .../ParameterizedBuiltinFunctionExpression.java | 10 ++--
 .../controlprogram/paramserv/LocalPSWorker.java |  5 +-
 .../controlprogram/paramserv/PSWorker.java      |  8 +--
 .../cp/ParamservBuiltinCPInstruction.java       | 58 ++++++++++----------
 .../paramserv/mnist_lenet_paramserv.dml         | 10 ++--
 .../mnist_lenet_paramserv_minimum_version.dml   | 12 ++--
 .../paramserv-without-optional-args.dml         | 12 ++++
 7 files changed, 59 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
index 33c5b0e..7c516e6 100644
--- a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
@@ -330,12 +330,12 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
 		checkDataType(fname, Statement.PS_MODEL, DataType.LIST, conditional); // check the model which is the only non-parameterized argument
 		checkDataType(fname, Statement.PS_FEATURES, DataType.MATRIX, conditional);
 		checkDataType(fname, Statement.PS_LABELS, DataType.MATRIX, conditional);
-		checkDataType(fname, Statement.PS_VAL_FEATURES, DataType.MATRIX, conditional);
-		checkDataType(fname, Statement.PS_VAL_LABELS, DataType.MATRIX, conditional);
+		checkDataValueType(true, fname, Statement.PS_VAL_FEATURES, DataType.MATRIX, ValueType.DOUBLE, conditional);
+		checkDataValueType(true, fname, Statement.PS_VAL_LABELS, DataType.MATRIX, ValueType.DOUBLE, conditional);
 		checkDataValueType(false, fname, Statement.PS_UPDATE_FUN, DataType.SCALAR, ValueType.STRING, conditional);
 		checkDataValueType(false, fname, Statement.PS_AGGREGATION_FUN, DataType.SCALAR, ValueType.STRING, conditional);
-		checkStringParam(false, fname, Statement.PS_MODE, conditional);
-		checkStringParam(false, fname, Statement.PS_UPDATE_TYPE, conditional);
+		checkStringParam(true, fname, Statement.PS_MODE, conditional);
+		checkStringParam(true, fname, Statement.PS_UPDATE_TYPE, conditional);
 		checkStringParam(true, fname, Statement.PS_FREQUENCY, conditional);
 		checkDataValueType(false, fname, Statement.PS_EPOCHS, DataType.SCALAR, ValueType.INT, conditional);
 		checkDataValueType(true, fname, Statement.PS_BATCH_SIZE, DataType.SCALAR, ValueType.INT, conditional);
@@ -860,7 +860,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
 			if (optional) {
 				return;
 			}
-			raiseValidateError(String.format("Named parameter '%s' is missing. Please specify the input.", fname),
+			raiseValidateError(String.format("Named parameter '%s' is missing. Please specify the input.", pname),
 					conditional, LanguageErrorCodes.INVALID_PARAMETERS);
 		} else if (data.getOutput().getDataType() != dt || data.getOutput().getValueType() != vt)
 			raiseValidateError(String.format("Input to %s::%s must be of type '%s', '%s'.It should not be of type '%s', '%s'.",

http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/LocalPSWorker.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/LocalPSWorker.java b/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/LocalPSWorker.java
index 04050b2..5ab4e07 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/LocalPSWorker.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/LocalPSWorker.java
@@ -39,9 +39,8 @@ public class LocalPSWorker extends PSWorker implements Callable<Void> {
 
 	protected LocalPSWorker() {}
 
-	public LocalPSWorker(int workerID, String updFunc, Statement.PSFrequency freq, int epochs, long batchSize,
-		MatrixObject valFeatures, MatrixObject valLabels, ExecutionContext ec, ParamServer ps) {
-		super(workerID, updFunc, freq, epochs, batchSize, valFeatures, valLabels, ec, ps);
+	public LocalPSWorker(int workerID, String updFunc, Statement.PSFrequency freq, int epochs, long batchSize, ExecutionContext ec, ParamServer ps) {
+		super(workerID, updFunc, freq, epochs, batchSize, ec, ps);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/PSWorker.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/PSWorker.java b/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/PSWorker.java
index 63600d1..7c73a71 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/PSWorker.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/paramserv/PSWorker.java
@@ -50,23 +50,17 @@ public abstract class PSWorker implements Serializable
 	protected FunctionCallCPInstruction _inst;
 	protected MatrixObject _features;
 	protected MatrixObject _labels;
-
-	protected MatrixObject _valFeatures;
-	protected MatrixObject _valLabels;
 	protected String _updFunc;
 	protected Statement.PSFrequency _freq;
 
 	protected PSWorker() {}
 
-	protected PSWorker(int workerID, String updFunc, Statement.PSFrequency freq, int epochs, long batchSize,
-		MatrixObject valFeatures, MatrixObject valLabels, ExecutionContext ec, ParamServer ps) {
+	protected PSWorker(int workerID, String updFunc, Statement.PSFrequency freq, int epochs, long batchSize, ExecutionContext ec, ParamServer ps) {
 		_workerID = workerID;
 		_updFunc = updFunc;
 		_freq = freq;
 		_epochs = epochs;
 		_batchSize = batchSize;
-		_valFeatures = valFeatures;
-		_valLabels = valLabels;
 		_ec = ec;
 		_ps = ps;
 		setupUpdateFunction(updFunc, ec);

http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
index 83ec3f7..b6bb6fb 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
@@ -36,8 +36,6 @@ import static org.apache.sysml.parser.Statement.PS_PARALLELISM;
 import static org.apache.sysml.parser.Statement.PS_SCHEME;
 import static org.apache.sysml.parser.Statement.PS_UPDATE_FUN;
 import static org.apache.sysml.parser.Statement.PS_UPDATE_TYPE;
-import static org.apache.sysml.parser.Statement.PS_VAL_FEATURES;
-import static org.apache.sysml.parser.Statement.PS_VAL_LABELS;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -65,14 +63,14 @@ import org.apache.sysml.runtime.controlprogram.LocalVariableMap;
 import org.apache.sysml.runtime.controlprogram.caching.MatrixObject;
 import org.apache.sysml.runtime.controlprogram.context.ExecutionContext;
 import org.apache.sysml.runtime.controlprogram.context.SparkExecutionContext;
-import org.apache.sysml.runtime.controlprogram.paramserv.dp.DataPartitionLocalScheme;
-import org.apache.sysml.runtime.controlprogram.paramserv.dp.LocalDataPartitioner;
 import org.apache.sysml.runtime.controlprogram.paramserv.LocalPSWorker;
 import org.apache.sysml.runtime.controlprogram.paramserv.LocalParamServer;
 import org.apache.sysml.runtime.controlprogram.paramserv.ParamServer;
 import org.apache.sysml.runtime.controlprogram.paramserv.ParamservUtils;
 import org.apache.sysml.runtime.controlprogram.paramserv.SparkPSBody;
 import org.apache.sysml.runtime.controlprogram.paramserv.SparkPSWorker;
+import org.apache.sysml.runtime.controlprogram.paramserv.dp.DataPartitionLocalScheme;
+import org.apache.sysml.runtime.controlprogram.paramserv.dp.LocalDataPartitioner;
 import org.apache.sysml.runtime.controlprogram.paramserv.rpc.PSRpcFactory;
 import org.apache.sysml.runtime.controlprogram.parfor.stat.InfrastructureAnalyzer;
 import org.apache.sysml.runtime.controlprogram.parfor.stat.Timing;
@@ -83,8 +81,10 @@ import org.apache.sysml.utils.Statistics;
 public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruction {
 
 	private static final int DEFAULT_BATCH_SIZE = 64;
-	private static final PSFrequency DEFAULT_UPDATE_FREQUENCY = PSFrequency.BATCH;
+	private static final PSFrequency DEFAULT_UPDATE_FREQUENCY = PSFrequency.EPOCH;
 	private static final PSScheme DEFAULT_SCHEME = PSScheme.DISJOINT_CONTIGUOUS;
+	private static final PSModeType DEFAULT_MODE = PSModeType.LOCAL;
+	private static final PSUpdateType DEFAULT_TYPE = PSUpdateType.ASP;
 
 	//internal local debug level
 	private static final boolean LDEBUG = false;
@@ -113,13 +113,14 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 			case REMOTE_SPARK:
 				runOnSpark((SparkExecutionContext) ec, mode);
 				break;
+			default:
+				throw new DMLRuntimeException(String.format("Paramserv func: not support mode %s", mode));
 		}
 	}
 
 	private void runOnSpark(SparkExecutionContext sec, PSModeType mode) {
 		Timing tSetup = DMLScript.STATISTICS ? new Timing(true) : null;
 
-		PSScheme scheme = getScheme();
 		int workerNum = getWorkerNum(mode);
 		String updFunc = getParam(PS_UPDATE_FUN);
 		String aggFunc = getParam(PS_AGGREGATION_FUN);
@@ -129,9 +130,6 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 		// Level of par is 1 in spark backend because one worker will be launched per task
 		ExecutionContext newEC = ParamservUtils.createExecutionContext(sec, newVarsMap, updFunc, aggFunc, 1);
 
-		MatrixObject features = sec.getMatrixObject(getParam(PS_FEATURES));
-		MatrixObject labels = sec.getMatrixObject(getParam(PS_LABELS));
-
 		// Create the agg service's execution context
 		ExecutionContext aggServiceEC = ParamservUtils.copyExecutionContext(newEC, 1).get(0);
 
@@ -172,24 +170,25 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 		if (DMLScript.STATISTICS)
 			Statistics.accPSSetupTime((long) tSetup.stop());
 
+		MatrixObject features = sec.getMatrixObject(getParam(PS_FEATURES));
+		MatrixObject labels = sec.getMatrixObject(getParam(PS_LABELS));
 		try {
-			ParamservUtils.doPartitionOnSpark(sec, features, labels, scheme, workerNum) // Do data partitioning
+			ParamservUtils.doPartitionOnSpark(sec, features, labels, getScheme(), workerNum) // Do data partitioning
 				.foreach(worker); // Run remote workers
 		} catch (Exception e) {
 			throw new DMLRuntimeException("Paramserv function failed: ", e);
 		} finally {
-			// Stop the netty server
-			server.close();
+			server.close(); // Stop the netty server
 		}
 
 		// Accumulate the statistics for remote workers
 		if (DMLScript.STATISTICS) {
-			Statistics.accPSSetupTime(aSetup.value().longValue());
-			Statistics.incWorkerNumber(aWorker.value().longValue());
-			Statistics.accPSLocalModelUpdateTime(aUpdate.value().longValue());
-			Statistics.accPSBatchIndexingTime(aIndex.value().longValue());
-			Statistics.accPSGradientComputeTime(aGrad.value().longValue());
-			Statistics.accPSRpcRequestTime(aRPC.value().longValue());
+			Statistics.accPSSetupTime(aSetup.value());
+			Statistics.incWorkerNumber(aWorker.value());
+			Statistics.accPSLocalModelUpdateTime(aUpdate.value());
+			Statistics.accPSBatchIndexingTime(aIndex.value());
+			Statistics.accPSGradientComputeTime(aGrad.value());
+			Statistics.accPSRpcRequestTime(aRPC.value());
 		}
 
 		// Fetch the final model from ps
@@ -205,11 +204,9 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 		String updFunc = getParam(PS_UPDATE_FUN);
 		String aggFunc = getParam(PS_AGGREGATION_FUN);
 
-		int k = getParLevel(workerNum);
-
 		// Get the compiled execution context
 		LocalVariableMap newVarsMap = createVarsMap(ec);
-		ExecutionContext newEC = ParamservUtils.createExecutionContext(ec, newVarsMap, updFunc, aggFunc, k);
+		ExecutionContext newEC = ParamservUtils.createExecutionContext(ec, newVarsMap, updFunc, aggFunc, getParLevel(workerNum));
 
 		// Create workers' execution context
 		List<ExecutionContext> workerECs = ParamservUtils.copyExecutionContext(newEC, workerNum);
@@ -219,17 +216,14 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 
 		PSFrequency freq = getFrequency();
 		PSUpdateType updateType = getUpdateType();
-		int epochs = getEpochs();
 
 		// Create the parameter server
 		ListObject model = ec.getListObject(getParam(PS_MODEL));
 		ParamServer ps = createPS(mode, aggFunc, updateType, workerNum, model, aggServiceEC);
 
 		// Create the local workers
-		MatrixObject valFeatures = ec.getMatrixObject(getParam(PS_VAL_FEATURES));
-		MatrixObject valLabels = ec.getMatrixObject(getParam(PS_VAL_LABELS));
 		List<LocalPSWorker> workers = IntStream.range(0, workerNum)
-			.mapToObj(i -> new LocalPSWorker(i, updFunc, freq, epochs, getBatchSize(), valFeatures, valLabels, workerECs.get(i), ps))
+			.mapToObj(i -> new LocalPSWorker(i, updFunc, freq, getEpochs(), getBatchSize(), workerECs.get(i), ps))
 			.collect(Collectors.toList());
 
 		// Do data partition
@@ -251,8 +245,7 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 			for (Future<Void> ret : es.invokeAll(workers))
 				ret.get(); //error handling
 			// Fetch the final model from ps
-			ListObject result = ps.getResult();
-			ec.setVariable(output.getName(), result);
+			ec.setVariable(output.getName(), ps.getResult());
 		} catch (InterruptedException | ExecutionException e) {
 			throw new DMLRuntimeException("ParamservBuiltinCPInstruction: some error occurred: ", e);
 		} finally {
@@ -271,6 +264,9 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 	}
 
 	private PSModeType getPSMode() {
+		if (!getParameterMap().containsKey(PS_MODE)) {
+			return DEFAULT_MODE;
+		}
 		PSModeType mode;
 		try {
 			mode = PSModeType.valueOf(getParam(PS_MODE));
@@ -294,6 +290,9 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 	}
 
 	private PSUpdateType getUpdateType() {
+		if (!getParameterMap().containsKey(PS_UPDATE_TYPE)) {
+			return DEFAULT_TYPE;
+		}
 		PSUpdateType updType;
 		try {
 			updType = PSUpdateType.valueOf(getParam(PS_UPDATE_TYPE));
@@ -301,7 +300,7 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 			throw new DMLRuntimeException(String.format("Paramserv function: not support update type '%s'.", getParam(PS_UPDATE_TYPE)));
 		}
 		if (updType == PSUpdateType.SSP)
-			throw new DMLRuntimeException("Not support update type SSP.");
+			throw new DMLRuntimeException("Paramserv function: Not support update type SSP.");
 		return updType;
 	}
 
@@ -318,7 +317,7 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 	}
 
 	private int getRemainingCores() {
-		return InfrastructureAnalyzer.getLocalParallelism() - 1;
+		return InfrastructureAnalyzer.getLocalParallelism();
 	}
 
 	/**
@@ -330,7 +329,6 @@ public class ParamservBuiltinCPInstruction extends ParameterizedBuiltinCPInstruc
 	private int getWorkerNum(PSModeType mode) {
 		switch (mode) {
 			case LOCAL:
-				// default worker number: available cores - 1 (assign one process for agg service)
 				return getParameterMap().containsKey(PS_PARALLELISM) ?
 					Integer.valueOf(getParam(PS_PARALLELISM)) : getRemainingCores();
 			case REMOTE_SPARK:

http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/test/scripts/functions/paramserv/mnist_lenet_paramserv.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/paramserv/mnist_lenet_paramserv.dml b/src/test/scripts/functions/paramserv/mnist_lenet_paramserv.dml
index 5ccda12..028440f 100644
--- a/src/test/scripts/functions/paramserv/mnist_lenet_paramserv.dml
+++ b/src/test/scripts/functions/paramserv/mnist_lenet_paramserv.dml
@@ -123,10 +123,10 @@ train = function(matrix[double] X, matrix[double] Y,
 # Should always use 'features' (batch features), 'labels' (batch labels),
 # 'hyperparams', 'model' as the arguments
 # and return the gradients of type list
-gradients = function(matrix[double] features,
-                     matrix[double] labels,
+gradients = function(list[unknown] model,
                      list[unknown] hyperparams,
-                     list[unknown] model)
+                     matrix[double] features,
+                     matrix[double] labels)
           return (list[unknown] gradients) {
 
   C = as.integer(as.scalar(hyperparams["C"]))
@@ -205,8 +205,8 @@ gradients = function(matrix[double] features,
 # Should use the arguments named 'model', 'gradients', 'hyperparams'
 # and return always a model of type list
 aggregation = function(list[unknown] model,
-                       list[unknown] gradients,
-                       list[unknown] hyperparams)
+                       list[unknown] hyperparams,
+                       list[unknown] gradients)
    return (list[unknown] modelResult) {
      W1 = as.matrix(model[1])
      W2 = as.matrix(model[2])

http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml b/src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml
index e7056f0..25ca23e 100644
--- a/src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml
+++ b/src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml
@@ -107,7 +107,7 @@ train = function(matrix[double] X, matrix[double] Y,
   params = list(lr=lr, mu=mu, decay=decay, C=C, Hin=Hin, Win=Win, Hf=Hf, Wf=Wf, stride=stride, pad=pad, lambda=lambda, F1=F1, F2=F2, N3=N3)
 
   # Use paramserv function
-  modelList2 = paramserv(model=modelList, features=X, labels=Y, val_features=X_val, val_labels=Y_val, upd="./src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml::gradients", agg="./src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml::aggregation", mode="LOCAL", utype="BSP", epochs=epochs, hyperparams=params)
+  modelList2 = paramserv(model=modelList, features=X, labels=Y, upd="./src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml::gradients", agg="./src/test/scripts/functions/paramserv/mnist_lenet_paramserv_minimum_version.dml::aggregation", epochs=epochs, hyperparams=params)
 
   W1 = as.matrix(modelList2[1])
   W2 = as.matrix(modelList2[2])
@@ -120,10 +120,10 @@ train = function(matrix[double] X, matrix[double] Y,
 
 }
 
-gradients = function(matrix[double] features,
-                     matrix[double] labels,
+gradients = function(list[unknown] model,
                      list[unknown] hyperparams,
-                     list[unknown] model)
+                     matrix[double] features,
+                     matrix[double] labels)
           return (list[unknown] gradients) {
 
   C = as.integer(as.scalar(hyperparams["C"]))
@@ -200,8 +200,8 @@ gradients = function(matrix[double] features,
 }
 
 aggregation = function(list[unknown] model,
-                       list[unknown] gradients,
-                       list[unknown] hyperparams)
+                       list[unknown] hyperparams,
+                       list[unknown] gradients)
    return (list[unknown] modelResult) {
      W1 = as.matrix(model[1])
      W2 = as.matrix(model[2])

http://git-wip-us.apache.org/repos/asf/systemml/blob/78e9d836/src/test/scripts/functions/paramserv/paramserv-without-optional-args.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/paramserv/paramserv-without-optional-args.dml b/src/test/scripts/functions/paramserv/paramserv-without-optional-args.dml
index 6d06ce2..425d364 100644
--- a/src/test/scripts/functions/paramserv/paramserv-without-optional-args.dml
+++ b/src/test/scripts/functions/paramserv/paramserv-without-optional-args.dml
@@ -38,6 +38,18 @@ e2 = "element2"
 params = list(e2=e2)
 
 # Use paramserv function
+# Remove the optional "val_features" and "val_labels"
+modelList2 = paramserv(model=modelList, features=X, labels=Y, upd="gradients", agg="aggregation", mode="REMOTE_SPARK", utype="BSP", freq="EPOCH", epochs=100, batchsize=64, k=7, scheme="DISJOINT_ROUND_ROBIN", checkpointing="EPOCH")
+
+# Remove the optional "mode"
+modelList2 = paramserv(model=modelList, features=X, labels=Y, upd="gradients", agg="aggregation", utype="BSP", freq="EPOCH", epochs=100, batchsize=64, k=7, scheme="DISJOINT_ROUND_ROBIN", checkpointing="EPOCH")
+
+# Remove the optional "utype"
+modelList2 = paramserv(model=modelList, features=X, labels=Y, upd="gradients", agg="aggregation", epochs=100, freq="EPOCH", batchsize=64, k=7, scheme="DISJOINT_ROUND_ROBIN", checkpointing="EPOCH")
+
+# Remove the optional "freq"
+modelList2 = paramserv(model=modelList, features=X, labels=Y, upd="gradients", agg="aggregation", utype="BSP", epochs=100, batchsize=64, k=7, scheme="DISJOINT_ROUND_ROBIN", checkpointing="EPOCH")
+
 # Remove the optional "hyperparams"
 modelList2 = paramserv(model=modelList, features=X, labels=Y, val_features=X_val, val_labels=Y_val, upd="gradients", agg="aggregation", mode="REMOTE_SPARK", utype="BSP", freq="EPOCH", epochs=100, batchsize=64, k=7, scheme="DISJOINT_ROUND_ROBIN", checkpointing="EPOCH")