You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemds.apache.org by ar...@apache.org on 2020/08/10 17:55:21 UTC

[systemds] branch master updated: [SYSTEMDS-2607, 2608] Use relative timestamp for scoring

This is an automated email from the ASF dual-hosted git repository.

arnabp20 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/master by this push:
     new 8afd129  [SYSTEMDS-2607,2608] Use relative timestamp for scoring
8afd129 is described below

commit 8afd129ca97e98cf7a9d10d3e624105c11c707a7
Author: arnabp <ar...@tugraz.at>
AuthorDate: Mon Aug 10 19:47:53 2020 +0200

    [SYSTEMDS-2607,2608] Use relative timestamp for scoring
    
    This patch changes the following:
     - use timestamp relative to execution start time instead of epoch
     - remove SpilledItem class and related data structures
     - re-reading of spilled items (no deletion from disk)
---
 .../apache/sysds/runtime/lineage/LineageCache.java |  3 +-
 .../sysds/runtime/lineage/LineageCacheConfig.java  |  5 ++
 .../sysds/runtime/lineage/LineageCacheEntry.java   | 13 ++++-
 .../runtime/lineage/LineageCacheEviction.java      | 56 ++++++++++------------
 4 files changed, 45 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
index be58d79..eef8bfb 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
@@ -62,6 +62,7 @@ public class LineageCache
 	static {
 		long maxMem = InfrastructureAnalyzer.getLocalMaxMemory();
 		LineageCacheEviction.setCacheLimit((long)(CACHE_FRAC * maxMem));
+		LineageCacheEviction.setStartTimestamp();
 	}
 	
 	// Cache Synchronization Approach:
