From 172a6e5efb6b34abb1e91545af3421f982d4a7ae Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Thu, 25 May 2023 18:06:47 -0700 Subject: [PATCH 1/2] [Runtime,RPC] Use f-strings for string formatting, NFC Replace uses of % and .format() with f-strings. Reformat modified files. --- python/tvm/rpc/base.py | 6 ++-- python/tvm/rpc/client.py | 23 +++++-------- python/tvm/rpc/minrpc.py | 4 +-- python/tvm/rpc/proxy.py | 22 ++++++------ python/tvm/rpc/server.py | 12 +++---- python/tvm/rpc/testing.py | 4 +-- python/tvm/rpc/tracker.py | 16 +++------ python/tvm/runtime/container.py | 14 ++++---- python/tvm/runtime/executor/aot_executor.py | 2 +- python/tvm/runtime/module.py | 38 +++++++++------------ python/tvm/runtime/ndarray.py | 17 ++++----- python/tvm/runtime/object.py | 7 ++-- python/tvm/runtime/object_generic.py | 6 ++-- python/tvm/runtime/vm.py | 15 ++++---- 14 files changed, 77 insertions(+), 109 deletions(-) diff --git a/python/tvm/rpc/base.py b/python/tvm/rpc/base.py index 6ab64f1e885c..7db0d4d42be2 100644 --- a/python/tvm/rpc/base.py +++ b/python/tvm/rpc/base.py @@ -140,7 +140,7 @@ def random_key(prefix, delimiter=":", cmap=None): The generated random key """ while True: - key = "{}{}{}".format(prefix, delimiter, random.random()) + key = f"{prefix}{delimiter}{random.random()}" if not cmap or key not in cmap: break return key @@ -192,8 +192,8 @@ def connect_with_retry(addr, timeout=60, retry_period=5): raise sock_err period = time.time() - tstart if period > timeout: - raise RuntimeError("Failed to connect to server %s" % str(addr)) + raise RuntimeError(f"Failed to connect to server {str(addr)}") logger.warning( - "Cannot connect to tracker %s, retry in %g secs...", str(addr), retry_period + f"Cannot connect to tracker {str(addr)}, retry in {retry_period:g} secs..." ) time.sleep(retry_period) diff --git a/python/tvm/rpc/client.py b/python/tvm/rpc/client.py index e315971c1d96..e984651c3eda 100644 --- a/python/tvm/rpc/client.py +++ b/python/tvm/rpc/client.py @@ -302,7 +302,7 @@ def _connect(self): self._sock.sendall(struct.pack("= session_timeout * 0.95: - raise RuntimeError("Session timeout when running %s" % func.__name__) + raise RuntimeError(f"Session timeout when running {func.__name__}") last_err = err raise RuntimeError( - "Failed to run on %s after %d retry, last_error:%s" % (key, max_retry, str(last_err)) + f"Failed to run on {key} after {max_retry} retry, last_error:{str(last_err)}" ) @@ -517,7 +512,7 @@ def connect( """ try: if session_timeout: - key += " -timeout=%s" % str(session_timeout) + key += f" -timeout={session_timeout}" session_constructor_args = session_constructor_args if session_constructor_args else [] if not isinstance(session_constructor_args, (list, tuple)): raise TypeError("Expect the session constructor to be a list or tuple") diff --git a/python/tvm/rpc/minrpc.py b/python/tvm/rpc/minrpc.py index 32c1fdce2cc0..842ba7e49814 100644 --- a/python/tvm/rpc/minrpc.py +++ b/python/tvm/rpc/minrpc.py @@ -36,11 +36,11 @@ def find_minrpc_server_libpath(server="posix_popen_server"): curr_dir = os.path.dirname(os.path.realpath(os.path.expanduser(__file__))) source_dir = os.path.abspath(os.path.join(curr_dir, "..", "..", "..")) minrpc_dir = os.path.join(source_dir, "src", "runtime", "minrpc") - path = os.path.join(minrpc_dir, server, ("%s.cc" % server)) + path = os.path.join(minrpc_dir, server, f"{server}.cc") candidates = [path] if not os.path.isfile(path): - raise RuntimeError("Cannot find minserver %s, in candidates %s" % (server, candidates)) + raise RuntimeError(f"Cannot find minserver {server}, in candidates {candidates}") return minrpc_dir, path diff --git a/python/tvm/rpc/proxy.py b/python/tvm/rpc/proxy.py index d7027c88a4b5..855a0b752682 100644 --- a/python/tvm/rpc/proxy.py +++ b/python/tvm/rpc/proxy.py @@ -39,7 +39,7 @@ from . import tornado_util except ImportError as error_msg: raise ImportError( - "RPCProxy module requires tornado package %s. Try 'pip install tornado'." % error_msg + f"RPCProxy module requires tornado package {error_msg}. Try 'pip install tornado'." ) from tvm.contrib.popen_pool import PopenWorker @@ -152,7 +152,7 @@ def __init__(self, sock, addr): self.addr = addr def name(self): - return "TCPSocketProxy:%s:%s" % (str(self.addr[0]), self.rpc_key) + return f"TCPSocketProxy:{str(self.addr[0])}:{self.rpc_key}" def send_data(self, message, binary=True): self.write_message(message, True) @@ -178,7 +178,7 @@ def __init__(self, *args, **kwargs): self._init_handler() def name(self): - return "WebSocketProxy:%s" % (self.rpc_key) + return f"WebSocketProxy:{self.rpc_key}" def on_message(self, message): self.on_data(message) @@ -213,7 +213,7 @@ def __init__(self, *args, **kwargs): web_port = kwargs.pop("rpc_web_port", None) if web_port: self.page = self.page.replace( - "ws://localhost:9190/ws", "ws://localhost:%d/ws" % web_port + "ws://localhost:9190/ws", f"ws://localhost:{web_port}/ws" ) else: self.page = open(file_path, "rb").read() @@ -245,9 +245,7 @@ def __init__( assert ProxyServerHandler.current is None ProxyServerHandler.current = self if web_port: - handlers = [ - (r"/ws", WebSocketHandler), - ] + handlers = [(r"/ws", WebSocketHandler)] if index_page: handlers.append( (r"/", RequestHandler, {"file_path": index_page, "rpc_web_port": web_port}) @@ -256,7 +254,7 @@ def __init__( resource_files = resource_files if resource_files else [] for fname in resource_files: basename = os.path.basename(fname) - pair = (r"/%s" % basename, RequestHandler, {"file_path": fname}) + pair = (fr"/{basename}", RequestHandler, {"file_path": fname}) handlers.append(pair) logging.info(pair) self.app = tornado.web.Application(handlers) @@ -340,7 +338,7 @@ def _update_tracker(self, period_update=False): magic = struct.unpack("= 4 magic = struct.unpack(" max_retry: - raise RuntimeError("Maximum retry error: last error: %s" % str(err)) + raise RuntimeError(f"Maximum retry error: last error: {str(err)}") time.sleep(retry_period) @@ -349,7 +349,7 @@ def __init__( continue raise sock_err if not self.port: - raise ValueError("cannot bind to any port in [%d, %d)" % (port, port_end)) + raise ValueError(f"cannot bind to any port in [{port}, {port_end})") logger.info("bind to %s:%d", host, self.port) sock.listen(1) self.sock = sock diff --git a/python/tvm/rpc/testing.py b/python/tvm/rpc/testing.py index 32c0ca00cf33..ba88c2048443 100644 --- a/python/tvm/rpc/testing.py +++ b/python/tvm/rpc/testing.py @@ -29,12 +29,12 @@ def _addone(x): @tvm.register_func("rpc.test.strcat") def _strcat(name, x): - return "%s:%d" % (name, x) + return f"{name}:{x}" @tvm.register_func("rpc.test.except") def _remotethrow(name): - raise ValueError("%s" % name) + raise ValueError(f"{name}") @tvm.register_func("rpc.test.runtime_str_concat") diff --git a/python/tvm/rpc/tracker.py b/python/tvm/rpc/tracker.py index ab33d20daee1..3c8dda55a6e4 100644 --- a/python/tvm/rpc/tracker.py +++ b/python/tvm/rpc/tracker.py @@ -56,7 +56,7 @@ from . import tornado_util except ImportError as error_msg: raise ImportError( - "RPCTracker module requires tornado package %s. Try 'pip install tornado'." % error_msg + f"RPCTracker module requires tornado package {error_msg}. Try 'pip install tornado'." ) from .._ffi.base import py_str @@ -184,7 +184,7 @@ def __init__(self, tracker, sock, addr): def name(self): """name of connection""" - return "TCPSocket: %s" % str(self._addr) + return f"TCPSocket: {str(self._addr)}" def summary(self): """Summary of this connection""" @@ -408,7 +408,7 @@ def __init__(self, host, port=9190, port_end=9199, silent=False, reuse_addr=True continue raise sock_err if not self.port: - raise ValueError("cannot bind to any port in [%d, %d)" % (port, port_end)) + raise ValueError(f"cannot bind to any port in [{port}, {port_end})") logger.info("bind to %s:%d", host, self.port) sock.listen(1) self.thread = threading.Thread(target=_tracker_server, args=(sock, self.stop_key)) @@ -463,15 +463,7 @@ def __init__( self.proc = PopenWorker() # send the function self.proc.send( - _popen_start_tracker_server, - [ - host, - port, - port_end, - silent, - reuse_addr, - timeout, - ], + _popen_start_tracker_server, [host, port, port_end, silent, reuse_addr, timeout] ) # receive the port self.port, self.stop_key = self.proc.recv() diff --git a/python/tvm/runtime/container.py b/python/tvm/runtime/container.py index cae408b6121d..686b4a26c80c 100644 --- a/python/tvm/runtime/container.py +++ b/python/tvm/runtime/container.py @@ -54,7 +54,7 @@ def getitem_helper(obj, elem_getter, length, idx): return [elem_getter(obj, i) for i in range(start, stop, step)] if idx < -length or idx >= length: - raise IndexError("Index out of range. size: {}, got index {}".format(length, idx)) + raise IndexError(f"Index out of range. size: {length}, got index {idx}") if idx < 0: idx += length return elem_getter(obj, idx) @@ -77,7 +77,7 @@ def __init__(self, tag, fields): for f in fields: assert isinstance( f, ObjectTypes - ), "Expect object or " "tvm NDArray type, but received : {0}".format(type(f)) + ), f"Expect object or tvm NDArray type, but received : {type(f)}" self.__init_handle_by_constructor__(_ffi_api.ADT, tag, *fields) @property @@ -108,7 +108,7 @@ def tuple_object(fields=None): for f in fields: assert isinstance( f, ObjectTypes - ), "Expect object or tvm " "NDArray type, but received : {0}".format(type(f)) + ), f"Expect object or tvm NDArray type, but received : {type(f)}" return _ffi_api.Tuple(*fields) @@ -149,11 +149,11 @@ class ShapeTuple(Object): """ def __init__(self, shape): - assert isinstance(shape, (list, tuple)), "Expect list of tuple, but received : {0}".format( - type(shape) - ) + assert isinstance( + shape, (list, tuple) + ), f"Expect list of tuple, but received : {type(shape)}" for x in shape: - assert isinstance(x, int), "Expect int type, but received : {0}".format(type(x)) + assert isinstance(x, int), f"Expect int type, but received : {type(x)}" self.__init_handle_by_constructor__(_ffi_api.ShapeTuple, *shape) def __len__(self): diff --git a/python/tvm/runtime/executor/aot_executor.py b/python/tvm/runtime/executor/aot_executor.py index f7b911cb1718..9e1e4bbd18f4 100644 --- a/python/tvm/runtime/executor/aot_executor.py +++ b/python/tvm/runtime/executor/aot_executor.py @@ -86,7 +86,7 @@ def set_input(self, key=None, value=None, **params): if key is not None: v = self._get_input(key) if v is None: - raise RuntimeError("Could not find '%s' in model's inputs" % key) + raise RuntimeError(f"Could not find '{key}' in model's inputs") v.copyfrom(value) if params: diff --git a/python/tvm/runtime/module.py b/python/tvm/runtime/module.py index 671e3a390e0d..82d82a0d463c 100644 --- a/python/tvm/runtime/module.py +++ b/python/tvm/runtime/module.py @@ -74,25 +74,19 @@ def __init__(self, results: Sequence[float]): self.max = np.max(self.results) def __repr__(self): - return "BenchmarkResult(min={}, mean={}, median={}, max={}, std={}, results={})".format( - self.min, self.mean, self.median, self.max, self.std, self.results + return ( + f"BenchmarkResult(min={self.min}, mean={self.mean}, median={self.median}, " + f"max={self.max}, std={self.std}, results={self.results})" ) def __str__(self): - return """Execution time summary: -{:^12} {:^12} {:^12} {:^12} {:^12} -{:^12.4f} {:^12.4f} {:^12.4f} {:^12.4f} {:^12.4f} - """.format( - "mean (ms)", - "median (ms)", - "max (ms)", - "min (ms)", - "std (ms)", - self.mean * 1000, - self.median * 1000, - self.max * 1000, - self.min * 1000, - self.std * 1000, + return ( + f"Execution time summary:\n" + f"{'mean (ms)':^12} {'median (ms)':^12} {'max (ms)':^12} " + f"{'min (ms)':^12} {'std (ms)':^12}\n" + f"{self.mean * 1000:^12.4f} {self.median * 1000:^12.4f} {self.max * 1000:^12.4f} " + f"{self.min * 1000:^12.4f} {self.std * 1000:^12.4f}" + " " ) @@ -180,7 +174,7 @@ def get_function(self, name, query_imports=False): ) ) if not ret_handle.value: - raise AttributeError("Module has no function '%s'" % name) + raise AttributeError(f"Module has no function '{name}'") return PackedFunc(ret_handle, False) def import_module(self, module): @@ -208,7 +202,7 @@ def __call__(self, *args): return self.entry_func(*args) def __repr__(self): - return "Module(%s, %x)" % (self.type_key, self.handle.value) + return f"Module({self.type_key}, {self.handle.value:x})" @property def type_key(self): @@ -495,8 +489,8 @@ def export_library(self, file_name, fcompile=None, addons=None, workspace_dir=No if self.type_key == "stackvm": if not file_name.endswith(".stackvm"): raise ValueError( - "Module[%s]: can only be saved as stackvm format." - "did you build with LLVM enabled?" % self.type_key + f"Module[{self.type_key}]: can only be saved as stackvm format." + "did you build with LLVM enabled?" ) self.save(file_name) return @@ -564,7 +558,7 @@ def export_library(self, file_name, fcompile=None, addons=None, workspace_dir=No llvm_target_string = "llvm -mtriple " + triple if getattr(fcompile, "need_system_lib", False) and not is_system_lib: - raise ValueError("%s need --system-lib option" % str(fcompile)) + raise ValueError(f"{str(fcompile)} need --system-lib option") if self.imported_modules: pack_lib_prefix = system_lib_prefix if system_lib_prefix else "" @@ -650,7 +644,7 @@ def load_module(path, fmt=""): if os.path.isfile(path): path = os.path.realpath(path) else: - raise ValueError("cannot find file %s" % path) + raise ValueError(f"cannot find file {path}") # High level handling for .o and .tar file. # We support this to be consistent with RPC module load. diff --git a/python/tvm/runtime/ndarray.py b/python/tvm/runtime/ndarray.py index b7a325948895..7e08f59644ba 100644 --- a/python/tvm/runtime/ndarray.py +++ b/python/tvm/runtime/ndarray.py @@ -124,7 +124,7 @@ def __setitem__(self, in_slice, value): elif isinstance(value, (np.ndarray, np.generic)): self.copyfrom(value) else: - raise TypeError("type %s not supported" % str(type(value))) + raise TypeError(f"type {type(value)} not supported") def copyfrom(self, source_array): """Perform a synchronous copy from the array. @@ -148,8 +148,7 @@ def copyfrom(self, source_array): source_array = np.array(source_array, dtype=self.dtype) except: raise TypeError( - "array must be an array_like data," - + "type %s is not supported" % str(type(source_array)) + f"array must be an array_like data, type {type(source_array)} is not supported" ) t = DataType(self.dtype) @@ -161,9 +160,7 @@ def copyfrom(self, source_array): if source_array.shape != shape: raise ValueError( - "array shape do not match the shape of NDArray {0} vs {1}".format( - source_array.shape, shape - ) + f"array shape do not match the shape of NDArray {source_array.shape} vs {shape}" ) numpy_str_map = DataType.NUMPY2STR np_dtype_str = ( @@ -184,7 +181,7 @@ def copyfrom(self, source_array): return self def __repr__(self): - res = "\n".format(self.shape, self.device) + res = f"\n" res += self.numpy().__repr__() return res @@ -252,7 +249,7 @@ def copyto(self, target, mem_scope=None): if isinstance(target, Device): res = empty(self.shape, self.dtype, target, mem_scope) return self._copyto(res) - raise ValueError("Unsupported target type %s" % str(type(target))) + raise ValueError(f"Unsupported target type {type(target)}") def _create_view(self, shape): """Create a view into an existing array. @@ -311,7 +308,7 @@ def device(dev_type, dev_id=0): if isinstance(dev_type, string_types): dev_type = dev_type.split()[0] if dev_type not in Device.STR2MASK: - raise ValueError("Unknown device type %s" % dev_type) + raise ValueError(f"Unknown device type {dev_type}") dev_type = Device.STR2MASK[dev_type] return Device(dev_type, dev_id) @@ -435,7 +432,7 @@ def gpu(dev_id=0): The created device """ warnings.warn( - "Please use tvm.cuda() instead of tvm.gpu(). tvm.gpu() is going to be deprecated in 0.9.0", + "Please use tvm.cuda() instead of tvm.gpu(). tvm.gpu() is going to be deprecated in 0.9.0" ) return Device(Device.kDLCUDA, dev_id) diff --git a/python/tvm/runtime/object.py b/python/tvm/runtime/object.py index 6a8dd6587643..b57276ebd2e1 100644 --- a/python/tvm/runtime/object.py +++ b/python/tvm/runtime/object.py @@ -38,10 +38,7 @@ if _FFI_MODE == "cython": raise error from tvm._ffi._ctypes.object import ObjectBase, PyNativeObject - from tvm._ffi._ctypes.packed_func import ( - _set_class_object, - _set_class_object_generic, - ) + from tvm._ffi._ctypes.packed_func import _set_class_object, _set_class_object_generic def _new_object(cls): @@ -75,7 +72,7 @@ def __getattr__(self, name): try: return _ffi_node_api.NodeGetAttr(self, name) except AttributeError: - raise AttributeError("%s has no attribute %s" % (str(type(self)), name)) from None + raise AttributeError(f"{type(self)} has no attribute {name}") from None def __hash__(self): return _ffi_api.ObjectPtrHash(self) diff --git a/python/tvm/runtime/object_generic.py b/python/tvm/runtime/object_generic.py index de8e801cca64..887c2faaeb2b 100644 --- a/python/tvm/runtime/object_generic.py +++ b/python/tvm/runtime/object_generic.py @@ -84,7 +84,7 @@ def convert_to_object(value, span=None): if value is None: return None - raise ValueError("don't know how to convert type %s to object" % type(value)) + raise ValueError(f"don't know how to convert type {type(value)} to object") def convert(value, span=None): @@ -128,9 +128,7 @@ def _scalar_type_inference(value): else: dtype = "int64" else: - raise NotImplementedError( - "Cannot automatically inference the type." " value={}".format(value) - ) + raise NotImplementedError(f"Cannot automatically inference the type. value={value}") return dtype diff --git a/python/tvm/runtime/vm.py b/python/tvm/runtime/vm.py index 45ec312b17bb..cf6d3e3f9ce8 100644 --- a/python/tvm/runtime/vm.py +++ b/python/tvm/runtime/vm.py @@ -61,7 +61,7 @@ def _gettype(arg): elif isinstance(arg, str): cargs.append(arg) else: - raise TypeError("Unsupported type: %s" % (type(arg))) + raise TypeError(f"Unsupported type: {type(arg)}") def convert(args): @@ -179,14 +179,13 @@ def load_exec(bytecode, lib): bytecode = bytearray(bytecode) elif not isinstance(bytecode, (bytearray, TVMByteArray)): raise TypeError( - "bytecode is expected to be the type of bytearray " - + "or TVMByteArray, but received {}".format(type(bytecode)) + "bytecode is expected to be the type of bytearray or TVMByteArray, but received " + f"{type(bytecode)}" ) if lib is not None and not isinstance(lib, tvm.runtime.Module): raise TypeError( - "lib is expected to be the type of tvm.runtime.Module" - + ", but received {}".format(type(lib)) + f"lib is expected to be the type of tvm.runtime.Module, but received {type(lib)}" ) return Executable(_ffi_api.Load_Executable(bytecode, lib)) @@ -384,8 +383,7 @@ def __init__(self, exe, device, memory_cfg=None): """ if not isinstance(exe, Executable) and not isinstance(exe, Module): raise TypeError( - "exe is expected to be the type of Executable, " - + "but received {}".format(type(exe)) + f"exe is expected to be the type of Executable, but received {type(exe)}" ) if not isinstance(exe, Executable): @@ -426,8 +424,7 @@ def _setup_device(self, dev, memory_cfg): memory_cfg = {} elif not isinstance(memory_cfg, dict): raise TypeError( - "memory_cfg is expected be string or dictionary, " - + "but received {}".format(type(memory_cfg)) + f"memory_cfg is expected be string or dictionary, but received {type(memory_cfg)}" ) init_args = [] for device in devs: From eff87fa63d3ea337d965bc81e52dcd5afcb18fb9 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Fri, 26 May 2023 11:40:21 -0700 Subject: [PATCH 2/2] Fix linter --- python/tvm/rpc/proxy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tvm/rpc/proxy.py b/python/tvm/rpc/proxy.py index 855a0b752682..687d47264b65 100644 --- a/python/tvm/rpc/proxy.py +++ b/python/tvm/rpc/proxy.py @@ -254,7 +254,7 @@ def __init__( resource_files = resource_files if resource_files else [] for fname in resource_files: basename = os.path.basename(fname) - pair = (fr"/{basename}", RequestHandler, {"file_path": fname}) + pair = (rf"/{basename}", RequestHandler, {"file_path": fname}) handlers.append(pair) logging.info(pair) self.app = tornado.web.Application(handlers)