Skip to content

Commit 32e7ebe

Browse files
committed
Python logging
1 parent de04127 commit 32e7ebe

File tree

7 files changed

+67
-49
lines changed

7 files changed

+67
-49
lines changed

source/__init__.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" Python Server entry point """
22

33
import argparse
4+
import logging
45
import os
56
import sys
67

@@ -20,18 +21,25 @@ def main():
2021
parser.add_argument("--host",
2122
metavar="ADDR", help="host to serve", default="localhost")
2223
parser.add_argument("--verbosity",
23-
metavar="LEVEL", help="output verbosity (quiet, default, debug)",
24-
choices=[ "quiet", "default", "debug", "0", "1", "2" ], default="default")
24+
metavar="LEVEL", help="log verbosity (quiet, default, debug)",
25+
choices=[ "quiet", "debug", "default" ], default="default")
2526
parser.add_argument("--version", help="print version", action="store_true")
2627
args = parser.parse_args()
28+
levels = {
29+
"quiet": logging.CRITICAL,
30+
"default": logging.INFO,
31+
"debug": logging.DEBUG,
32+
}
33+
logging.basicConfig(level=levels[args.verbosity], format="%(message)s")
34+
logger = logging.getLogger(__name__)
2735
if args.file and not os.path.exists(args.file):
28-
print("Model file '" + args.file + "' does not exist.")
36+
logger.error(f"Model file '{args.file}' does not exist.")
2937
sys.exit(2)
3038
if args.version:
31-
print(__version__)
39+
logger.info(__version__)
3240
sys.exit(0)
3341
address = (args.host, args.port) if args.host else args.port if args.port else None
34-
start(args.file, address=address, browse=args.browse, verbosity=args.verbosity)
42+
start(args.file, address=address, browse=args.browse)
3543
wait()
3644
sys.exit(0)
3745

source/onnx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def attribute(self, _, op_type):
112112
attribute_type = "tensor"
113113
value = self._tensor(_.t)
114114
elif _.type == _AttributeType.GRAPH:
115-
attribute_type = "tensor"
115+
attribute_type = "graph"
116116
raise Exception("Unsupported graph attribute type")
117117
elif _.type == _AttributeType.FLOATS:
118118
attribute_type = "float32[]"

source/server.py

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@
22

33
import errno
44
import http.server
5-
import importlib.util
5+
import importlib
66
import json
7+
import logging
78
import os
89
import random
910
import re
1011
import socket
1112
import socketserver
12-
import sys
1313
import threading
1414
import time
1515
import urllib.parse
1616
import webbrowser
1717

1818
__version__ = "0.0.0"
1919

20+
logger = logging.getLogger(__name__)
21+
2022
class _ContentProvider:
2123
data = bytearray()
2224
base_dir = ""
@@ -43,7 +45,6 @@ def read(self, path):
4345

