Skip to content

Commit ed5e659

Browse files
authored
Merge pull request PaddlePaddle#13 from ChunweiYan/feature/add_image_component
2 parents 70c9bb1 + c8116e3 commit ed5e659

File tree

27 files changed

+980
-110
lines changed

27 files changed

+980
-110
lines changed

CMakeLists.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,30 @@ include(external/zlib) # download, build, install zlib
2323
include(external/gflags) # download, build, install gflags
2424
include(external/glog) # download, build, install glog
2525
include(external/gtest) # download, build, install gtest
26+
include(external/eigen) # download eigen
2627
include(external/pybind11) # download pybind11
2728
include(external/protobuf) # download, build, install protobuf
2829
include(external/python) # find python and set path
2930

3031
include_directories(${PROJECT_SOURCE_DIR})
3132
include_directories(${CMAKE_CURRENT_BINARY_DIR})
32-
include_directories(${PROJECT_SOURCE_DIR}/thirdparty/local/include)
33+
# TODO(ChunweiYan) debug, remote latter
34+
#include_directories(/home/superjom/project/VisualDL/build/third_party/eigen3/src/extern_eigen3)
3335

3436
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/visualdl/storage)
3537
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/visualdl/logic)
3638
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/visualdl/python)
3739

3840
add_executable(vl_test
3941
${PROJECT_SOURCE_DIR}/visualdl/test.cc
40-
${PROJECT_SOURCE_DIR}/visualdl/storage/storage_test.cc
4142
${PROJECT_SOURCE_DIR}/visualdl/logic/sdk_test.cc
43+
${PROJECT_SOURCE_DIR}/visualdl/storage/storage_test.cc
4244
${PROJECT_SOURCE_DIR}/visualdl/utils/test_concurrency.cc
45+
${PROJECT_SOURCE_DIR}/visualdl/utils/test_image.cc
4346
${PROJECT_SOURCE_DIR}/visualdl/utils/concurrency.h
4447
${PROJECT_SOURCE_DIR}/visualdl/utils/filesystem.h
4548
)
46-
target_link_libraries(vl_test sdk storage entry im gtest glog protobuf gflags pthread)
49+
target_link_libraries(vl_test sdk storage entry tablet im gtest glog protobuf gflags pthread)
4750

4851
enable_testing ()
4952

cmake/external/eigen.cmake

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
INCLUDE(ExternalProject)
2+
3+
SET(EIGEN_SOURCE_DIR ${THIRD_PARTY_PATH}/eigen3)
4+
5+
INCLUDE_DIRECTORIES(${EIGEN_SOURCE_DIR}/src/extern_eigen3)
6+
7+
ExternalProject_Add(
8+
extern_eigen3
9+
${EXTERNAL_PROJECT_LOG_ARGS}
10+
GIT_REPOSITORY "https://github.com/RLovelett/eigen.git"
11+
GIT_TAG "master"
12+
PREFIX ${EIGEN_SOURCE_DIR}
13+
UPDATE_COMMAND ""
14+
CONFIGURE_COMMAND ""
15+
BUILD_COMMAND ""
16+
INSTALL_COMMAND ""
17+
TEST_COMMAND ""
18+
)
19+
20+
if (${CMAKE_VERSION} VERSION_LESS "3.3.0")
21+
set(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/eigen3_dummy.c)
22+
file(WRITE ${dummyfile} "const char * dummy_eigen3 = \"${dummyfile}\";")
23+
add_library(eigen3 STATIC ${dummyfile})
24+
else()
25+
add_library(eigen3 INTERFACE)
26+
endif()
27+
28+
add_dependencies(eigen3 extern_eigen3)
29+
30+
LIST(APPEND external_project_dependencies eigen3)

