1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
- import matplotlib
- # this needs to be called before importing wandb Graph
- matplotlib.use("Agg")
- from wandb import wandb_run
- from wandb.summary import FileSummary
- import pandas
- import tensorflow as tf
- import torch
- import json
- import glob
- import os
- import numpy as np
- import tempfile
- import plotly.graph_objs as go
- import matplotlib.pyplot as plt
- from wandb import Histogram, Image, Graph, Table
- from click.testing import CliRunner
- import pytest
- @pytest.fixture
- def summary():
- with CliRunner().isolated_filesystem():
- run = wandb_run.Run()
- run.summary.update({"foo": "init"})
- yield run.summary
- def disk_summary(summary):
- return json.load(open(summary._fname))
- def test_set_attrs(summary):
- summary.foo = "bar"
- assert disk_summary(summary) == {"foo": "bar"}
- def test_get_attr(summary):
- assert summary.foo == "init"
- def test_update(summary):
- summary.update({"foo": "bar"})
- assert disk_summary(summary) == {"foo": "bar"}
- def test_update_histogram(summary):
- summary.update({"hist": Histogram(np_histogram=([1, 2, 3], [1, 2, 3, 4]))})
- assert disk_summary(summary) == {
- 'foo': 'init',
- "hist": {"_type": "histogram", "values": [1, 2, 3], "bins": [1, 2, 3, 4]}}
- def test_set_histogram(summary):
- summary["hist"] = Histogram(np_histogram=([1, 2, 3], [1, 2, 3, 4]))
- assert disk_summary(summary) == {
- 'foo': 'init',
- "hist": {"_type": "histogram", "values": [1, 2, 3], "bins": [1, 2, 3, 4]}}
- def test_set_item(summary):
- summary["foo"] = "bar"
- assert disk_summary(summary) == {"foo": "bar"}
- def test_get_item(summary):
- assert summary["foo"] == "init"
- def test_delete(summary):
- summary.update({"foo": "bar", "bad": True})
- assert summary['foo'] == 'bar'
- assert summary['bad'] is True
- del summary["bad"]
- assert disk_summary(summary) == {"foo": "bar"}
- def test_image(summary):
- summary["image"] = Image(np.zeros((28, 28)))
- ds = disk_summary(summary)
- assert os.path.exists(os.path.join(summary._run.dir, ds['image']['path']))
- expected = {
- '_type': 'image-file',
- 'height': 28,
- 'width': 28,
- 'size': 73,
- }
- assert set(ds['image'].items()) >= set(expected.items())
- def test_matplot_image(summary):
- img = plt.imshow(np.zeros((28, 28)), cmap='gray')
- summary["fig"] = img
- plt.close()
- ds = disk_summary(summary)
- assert os.path.exists(os.path.join(summary._run.dir, ds['fig']['path']))
- assert set(ds["fig"].items()) >= set({
- "_type": "image-file",
- "height": 480,
- "width": 640,
- }.items())
- def test_matplot_plotly(summary):
- plt.cla()
- plt.plot([1, 2, 3])
- summary["plot"] = plt
- plt.close()
- plot = disk_summary(summary)["plot"]
- assert plot["_type"] == "plotly"
- def test_plotly_plot(summary):
- summary["plot"] = go.Scatter(x=[0, 1, 2])
- plot = disk_summary(summary)["plot"]
- assert plot["_type"] == "plotly"
- assert plot["plot"]['type'] == 'scatter'
- def test_newline(summary):
- summary["rad \n"] = 1
- summary.update({"bad \n ": 2})
- summ = disk_summary(summary)
- assert summ["rad"] == 1
- assert summ["bad"] == 2
- def test_big_numpy(summary):
- summary.update({"rad": np.random.rand(1000)})
- assert disk_summary(summary)["rad"]["max"] > 0
- assert os.path.exists(os.path.join(summary._run.dir, "wandb.h5"))
- def test_big_nested_numpy(summary):
- summary.update({"rad": {"deep": np.random.rand(1000)}})
- assert disk_summary(summary)["rad"]["deep"]["max"] > 0
- summary["rad"]["deep2"] = np.random.rand(1000)
- assert disk_summary(summary)["rad"]["deep2"]["max"] > 0
- assert os.path.exists(os.path.join(summary._run.dir, "wandb.h5"))
- def test_torch_tensor(summary):
- summary.update({"pytorch": torch.rand(1000, 1000)})
- assert os.path.exists(os.path.join(summary._run.dir, "wandb.h5"))
- assert disk_summary(summary)["pytorch"]["_type"] == "torch.Tensor"
- def test_tensorflow_tensor(summary):
- with tf.Session().as_default():
- summary.update({"tensorflow": tf.random_normal([1000])})
- assert os.path.exists(os.path.join(summary._run.dir, "wandb.h5"))
- assert disk_summary(summary)["tensorflow"]["_type"] == "tensorflow.Tensor"
- def test_pandas(summary):
- summary.update({"pandas": pandas.DataFrame(
- data=np.random.rand(1000), columns=['col'])})
- def test_read_numpy(summary):
- summary.update({"rad": np.random.rand(1000)})
- s = FileSummary(summary._run)
- assert len(s["rad"]) == 1000
- def test_read_nested_numpy(summary):
- summary.update({"rad": {"deep": np.random.rand(1000)}})
- s = FileSummary(summary._run)
- assert len(s["rad"]["deep"]) == 1000
- def test_read_nested_array(summary):
- summary["rad"] = {"deep": "dish"}
- s = FileSummary(summary._run)
- assert summary["rad"]["deep"] == "dish"
- def test_read_very_nested_numpy(summary):
- # Test that even deeply nested writes are written to disk.
- summary.update(
- {"a": {"b": {"c": {"d": {"e": {"f": {"g": {"h": {"i": {}}}}}}}}}})
- summary['a']['b']['c']['d']['e']['f']['g']['h']['i']['j'] = True
- assert disk_summary(summary)[
- 'a']['b']['c']['d']['e']['f']['g']['h']['i']['j'] is True
- def test_key_locking(summary):
- summary.update({'a': 'a'})
- assert summary['a'] == 'a'
- summary.update({'a': 'b'})
- assert summary['a'] == 'b'
- summary.update({'a': 'c'}, overwrite=False)
- assert summary['a'] == 'b'
|