@@ -220,7 +221,7 @@ public class LineageCache
 	
 	public static boolean probe(LineageItem key) {
 		//TODO problematic as after probe the matrix might be kicked out of cache
-		boolean p = (_cache.containsKey(key) || LineageCacheEviction.spillListContains(key));
+		boolean p = _cache.containsKey(key);  // in cache or in disk
 		if (!p && DMLScript.STATISTICS && LineageCacheEviction._removelist.contains(key))
 			// The sought entry was in cache but removed later 
 			LineageCacheStatistics.incrementDelHits();
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
index f17e055..45fd34b 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
@@ -224,6 +224,11 @@ public class LineageCacheConfig
 				break;
 			case HYBRID:
 				WEIGHTS[0] = 1; WEIGHTS[1] = 0.0033;
+				// FIXME: Relative timestamp fix reduces the absolute
+				// value of the timestamp component of the scoring function
+				// to a comparatively much smaller number. W[1] needs to be
+				// re-tuned accordingly.
+				// TODO: Automatic tuning of weights.
 				break;
 		}
 		_cachepolicy = policy;
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java
index 773dce6..983572c 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java
@@ -35,6 +35,7 @@ public class LineageCacheEntry {
 	protected LineageCacheStatus _status;
 	protected LineageCacheEntry _nextEntry;
 	protected LineageItem _origItem;
+	private String _outfile = null;
 	protected double score;
 	
 	public LineageCacheEntry(LineageItem key, DataType dt, MatrixBlock Mval, ScalarObject Sval, long computetime) {
@@ -122,8 +123,18 @@ public class LineageCacheEntry {
 		_status = LineageCacheStatus.EMPTY;
 	}
 	
+	protected synchronized void setOutfile(String outfile) {
+		_outfile = outfile;
+	}
+	
+	protected synchronized String getOutfile() {
+		return _outfile;
+	}
+	
 	protected synchronized void setTimestamp() {
-		_timestamp = System.currentTimeMillis();
+		_timestamp =  System.currentTimeMillis() - LineageCacheEviction.getStartTimestamp();
+		if (_timestamp < 0)
+			throw new DMLRuntimeException ("Execution timestamp shouldn't be -ve. Key: "+_key);
 		recomputeScore();
 	}
 	
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java
index 43fa7c5..31fccc7 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java
@@ -20,7 +20,6 @@
 package org.apache.sysds.runtime.lineage;
 
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -37,8 +36,8 @@ public class LineageCacheEviction
 {
 	private static long _cachesize = 0;
 	private static long CACHE_LIMIT; //limit in bytes
+	private static long _startTimestamp = 0;
 	protected static final Set<LineageItem> _removelist = new HashSet<>();
-	private static final Map<LineageItem, SpilledItem> _spillList = new HashMap<>();
 	private static String _outdir = null;
 	private static TreeSet<LineageCacheEntry> weightedQueue = new TreeSet<>(LineageCacheConfig.LineageCacheComparator);
 	
@@ -46,7 +45,6 @@ public class LineageCacheEviction
 		// reset cache size, otherwise the cache clear leads to unusable 
 		// space which means evictions could run into endless loops
 		_cachesize = 0;
-		_spillList.clear();
 		weightedQueue.clear();
 		_outdir = null;
 		if (DMLScript.STATISTICS)
@@ -240,6 +238,14 @@ public class LineageCacheEviction
 
 	//---------------- COSTING RELATED METHODS -----------------
 
+	protected static void setStartTimestamp() {
+		_startTimestamp = System.currentTimeMillis();
+	}
+	
+	protected static long getStartTimestamp() {
+		return _startTimestamp;
+	}
+
 	private static double getDiskSpillEstimate(LineageCacheEntry e) {
 		if (!e.isMatrixValue() || e.isNullVal())
 			return 0;
@@ -299,6 +305,15 @@ public class LineageCacheEviction
 		if (entry.isNullVal())
 			throw new DMLRuntimeException ("Cannot spill null value to disk. Key: "+entry._key);
 		
+		// Do nothing if the entry is already spilled before.
+		if (entry._origItem == null && entry.getOutfile() != null)
+			return;
+		if (entry._origItem != null) {
+			LineageCacheEntry tmp = cache.get(entry._origItem); //head
+			if (tmp.getOutfile() != null)
+				return;
+		}
+		
 		long t0 = System.nanoTime();
 		if (_outdir == null) {
 			_outdir = LocalFileUtils.getUniqueWorkingDir(LocalFileUtils.CATEGORY_LINEAGE);
@@ -316,12 +331,12 @@ public class LineageCacheEviction
 		
 		// Add all the entries associated with this matrix to spillList.
 		if (entry._origItem == null) {
-			_spillList.put(entry._key, new SpilledItem(outfile));
+			entry.setOutfile(outfile);
 		}
 		else {
 			LineageCacheEntry h = cache.get(entry._origItem); //head
 			while (h != null) {
-				_spillList.put(h._key, new SpilledItem(outfile));
+				h.setOutfile(outfile);
 				h = h._nextEntry;
 			}
 		}
@@ -336,19 +351,20 @@ public class LineageCacheEviction
 		if (cache.get(key) == null)
 			throw new DMLRuntimeException ("Spilled item should present in cache. Key: "+key);
 
+		LineageCacheEntry e = cache.get(key);
 		long t0 = System.nanoTime();
 		MatrixBlock mb = null;
 		// Read from local FS
 		try {
-			mb = LocalFileUtils.readMatrixBlockFromLocal(_spillList.get(key)._outfile);
-		} catch (IOException e) {
-			throw new DMLRuntimeException ("Read from " + _spillList.get(key)._outfile + " failed.", e);
+			mb = LocalFileUtils.readMatrixBlockFromLocal(e.getOutfile());
+		} catch (IOException exp) {
+			throw new DMLRuntimeException ("Read from " + e.getOutfile() + " failed.", exp);
 		}
-		LocalFileUtils.deleteFileIfExists(_spillList.get(key)._outfile, true);
+		// Keep the entry in disk to save re-spilling.
+		//LocalFileUtils.deleteFileIfExists(_spillList.get(key)._outfile, true);
 		long t1 = System.nanoTime();
 
 		// Restore to cache
-		LineageCacheEntry e = cache.get(key);
 		e.setValue(mb);
 		if (e._origItem != null) {
 			// Restore to all the entries having the same data.
@@ -365,30 +381,10 @@ public class LineageCacheEviction
 		// Adjust disk reading speed
 		adjustReadWriteSpeed(e, ((double)(t1-t0))/1000000000, true);
 		// TODO: set cache status as RELOADED for this entry
-		_spillList.remove(key);
 		if (DMLScript.STATISTICS) {
 			LineageCacheStatistics.incrementFSReadTime(t1-t0);
 			LineageCacheStatistics.incrementFSHits();
 		}
 		return cache.get(key);
 	}
-	
-	protected static boolean spillListContains(LineageItem key) {
-		return _spillList.containsKey(key);
-	}
-
-	// ---------------- INTERNAL DATA STRUCTURES FOR EVICTION -----------------
-
-	// TODO: Remove this class, and add outfile to LineageCacheEntry.
-	private static class SpilledItem {
-		String _outfile;
-		//long _computeTime;
-		//protected LineageItem _origItem;
-
-		public SpilledItem(String outfile) {
-			_outfile = outfile;
-			//_computeTime = computetime;
-			//_origItem = origItem;
-		}
-	}
 }