storage.py 7.3 KB
Newer Older
Y
Yan Chunwei 已提交
1 2 3
from __future__ import absolute_import

from visualdl import core
S
superjom 已提交
4 5 6

dtypes = ("float", "double", "int32", "int64")

T
Thuan Nguyen 已提交
7

Y
Yan Chunwei 已提交
8 9 10
def check_tag_name_valid(tag):
    assert '%' not in tag, "character % is a reserved word, it is not allowed in tag."

T
Thuan Nguyen 已提交
11

Y
Yan Chunwei 已提交
12 13 14
def check_mode_name_valid(tag):
    for char in ['%', '/']:
        assert char not in tag, "character %s is a reserved word, it is not allowed in mode." % char
S
superjom 已提交
15

T
Thuan Nguyen 已提交
16

17
class LogReader(object):
Q
Qiao Longfei 已提交
18
    """LogReader is a Python wrapper to read and analysis the data that
19
    saved with data format defined in storage.proto. A User can get
Q
Qiao Longfei 已提交
20 21 22
    Scalar Reader/Image Reader/Histogram Reader from this module and use
    them to reade the data you need.
    """
S
superjom 已提交
23

S
superjom 已提交
24
    def __init__(self, dir, reader=None):
Q
Qiao Longfei 已提交
25 26 27 28 29
        """
        create a LogReader
        :param dir: the dir where log file is.
        :param reader: create a new LogReader with a formal one
        """
S
superjom 已提交
30
        self.dir = dir
31
        self.reader = reader if reader else core.LogReader(dir)
S
superjom 已提交
32

S
superjom 已提交
33
    def mode(self, mode):
Q
Qiao Longfei 已提交
34 35 36
        """
        Set the current mode of reader.

37 38 39 40
        :param mode: The log reader will read the data grouped by mode.
        :type mode: basestring
        :return: the log reader itself
        :rtype: LogReader
Q
Qiao Longfei 已提交
41
        """
Y
Yan Chunwei 已提交
42
        check_mode_name_valid(mode)
S
superjom 已提交
43 44
        self.reader.set_mode(mode)
        return self
S
superjom 已提交
45

S
superjom 已提交
46
    def as_mode(self, mode):
Q
Qiao Longfei 已提交
47 48
        """
        create a new LogReader with mode and return it to user.
49 50 51 52 53

        :param mode: The log reader will read the data grouped by mode.
        :type mode: basestring
        :return: a new log reader instance
        :rtype: LogReader
Q
Qiao Longfei 已提交
54
        """
Y
Yan Chunwei 已提交
55
        check_mode_name_valid(mode)
56
        tmp = LogReader(dir, self.reader.as_mode(mode))
S
superjom 已提交
57 58 59
        return tmp

    def modes(self):
Q
Qiao Longfei 已提交
60 61
        """
        Get all modes of the log file
62 63 64

        :return: a list of all modes
        :rtype: list
Q
Qiao Longfei 已提交
65
        """
S
superjom 已提交
66 67
        return self.reader.modes()

Q
Qiao Longfei 已提交
68 69 70
    def tags(self, component):
        """
        Get all tags from the current log file for one kind of component
71 72

        :param component:  scalar|histogram|image
Q
Qiao Longfei 已提交
73
        :return: all the tags
74
        :type: list
Q
Qiao Longfei 已提交
75 76
        """
        return self.reader.tags(component)
S
superjom 已提交
77 78

    def scalar(self, tag, type='float'):
Q
Qiao Longfei 已提交
79 80
        """
        Get a scalar reader with tag and data type
81 82 83

        :param tag:  The reader will read the scalar data marked with tag
        :type tag: basestring
Q
Qiao Longfei 已提交
84
        """
Y
Yan Chunwei 已提交
85
        check_tag_name_valid(tag)
S
superjom 已提交
86 87 88 89 90 91 92
        type2scalar = {
            'float': self.reader.get_scalar_float,
            'double': self.reader.get_scalar_double,
            'int': self.reader.get_scalar_int,
        }
        return type2scalar[type](tag)

S
superjom 已提交
93
    def image(self, tag):
Q
Qiao Longfei 已提交
94 95
        """
        Get a image reader with tag
96 97 98

        :param tag:  The reader will read the image data marked with tag
        :type tag: basestring
Q
Qiao Longfei 已提交
99
        """
Y
Yan Chunwei 已提交
100
        check_tag_name_valid(tag)
S
superjom 已提交
101 102
        return self.reader.get_image(tag)

103
    def histogram(self, tag, type='float'):
Q
Qiao Longfei 已提交
104 105
        """
        Get a histogram reader with tag and data type
106 107 108

        :param tag:  The reader will read the histogram data marked with tag
        :type tag: basestring
Q
Qiao Longfei 已提交
109
        """
110 111 112 113 114
        type2scalar = {
            'float': self.reader.get_histogram_float,
            'double': self.reader.get_histogram_double,
            'int': self.reader.get_histogram_int,
        }
Y
Yan Chunwei 已提交
115
        check_tag_name_valid(tag)
116 117
        return type2scalar[type](tag)

J
Jeff Wang 已提交
118 119 120 121
    def text(self, tag):
        check_tag_name_valid(tag)
        return self.reader.get_text(tag)

S
superjom 已提交
122
    def __enter__(self):
S
superjom 已提交
123
        return self