4446
class _HTTPRequestHandler(http.server.BaseHTTPRequestHandler):
4547
content = None
46-
verbosity = 1
4748
mime_types = {
4849
".html": "text/html",
4950
".js": "text/javascript",
@@ -107,10 +108,9 @@ def do_GET(self):
107108
content = re.sub(regex, lambda _: meta, content)
108109
content = content.encode("utf-8")
109110
status_code = 200
110-
_log(self.verbosity > 1, f"{str(status_code)} {self.command} {self.path}\n")
111111
self._write(status_code, content_type, content)
112112
def log_message(self, format, *args):
113-
return
113+
logger.debug(" ".join(args))
114114
def _write(self, status_code, content_type, content):
115115
self.send_response(status_code)
116116
if content:
@@ -127,16 +127,14 @@ class _ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
127127
pass
128128

129129
class _HTTPServerThread(threading.Thread):
130-
def __init__(self, content, address, verbosity):
130+
def __init__(self, content, address):
131131
threading.Thread.__init__(self)
132-
self.verbosity = verbosity
133132
self.address = address
134133
self.url = "http://" + address[0] + ":" + str(address[1])
135134
self.server = _ThreadedHTTPServer(address, _HTTPRequestHandler)
136135
self.server.timeout = 0.25
137136
self.server.block_on_close = False
138137
self.server.RequestHandlerClass.content = content
139-
self.server.RequestHandlerClass.verbosity = verbosity
140138
self.terminate_event = threading.Event()
141139
self.terminate_event.set()
142140
self.stop_event = threading.Event()
@@ -155,10 +153,10 @@ def run(self):
155153
def stop(self):
156154
""" Stop server """
157155
if self.alive():
158-
_log(self.verbosity > 0, "Stopping " + self.url + "\n")
156+
logger.info("Stopping " + self.url)
159157
self.stop_event.set()
160158
self.server.server_close()
161-
self.terminate_event.wait(1000)
159+
self.terminate_event.wait(1)
162160

163161
def alive(self):
164162
""" Check server status """
@@ -198,11 +196,6 @@ def _threads(address=None):
198196
threads = [ _ for _ in threads if address[1] == _.address[1] ]
199197
return threads
200198

201-
def _log(condition, message):
202-
if condition:
203-
sys.stdout.write(message)
204-
sys.stdout.flush()
205-
206199
def _make_address(address):
207200
if address is None or isinstance(address, int):
208201
port = address
@@ -253,13 +246,13 @@ def stop(address=None):
253246
for thread in threads:
254247
thread.stop()
255248

256-
def status(adrress=None):
249+
def status(address=None):
257250
"""Is model served at address.
258251
259252
Args:
260253
address (tuple, optional): A (host, port) tuple, or a port number.
261254
"""
262-
threads = _threads(adrress)
255+
threads = _threads(address)
263256
return len(threads) > 0
264257

265258
def wait():
@@ -268,32 +261,31 @@ def wait():
268261
while len(_threads()) > 0:
269262
time.sleep(0.1)
270263
except (KeyboardInterrupt, SystemExit):
271-
_log(True, "\n")
264+
logger.info("")
272265
stop()
273266

274-
def serve(file, data=None, address=None, browse=False, verbosity=1):
267+
def serve(file, data=None, address=None, browse=False):
275268
"""Start serving model from file or data buffer at address and open in web browser.
276269
277270
Args:
278271
file (string): Model file to serve. Required to detect format.
279272
data (bytes): Model data to serve. None will load data from file.
280273
address (tuple, optional): A (host, port) tuple, or a port number.
281274
browse (bool, optional): Launch web browser. Default: True
282-
log (bool, optional): Log details to console. Default: False
283275
284276
Returns:
285277
A (host, port) address tuple.
286278
"""
287-
verbosities = { "0": 0, "quiet": 0, "1": 1, "default": 1, "2": 2, "debug": 2 }
288-
verbosity = verbosities[str(verbosity)]
279+
if not logging.getLogger().hasHandlers():
280+
logging.basicConfig(level=logging.INFO, format="%(message)s")
289281

290282
if not data and file and not os.path.exists(file):
291283
raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), file)
292284

293285
content = _ContentProvider(data, file, file, file)
294286

295287
if data and not isinstance(data, bytearray) and isinstance(data.__class__, type):
296-
_log(verbosity > 1, "Experimental\n")
288+
logger.info("Experimental")
297289
model = _open(data)
298290
if model:
299291
text = json.dumps(model.to_json(), indent=2, ensure_ascii=False)
@@ -305,31 +297,29 @@ def serve(file, data=None, address=None, browse=False, verbosity=1):
305297
else:
306298
address = _make_port(address)
307299

308-
thread = _HTTPServerThread(content, address, verbosity)
300+
thread = _HTTPServerThread(content, address)
309301
thread.start()
310302
while not thread.alive():
311303
time.sleep(0.01)
312304
state = ("Serving '" + file + "'") if file else "Serving"
313-
message = f"{state} at {thread.url}\n"
314-
_log(verbosity > 0, message)
305+
logger.info(f"{state} at {thread.url}")
315306
if browse:
316307
webbrowser.open(thread.url)
317308

318309
return address
319310

320-
def start(file=None, address=None, browse=True, verbosity=1):
311+
def start(file=None, address=None, browse=True):
321312
"""Start serving model file at address and open in web browser.
322313
323314
Args:
324315
file (string): Model file to serve.
325-
log (bool, optional): Log details to console. Default: False
326316
browse (bool, optional): Launch web browser, Default: True
327317
address (tuple, optional): A (host, port) tuple, or a port number.
328318
329319
Returns:
330320
A (host, port) address tuple.
331321
"""
332-
return serve(file, None, browse=browse, address=address, verbosity=verbosity)
322+
return serve(file, None, browse=browse, address=address)
333323