server/visualdl/lib.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import pprint
2+
import re
3+
import urllib
4+
from tempfile import NamedTemporaryFile
5+
6+
import numpy as np
7+
from PIL import Image
8+
9+
import storage
10+
11+
12+
def get_modes(storage):
13+
return storage.modes()
14+
15+
16+
def get_scalar_tags(storage, mode):
17+
result = {}
18+
for mode in storage.modes():
19+
reader = storage.as_mode(mode)
20+
tags = reader.tags('scalar')
21+
if tags:
22+
result[mode] = {}
23+
for tag in tags:
24+
result[mode][tag] = {
25+
'displayName': reader.scalar(tag).caption(),
26+
'description': "",
27+
}
28+
return result
29+
30+
31+
def get_scalar(storage, mode, tag):
32+
reader = storage.as_mode(mode)
33+
scalar = reader.scalar(tag)
34+
35+
records = scalar.records()
36+
ids = scalar.ids()
37+
timestamps = scalar.timestamps()
38+
39+
result = zip(timestamps, ids, records)
40+
return result
41+
42+
43+
def get_image_tags(storage):
44+
result = {}
45+
46+
for mode in storage.modes():
47+
reader = storage.as_mode(mode)
48+
tags = reader.tags('image')
49+
if tags:
50+
result[mode] = {}
51+
for tag in tags:
52+
image = reader.image(tag)
53+
for i in xrange(max(1, image.num_samples())):
54+
caption = tag if image.num_samples() <= 1 else '%s/%d'%(tag, i)
55+
result[mode][caption] = {
56+
'displayName': caption,
57+
'description': "",
58+
'samples': 1,
59+
}
60+
return result
61+
62+
63+
def get_image_tag_steps(storage, mode, tag):
64+
print 'image_tag_steps,mode,tag:', mode, tag
65+
# remove suffix '/x'
66+
res = re.search(r".*/([0-9]+$)", tag)
67+
sample_index = 0
68+
origin_tag = tag
69+
if res:
70+
tag = tag[:tag.rfind('/')]
71+
sample_index = int(res.groups()[0])
72+
73+
reader = storage.as_mode(mode)
74+
image = reader.image(tag)
75+
res = []
76+
77+
for step_index in range(image.num_records()):
78+
record = image.record(step_index, sample_index)
79+
shape = record.shape()
80+
assert shape, "%s,%s" % (mode, tag)
81+
query = urllib.urlencode({
82+
'sample': 0,
83+
'index': step_index,
84+
'tag': origin_tag,
85+
'run': mode,
86+
})
87+
res.append({
88+
'height': shape[0],
89+
'width': shape[1],
90+
'step': record.step_id(),
91+
'wall_time': image.timestamp(step_index),
92+
'query': query,
93+
})
94+
return res
95+
96+
97+
def get_invididual_image(storage, mode, tag, step_index):
98+
reader = storage.as_mode(mode)
99+
res = re.search(r".*/([0-9]+$)", tag)
100+
# remove suffix '/x'
101+
if res:
102+
offset = int(res.groups()[0])
103+
tag = tag[:tag.rfind('/')]
104+
105+
image = reader.image(tag)
106+
record = image.record(step_index, offset)
107+
108+
data = np.array(record.data(), dtype='uint8').reshape(record.shape())
109+
tempfile = NamedTemporaryFile(mode='w+b', suffix='.png')
110+
with Image.fromarray(data) as im:
111+
im.save(tempfile)
112+
tempfile.seek(0, 0)
113+
return tempfile
114+
115+
116+
if __name__ == '__main__':
117+
reader = storage.StorageReader('./tmp/mock')
118+
tags = get_image_tags(reader)
119+
120+
tags = get_image_tag_steps(reader, 'train', 'layer1/layer2/image0/0')
121+
pprint.pprint(tags)
122+
123+
image = get_invididual_image(reader, "train", 'layer1/layer2/image0/0', 2)
124+
print image

