Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add LogReader #827

Merged
merged 2 commits into from
Oct 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions visualdl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import os

from visualdl.writer.writer import LogWriter # noqa
from visualdl.reader.reader import LogReader
from visualdl.version import vdl_version as __version__
from visualdl.utils.dir import init_vdl_config

Expand Down
6 changes: 6 additions & 0 deletions visualdl/component/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,11 @@
},
"graph": {
"enabled": False
},
"pr_curve": {
"enabled": False
},
"meta_data": {
"enabled": False
}
}
90 changes: 66 additions & 24 deletions visualdl/reader/reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# =======================================================================
import os
import collections
from functools import partial
from visualdl.io import bfile
from visualdl.component import components
from visualdl.reader.record_reader import RecordReader
Expand Down Expand Up @@ -40,7 +41,7 @@ class LogReader(object):

"""

def __init__(self, logdir):
def __init__(self, logdir='', file_name=''):
"""Instance of LogReader

Args:
Expand All @@ -59,13 +60,23 @@ def __init__(self, logdir):
self.tags2name = {}

self.file_readers = {}
self._environments = components
self.data_manager = default_data_manager
self.load_new_data(update=True)
self._a_tags = {}

self._model = ""
if file_name:
self._log_data = collections.defaultdict(lambda: collections.defaultdict(list))
self.get_file_reader(file_name=file_name)
remain = self.get_remain()
self.read_log_data(remain=remain)

components_name = components.keys()

for name in components_name:
exec("self.get_%s=partial(self.get_data, '%s')" % (name, name))
elif logdir:
self.data_manager = default_data_manager
self.load_new_data(update=True)
self._a_tags = {}

self._model = ""

@property
def model(self):
Expand All @@ -87,6 +98,19 @@ def model(self, model_path):
def logdir(self):
return self.dir

def _get_log_tags(self):
component_keys = self._log_data.keys()
log_tags = {}
for key in component_keys:
log_tags[key] = list(self._log_data[key].keys())
return log_tags

def get_tags(self):
return self._get_log_tags()

def get_data(self, component, tag):
return self._log_data[component][tag]

def parse_from_bin(self, record_bin):
"""Register to self._tags by component type.

Expand Down Expand Up @@ -134,21 +158,6 @@ def get_all_walk(self):
for root, dirs, files in bfile.walk(dir):
self.walks.update({root: files})

def components_listing(self):
"""Get available component types.

Indicates what components are included.

Returns:
self._environments: A dict like `{"image": False, "scalar":
True}`
"""
keys_enable = self.data_manager.get_keys()
for key in self._environments.keys():
if key in keys_enable:
self._environments[key].update({"enable": True})
return self._environments

def logs(self, update=False):
"""Get logs.

Expand Down Expand Up @@ -191,7 +200,20 @@ def get_log_reader(self, dir, log):
self.reader = self.readers[filepath]
return self.reader

def _register_reader(self, path, dir):
def get_file_reader(self, file_name):
"""Get file reader for specified vdl log file.

Get instance of class RecordReader base on BFile.

Args:
file_name: Vdl log file name.
"""
self._register_reader(file_name)
self.reader = self.readers[file_name]
self.reader.dir = file_name
return self.reader

def _register_reader(self, path, dir=None):
if path not in list(self.readers.keys()):
reader = RecordReader(filepath=path, dir=dir)
self.readers[path] = reader
Expand All @@ -215,10 +237,10 @@ def add_remain(self):
"""
for reader in self.readers.values():
self.reader = reader

remain = self.reader.get_remain()
for item in remain:
component, dir, tag, record = self.parse_from_bin(item)

self.data_manager.add_item(component, self.reader.dir, tag,
record)

Expand All @@ -229,6 +251,20 @@ def get_remain(self):
raise RuntimeError("Please specify log path!")
return self.reader.get_remain()

def read_log_data(self, remain):
"""Parse data from log file without sampling.

Args:
remain: Raw data from log file.
"""
for item in remain:
component, dir, tag, record = self.parse_from_bin(item)
self._log_data[component][tag].append(record)

@property
def log_data(self):
return self._log_data

def runs(self, update=True):
self.logs(update=update)
return list(self.walks.keys())
Expand Down Expand Up @@ -259,3 +295,9 @@ def load_new_data(self, update=True):
if self.logdir is not None:
self.register_readers(update=update)
self.add_remain()

def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
pass
4 changes: 4 additions & 0 deletions visualdl/reader/record_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,7 @@ def get_remain(self, update=False):
@property
def dir(self):
return self._dir

@dir.setter
def dir(self, value):
self._dir = value
7 changes: 1 addition & 6 deletions visualdl/server/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (c) 2017 VisualDL Authors. All Rights Reserve.
# Copyright (c) 2020 VisualDL Authors. All Rights Reserve.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -12,8 +12,3 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# =======================================================================

from __future__ import absolute_import
from . import (log, app, api)

__all__ = ['log', 'app', 'api']
2 changes: 1 addition & 1 deletion visualdl/server/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import json
import os

from visualdl.reader.reader import LogReader
from visualdl import LogReader
from visualdl.server import lib
from visualdl.server.log import logger
from visualdl.python.cache import MemCache
Expand Down
1 change: 0 additions & 1 deletion visualdl/server/data_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
# limitations under the License.
# =======================================================================

from __future__ import absolute_import
import threading
import random
import collections
Expand Down
26 changes: 4 additions & 22 deletions visualdl/server/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
import sys
import time
import os
from functools import partial
import numpy as np
from visualdl.server.log import logger
from visualdl.io import bfile
from visualdl.utils.string_util import encode_tag, decode_tag
from visualdl.component import components


MODIFY_PREFIX = {}
Expand Down Expand Up @@ -106,8 +108,8 @@ def get_logs(log_reader, component):
return run2tag


def get_scalar_tags(log_reader):
return get_logs(log_reader, "scalar")
for name in components.keys():
exec("get_%s_tags=partial(get_logs, component='%s')" % (name, name))


def get_scalar(log_reader, run, tag):
Expand All @@ -119,10 +121,6 @@ def get_scalar(log_reader, run, tag):
return results


def get_image_tags(log_reader):
return get_logs(log_reader, "image")


def get_image_tag_steps(log_reader, run, tag):
run = log_reader.name2tags[run] if run in log_reader.name2tags else run
log_reader.load_new_data()
Expand All @@ -143,10 +141,6 @@ def get_individual_image(log_reader, run, tag, step_index):
return records[step_index].image.encoded_image_string


def get_audio_tags(log_reader):
return get_logs(log_reader, "audio")


def get_audio_tag_steps(log_reader, run, tag):
run = log_reader.name2tags[run] if run in log_reader.name2tags else run
log_reader.load_new_data()
Expand All @@ -168,18 +162,6 @@ def get_individual_audio(log_reader, run, tag, step_index):
return result


def get_embeddings_tags(log_reader):
return get_logs(log_reader, "embeddings")


def get_histogram_tags(log_reader):
return get_logs(log_reader, "histogram")


def get_pr_curve_tags(log_reader):
return get_logs(log_reader, "pr_curve")


def get_pr_curve(log_reader, run, tag):
run = log_reader.name2tags[run] if run in log_reader.name2tags else run
log_reader.load_new_data()
Expand Down