334324
def widget(address, height=800):
335325
""" Open address as Jupyter Notebook IFrame.

test/backend.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
""" Expermiental Python Server backend test """
44

5+
import logging
56
import os
67
import sys
78

@@ -13,23 +14,32 @@
1314
third_party_dir = os.path.join(root_dir, "third_party")
1415
test_data_dir = os.path.join(third_party_dir, "test")
1516

17+
logger = logging.getLogger(__name__)
18+
logging.basicConfig(level=logging.INFO, format="%(message)s")
19+
1620
def _test_onnx():
1721
file = os.path.join(test_data_dir, "onnx", "candy.onnx")
1822
onnx = __import__("onnx")
1923
model = onnx.load(file)
2024
netron.serve(None, model)
2125

2226
def _test_onnx_iterate():
27+
logging.getLogger(netron.__name__).setLevel(logging.WARNING)
2328
folder = os.path.join(test_data_dir, "onnx")
2429
for item in os.listdir(folder):
2530
file = os.path.join(folder, item)
26-
if file.endswith(".onnx") and \
27-
item != "super_resolution.onnx" and \
28-
item != "arcface-resnet100.onnx":
29-
print(item)
31+
skip = (
32+
"super_resolution.onnx",
33+
"arcface-resnet100.onnx",
34+
"aten_sum_dim_onnx_inlined.onnx",
35+
"phi3-mini-128k-instruct-cuda-fp16.onnx",
36+
"if_k1.onnx"
37+
)
38+
if file.endswith(".onnx") and item not in skip:
39+
logger.info(item)
3040
onnx = __import__("onnx")
3141
model = onnx.load(file)
32-
address = netron.serve(file, model, verbosity="quiet")
42+
address = netron.serve(file, model)
3343
netron.stop(address)
3444

3545
def _test_torchscript(file):

test/measures.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22

33
""" Test Measures Script """
44

5+
import logging
6+
57
import pandas
68

79
pandas.set_option("display.max_rows", None)
810

11+
logger = logging.getLogger(__name__)
12+
logging.basicConfig(level=logging.INFO, format="%(message)s")
13+
14+
915
def _summarize(summary_df, measures_df, column, threshold):
1016
measures_df = measures_df.sort_values(column, ascending=False)
1117
total = measures_df[column].sum()
@@ -19,10 +25,10 @@ def main():
1925
measures_df = pandas.read_csv("dist/test/measures.csv")
2026
measures_df.fillna(0, inplace=True)
2127
summary_df = pandas.DataFrame(columns=[ "Name", "Total", "Top", "Count", "Ratio" ])
22-
print(_summarize(summary_df, measures_df, "load", 1))
23-
print(_summarize(summary_df, measures_df, "validate", 1))
24-
print(_summarize(summary_df, measures_df, "render", 1))
25-
print(summary_df.to_string(index=False))
28+
logger.info(_summarize(summary_df, measures_df, "load", 1))
29+
logger.info(_summarize(summary_df, measures_df, "validate", 1))
30+
logger.info(_summarize(summary_df, measures_df, "render", 1))
31+
logger.info(summary_df.to_string(index=False))
2632

2733
if __name__ == "__main__":
2834
main()

tools/pytorch_script.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import collections
44
import json
5+
import logging
56
import os
67
import re
78
import sys
@@ -15,6 +16,10 @@
1516
metadata_file = os.path.join(source_dir, "pytorch-metadata.json")
1617
pytorch_source_dir = os.path.join(third_party_dir, "source", "pytorch")
1718

19+
logger = logging.getLogger(__name__)
20+
logging.basicConfig(level=logging.INFO, format="%(message)s")
21+
22+
1823
def _read(path):
1924
with open(path, encoding="utf-8") as file:
2025
return file.read()
@@ -333,7 +338,7 @@ def _parse_schemas():
333338
if key not in schemas:
334339
schemas[key] = schema
335340
else:
336-
print(f"-> {key}")
341+
logging.warning(f"-> {key}")
337342
return schemas
338343

339344
def _filter_schemas(schemas, types):

tools/tf_script.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,9 @@ def _convert_number(number):
146146
}
147147

148148
def _convert_attr_type(attr_type):
149-
if attr_type in attr_type_table:
150-
return attr_type_table[attr_type]
151-
print(attr_type)
152-
return attr_type
149+
if attr_type not in attr_type_table:
150+
raise ValueError(f"Unknown attribute type '{attr_type}'")
151+
return attr_type_table[attr_type]
153152

154153
def _convert_attr_list(attr_value):
155154
result = []

0 commit comments

Comments
 (0)