server/visualdl/lib_test.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import lib
2+
import unittest
3+
import storage
4+
import pprint
5+
from storage_mock import add_scalar, add_image
6+
7+
8+
class LibTest(unittest.TestCase):
9+
def setUp(self):
10+
dir = "./tmp/mock"
11+
writer = storage.StorageWriter(dir, sync_cycle=20)
12+
13+
add_scalar(writer, "train", "layer/scalar0/min", 1000, 1)
14+
add_scalar(writer, "test", "layer/scalar0/min", 1000, 10)
15+
add_scalar(writer, "valid", "layer/scalar0/min", 1000, 10)
16+
17+
add_scalar(writer, "train", "layer/scalar0/max", 1000, 1)
18+
add_scalar(writer, "test", "layer/scalar0/max", 1000, 10)
19+
add_scalar(writer, "valid", "layer/scalar0/max", 1000, 10)
20+
21+
add_image(writer, "train", "layer/image0", 7, 10, 1)
22+
add_image(writer, "test", "layer/image0", 7, 10, 3)
23+
24+
add_image(writer, "train", "layer/image1", 7, 10, 1, shape=[30,30,2])
25+
add_image(writer, "test", "layer/image1", 7, 10, 1, shape=[30,30,2])
26+
27+
self.reader = storage.StorageReader(dir)
28+
29+
def test_modes(self):
30+
modes = lib.get_modes(self.reader)
31+
self.assertEqual(sorted(modes), sorted(["train", "test", "valid"]))
32+
33+
def test_scalar(self):
34+
35+
for mode in "train test valid".split():
36+
tags = lib.get_scalar_tags(self.reader, mode)
37+
print 'scalar tags:'
38+
pprint.pprint(tags)
39+
self.assertEqual(len(tags), 3)
40+
self.assertEqual(sorted(tags.keys()), sorted("train test valid".split()))
41+
42+
def test_image(self):
43+
tags = lib.get_image_tags(self.reader)
44+
self.assertEqual(len(tags), 2)
45+
46+
tags = lib.get_image_tag_steps(self.reader, 'train', 'layer/image0/0')
47+
pprint.pprint(tags)
48+
49+
image = lib.get_invididual_image(self.reader, "train", 'layer/image0/0', 2)
50+
print image
51+
52+
53+
if __name__ == '__main__':
54+
unittest.main()

server/visualdl/mock.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/bin/bash
2+
set -ex
3+
4+
export PYTHONPATH="/home/superjom/project/VisualDL/build/visualdl/logic:/home/superjom/project/VisualDL/visualdl/python"
5+
6+
python lib_test.py

server/visualdl/run.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
set -ex
3+
4+
export PYTHONPATH="$(pwd)/..:/home/superjom/project/VisualDL/build/visualdl/logic:/home/superjom/project/VisualDL/visualdl/python"
5+
export FLASK_APP=visual_dl.py
6+
export FLASK_DEBUG=1
7+
8+
python visual_dl.py --logdir ./tmp/mock --host 172.23.233.68 --port 8043

server/visualdl/storage_mock.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import random
2+
import time
3+
import unittest
4+
5+
import numpy as np
6+
7+
8+
def add_scalar(writer, mode, tag, num_steps, skip):
9+
my_writer = writer.as_mode(mode)
10+
scalar = my_writer.scalar(tag)
11+
for i in range(num_steps):
12+
if i % skip == 0:
13+
scalar.add_record(i, random.random())
14+
15+
16+
def add_image(writer,
17+
mode,
18+
tag,
19+
num_samples,
20+
num_passes,
21+
step_cycle,
22+
shape=[50, 50, 3]):
23+
writer_ = writer.as_mode(mode)
24+
image_writer = writer_.image(tag, num_samples, step_cycle)
25+
26+
for pass_ in xrange(num_passes):
27+
image_writer.start_sampling()
28+
for ins in xrange(2 * num_samples):
29+
index = image_writer.is_sample_taken()
30+
if index != -1:
31+
data = np.random.random(shape) * 256
32+
data = np.ndarray.flatten(data)
33+
assert shape
34+
assert len(data) > 0
35+
image_writer.set_sample(index, shape, list(data))
36+
image_writer.finish_sampling()
37+
38+
39+
if __name__ == '__main__':
40+
add_scalar("train", "layer/scalar0/min", 1000, 1)
41+
add_scalar("test", "layer/scalar0/min", 1000, 10)
42+
add_scalar("valid", "layer/scalar0/min", 1000, 10)
43+
44+
add_scalar("train", "layer/scalar0/max", 1000, 1)
45+
add_scalar("test", "layer/scalar0/max", 1000, 10)
46+
add_scalar("valid", "layer/scalar0/max", 1000, 10)
47+
48+
add_image("train", "layer/image0", 7, 10, 1)
49+
add_image("test", "layer/image0", 7, 10, 3)

0 commit comments

Comments
 (0)