S
superjom 已提交
124 125

    def __exit__(self, type, value, traceback):
S
superjom 已提交
126
        self.reader.set_mode("default")
S
superjom 已提交
127

S
superjom 已提交
128

129
class LogWriter(object):
Q
Qiao Longfei 已提交
130
    """LogWriter is a Python wrapper to write data to log file with the data
131
    format defined in storage.proto. A User can get Scalar Reader/Image Reader/
Q
Qiao Longfei 已提交
132
    Histogram Reader from this module and use them to write the data to log file.
J
Jeff Wang 已提交
133 134 135 136 137 138 139 140 141

    :param dir: The directory path to the saved log files.
    :type dir: basestring
    :param sync_cycle: Specify how often should the system store data into the file system.
        Typically adding a record requires 6 operations.
        System will save the data into the file system once operations count reaches sync_cycle.
    :type sync_cycle: integer
    :return: a new LogWriter instance
    :rtype: LogWriter
Q
Qiao Longfei 已提交
142
    """
S
superjom 已提交
143

S
superjom 已提交
144 145
    cur_mode = None

S
superjom 已提交
146 147 148
    def __init__(self, dir, sync_cycle, writer=None):
        self.dir = dir
        self.sync_cycle = sync_cycle
149
        self.writer = writer if writer else core.LogWriter(dir, sync_cycle)
S
superjom 已提交
150

S
superjom 已提交
151
    def mode(self, mode):
152 153 154 155 156 157 158 159
        """
        Set the current mode of writer.

        :param mode: The logger will group data under mode.
        :type mode: basestring
        :return: a new LogWriter instance with mode
        :rtype: LogWriter
        """
Y
Yan Chunwei 已提交
160
        check_mode_name_valid(mode)
S
superjom 已提交
161 162
        self.writer.set_mode(mode)
        return self
S
superjom 已提交
163

S
superjom 已提交
164
    def as_mode(self, mode):
Q
Qiao Longfei 已提交
165 166
        """
        create a new LogWriter with mode and return it.
167 168 169 170 171

        :param mode: The logger will group data under mode.
        :type mode: basestring
        :return: the logWriter itself
        :rtype: LogWriter
Q
Qiao Longfei 已提交
172
        """
Y
Yan Chunwei 已提交
173
        check_mode_name_valid(mode)
T
Thuan Nguyen 已提交
174 175
        LogWriter.cur_mode = LogWriter(self.dir, self.sync_cycle,
                                       self.writer.as_mode(mode))
176
        return LogWriter.cur_mode
S
superjom 已提交
177 178

    def scalar(self, tag, type='float'):
Q
Qiao Longfei 已提交
179 180
        """
        Create a scalar writer with tag and type to write scalar data.
181 182 183

        :param tag: The scalar writer will label the data with tag
        :type tag: basestring
184 185
        :return: A scalar writer to handle step and value records
        :rtype: ScalarWriter
Q
Qiao Longfei 已提交
186
        """
Y
Yan Chunwei 已提交
187
        check_tag_name_valid(tag)
S
superjom 已提交
188 189 190 191 192 193
        type2scalar = {
            'float': self.writer.new_scalar_float,
            'double': self.writer.new_scalar_double,
            'int': self.writer.new_scalar_int,
        }
        return type2scalar[type](tag)
S
superjom 已提交
194

Y
Yan Chunwei 已提交
195
    def image(self, tag, num_samples, step_cycle=1):
Q
Qiao Longfei 已提交
196 197
        """
        Create an image writer that used to write image data.
198 199 200

        :param tag: The image writer will label the image with tag
        :type tag: basestring
201 202 203 204 205 206
        :param num_samples: how many samples to take in a step.
        :type num_samples: integer
        :param step_cycle: store every `step_cycle` as a record.
        :type step_cycle: integer
        :return: A image writer to sample images
        :rtype: ImageWriter
Q
Qiao Longfei 已提交
207
        """
Y
Yan Chunwei 已提交
208
        check_tag_name_valid(tag)
S
superjom 已提交
209
        return self.writer.new_image(tag, num_samples, step_cycle)
S
superjom 已提交
210

211
    def histogram(self, tag, num_buckets, type='float'):
Q
Qiao Longfei 已提交
212 213 214
        """
        Create a histogram writer that used to write
        histogram related data.
215 216 217

        :param tag: The histogram writer will label the data with tag
        :type tag: basestring
218 219
        :return: A histogram writer to record distribution
        :rtype: HistogramWriter
Q
Qiao Longfei 已提交
220
        """
Y
Yan Chunwei 已提交
221
        check_tag_name_valid(tag)
222 223 224 225 226 227 228
        types = {
            'float': self.writer.new_histogram_float,
            'double': self.writer.new_histogram_double,
            'int': self.writer.new_histogram_int,
        }
        return types[type](tag, num_buckets)

J
Jeff Wang 已提交
229 230 231 232
    def text(self, tag):
        check_tag_name_valid(tag)
        return self.writer.new_text(tag)

J
Jeff Wang 已提交
233 234 235
    def save(self):
        self.writer.save()

S
superjom 已提交
236
    def __enter__(self):
S
superjom 已提交
237
        return self
S
superjom 已提交
238 239

    def __exit__(self, type, value, traceback):
S
superjom 已提交
240
        self.writer.set_mode("default")