Skip to content

Commit b27a3dd

Browse files
Add basic implementation of mimir logger
1 parent 47285eb commit b27a3dd

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

blocks/log/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from .log import TrainingLog
22
from .sqlite import SQLiteLog
3+
from .json import JSONLog
34

45
BACKENDS = {
56
'python': TrainingLog,
6-
'sqlite': SQLiteLog
7+
'sqlite': SQLiteLog,
8+
'mimir': JSONLog
79
}

blocks/log/json.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from mimir import Logger
2+
3+
from .log import TrainingLogBase
4+
5+
6+
class PiclableLogger(object):
7+
def __init__(self, filename, **kwargs):
8+
logger = Logger(**kwargs)
9+
self.__dict__ = logger.__dict__
10+
self.all_kwargs = kwargs
11+
self.all_kwargs['filename'] = filename
12+
self.status = {}
13+
self.iteration_status = {}
14+
15+
def __setstate__(self, state):
16+
logger = Logger(**kwargs)
17+
self.__dict__ = logger.__dict__
18+
19+
def __getstate__(self):
20+
self.flush()
21+
return self.all_kwargs
22+
23+
def flush(self):
24+
self.log({self.status['iterations_done']: self.iteration_status})
25+
self.iteration_status = {}
26+
27+
def get_record(self, time):
28+
iterations_done = self.status.get('iterations_done', -1)
29+
if time > iterations_done:
30+
self.flush()
31+
return self.iteration_status
32+
elif time < iterations_done - 1:
33+
raise ValueError('cannot get past log entries for JSON log')
34+
elif time == iterations_done:
35+
return self.iteration_status
36+
else:
37+
return self[iterations_done - time]
38+
39+
40+
class JSONLog(TrainingLogBase):
41+
def __init__(self, filename='test.jsonl.gz'):
42+
self.logger = PiclableLogger(maxlen=2, filename=filename)
43+
TrainingLogBase.__init__(self)
44+
45+
@property
46+
def status(self):
47+
return self.logger.status
48+
49+
def __getitem__(self, time):
50+
self._check_time(time)
51+
return self.logger.get_record(time)
52+
53+
def __setitem__(self, time, value):
54+
raise ValueError('cannot manually change log')

0 commit comments

Comments
 (0)