未验证 提交 19275c3d 编写于 作者: Y Yan Chunwei 提交者: GitHub

add try call to enhance robust of server (#133)

上级 06583b18
import os
import json import json
import os
from google.protobuf.json_format import MessageToJson from google.protobuf.json_format import MessageToJson
from PIL import Image
import onnx
import graphviz_graph as gg import graphviz_graph as gg
from PIL import Image import onnx
def debug_print(json_obj): def debug_print(json_obj):
......
import json
import unittest import unittest
import graph import graph
import json
class GraphTest(unittest.TestCase): class GraphTest(unittest.TestCase):
......
import subprocess import os
import tempfile
import sys
import random import random
import subprocess import subprocess
import os import sys
import tempfile
def crepr(v): def crepr(v):
......
import pprint import pprint
import random
import re import re
import time
import urllib import urllib
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
...@@ -133,7 +133,7 @@ def get_invididual_image(storage, mode, tag, step_index, max_size=80): ...@@ -133,7 +133,7 @@ def get_invididual_image(storage, mode, tag, step_index, max_size=80):
shape = record.shape() shape = record.shape()
if shape[2] == 1: if shape[2] == 1:
shape = [shape[0], shape[1]] shape = [shape[0], shape[1]]
data = np.array(record.data(), dtype='uint8').reshape(shape) data = np.array(record.data(), dtype='uint8').reshape(shape)
tempfile = NamedTemporaryFile(mode='w+b', suffix='.png') tempfile = NamedTemporaryFile(mode='w+b', suffix='.png')
with Image.fromarray(data) as im: with Image.fromarray(data) as im:
...@@ -174,12 +174,13 @@ def get_histogram(storage, mode, tag): ...@@ -174,12 +174,13 @@ def get_histogram(storage, mode, tag):
return res return res
if __name__ == '__main__': def retry(ntimes, function, time2sleep, *args, **kwargs):
reader = storage.LogReader('./tmp/mock') '''
tags = get_image_tags(reader) try to execute `function` `ntimes`, if exception catched, the thread will
sleep `time2sleep` seconds.
tags = get_image_tag_steps(reader, 'train', 'layer1/layer2/image0/0') '''
pprint.pprint(tags) for i in xrange(ntimes):
try:
image = get_invididual_image(reader, "train", 'layer1/layer2/image0/0', 2) return function(*args, **kwargs)
print image except:
time.sleep(time2sleep)
import pprint import pprint
import unittest import unittest
import lib
from visualdl import LogReader, LogWriter from visualdl import LogReader, LogWriter
import pprint import lib
from storage_mock import add_scalar, add_image, add_histogram from storage_mock import add_histogram, add_image, add_scalar
_retry_counter = 0
class LibTest(unittest.TestCase): class LibTest(unittest.TestCase):
def setUp(self): def setUp(self):
dir = "./tmp/mock" dir = "./tmp/mock"
writer = LogWriter(dir, sync_cycle=10) writer = LogWriter(dir, sync_cycle=30)
add_scalar(writer, "train", "layer/scalar0/min", 1000, 1) add_scalar(writer, "train", "layer/scalar0/min", 1000, 1)
add_scalar(writer, "test", "layer/scalar0/min", 1000, 10) add_scalar(writer, "test", "layer/scalar0/min", 1000, 10)
...@@ -32,6 +32,21 @@ class LibTest(unittest.TestCase): ...@@ -32,6 +32,21 @@ class LibTest(unittest.TestCase):
self.reader = LogReader(dir) self.reader = LogReader(dir)
def test_retry(self):
ntimes = 7
time2sleep = 1
def func():
global _retry_counter
if _retry_counter < 5:
_retry_counter += 1
raise
return _retry_counter
lib.retry(ntimes, func, time2sleep)
self.assertEqual(_retry_counter, 5)
def test_modes(self): def test_modes(self):
modes = lib.get_modes(self.reader) modes = lib.get_modes(self.reader)
self.assertEqual( self.assertEqual(
......
...@@ -225,4 +225,4 @@ def graph_data(): ...@@ -225,4 +225,4 @@ def graph_data():
} }
} }
] ]
}""" }"""
\ No newline at end of file
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
import json import json
import os import os
import exceptions
import time
import sys import sys
from optparse import OptionParser from optparse import OptionParser
...@@ -21,9 +23,20 @@ app = Flask(__name__, static_url_path="") ...@@ -21,9 +23,20 @@ app = Flask(__name__, static_url_path="")
# set static expires in a short time to reduce browser's memory usage. # set static expires in a short time to reduce browser's memory usage.
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 30 app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 30
error_retry_times = 3
error_sleep_time = 2 # seconds
SERVER_DIR = os.path.join(visualdl.ROOT, 'server') SERVER_DIR = os.path.join(visualdl.ROOT, 'server')
def try_call(function, *args, **kwargs):
res = lib.retry(error_retry_times, function, error_sleep_time, *args,
**kwargs)
if not res:
raise exceptions.IOError("server IO error, will retry latter.")
return res
def option_parser(): def option_parser():
""" """
:return: :return:
...@@ -64,6 +77,7 @@ log_reader = LogReader(options.logdir) ...@@ -64,6 +77,7 @@ log_reader = LogReader(options.logdir)
graph_image_path = None graph_image_path = None
# return data # return data
# status, msg, data # status, msg, data
def gen_result(status, msg, data): def gen_result(status, msg, data):
...@@ -89,11 +103,12 @@ def serve_static(filename): ...@@ -89,11 +103,12 @@ def serve_static(filename):
return send_from_directory( return send_from_directory(
os.path.join(server_path, static_file_path), filename) os.path.join(server_path, static_file_path), filename)
@app.route('/graphs/image') @app.route('/graphs/image')
def serve_graph(): def serve_graph():
print 'send file', graph_image_path
return send_file(graph_image_path) return send_file(graph_image_path)
@app.route('/data/logdir') @app.route('/data/logdir')
def logdir(): def logdir():
result = gen_result(0, "", {"logdir": options.logdir}) result = gen_result(0, "", {"logdir": options.logdir})
...@@ -110,10 +125,7 @@ def runs(): ...@@ -110,10 +125,7 @@ def runs():
def scalar_tags(): def scalar_tags():
mode = request.args.get('mode') mode = request.args.get('mode')
is_debug = bool(request.args.get('debug')) is_debug = bool(request.args.get('debug'))
if is_debug: result = try_call(lib.get_scalar_tags, log_reader)
result = mock_tags.data()
else:
result = lib.get_scalar_tags(log_reader)
result = gen_result(0, "", result) result = gen_result(0, "", result)
return Response(json.dumps(result), mimetype='application/json') return Response(json.dumps(result), mimetype='application/json')
...@@ -121,7 +133,7 @@ def scalar_tags(): ...@@ -121,7 +133,7 @@ def scalar_tags():
@app.route("/data/plugin/images/tags") @app.route("/data/plugin/images/tags")
def image_tags(): def image_tags():
mode = request.args.get('run') mode = request.args.get('run')
result = lib.get_image_tags(log_reader) result = try_call(lib.get_image_tags, log_reader)
result = gen_result(0, "", result) result = gen_result(0, "", result)
return Response(json.dumps(result), mimetype='application/json') return Response(json.dumps(result), mimetype='application/json')
...@@ -129,7 +141,8 @@ def image_tags(): ...@@ -129,7 +141,8 @@ def image_tags():
@app.route("/data/plugin/histograms/tags") @app.route("/data/plugin/histograms/tags")
def histogram_tags(): def histogram_tags():
mode = request.args.get('run') mode = request.args.get('run')
result = lib.get_histogram_tags(log_reader) # hack to avlid IO conflicts
result = try_call(lib.get_histogram_tags, log_reader)
result = gen_result(0, "", result) result = gen_result(0, "", result)
return Response(json.dumps(result), mimetype='application/json') return Response(json.dumps(result), mimetype='application/json')
...@@ -138,12 +151,7 @@ def histogram_tags(): ...@@ -138,12 +151,7 @@ def histogram_tags():
def scalars(): def scalars():
run = request.args.get('run') run = request.args.get('run')
tag = request.args.get('tag') tag = request.args.get('tag')
is_debug = bool(request.args.get('debug')) result = try_call(lib.get_scalar, log_reader, run, tag)
if is_debug:
result = mock_data.sequence_data()
else:
result = lib.get_scalar(log_reader, run, tag)
result = gen_result(0, "", result) result = gen_result(0, "", result)
return Response(json.dumps(result), mimetype='application/json') return Response(json.dumps(result), mimetype='application/json')
...@@ -153,7 +161,7 @@ def images(): ...@@ -153,7 +161,7 @@ def images():
mode = request.args.get('run') mode = request.args.get('run')
tag = request.args.get('tag') tag = request.args.get('tag')
result = lib.get_image_tag_steps(log_reader, mode, tag) result = try_call(lib.get_image_tag_steps, log_reader, mode, tag)
result = gen_result(0, "", result) result = gen_result(0, "", result)
return Response(json.dumps(result), mimetype='application/json') return Response(json.dumps(result), mimetype='application/json')
...@@ -166,7 +174,8 @@ def individual_image(): ...@@ -166,7 +174,8 @@ def individual_image():
step_index = int(request.args.get('index')) # index of step step_index = int(request.args.get('index')) # index of step
offset = 0 offset = 0
imagefile = lib.get_invididual_image(log_reader, mode, tag, step_index) imagefile = try_call(lib.get_invididual_image, log_reader, mode, tag,
step_index)
response = send_file( response = send_file(
imagefile, as_attachment=True, attachment_filename='img.png') imagefile, as_attachment=True, attachment_filename='img.png')
return response return response
...@@ -176,7 +185,7 @@ def individual_image(): ...@@ -176,7 +185,7 @@ def individual_image():
def histogram(): def histogram():
run = request.args.get('run') run = request.args.get('run')
tag = request.args.get('tag') tag = request.args.get('tag')
result = lib.get_histogram(log_reader, run, tag) result = try_call(lib.get_histogram, log_reader, run, tag)
result = gen_result(0, "", result) result = gen_result(0, "", result)
return Response(json.dumps(result), mimetype='application/json') return Response(json.dumps(result), mimetype='application/json')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册