From da87a80d0afb1ddfa9a80a89051d8df269796fb3 Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 11 Apr 2022 18:20:22 +0800 Subject: [PATCH 01/31] move to lib --- .gitignore | 1 + MANIFEST.in | 4 ++++ csrc/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt | 2 ++ csrc/backend_ops/ncnn/ops/CMakeLists.txt | 3 +++ csrc/backend_ops/onnxruntime/CMakeLists.txt | 3 +++ csrc/backend_ops/tensorrt/CMakeLists.txt | 3 +++ mmdeploy/backend/ncnn/init_plugins.py | 6 ++---- mmdeploy/backend/onnxruntime/init_plugins.py | 2 +- mmdeploy/backend/tensorrt/init_plugins.py | 2 +- setup.py | 6 ++++-- 10 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 3c4bdc851e..5e424cdba2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ __pycache__/ # C extensions *.so +onnx2ncnn # Distribution / packaging .Python diff --git a/MANIFEST.in b/MANIFEST.in index e534d45947..0281f8a474 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,5 @@ include requirements/*.txt +include mmdeploy/backend/ncnn/*.so +include mmdeploy/backend/ncnn/*.dll +include mmdeploy/lib/*.so +include mmdeploy/lib/*.dll \ No newline at end of file diff --git a/csrc/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt b/csrc/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt index eca4e0ccaf..721414e890 100755 --- a/csrc/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt +++ b/csrc/backend_ops/ncnn/onnx2ncnn/CMakeLists.txt @@ -12,6 +12,8 @@ if (PROTOBUF_FOUND) ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(onnx2ncnn PRIVATE ${PROTOBUF_LIBRARIES}) + set(_NCNN_CONVERTER_DIR ${CMAKE_SOURCE_DIR}/mmdeploy/backend/ncnn) + install(TARGETS onnx2ncnn DESTINATION ${_NCNN_CONVERTER_DIR}) else () message( FATAL_ERROR "Protobuf not found, onnx model convert tool won't be built") diff --git a/csrc/backend_ops/ncnn/ops/CMakeLists.txt b/csrc/backend_ops/ncnn/ops/CMakeLists.txt index 461301211a..8af1b85f0b 100755 --- a/csrc/backend_ops/ncnn/ops/CMakeLists.txt +++ b/csrc/backend_ops/ncnn/ops/CMakeLists.txt @@ -23,3 +23,6 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${_COMMON_INCLUDE_DIRS}) add_library(mmdeploy::ncnn_ops ALIAS ${PROJECT_NAME}) + +set(_NCNN_OPS_DIR ${CMAKE_SOURCE_DIR}/mmdeploy/lib) +install(TARGETS ${PROJECT_NAME} DESTINATION ${_NCNN_OPS_DIR}) diff --git a/csrc/backend_ops/onnxruntime/CMakeLists.txt b/csrc/backend_ops/onnxruntime/CMakeLists.txt index 5dfa8176b0..3d1a1e14c3 100644 --- a/csrc/backend_ops/onnxruntime/CMakeLists.txt +++ b/csrc/backend_ops/onnxruntime/CMakeLists.txt @@ -22,3 +22,6 @@ target_link_libraries(${PROJECT_NAME}_obj PUBLIC onnxruntime) mmdeploy_add_library(${PROJECT_NAME} SHARED EXCLUDE "") target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_obj) add_library(mmdeploy::onnxruntime::ops ALIAS ${PROJECT_NAME}) + +set(_ORT_OPS_DIR ${CMAKE_SOURCE_DIR}/mmdeploy/lib) +install(TARGETS ${PROJECT_NAME} DESTINATION ${_ORT_OPS_DIR}) diff --git a/csrc/backend_ops/tensorrt/CMakeLists.txt b/csrc/backend_ops/tensorrt/CMakeLists.txt index 14db917dd3..9f375596fa 100644 --- a/csrc/backend_ops/tensorrt/CMakeLists.txt +++ b/csrc/backend_ops/tensorrt/CMakeLists.txt @@ -35,3 +35,6 @@ mmdeploy_export(${PROJECT_NAME}_obj) mmdeploy_add_module(${PROJECT_NAME} MODULE EXCLUDE "") target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_obj) add_library(mmdeploy::tensorrt_ops ALIAS ${PROJECT_NAME}) + +set(_TRT_OPS_DIR ${CMAKE_SOURCE_DIR}/mmdeploy/lib) +install(TARGETS ${PROJECT_NAME} DESTINATION ${_TRT_OPS_DIR}) diff --git a/mmdeploy/backend/ncnn/init_plugins.py b/mmdeploy/backend/ncnn/init_plugins.py index 10f9ca2655..f46c3a83d7 100644 --- a/mmdeploy/backend/ncnn/init_plugins.py +++ b/mmdeploy/backend/ncnn/init_plugins.py @@ -11,7 +11,7 @@ def get_ops_path() -> str: str: The library path of NCNN custom ops. """ candidates = [ - '../../../build/lib/libmmdeploy_ncnn_ops.so', + '../../lib/libmmdeploy_ncnn_ops.so', '../../../build/bin/*/mmdeploy_ncnn_ops.dll' ] return get_file_path(os.path.dirname(__file__), candidates) @@ -23,7 +23,5 @@ def get_onnx2ncnn_path() -> str: Returns: str: A path of onnx2ncnn tool. """ - candidates = [ - '../../../build/bin/onnx2ncnn', '../../../build/bin/*/onnx2ncnn.exe' - ] + candidates = ['./onnx2ncnn', './onnx2ncnn.exe'] return get_file_path(os.path.dirname(__file__), candidates) diff --git a/mmdeploy/backend/onnxruntime/init_plugins.py b/mmdeploy/backend/onnxruntime/init_plugins.py index e8622eedf3..666d0eae79 100644 --- a/mmdeploy/backend/onnxruntime/init_plugins.py +++ b/mmdeploy/backend/onnxruntime/init_plugins.py @@ -11,7 +11,7 @@ def get_ops_path() -> str: str: The library path to onnxruntime custom ops. """ candidates = [ - '../../../build/lib/libmmdeploy_onnxruntime_ops.so', + '../../lib/libmmdeploy_onnxruntime_ops.so', '../../../build/bin/*/mmdeploy_onnxruntime_ops.dll', ] return get_file_path(os.path.dirname(__file__), candidates) diff --git a/mmdeploy/backend/tensorrt/init_plugins.py b/mmdeploy/backend/tensorrt/init_plugins.py index 80c6eea4d7..9cf5cabb95 100644 --- a/mmdeploy/backend/tensorrt/init_plugins.py +++ b/mmdeploy/backend/tensorrt/init_plugins.py @@ -12,7 +12,7 @@ def get_ops_path() -> str: str: A path of the TensorRT plugin library. """ candidates = [ - '../../../build/lib/libmmdeploy_tensorrt_ops.so', + '../../lib/libmmdeploy_tensorrt_ops.so', '../../../build/bin/*/mmdeploy_tensorrt_ops.dll' ] return get_file_path(os.path.dirname(__file__), candidates) diff --git a/setup.py b/setup.py index cb22dc54ee..f47db98f34 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,9 @@ import logging +import os from setuptools import find_packages, setup +pwd = os.path.dirname(__file__) version_file = 'mmdeploy/version.py' try: @@ -13,13 +15,13 @@ def readme(): - with open('README.md', encoding='utf-8') as f: + with open(os.path.join(pwd, 'README.md'), encoding='utf-8') as f: content = f.read() return content def get_version(): - with open(version_file, 'r') as f: + with open(os.path.join(pwd, version_file), 'r') as f: exec(compile(f.read(), version_file, 'exec')) return locals()['__version__'] From 2a03ca7a2f124abc0d22540e6ceb561420334eec Mon Sep 17 00:00:00 2001 From: grimoire Date: Fri, 25 Mar 2022 13:33:35 +0800 Subject: [PATCH 02/31] optional import pytorch rewriter --- mmdeploy/__init__.py | 6 +++++- mmdeploy/backend/sdk/__init__.py | 11 +++++++---- requirements/runtime.txt | 1 + setup.py | 10 +--------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/mmdeploy/__init__.py b/mmdeploy/__init__.py index 805db5c94b..a57f906701 100644 --- a/mmdeploy/__init__.py +++ b/mmdeploy/__init__.py @@ -4,7 +4,11 @@ from mmdeploy.utils import get_root_logger from .version import __version__ # noqa F401 -importlib.import_module('mmdeploy.pytorch') +if importlib.util.find_spec('torch'): + importlib.import_module('mmdeploy.pytorch') +else: + logger = get_root_logger() + logger.debug('torch is not installed.') if importlib.util.find_spec('mmcv'): importlib.import_module('mmdeploy.mmcv') diff --git a/mmdeploy/backend/sdk/__init__.py b/mmdeploy/backend/sdk/__init__.py index ef648c4d5b..9a210d01be 100644 --- a/mmdeploy/backend/sdk/__init__.py +++ b/mmdeploy/backend/sdk/__init__.py @@ -20,10 +20,13 @@ lib_dir = os.path.dirname(lib_path) sys.path.insert(0, lib_dir) -if importlib.util.find_spec(module_name) is not None: - from .wrapper import SDKWrapper - __all__ = ['SDKWrapper'] - _is_available = True +try: + if importlib.util.find_spec(module_name) is not None: + from .wrapper import SDKWrapper + __all__ = ['SDKWrapper'] + _is_available = True +except Exception: + pass def is_available() -> bool: diff --git a/requirements/runtime.txt b/requirements/runtime.txt index 6114dfc58f..82e152466d 100644 --- a/requirements/runtime.txt +++ b/requirements/runtime.txt @@ -1,5 +1,6 @@ h5py matplotlib +multiprocess numpy onnx>=1.8.0 six diff --git a/setup.py b/setup.py index f47db98f34..86e5cdf022 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,3 @@ -import logging import os from setuptools import find_packages, setup @@ -6,13 +5,6 @@ pwd = os.path.dirname(__file__) version_file = 'mmdeploy/version.py' -try: - from torch.utils.cpp_extension import BuildExtension - cmd_class = {'build_ext': BuildExtension} -except ModuleNotFoundError: - cmd_class = {} - logging.warning('Skip building ext ops due to the absence of torch.') - def readme(): with open(os.path.join(pwd, 'README.md'), encoding='utf-8') as f: @@ -137,5 +129,5 @@ def gen_packages_items(): 'optional': parse_requirements('requirements/optional.txt'), }, ext_modules=[], - cmdclass=cmd_class, + cmdclass={}, zip_safe=False) From 8047c1bb0c77e330b12165a5d3629c7fa669bc77 Mon Sep 17 00:00:00 2001 From: grimoire Date: Thu, 24 Mar 2022 16:50:31 +0800 Subject: [PATCH 03/31] reduce torch dependancy of tensorrt export --- mmdeploy/backend/tensorrt/calib_utils.py | 25 +++++------ mmdeploy/backend/tensorrt/utils.py | 57 +++++------------------- mmdeploy/backend/tensorrt/wrapper.py | 42 ++++++++++++++++- mmdeploy/utils/utils.py | 2 +- 4 files changed, 66 insertions(+), 60 deletions(-) diff --git a/mmdeploy/backend/tensorrt/calib_utils.py b/mmdeploy/backend/tensorrt/calib_utils.py index 9a969b5f9a..fdd1fda184 100644 --- a/mmdeploy/backend/tensorrt/calib_utils.py +++ b/mmdeploy/backend/tensorrt/calib_utils.py @@ -3,8 +3,9 @@ import h5py import numpy as np +import pycuda.autoinit # noqa:F401 +import pycuda.driver as cuda import tensorrt as trt -import torch DEFAULT_CALIBRATION_ALGORITHM = trt.CalibrationAlgoType.ENTROPY_CALIBRATION_2 @@ -67,30 +68,28 @@ def get_batch(self, names: Sequence[str], **kwargs) -> list: ret = [] for name in names: input_group = self.calib_data[name] - data_np = input_group[str(self.count)][...] - data_torch = torch.from_numpy(data_np) + data_np = input_group[str(self.count)][...].astype(np.float32) # tile the tensor so we can keep the same distribute opt_shape = self.input_shapes[name]['opt_shape'] - data_shape = data_torch.shape + data_shape = data_np.shape reps = [ int(np.ceil(opt_s / data_s)) for opt_s, data_s in zip(opt_shape, data_shape) ] - data_torch = data_torch.tile(reps) + data_np = np.tile(data_np, reps) - for dim, opt_s in enumerate(opt_shape): - if data_torch.shape[dim] != opt_s: - data_torch = data_torch.narrow(dim, 0, opt_s) + slice_list = tuple(slice(0, end) for end in opt_shape) + data_np = data_np[slice_list] - if name not in self.buffers: - self.buffers[name] = data_torch.cuda(self.device_id) - else: - self.buffers[name].copy_(data_torch.cuda(self.device_id)) + data_np_cuda_ptr = cuda.mem_alloc(data_np.nbytes) + cuda.memcpy_htod(data_np_cuda_ptr, + np.ascontiguousarray(data_np)) + self.buffers[name] = data_np_cuda_ptr - ret.append(int(self.buffers[name].data_ptr())) + ret.append(self.buffers[name]) self.count += 1 return ret else: diff --git a/mmdeploy/backend/tensorrt/utils.py b/mmdeploy/backend/tensorrt/utils.py index 3dc0882d2f..4a2c56ca2b 100644 --- a/mmdeploy/backend/tensorrt/utils.py +++ b/mmdeploy/backend/tensorrt/utils.py @@ -4,11 +4,9 @@ import onnx import tensorrt as trt -import torch from packaging import version from mmdeploy.utils import get_root_logger -from .calib_utils import HDF5Calibrator from .init_plugins import load_tensorrt_plugin @@ -54,8 +52,17 @@ def create_trt_engine(onnx_model: Union[str, onnx.ModelProto], >>> device_id=0) >>> }) """ + + import os + old_cuda_device = os.environ.get('CUDA_DEVICE', None) + os.environ['CUDA_DEVICE'] = str(device_id) + import pycuda.autoinit # noqa:F401 + if old_cuda_device is not None: + os.environ['CUDA_DEVICE'] = old_cuda_device + else: + os.environ.pop('CUDA_DEVICE') + load_tensorrt_plugin() - device = torch.device('cuda:{}'.format(device_id)) # create builder and network logger = trt.Logger(log_level) builder = trt.Builder(logger) @@ -96,6 +103,7 @@ def create_trt_engine(onnx_model: Union[str, onnx.ModelProto], config.set_flag(trt.BuilderFlag.FP16) if int8_mode: + from .calib_utils import HDF5Calibrator config.set_flag(trt.BuilderFlag.INT8) assert int8_param is not None config.int8_calibrator = HDF5Calibrator( @@ -110,8 +118,7 @@ def create_trt_engine(onnx_model: Union[str, onnx.ModelProto], builder.int8_calibrator = config.int8_calibrator # create engine - with torch.cuda.device(device): - engine = builder.build_engine(network, config) + engine = builder.build_engine(network, config) assert engine is not None, 'Failed to create TensorRT engine' return engine @@ -145,46 +152,6 @@ def load_trt_engine(path: str) -> trt.ICudaEngine: return engine -def torch_dtype_from_trt(dtype: trt.DataType) -> torch.dtype: - """Convert pytorch dtype to TensorRT dtype. - - Args: - dtype (str.DataType): The data type in tensorrt. - - Returns: - torch.dtype: The corresponding data type in torch. - """ - - if dtype == trt.bool: - return torch.bool - elif dtype == trt.int8: - return torch.int8 - elif dtype == trt.int32: - return torch.int32 - elif dtype == trt.float16: - return torch.float16 - elif dtype == trt.float32: - return torch.float32 - else: - raise TypeError(f'{dtype} is not supported by torch') - - -def torch_device_from_trt(device: trt.TensorLocation): - """Convert pytorch device to TensorRT device. - - Args: - device (trt.TensorLocation): The device in tensorrt. - Returns: - torch.device: The corresponding device in torch. - """ - if device == trt.TensorLocation.DEVICE: - return torch.device('cuda') - elif device == trt.TensorLocation.HOST: - return torch.device('cpu') - else: - return TypeError(f'{device} is not supported by torch') - - def get_trt_log_level() -> trt.Logger.Severity: """Get tensorrt log level from root logger. diff --git a/mmdeploy/backend/tensorrt/wrapper.py b/mmdeploy/backend/tensorrt/wrapper.py index 9a0cd2e10f..9a23d5b2a4 100644 --- a/mmdeploy/backend/tensorrt/wrapper.py +++ b/mmdeploy/backend/tensorrt/wrapper.py @@ -8,7 +8,47 @@ from mmdeploy.utils.timer import TimeCounter from ..base import BACKEND_WRAPPER, BaseWrapper from .init_plugins import load_tensorrt_plugin -from .utils import load_trt_engine, torch_device_from_trt, torch_dtype_from_trt +from .utils import load_trt_engine + + +def torch_dtype_from_trt(dtype: trt.DataType) -> torch.dtype: + """Convert pytorch dtype to TensorRT dtype. + + Args: + dtype (str.DataType): The data type in tensorrt. + + Returns: + torch.dtype: The corresponding data type in torch. + """ + + if dtype == trt.bool: + return torch.bool + elif dtype == trt.int8: + return torch.int8 + elif dtype == trt.int32: + return torch.int32 + elif dtype == trt.float16: + return torch.float16 + elif dtype == trt.float32: + return torch.float32 + else: + raise TypeError(f'{dtype} is not supported by torch') + + +def torch_device_from_trt(device: trt.TensorLocation): + """Convert pytorch device to TensorRT device. + + Args: + device (trt.TensorLocation): The device in tensorrt. + Returns: + torch.device: The corresponding device in torch. + """ + if device == trt.TensorLocation.DEVICE: + return torch.device('cuda') + elif device == trt.TensorLocation.HOST: + return torch.device('cpu') + else: + return TypeError(f'{device} is not supported by torch') @BACKEND_WRAPPER.register_module(Backend.TENSORRT.value) diff --git a/mmdeploy/utils/utils.py b/mmdeploy/utils/utils.py index 10d6d02bd0..33d71094e4 100644 --- a/mmdeploy/utils/utils.py +++ b/mmdeploy/utils/utils.py @@ -6,7 +6,7 @@ import traceback from typing import Callable, Optional, Union -import torch.multiprocessing as mp +import multiprocess as mp from mmcv.utils import get_logger From 93f2611e7e904d5fb479d28b16d7b2e30b29ba6e Mon Sep 17 00:00:00 2001 From: grimoire Date: Thu, 24 Mar 2022 21:07:50 +0800 Subject: [PATCH 04/31] remove more mmcv support --- mmdeploy/backend/__init__.py | 41 +++++++++++++----------- mmdeploy/backend/ncnn/__init__.py | 7 ++-- mmdeploy/backend/ncnn/onnx2ncnn.py | 12 +++++-- mmdeploy/backend/tensorrt/__init__.py | 15 +++++---- mmdeploy/utils/__init__.py | 46 +++++++++++++++++---------- mmdeploy/utils/device.py | 11 ++++--- mmdeploy/utils/utils.py | 43 +++++++++++++++++++++---- 7 files changed, 117 insertions(+), 58 deletions(-) diff --git a/mmdeploy/backend/__init__.py b/mmdeploy/backend/__init__.py index 3385ad598e..a170c3e6c7 100644 --- a/mmdeploy/backend/__init__.py +++ b/mmdeploy/backend/__init__.py @@ -1,4 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. +import importlib + from mmdeploy.backend.ncnn import is_available as ncnn_available from mmdeploy.backend.onnxruntime import is_available as ort_available from mmdeploy.backend.openvino import is_available as openvino_available @@ -6,22 +8,23 @@ from mmdeploy.backend.sdk import is_available as sdk_available from mmdeploy.backend.tensorrt import is_available as trt_available -__all__ = [] -if ncnn_available(): - from .ncnn import NCNNWrapper # noqa: F401,F403 - __all__.append('NCNNWrapper') -if ort_available(): - from .onnxruntime import ORTWrapper # noqa: F401,F403 - __all__.append('ORTWrapper') -if trt_available(): - from .tensorrt import TRTWrapper # noqa: F401,F403 - __all__.append('TRTWrapper') -if pplnn_available(): - from .pplnn import PPLNNWrapper # noqa: F401,F403 - __all__.append('PPLNNWrapper') -if openvino_available(): - from .openvino import OpenVINOWrapper # noqa: F401,F403 - __all__.append('OpenVINOWrapper') -if sdk_available(): - from .sdk import SDKWrapper # noqa: F401,F403 - __all__.append('SDKWrapper') +if importlib.util.find_spec('torch') is not None: + __all__ = [] + if ncnn_available(): + from .ncnn import NCNNWrapper # noqa: F401,F403 + __all__.append('NCNNWrapper') + if ort_available(): + from .onnxruntime import ORTWrapper # noqa: F401,F403 + __all__.append('ORTWrapper') + if trt_available(): + from .tensorrt import TRTWrapper # noqa: F401,F403 + __all__.append('TRTWrapper') + if pplnn_available(): + from .pplnn import PPLNNWrapper # noqa: F401,F403 + __all__.append('PPLNNWrapper') + if openvino_available(): + from .openvino import OpenVINOWrapper # noqa: F401,F403 + __all__.append('OpenVINOWrapper') + if sdk_available(): + from .sdk import SDKWrapper # noqa: F401,F403 + __all__.append('SDKWrapper') diff --git a/mmdeploy/backend/ncnn/__init__.py b/mmdeploy/backend/ncnn/__init__.py index e241b6d2ae..41b2c0ad94 100644 --- a/mmdeploy/backend/ncnn/__init__.py +++ b/mmdeploy/backend/ncnn/__init__.py @@ -32,6 +32,9 @@ def is_plugin_available(): if is_available(): - from .wrapper import NCNNWrapper + try: + from .wrapper import NCNNWrapper - __all__ = ['NCNNWrapper'] + __all__ = ['NCNNWrapper'] + except Exception: + pass diff --git a/mmdeploy/backend/ncnn/onnx2ncnn.py b/mmdeploy/backend/ncnn/onnx2ncnn.py index f4bd30d800..ec69d941db 100644 --- a/mmdeploy/backend/ncnn/onnx2ncnn.py +++ b/mmdeploy/backend/ncnn/onnx2ncnn.py @@ -1,13 +1,19 @@ # Copyright (c) OpenMMLab. All rights reserved. +import os import os.path as osp from subprocess import call from typing import List -import mmcv - from .init_plugins import get_onnx2ncnn_path +def mkdir_or_exist(dir_name, mode=0o777): + if dir_name == '': + return + dir_name = osp.expanduser(dir_name) + os.makedirs(dir_name, mode=mode, exist_ok=True) + + def get_output_model_file(onnx_path: str, work_dir: str) -> List[str]: """Returns the path to the .param, .bin file with export result. @@ -19,7 +25,7 @@ def get_output_model_file(onnx_path: str, work_dir: str) -> List[str]: List[str]: The path to the files where the export result will be located. """ - mmcv.mkdir_or_exist(osp.abspath(work_dir)) + mkdir_or_exist(osp.abspath(work_dir)) file_name = osp.splitext(osp.split(onnx_path)[1])[0] save_param = osp.join(work_dir, file_name + '.param') save_bin = osp.join(work_dir, file_name + '.bin') diff --git a/mmdeploy/backend/tensorrt/__init__.py b/mmdeploy/backend/tensorrt/__init__.py index de0a71574e..b86fd8efdd 100644 --- a/mmdeploy/backend/tensorrt/__init__.py +++ b/mmdeploy/backend/tensorrt/__init__.py @@ -3,8 +3,6 @@ import importlib import os.path as osp -import torch - from .init_plugins import get_ops_path, load_tensorrt_plugin @@ -15,8 +13,7 @@ def is_available(): bool: True if TensorRT package is installed and cuda is available. """ - return importlib.util.find_spec('tensorrt') is not None and \ - torch.cuda.is_available() + return importlib.util.find_spec('tensorrt') is not None def is_plugin_available(): @@ -31,9 +28,15 @@ def is_plugin_available(): if is_available(): from .utils import create_trt_engine, load_trt_engine, save_trt_engine - from .wrapper import TRTWrapper __all__ = [ 'create_trt_engine', 'save_trt_engine', 'load_trt_engine', - 'TRTWrapper', 'load_tensorrt_plugin' + 'load_tensorrt_plugin' ] + + try: + # import wrapper if pytorch is available + from .wrapper import TRTWrapper + __all__ += ['TRTWrapper'] + except Exception: + pass diff --git a/mmdeploy/utils/__init__.py b/mmdeploy/utils/__init__.py index 4847ba7b09..e2955ee248 100644 --- a/mmdeploy/utils/__init__.py +++ b/mmdeploy/utils/__init__.py @@ -1,24 +1,36 @@ # Copyright (c) OpenMMLab. All rights reserved. -from .config_utils import (cfg_apply_marks, get_backend, get_backend_config, - get_calib_config, get_calib_filename, get_codebase, - get_codebase_config, get_common_config, - get_dynamic_axes, get_input_shape, get_ir_config, - get_model_inputs, get_onnx_config, - get_partition_config, get_task_type, - is_dynamic_batch, is_dynamic_shape, load_config) -from .constants import IR, SDK_TASK_MAP, Backend, Codebase, Task +import importlib + +from .constants import SDK_TASK_MAP, Backend, Codebase, Task from .device import parse_cuda_device_id, parse_device_id from .env import get_backend_version, get_codebase_version, get_library_version from .utils import get_file_path, get_root_logger, target_wrapper __all__ = [ - 'is_dynamic_batch', 'is_dynamic_shape', 'get_task_type', 'get_codebase', - 'get_backend', 'load_config', 'Backend', 'Codebase', 'Task', - 'get_ir_config', 'get_onnx_config', 'get_partition_config', - 'get_calib_config', 'get_calib_filename', 'get_common_config', - 'get_model_inputs', 'cfg_apply_marks', 'get_input_shape', - 'parse_device_id', 'parse_cuda_device_id', 'get_codebase_config', - 'get_backend_config', 'get_root_logger', 'get_dynamic_axes', - 'target_wrapper', 'SDK_TASK_MAP', 'get_library_version', - 'get_codebase_version', 'get_backend_version', 'IR', 'get_file_path' + 'SDK_TASK_MAP', 'Backend', 'Codebase', 'Task', 'parse_cuda_device_id', + 'parse_device_id', 'get_file_path', 'get_root_logger', 'target_wrapper', + 'get_backend_version', 'get_codebase_version', 'get_library_version' ] + +if importlib.util.find_spec('mmcv') is not None: + # yapf: disable + from .config_utils import (cfg_apply_marks, get_backend, + get_backend_config, get_calib_config, + get_calib_filename, get_codebase, + get_codebase_config, get_common_config, + get_dynamic_axes, get_input_shape, + get_ir_config, get_model_inputs, + get_onnx_config, get_partition_config, + get_task_type, is_dynamic_batch, + is_dynamic_shape, load_config) + + # yapf: enable + + __all__ += [ + 'cfg_apply_marks', 'get_backend', 'get_backend_config', + 'get_calib_config', 'get_calib_filename', 'get_codebase', + 'get_codebase_config', 'get_common_config', 'get_dynamic_axes', + 'get_input_shape', 'get_ir_config', 'get_model_inputs', + 'get_onnx_config', 'get_partition_config', 'get_task_type', + 'is_dynamic_batch', 'is_dynamic_shape', 'load_config' + ] diff --git a/mmdeploy/utils/device.py b/mmdeploy/utils/device.py index 1925e6523c..1b980e449c 100644 --- a/mmdeploy/utils/device.py +++ b/mmdeploy/utils/device.py @@ -1,8 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. +import re from typing import Optional -import torch - def parse_device_id(device: str) -> Optional[int]: """Parse device index from a string. @@ -34,9 +33,11 @@ def parse_cuda_device_id(device: str) -> int: Returns: int: The parsed device id, defaults to `0`. """ - device = torch.device(device) - assert device.type == 'cuda', 'Not cuda device.' + match_result = re.match('([^:]+)(:[0-9]+)?$', device) + assert match_result is not None, f'Can not parse device {device}.' + assert match_result.group(1).lower() == 'cuda', 'Not cuda device.' - device_id = 0 if device.index is None else device.index + device_id = 0 if match_result.lastindex == 1 else int( + match_result.group(2)[1:]) return device_id diff --git a/mmdeploy/utils/utils.py b/mmdeploy/utils/utils.py index 33d71094e4..53f77af3b8 100644 --- a/mmdeploy/utils/utils.py +++ b/mmdeploy/utils/utils.py @@ -7,7 +7,6 @@ from typing import Callable, Optional, Union import multiprocess as mp -from mmcv.utils import get_logger def target_wrapper(target: Callable, @@ -27,8 +26,7 @@ def target_wrapper(target: Callable, """ logger = logging.getLogger() logging.basicConfig( - format='%(asctime)s,%(name)s %(levelname)-8s' - ' [%(filename)s:%(lineno)d] %(message)s', + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d:%H:%M:%S') logger.level logger.setLevel(log_level) @@ -44,6 +42,9 @@ def target_wrapper(target: Callable, traceback.print_exc(file=sys.stdout) +mmdeploy_logger = None + + def get_root_logger(log_file=None, log_level=logging.INFO) -> logging.Logger: """Get root logger. @@ -54,9 +55,39 @@ def get_root_logger(log_file=None, log_level=logging.INFO) -> logging.Logger: Returns: logging.Logger: The obtained logger """ - logger = get_logger( - name='mmdeploy', log_file=log_file, log_level=log_level) - + try: + from mmcv.utils import get_logger + logger = get_logger( + name='mmdeploy', log_file=log_file, log_level=log_level) + except Exception: + global mmdeploy_logger + if mmdeploy_logger is not None: + return mmdeploy_logger + import logging + logger = logging.getLogger('mmdeploy') + + for handler in logger.root.handlers: + if type(handler) is logging.StreamHandler: + handler.setLevel(logging.ERROR) + + stream_handler = logging.StreamHandler() + handlers = [stream_handler] + file_mode = 'w' + + if log_file is not None: + file_handler = logging.FileHandler(log_file, file_mode) + handlers.append(file_handler) + + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + for handler in handlers: + handler.setFormatter(formatter) + handler.setLevel(log_level) + logger.addHandler(handler) + + logger.setLevel(log_level) + + mmdeploy_logger = logger return logger From d90cd659349182b25a31f8760a7049c37691f08d Mon Sep 17 00:00:00 2001 From: grimoire Date: Fri, 15 Apr 2022 15:14:07 +0800 Subject: [PATCH 05/31] fix pytest --- tests/test_utils/test_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_utils/test_util.py b/tests/test_utils/test_util.py index d4e6764eec..8fe04d6284 100644 --- a/tests/test_utils/test_util.py +++ b/tests/test_utils/test_util.py @@ -390,7 +390,7 @@ def test_cuda10(self): def test_incorrect_cuda_device(self): device = 'cuda_5' - with pytest.raises(RuntimeError): + with pytest.raises(AssertionError): util.parse_device_id(device) def test_incorrect_device(self): From 4ec8e88fc6ca4347d526ec2128a5021c5e7bab39 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 20 Apr 2022 15:42:03 +0800 Subject: [PATCH 06/31] remove mmcv logge --- mmdeploy/utils/utils.py | 66 +++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/mmdeploy/utils/utils.py b/mmdeploy/utils/utils.py index 53f77af3b8..770f6476c1 100644 --- a/mmdeploy/utils/utils.py +++ b/mmdeploy/utils/utils.py @@ -8,6 +8,8 @@ import multiprocess as mp +mmdeploy_logger = None + def target_wrapper(target: Callable, log_level: int, @@ -42,9 +44,6 @@ def target_wrapper(target: Callable, traceback.print_exc(file=sys.stdout) -mmdeploy_logger = None - - def get_root_logger(log_file=None, log_level=logging.INFO) -> logging.Logger: """Get root logger. @@ -55,39 +54,34 @@ def get_root_logger(log_file=None, log_level=logging.INFO) -> logging.Logger: Returns: logging.Logger: The obtained logger """ - try: - from mmcv.utils import get_logger - logger = get_logger( - name='mmdeploy', log_file=log_file, log_level=log_level) - except Exception: - global mmdeploy_logger - if mmdeploy_logger is not None: - return mmdeploy_logger - import logging - logger = logging.getLogger('mmdeploy') - - for handler in logger.root.handlers: - if type(handler) is logging.StreamHandler: - handler.setLevel(logging.ERROR) - - stream_handler = logging.StreamHandler() - handlers = [stream_handler] - file_mode = 'w' - - if log_file is not None: - file_handler = logging.FileHandler(log_file, file_mode) - handlers.append(file_handler) - - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - for handler in handlers: - handler.setFormatter(formatter) - handler.setLevel(log_level) - logger.addHandler(handler) - - logger.setLevel(log_level) - - mmdeploy_logger = logger + global mmdeploy_logger + if mmdeploy_logger is not None: + return mmdeploy_logger + import logging + logger = logging.getLogger('mmdeploy') + + for handler in logger.root.handlers: + if type(handler) is logging.StreamHandler: + handler.setLevel(logging.ERROR) + + stream_handler = logging.StreamHandler() + handlers = [stream_handler] + file_mode = 'w' + + if log_file is not None: + file_handler = logging.FileHandler(log_file, file_mode) + handlers.append(file_handler) + + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + for handler in handlers: + handler.setFormatter(formatter) + handler.setLevel(log_level) + logger.addHandler(handler) + + logger.setLevel(log_level) + + mmdeploy_logger = logger return logger From 3c8a85ff1afca3a1ef6fca502f83e91d1a67ce33 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 20 Apr 2022 16:13:55 +0800 Subject: [PATCH 07/31] Add `mmdeploy.utils.logging` --- .../codebase/mmcls/deploy/classification.py | 2 +- .../codebase/mmdet/deploy/object_detection.py | 2 +- .../mmedit/deploy/super_resolution.py | 2 +- .../codebase/mmocr/deploy/text_detection.py | 2 +- .../codebase/mmocr/deploy/text_recognition.py | 2 +- .../codebase/mmpose/deploy/pose_detection.py | 2 +- .../codebase/mmseg/deploy/segmentation.py | 2 +- mmdeploy/utils/logging.py | 71 +++++++++++++++++++ mmdeploy/utils/timer.py | 2 +- mmdeploy/utils/utils.py | 31 +------- 10 files changed, 82 insertions(+), 36 deletions(-) create mode 100644 mmdeploy/utils/logging.py diff --git a/mmdeploy/codebase/mmcls/deploy/classification.py b/mmdeploy/codebase/mmcls/deploy/classification.py index 8e91c2f4c2..b06a8ef0ab 100644 --- a/mmdeploy/codebase/mmcls/deploy/classification.py +++ b/mmdeploy/codebase/mmcls/deploy/classification.py @@ -235,7 +235,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, """ import warnings - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file, log_level=logging.INFO) if metrics: diff --git a/mmdeploy/codebase/mmdet/deploy/object_detection.py b/mmdeploy/codebase/mmdet/deploy/object_detection.py index baf388a75d..772c016cff 100644 --- a/mmdeploy/codebase/mmdet/deploy/object_detection.py +++ b/mmdeploy/codebase/mmdet/deploy/object_detection.py @@ -260,7 +260,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmedit/deploy/super_resolution.py b/mmdeploy/codebase/mmedit/deploy/super_resolution.py index 8d9140683d..e93c1922b6 100644 --- a/mmdeploy/codebase/mmedit/deploy/super_resolution.py +++ b/mmdeploy/codebase/mmedit/deploy/super_resolution.py @@ -269,7 +269,7 @@ def evaluate_outputs(model_cfg, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmocr/deploy/text_detection.py b/mmdeploy/codebase/mmocr/deploy/text_detection.py index bdc37a6c21..75fbeb3118 100644 --- a/mmdeploy/codebase/mmocr/deploy/text_detection.py +++ b/mmdeploy/codebase/mmocr/deploy/text_detection.py @@ -267,7 +267,7 @@ def evaluate_outputs(model_cfg, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmocr/deploy/text_recognition.py b/mmdeploy/codebase/mmocr/deploy/text_recognition.py index 6e7eeb0994..5976224c33 100644 --- a/mmdeploy/codebase/mmocr/deploy/text_recognition.py +++ b/mmdeploy/codebase/mmocr/deploy/text_recognition.py @@ -280,7 +280,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmpose/deploy/pose_detection.py b/mmdeploy/codebase/mmpose/deploy/pose_detection.py index 0405523400..2da10fabda 100644 --- a/mmdeploy/codebase/mmpose/deploy/pose_detection.py +++ b/mmdeploy/codebase/mmpose/deploy/pose_detection.py @@ -273,7 +273,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file, log_level=logging.INFO) res_folder = '.' diff --git a/mmdeploy/codebase/mmseg/deploy/segmentation.py b/mmdeploy/codebase/mmseg/deploy/segmentation.py index 26d2105380..05de2db777 100644 --- a/mmdeploy/codebase/mmseg/deploy/segmentation.py +++ b/mmdeploy/codebase/mmseg/deploy/segmentation.py @@ -230,7 +230,7 @@ def evaluate_outputs(model_cfg, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmcv.utils import get_logger + from mmdeploy.utils.logging import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/utils/logging.py b/mmdeploy/utils/logging.py new file mode 100644 index 0000000000..61d6be7caa --- /dev/null +++ b/mmdeploy/utils/logging.py @@ -0,0 +1,71 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging + +logger_initialized = {} + + +def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): + """Initialize and get a logger by name. + + If the logger has not been initialized, this method will initialize the + logger by adding one or two handlers, otherwise the initialized logger will + be directly returned. During initialization, a StreamHandler will always be + added. If `log_file` is specified and the process rank is 0, a FileHandler + will also be added. + + Args: + name (str): Logger name. + log_file (str | None): The log filename. If specified, a FileHandler + will be added to the logger. + log_level (int): The logger level. Note that only the process of + rank 0 is affected, and other processes will set the level to + "Error" thus be silent most of the time. + file_mode (str): The file mode used in opening log file. + Defaults to 'w'. + + Returns: + logging.Logger: The expected logger. + """ + logger = logging.getLogger(name) + if name in logger_initialized: + return logger + # handle hierarchical names + # e.g., logger "a" is initialized, then logger "a.b" will skip the + # initialization since it is a child of "a". + for logger_name in logger_initialized: + if name.startswith(logger_name): + return logger + + # handle duplicate logs to the console + # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler (NOTSET) + # to the root logger. As logger.propagate is True by default, this root + # level handler causes logging messages from rank>0 processes to + # unexpectedly show up on the console, creating much unwanted clutter. + # To fix this issue, we set the root logger's StreamHandler, if any, to log + # at the ERROR level. + for handler in logger.root.handlers: + if type(handler) is logging.StreamHandler: + handler.setLevel(logging.ERROR) + + stream_handler = logging.StreamHandler() + handlers = [stream_handler] + + # only rank 0 will add a FileHandler + if log_file is not None: + # Here, the default behaviour of the official logger is 'a'. Thus, we + # provide an interface to change the file mode to the default + # behaviour. + file_handler = logging.FileHandler(log_file, file_mode) + handlers.append(file_handler) + + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + for handler in handlers: + handler.setFormatter(formatter) + handler.setLevel(log_level) + logger.addHandler(handler) + + logger.setLevel(log_level) + logger_initialized[name] = True + + return logger diff --git a/mmdeploy/utils/timer.py b/mmdeploy/utils/timer.py index 2c7702ec3d..43b9f646d1 100644 --- a/mmdeploy/utils/timer.py +++ b/mmdeploy/utils/timer.py @@ -5,7 +5,7 @@ from typing import Optional import torch -from mmcv.utils import get_logger +from mmdeploy.utils.logging import get_logger class TimeCounter: diff --git a/mmdeploy/utils/utils.py b/mmdeploy/utils/utils.py index 770f6476c1..29b94dde65 100644 --- a/mmdeploy/utils/utils.py +++ b/mmdeploy/utils/utils.py @@ -8,7 +8,7 @@ import multiprocess as mp -mmdeploy_logger = None +from mmdeploy.utils.logging import get_logger def target_wrapper(target: Callable, @@ -54,34 +54,9 @@ def get_root_logger(log_file=None, log_level=logging.INFO) -> logging.Logger: Returns: logging.Logger: The obtained logger """ - global mmdeploy_logger - if mmdeploy_logger is not None: - return mmdeploy_logger - import logging - logger = logging.getLogger('mmdeploy') - - for handler in logger.root.handlers: - if type(handler) is logging.StreamHandler: - handler.setLevel(logging.ERROR) - - stream_handler = logging.StreamHandler() - handlers = [stream_handler] - file_mode = 'w' - - if log_file is not None: - file_handler = logging.FileHandler(log_file, file_mode) - handlers.append(file_handler) - - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') - for handler in handlers: - handler.setFormatter(formatter) - handler.setLevel(log_level) - logger.addHandler(handler) + logger = get_logger( + name='mmdeploy', log_file=log_file, log_level=log_level) - logger.setLevel(log_level) - - mmdeploy_logger = logger return logger From 6f281580afaf41db423d7b560fe6f271f5451036 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 20 Apr 2022 16:18:40 +0800 Subject: [PATCH 08/31] Improve the common of the `get_logger` --- mmdeploy/utils/logging.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/mmdeploy/utils/logging.py b/mmdeploy/utils/logging.py index 61d6be7caa..aaba946cbc 100644 --- a/mmdeploy/utils/logging.py +++ b/mmdeploy/utils/logging.py @@ -10,16 +10,13 @@ def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): If the logger has not been initialized, this method will initialize the logger by adding one or two handlers, otherwise the initialized logger will be directly returned. During initialization, a StreamHandler will always be - added. If `log_file` is specified and the process rank is 0, a FileHandler - will also be added. + added. If `log_file` is specified, a FileHandler will also be added. Args: name (str): Logger name. log_file (str | None): The log filename. If specified, a FileHandler will be added to the logger. - log_level (int): The logger level. Note that only the process of - rank 0 is affected, and other processes will set the level to - "Error" thus be silent most of the time. + log_level (int): The logger level. file_mode (str): The file mode used in opening log file. Defaults to 'w'. @@ -37,12 +34,6 @@ def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): return logger # handle duplicate logs to the console - # Starting in 1.8.0, PyTorch DDP attaches a StreamHandler (NOTSET) - # to the root logger. As logger.propagate is True by default, this root - # level handler causes logging messages from rank>0 processes to - # unexpectedly show up on the console, creating much unwanted clutter. - # To fix this issue, we set the root logger's StreamHandler, if any, to log - # at the ERROR level. for handler in logger.root.handlers: if type(handler) is logging.StreamHandler: handler.setLevel(logging.ERROR) @@ -50,7 +41,6 @@ def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): stream_handler = logging.StreamHandler() handlers = [stream_handler] - # only rank 0 will add a FileHandler if log_file is not None: # Here, the default behaviour of the official logger is 'a'. Thus, we # provide an interface to change the file mode to the default From 3702378840895a1ddc2e0900736ca1044d8fc4a2 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 20 Apr 2022 16:41:41 +0800 Subject: [PATCH 09/31] Fix lint --- mmdeploy/utils/timer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mmdeploy/utils/timer.py b/mmdeploy/utils/timer.py index 43b9f646d1..4e4e1a8a55 100644 --- a/mmdeploy/utils/timer.py +++ b/mmdeploy/utils/timer.py @@ -5,6 +5,7 @@ from typing import Optional import torch + from mmdeploy.utils.logging import get_logger From b78277377e38cd84432111c04615a5068a827317 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 20 Apr 2022 18:44:55 +0800 Subject: [PATCH 10/31] onnxruntim add try catch to import wrapper if pytorch is available --- mmdeploy/backend/onnxruntime/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mmdeploy/backend/onnxruntime/__init__.py b/mmdeploy/backend/onnxruntime/__init__.py index 09399a41b4..a6dc88c6be 100644 --- a/mmdeploy/backend/onnxruntime/__init__.py +++ b/mmdeploy/backend/onnxruntime/__init__.py @@ -26,5 +26,9 @@ def is_plugin_available(): if is_available(): - from .wrapper import ORTWrapper - __all__ = ['ORTWrapper'] + try: + # import wrapper if pytorch is available + from .wrapper import ORTWrapper + __all__ = ['ORTWrapper'] + except Exception: + pass From bb83390333aca4d1b9e02045c75bcb69608df51b Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Fri, 22 Apr 2022 10:40:20 +0800 Subject: [PATCH 11/31] Using `mmcv.utils.logging` in all files under `mmdeploy/codebase` --- mmdeploy/codebase/mmcls/deploy/classification.py | 2 +- mmdeploy/codebase/mmdet/deploy/object_detection.py | 2 +- mmdeploy/codebase/mmedit/deploy/super_resolution.py | 2 +- mmdeploy/codebase/mmocr/deploy/text_detection.py | 2 +- mmdeploy/codebase/mmocr/deploy/text_recognition.py | 2 +- mmdeploy/codebase/mmpose/deploy/pose_detection.py | 2 +- mmdeploy/codebase/mmseg/deploy/segmentation.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mmdeploy/codebase/mmcls/deploy/classification.py b/mmdeploy/codebase/mmcls/deploy/classification.py index b06a8ef0ab..8e91c2f4c2 100644 --- a/mmdeploy/codebase/mmcls/deploy/classification.py +++ b/mmdeploy/codebase/mmcls/deploy/classification.py @@ -235,7 +235,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, """ import warnings - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file, log_level=logging.INFO) if metrics: diff --git a/mmdeploy/codebase/mmdet/deploy/object_detection.py b/mmdeploy/codebase/mmdet/deploy/object_detection.py index 772c016cff..baf388a75d 100644 --- a/mmdeploy/codebase/mmdet/deploy/object_detection.py +++ b/mmdeploy/codebase/mmdet/deploy/object_detection.py @@ -260,7 +260,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmedit/deploy/super_resolution.py b/mmdeploy/codebase/mmedit/deploy/super_resolution.py index e93c1922b6..8d9140683d 100644 --- a/mmdeploy/codebase/mmedit/deploy/super_resolution.py +++ b/mmdeploy/codebase/mmedit/deploy/super_resolution.py @@ -269,7 +269,7 @@ def evaluate_outputs(model_cfg, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmocr/deploy/text_detection.py b/mmdeploy/codebase/mmocr/deploy/text_detection.py index 75fbeb3118..bdc37a6c21 100644 --- a/mmdeploy/codebase/mmocr/deploy/text_detection.py +++ b/mmdeploy/codebase/mmocr/deploy/text_detection.py @@ -267,7 +267,7 @@ def evaluate_outputs(model_cfg, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmocr/deploy/text_recognition.py b/mmdeploy/codebase/mmocr/deploy/text_recognition.py index 5976224c33..6e7eeb0994 100644 --- a/mmdeploy/codebase/mmocr/deploy/text_recognition.py +++ b/mmdeploy/codebase/mmocr/deploy/text_recognition.py @@ -280,7 +280,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file) if out: diff --git a/mmdeploy/codebase/mmpose/deploy/pose_detection.py b/mmdeploy/codebase/mmpose/deploy/pose_detection.py index 2da10fabda..0405523400 100644 --- a/mmdeploy/codebase/mmpose/deploy/pose_detection.py +++ b/mmdeploy/codebase/mmpose/deploy/pose_detection.py @@ -273,7 +273,7 @@ def evaluate_outputs(model_cfg: mmcv.Config, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file, log_level=logging.INFO) res_folder = '.' diff --git a/mmdeploy/codebase/mmseg/deploy/segmentation.py b/mmdeploy/codebase/mmseg/deploy/segmentation.py index 05de2db777..26d2105380 100644 --- a/mmdeploy/codebase/mmseg/deploy/segmentation.py +++ b/mmdeploy/codebase/mmseg/deploy/segmentation.py @@ -230,7 +230,7 @@ def evaluate_outputs(model_cfg, log_file (str | None): The file to write the evaluation results. Defaults to `None` and the results will only print on stdout. """ - from mmdeploy.utils.logging import get_logger + from mmcv.utils import get_logger logger = get_logger('test', log_file=log_file) if out: From d70b80327cfb3454ebc551c421a652de741aa9e3 Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 2 May 2022 16:44:20 +0800 Subject: [PATCH 12/31] add __init__ --- MANIFEST.in | 4 +++- mmdeploy/utils/__init__.py | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 0281f8a474..7c85a3240b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,7 @@ include requirements/*.txt include mmdeploy/backend/ncnn/*.so include mmdeploy/backend/ncnn/*.dll +include mmdeploy/backend/ncnn/*.pyd include mmdeploy/lib/*.so -include mmdeploy/lib/*.dll \ No newline at end of file +include mmdeploy/lib/*.dll +include mmdeploy/lib/*.pyd diff --git a/mmdeploy/utils/__init__.py b/mmdeploy/utils/__init__.py index e2955ee248..dda45c09d2 100644 --- a/mmdeploy/utils/__init__.py +++ b/mmdeploy/utils/__init__.py @@ -1,15 +1,16 @@ # Copyright (c) OpenMMLab. All rights reserved. import importlib -from .constants import SDK_TASK_MAP, Backend, Codebase, Task +from .constants import IR, SDK_TASK_MAP, Backend, Codebase, Task from .device import parse_cuda_device_id, parse_device_id from .env import get_backend_version, get_codebase_version, get_library_version from .utils import get_file_path, get_root_logger, target_wrapper __all__ = [ - 'SDK_TASK_MAP', 'Backend', 'Codebase', 'Task', 'parse_cuda_device_id', - 'parse_device_id', 'get_file_path', 'get_root_logger', 'target_wrapper', - 'get_backend_version', 'get_codebase_version', 'get_library_version' + 'SDK_TASK_MAP', 'IR', 'Backend', 'Codebase', 'Task', + 'parse_cuda_device_id', 'get_library_version', 'get_codebase_version', + 'get_backend_version', 'parse_device_id', 'get_file_path', + 'get_root_logger', 'target_wrapper' ] if importlib.util.find_spec('mmcv') is not None: From f00fe8100add814d04505e898a6b7cf4d43a1cf4 Mon Sep 17 00:00:00 2001 From: grimoire Date: Thu, 5 May 2022 17:03:37 +0800 Subject: [PATCH 13/31] add prebuild tools --- tools/package_tools/configs/jetson_nano.yaml | 13 ++ .../package_tools/configs/linux_x86_trt.yaml | 20 ++ tools/package_tools/mmdeploy_builder.py | 217 ++++++++++++++++++ tools/package_tools/packaging/MANIFEST.in | 2 + .../packaging/mmdeploy_python/__init__.py | 23 ++ .../packaging/mmdeploy_python/version.py | 2 + tools/package_tools/packaging/setup.py | 37 +++ 7 files changed, 314 insertions(+) create mode 100644 tools/package_tools/configs/jetson_nano.yaml create mode 100644 tools/package_tools/configs/linux_x86_trt.yaml create mode 100644 tools/package_tools/mmdeploy_builder.py create mode 100644 tools/package_tools/packaging/MANIFEST.in create mode 100644 tools/package_tools/packaging/mmdeploy_python/__init__.py create mode 100644 tools/package_tools/packaging/mmdeploy_python/version.py create mode 100644 tools/package_tools/packaging/setup.py diff --git a/tools/package_tools/configs/jetson_nano.yaml b/tools/package_tools/configs/jetson_nano.yaml new file mode 100644 index 0000000000..ced11791ee --- /dev/null +++ b/tools/package_tools/configs/jetson_nano.yaml @@ -0,0 +1,13 @@ +global_config: + CMAKE_CXX_COMPILER: "g++-7" + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' + MMDEPLOY_TARGET_BACKENDS: "trt" + TENSORRT_DIR: "/usr/include/aarch64-linux-gnu" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda" + pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl + +local_configs: + - BUILD_NAME: "mmdeploy-jetson-nano" + TAR_NAME: "mmdeploy-jetson-nano-sdk" diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml new file mode 100644 index 0000000000..ad73d0521d --- /dev/null +++ b/tools/package_tools/configs/linux_x86_trt.yaml @@ -0,0 +1,20 @@ +global_config: + CMAKE_CXX_COMPILER: "g++-7" + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' + MMDEPLOY_TARGET_BACKENDS: "trt" + pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl + +local_configs: + - BUILD_NAME: "linux-x86-cuda102-trt7216" + TENSORRT_DIR: "${HOME}/SDK/TensorRT-7.2.1.6" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-10.2" + + - BUILD_NAME: "linux-x86-cuda111-trt8016" + TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.0.1.6" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.1" + + - BUILD_NAME: "linux-x86-cuda113-trt8230" + TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.2.3.0" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py new file mode 100644 index 0000000000..1cae3e4a81 --- /dev/null +++ b/tools/package_tools/mmdeploy_builder.py @@ -0,0 +1,217 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import copy +import logging +import os +import os.path as osp +import shutil +import tarfile +from glob import glob +from subprocess import CalledProcessError, run +from typing import Dict + +import yaml + +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +CUR_DIR = os.path.dirname(os.path.abspath(__file__)) +PACKAGING_DIR = osp.join(CUR_DIR, 'packaging') + + +def _remove_if_exist(path): + if osp.exists(path): + logging.info(f'Remove path: {path}.') + if osp.isdir(path): + shutil.rmtree(path) + else: + os.remove(path) + + +def _copy(src_path, dst_path): + assert osp.exists(src_path), f'src path: {src_path} not exist.' + + logging.info(f'copy path: {src_path} to {dst_path}.') + if osp.isdir(src_path): + if osp.exists(dst_path): + shutil.rmtree(dst_path) + shutil.copytree(src_path, dst_path) + else: + shutil.copy(src_path, dst_path) + + +def _call_command(cmd, cwd, stdout=None, stderr=None): + if cmd == '': + return + logging.info(f'Process cmd: {cmd}') + logging.info(f'work_path: {cwd}') + run(cmd, stdout=stdout, stderr=stderr, cwd=cwd, shell=True) + + +def _create_tar(path, tar_name): + logging.info(f'create tar file: {tar_name}') + with tarfile.open(tar_name, 'w:gz') as tar: + tar.add(path, arcname=os.path.basename(path)) + + +def clear_mmdeploy(mmdeploy_dir: str): + logging.info(f'cleaning mmdeploy: {mmdeploy_dir}') + + def _remove_in_mmdeploy(path): + remove_dir = osp.join(mmdeploy_dir, path) + _remove_if_exist(remove_dir) + + # remove build file + _remove_in_mmdeploy('build') + + # remove dist + _remove_in_mmdeploy('dist') + + # remove installed library + _remove_in_mmdeploy('mmdeploy/lib') + + # remove onnx2ncnn and ncnn ext + _remove_in_mmdeploy('mmdeploy/backend/ncnn/onnx2ncnn') + _remove_in_mmdeploy('mmdeploy/backend/ncnn/onnx2ncnn.exe') + ncnn_ext_paths = glob( + osp.join(mmdeploy_dir, 'mmdeploy/backend/ncnn/ncnn_ext.*')) + for ncnn_ext_path in ncnn_ext_paths: + os.remove(ncnn_ext_path) + + +def build_mmdeploy(cfg, mmdeploy_dir): + + args = [f'-D{k}={v}' for k, v in cfg.items()] + + # clear mmdeploy + clear_mmdeploy(mmdeploy_dir) + + build_dir = osp.join(mmdeploy_dir, 'build') + if not osp.exists(build_dir): + os.mkdir(build_dir) + + # cmake cmd + cmake_cmd = ' '.join(['cmake ..'] + args) + + # build cmd + build_cmd = 'cmake --build . -- -j$(nproc) && cmake --install .' + + # build wheel + bdist_cmd = 'python setup.py bdist_wheel' + + _call_command(cmake_cmd, build_dir) + _call_command(build_cmd, build_dir) + _call_command(bdist_cmd, mmdeploy_dir) + + +def get_dir_name(cfg, tag, default_name): + if tag not in cfg: + logging.warning(f'{tag} not found, use `{default_name}` as default.') + else: + default_name = cfg[tag] + cfg = copy.deepcopy(cfg) + cfg.pop(tag) + return cfg, default_name + + +def create_package(cfg: Dict, mmdeploy_dir: str): + build_dir = 'build' + sdk_tar_name = 'sdk-tar' + + # load flags + cfg, build_dir = get_dir_name(cfg, 'BUILD_NAME', build_dir) + build_sdk_flag = cfg.get('MMDEPLOY_BUILD_SDK', False) + if 'TAR_NAME' in cfg: + cfg, sdk_tar_name = get_dir_name(cfg, 'TAR_NAME', sdk_tar_name) + + # create package directory. + if osp.exists(build_dir): + logging.info(f'{build_dir} existed, deleting...') + shutil.rmtree(build_dir) + os.mkdir(build_dir) + + logging.info(f'build mmdeploy in {build_dir}:') + logging.debug(f'with config: {cfg}') + + try: + # clear mmdeploy + clear_mmdeploy(mmdeploy_dir) + build_mmdeploy(cfg, mmdeploy_dir) + _copy(osp.join(mmdeploy_dir, 'dist'), osp.join(build_dir, 'dist')) + + if build_sdk_flag: + + sdk_tar_dir = osp.join(build_dir, sdk_tar_name) + + # copy lib and install into sdk dir + install_dir = osp.join(mmdeploy_dir, 'build/install/') + _copy(install_dir, sdk_tar_dir) + _remove_if_exist(osp.join(sdk_tar_dir, 'example', 'build')) + + # create sdk python api wheel + python_api_lib_path = glob( + osp.join(mmdeploy_dir, 'build/lib/mmdeploy_python.*.so')) + num_libs = len(python_api_lib_path) + assert num_libs == 1, f'Expect one api lib, but found {num_libs}.' + python_api_lib_path = python_api_lib_path[0] + + sdk_python_package_dir = osp.join(build_dir, '.mmdeploy_python') + _copy(PACKAGING_DIR, sdk_python_package_dir) + _copy(python_api_lib_path, + osp.join(sdk_python_package_dir, 'mmdeploy_python')) + create_wheel_cmd = 'python setup.py bdist_wheel' + _call_command(create_wheel_cmd, sdk_python_package_dir) + wheel_src_dir = osp.join(sdk_python_package_dir, 'dist') + _copy(wheel_src_dir, osp.join(sdk_tar_dir, 'python')) + + # create tar file + _create_tar(sdk_tar_dir, sdk_tar_dir + '.tar') + + logging.info('build finish.') + + except CalledProcessError: + logging.error('build failed') + exit() + + +def parse_args(): + parser = argparse.ArgumentParser(description='Build mmdeploy from yaml.') + parser.add_argument('build_cfgs', help='The build config yaml file.') + parser.add_argument('mmdeploy_dir', help='The source code of MMDeploy.') + args = parser.parse_args() + + return args + + +def parse_configs(cfg_path: str): + with open(cfg_path, mode='r') as f: + cfgs = yaml.load(f, yaml.Loader) + + global_cfg = cfgs.get('global_config', dict()) + local_cfgs = cfgs.get('local_configs', []) + + if len(local_cfgs) == 0: + merged_cfgs = [global_cfg] + else: + merged_cfgs = [copy.deepcopy(global_cfg) for _ in local_cfgs] + + for cfg, local_cfg in zip(merged_cfgs, local_cfgs): + cfg.update(local_cfg) + + return merged_cfgs + + +def main(): + args = parse_args() + cfgs = parse_configs(args.build_cfgs) + mmdeploy_dir = osp.abspath(args.mmdeploy_dir) + logging.info(f'Using mmdeploy_dir: {mmdeploy_dir}') + + logging.info(f'Using PACKAGING_DIR: {PACKAGING_DIR}') + + for cfg in cfgs: + create_package(cfg, mmdeploy_dir) + + +if __name__ == '__main__': + main() diff --git a/tools/package_tools/packaging/MANIFEST.in b/tools/package_tools/packaging/MANIFEST.in new file mode 100644 index 0000000000..11e6ae62c3 --- /dev/null +++ b/tools/package_tools/packaging/MANIFEST.in @@ -0,0 +1,2 @@ +include mmdeploy_python/*.so +include mmdeploy_python/*.dll diff --git a/tools/package_tools/packaging/mmdeploy_python/__init__.py b/tools/package_tools/packaging/mmdeploy_python/__init__.py new file mode 100644 index 0000000000..2fc45bf87c --- /dev/null +++ b/tools/package_tools/packaging/mmdeploy_python/__init__.py @@ -0,0 +1,23 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# modify from https://github.com/NVIDIA/TensorRT/blob/main/python/packaging/tensorrt/__init__.py # noqa +import ctypes +import glob +import os + +from .version import __version__ + + +def try_load(library): + try: + ctypes.CDLL(library) + except OSError: + pass + + +CURDIR = os.path.realpath(os.path.dirname(__file__)) +for lib in glob.iglob(os.path.join(CURDIR, '*.so*')): + try_load(lib) + +from .mmdeploy_python import * # noqa + +__all__ = ['__version__'] diff --git a/tools/package_tools/packaging/mmdeploy_python/version.py b/tools/package_tools/packaging/mmdeploy_python/version.py new file mode 100644 index 0000000000..b3309754c0 --- /dev/null +++ b/tools/package_tools/packaging/mmdeploy_python/version.py @@ -0,0 +1,2 @@ +# Copyright (c) OpenMMLab. All rights reserved. +__version__ = '0.5.0' diff --git a/tools/package_tools/packaging/setup.py b/tools/package_tools/packaging/setup.py new file mode 100644 index 0000000000..3d336ff741 --- /dev/null +++ b/tools/package_tools/packaging/setup.py @@ -0,0 +1,37 @@ +import os +import os.path as osp +import platform + +try: + from setuptools import find_packages, setup +except ImportError: + from distutils.core import find_packages, setup + +CURDIR = os.path.realpath(os.path.dirname(__file__)) +version_file = osp.join(CURDIR, 'mmdeploy_python', 'version.py') + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +def get_platform_name(): + return platform.machine() + + +if __name__ == '__main__': + setup( + name='mmdeploy_python', + version=get_version(), + description='OpenMMLab Model Deployment SDK python api', + author='OpenMMLab', + author_email='openmmlab@gmail.com', + keywords='computer vision, model deployment', + url='https://github.com/open-mmlab/mmdeploy', + packages=find_packages(), + include_package_data=True, + platforms=get_platform_name(), + package_data={'mmdeploy_python': ['*.so*', '*.pyd', '*.pdb']}, + license='Apache License 2.0') From 71521eb8565265e342d04301145c768f04fb9b18 Mon Sep 17 00:00:00 2001 From: grimoire Date: Fri, 6 May 2022 20:45:31 +0800 Subject: [PATCH 14/31] support windows --- mmdeploy/backend/ncnn/init_plugins.py | 3 +- mmdeploy/backend/onnxruntime/init_plugins.py | 2 +- mmdeploy/backend/sdk/__init__.py | 2 +- mmdeploy/backend/tensorrt/init_plugins.py | 2 +- tools/package_tools/configs/jetson_nano.yaml | 17 ++--- .../package_tools/configs/linux_x86_trt.yaml | 28 +++++---- tools/package_tools/configs/windows_ort.yaml | 13 ++++ tools/package_tools/mmdeploy_builder.py | 63 +++++++++++++------ 8 files changed, 87 insertions(+), 43 deletions(-) create mode 100644 tools/package_tools/configs/windows_ort.yaml diff --git a/mmdeploy/backend/ncnn/init_plugins.py b/mmdeploy/backend/ncnn/init_plugins.py index f46c3a83d7..90fb0c2211 100644 --- a/mmdeploy/backend/ncnn/init_plugins.py +++ b/mmdeploy/backend/ncnn/init_plugins.py @@ -11,8 +11,7 @@ def get_ops_path() -> str: str: The library path of NCNN custom ops. """ candidates = [ - '../../lib/libmmdeploy_ncnn_ops.so', - '../../../build/bin/*/mmdeploy_ncnn_ops.dll' + '../../lib/libmmdeploy_ncnn_ops.so', '../../lib/mmdeploy_ncnn_ops.dll' ] return get_file_path(os.path.dirname(__file__), candidates) diff --git a/mmdeploy/backend/onnxruntime/init_plugins.py b/mmdeploy/backend/onnxruntime/init_plugins.py index 666d0eae79..3c194fddb7 100644 --- a/mmdeploy/backend/onnxruntime/init_plugins.py +++ b/mmdeploy/backend/onnxruntime/init_plugins.py @@ -12,6 +12,6 @@ def get_ops_path() -> str: """ candidates = [ '../../lib/libmmdeploy_onnxruntime_ops.so', - '../../../build/bin/*/mmdeploy_onnxruntime_ops.dll', + '../../lib/mmdeploy_onnxruntime_ops.dll', ] return get_file_path(os.path.dirname(__file__), candidates) diff --git a/mmdeploy/backend/sdk/__init__.py b/mmdeploy/backend/sdk/__init__.py index 9a210d01be..c8104fa736 100644 --- a/mmdeploy/backend/sdk/__init__.py +++ b/mmdeploy/backend/sdk/__init__.py @@ -18,7 +18,7 @@ if lib_path: lib_dir = os.path.dirname(lib_path) - sys.path.insert(0, lib_dir) + sys.path.append(lib_dir) try: if importlib.util.find_spec(module_name) is not None: diff --git a/mmdeploy/backend/tensorrt/init_plugins.py b/mmdeploy/backend/tensorrt/init_plugins.py index 9cf5cabb95..d1dcc9d8bb 100644 --- a/mmdeploy/backend/tensorrt/init_plugins.py +++ b/mmdeploy/backend/tensorrt/init_plugins.py @@ -13,7 +13,7 @@ def get_ops_path() -> str: """ candidates = [ '../../lib/libmmdeploy_tensorrt_ops.so', - '../../../build/bin/*/mmdeploy_tensorrt_ops.dll' + '../../lib/mmdeploy_tensorrt_ops.dll' ] return get_file_path(os.path.dirname(__file__), candidates) diff --git a/tools/package_tools/configs/jetson_nano.yaml b/tools/package_tools/configs/jetson_nano.yaml index ced11791ee..8d2645e8b2 100644 --- a/tools/package_tools/configs/jetson_nano.yaml +++ b/tools/package_tools/configs/jetson_nano.yaml @@ -1,12 +1,13 @@ global_config: - CMAKE_CXX_COMPILER: "g++-7" - MMDEPLOY_BUILD_SDK: "ON" - MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" - MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' - MMDEPLOY_TARGET_BACKENDS: "trt" - TENSORRT_DIR: "/usr/include/aarch64-linux-gnu" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda" - pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl + cmake_envs: + CMAKE_CXX_COMPILER: "g++-7" + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' + MMDEPLOY_TARGET_BACKENDS: "trt" + TENSORRT_DIR: "/usr/include/aarch64-linux-gnu" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda" + pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - BUILD_NAME: "mmdeploy-jetson-nano" diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml index ad73d0521d..c747977185 100644 --- a/tools/package_tools/configs/linux_x86_trt.yaml +++ b/tools/package_tools/configs/linux_x86_trt.yaml @@ -1,20 +1,24 @@ global_config: - CMAKE_CXX_COMPILER: "g++-7" - MMDEPLOY_BUILD_SDK: "ON" - MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" - MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' - MMDEPLOY_TARGET_BACKENDS: "trt" - pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl + cmake_envs: + CMAKE_CXX_COMPILER: "g++-7" + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' + MMDEPLOY_TARGET_BACKENDS: "trt" + pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - BUILD_NAME: "linux-x86-cuda102-trt7216" - TENSORRT_DIR: "${HOME}/SDK/TensorRT-7.2.1.6" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-10.2" + cmake_envs: + TENSORRT_DIR: "${HOME}/SDK/TensorRT-7.2.1.6" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-10.2" - BUILD_NAME: "linux-x86-cuda111-trt8016" - TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.0.1.6" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.1" + cmake_envs: + TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.0.1.6" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.1" - BUILD_NAME: "linux-x86-cuda113-trt8230" - TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.2.3.0" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" + cmake_envs: + TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.2.3.0" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" diff --git a/tools/package_tools/configs/windows_ort.yaml b/tools/package_tools/configs/windows_ort.yaml new file mode 100644 index 0000000000..62972bb231 --- /dev/null +++ b/tools/package_tools/configs/windows_ort.yaml @@ -0,0 +1,13 @@ +global_config: + cmake_flags: ['-G "Visual Studio 17 2022" -A x64 -T v143'] + cmake_envs: + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + MMDEPLOY_TARGET_DEVICES: '"cpu"' + MMDEPLOY_TARGET_BACKENDS: "ort" + MMDEPLOY_CODEBASES: "all" + +local_configs: + - BUILD_NAME: "windows-cpu-ort8230" + cmake_envs: + ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 1cae3e4a81..57032eed70 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -5,6 +5,7 @@ import os import os.path as osp import shutil +import sys import tarfile from glob import glob from subprocess import CalledProcessError, run @@ -19,6 +20,16 @@ PACKAGING_DIR = osp.join(CUR_DIR, 'packaging') +def _merge_cfg(cfg0, cfg1): + cfg = copy.deepcopy(cfg0) + for k, v in cfg1.items(): + if k in cfg: + cfg[k] = _merge_cfg(cfg0[k], cfg1[k]) + else: + cfg[k] = v + return cfg + + def _remove_if_exist(path): if osp.exists(path): logging.info(f'Remove path: {path}.') @@ -80,8 +91,10 @@ def _remove_in_mmdeploy(path): def build_mmdeploy(cfg, mmdeploy_dir): + cmake_flags = cfg.get('cmake_flags', []) + cmake_envs = cfg.get('cmake_envs', dict()) - args = [f'-D{k}={v}' for k, v in cfg.items()] + args = [f'-D{k}={v}' for k, v in cmake_envs.items()] # clear mmdeploy clear_mmdeploy(mmdeploy_dir) @@ -90,17 +103,23 @@ def build_mmdeploy(cfg, mmdeploy_dir): if not osp.exists(build_dir): os.mkdir(build_dir) - # cmake cmd - cmake_cmd = ' '.join(['cmake ..'] + args) + # cmake cmd + cmake_cmd = ' '.join(['cmake ..'] + cmake_flags + args) + _call_command(cmake_cmd, build_dir) - # build cmd - build_cmd = 'cmake --build . -- -j$(nproc) && cmake --install .' + if sys.platform == 'win32': + # build cmd + build_cmd = 'cmake --build . --config Release -- /m' + _call_command(build_cmd, build_dir) + install_cmd = 'cmake --install . --config Release' + _call_command(install_cmd, build_dir) + else: + # build cmd + build_cmd = 'cmake --build . -- -j$(nproc) && cmake --install .' + _call_command(build_cmd, build_dir) # build wheel bdist_cmd = 'python setup.py bdist_wheel' - - _call_command(cmake_cmd, build_dir) - _call_command(build_cmd, build_dir) _call_command(bdist_cmd, mmdeploy_dir) @@ -109,8 +128,6 @@ def get_dir_name(cfg, tag, default_name): logging.warning(f'{tag} not found, use `{default_name}` as default.') else: default_name = cfg[tag] - cfg = copy.deepcopy(cfg) - cfg.pop(tag) return cfg, default_name @@ -120,7 +137,8 @@ def create_package(cfg: Dict, mmdeploy_dir: str): # load flags cfg, build_dir = get_dir_name(cfg, 'BUILD_NAME', build_dir) - build_sdk_flag = cfg.get('MMDEPLOY_BUILD_SDK', False) + cmake_envs = cfg.get('cmake_envs', dict()) + build_sdk_flag = cmake_envs.get('MMDEPLOY_BUILD_SDK', False) if 'TAR_NAME' in cfg: cfg, sdk_tar_name = get_dir_name(cfg, 'TAR_NAME', sdk_tar_name) @@ -149,10 +167,15 @@ def create_package(cfg: Dict, mmdeploy_dir: str): _remove_if_exist(osp.join(sdk_tar_dir, 'example', 'build')) # create sdk python api wheel + # for linux python_api_lib_path = glob( osp.join(mmdeploy_dir, 'build/lib/mmdeploy_python.*.so')) + # for windows + python_api_lib_path += glob( + osp.join(mmdeploy_dir, 'build/bin/*/mmdeploy_python.*.pyd')) num_libs = len(python_api_lib_path) - assert num_libs == 1, f'Expect one api lib, but found {num_libs}.' + if num_libs != 1: + logging.info('find multiple mmdeploy_python libraries.') python_api_lib_path = python_api_lib_path[0] sdk_python_package_dir = osp.join(build_dir, '.mmdeploy_python') @@ -190,13 +213,17 @@ def parse_configs(cfg_path: str): global_cfg = cfgs.get('global_config', dict()) local_cfgs = cfgs.get('local_configs', []) - if len(local_cfgs) == 0: - merged_cfgs = [global_cfg] - else: - merged_cfgs = [copy.deepcopy(global_cfg) for _ in local_cfgs] + merged_cfgs = [ + _merge_cfg(global_cfg, local_cfg) for local_cfg in local_cfgs + ] + + # if len(local_cfgs) == 0: + # merged_cfgs = [global_cfg] + # else: + # merged_cfgs = [copy.deepcopy(global_cfg) for _ in local_cfgs] - for cfg, local_cfg in zip(merged_cfgs, local_cfgs): - cfg.update(local_cfg) + # for cfg, local_cfg in zip(merged_cfgs, local_cfgs): + # cfg.update(local_cfg) return merged_cfgs From 8f2e8748ae4a0bac2c6ae0b08bc83e5fe6b12516 Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 9 May 2022 17:22:16 +0800 Subject: [PATCH 15/31] for comment --- mmdeploy/backend/__init__.py | 29 ------------------- mmdeploy/utils/logging.py | 6 +++- .../package_tools/configs/linux_x86_trt.yaml | 6 ++-- tools/package_tools/mmdeploy_builder.py | 8 ----- 4 files changed, 8 insertions(+), 41 deletions(-) diff --git a/mmdeploy/backend/__init__.py b/mmdeploy/backend/__init__.py index a170c3e6c7..ef101fec61 100644 --- a/mmdeploy/backend/__init__.py +++ b/mmdeploy/backend/__init__.py @@ -1,30 +1 @@ # Copyright (c) OpenMMLab. All rights reserved. -import importlib - -from mmdeploy.backend.ncnn import is_available as ncnn_available -from mmdeploy.backend.onnxruntime import is_available as ort_available -from mmdeploy.backend.openvino import is_available as openvino_available -from mmdeploy.backend.pplnn import is_available as pplnn_available -from mmdeploy.backend.sdk import is_available as sdk_available -from mmdeploy.backend.tensorrt import is_available as trt_available - -if importlib.util.find_spec('torch') is not None: - __all__ = [] - if ncnn_available(): - from .ncnn import NCNNWrapper # noqa: F401,F403 - __all__.append('NCNNWrapper') - if ort_available(): - from .onnxruntime import ORTWrapper # noqa: F401,F403 - __all__.append('ORTWrapper') - if trt_available(): - from .tensorrt import TRTWrapper # noqa: F401,F403 - __all__.append('TRTWrapper') - if pplnn_available(): - from .pplnn import PPLNNWrapper # noqa: F401,F403 - __all__.append('PPLNNWrapper') - if openvino_available(): - from .openvino import OpenVINOWrapper # noqa: F401,F403 - __all__.append('OpenVINOWrapper') - if sdk_available(): - from .sdk import SDKWrapper # noqa: F401,F403 - __all__.append('SDKWrapper') diff --git a/mmdeploy/utils/logging.py b/mmdeploy/utils/logging.py index aaba946cbc..7a6ea65d11 100644 --- a/mmdeploy/utils/logging.py +++ b/mmdeploy/utils/logging.py @@ -1,10 +1,14 @@ # Copyright (c) OpenMMLab. All rights reserved. import logging +from typing import Optional logger_initialized = {} -def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'): +def get_logger(name: str, + log_file: Optional[str] = None, + log_level: int = logging.INFO, + file_mode: str = 'w'): """Initialize and get a logger by name. If the logger has not been initialized, this method will initialize the diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml index c747977185..ed4b9f9b64 100644 --- a/tools/package_tools/configs/linux_x86_trt.yaml +++ b/tools/package_tools/configs/linux_x86_trt.yaml @@ -10,15 +10,15 @@ global_config: local_configs: - BUILD_NAME: "linux-x86-cuda102-trt7216" cmake_envs: - TENSORRT_DIR: "${HOME}/SDK/TensorRT-7.2.1.6" + TENSORRT_DIR: "${HOME}/TensorRT-7.2.1.6" CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-10.2" - BUILD_NAME: "linux-x86-cuda111-trt8016" cmake_envs: - TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.0.1.6" + TENSORRT_DIR: "${HOME}/TensorRT-8.0.1.6" CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.1" - BUILD_NAME: "linux-x86-cuda113-trt8230" cmake_envs: - TENSORRT_DIR: "${HOME}/SDK/TensorRT-8.2.3.0" + TENSORRT_DIR: "${HOME}/TensorRT-8.2.3.0" CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 57032eed70..dc5d56e223 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -217,14 +217,6 @@ def parse_configs(cfg_path: str): _merge_cfg(global_cfg, local_cfg) for local_cfg in local_cfgs ] - # if len(local_cfgs) == 0: - # merged_cfgs = [global_cfg] - # else: - # merged_cfgs = [copy.deepcopy(global_cfg) for _ in local_cfgs] - - # for cfg, local_cfg in zip(merged_cfgs, local_cfgs): - # cfg.update(local_cfg) - return merged_cfgs From 4d53c1ef1551659cdef69cee279f0c49e7f39dee Mon Sep 17 00:00:00 2001 From: grimoire Date: Fri, 13 May 2022 11:23:03 +0800 Subject: [PATCH 16/31] exit if failed --- tools/package_tools/mmdeploy_builder.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index dc5d56e223..642425c578 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -56,7 +56,14 @@ def _call_command(cmd, cwd, stdout=None, stderr=None): return logging.info(f'Process cmd: {cmd}') logging.info(f'work_path: {cwd}') - run(cmd, stdout=stdout, stderr=stderr, cwd=cwd, shell=True) + try: + ret = run(cmd, stdout=stdout, stderr=stderr, cwd=cwd, shell=True) + if ret.returncode != 0: + logging.error(f'Process cmd: "{cmd}"' + f' failed with returncode: {ret.returncode}') + except Exception: + logging.error(f'Process cmd: {cmd} failed.') + exit() def _create_tar(path, tar_name): From 34e49ac5e9ca77457d3ac66a5121b2486980f44d Mon Sep 17 00:00:00 2001 From: grimoire Date: Fri, 13 May 2022 15:48:36 +0800 Subject: [PATCH 17/31] add exist --- tools/package_tools/mmdeploy_builder.py | 1 + tools/package_tools/packaging/MANIFEST.in | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 642425c578..6a91dcca7e 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -61,6 +61,7 @@ def _call_command(cmd, cwd, stdout=None, stderr=None): if ret.returncode != 0: logging.error(f'Process cmd: "{cmd}"' f' failed with returncode: {ret.returncode}') + exit() except Exception: logging.error(f'Process cmd: {cmd} failed.') exit() diff --git a/tools/package_tools/packaging/MANIFEST.in b/tools/package_tools/packaging/MANIFEST.in index 11e6ae62c3..891555be37 100644 --- a/tools/package_tools/packaging/MANIFEST.in +++ b/tools/package_tools/packaging/MANIFEST.in @@ -1,2 +1,3 @@ include mmdeploy_python/*.so include mmdeploy_python/*.dll +include mmdeploy_python/*.pyd From 6efe4fed00d49083f69d0b1692bca42daf793d17 Mon Sep 17 00:00:00 2001 From: grimoire Date: Fri, 13 May 2022 16:29:58 +0800 Subject: [PATCH 18/31] decouple --- mmdeploy/backend/sdk/__init__.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mmdeploy/backend/sdk/__init__.py b/mmdeploy/backend/sdk/__init__.py index c8104fa736..e64379dd7a 100644 --- a/mmdeploy/backend/sdk/__init__.py +++ b/mmdeploy/backend/sdk/__init__.py @@ -20,14 +20,18 @@ lib_dir = os.path.dirname(lib_path) sys.path.append(lib_dir) -try: - if importlib.util.find_spec(module_name) is not None: - from .wrapper import SDKWrapper - __all__ = ['SDKWrapper'] - _is_available = True -except Exception: - pass +if importlib.util.find_spec(module_name) is not None: + _is_available = True def is_available() -> bool: return _is_available + + +if is_available(): + + try: + from .wrapper import SDKWrapper + __all__ = ['SDKWrapper'] + except Exception: + pass From fee4c41b5907541d15fcf963998fdfb5af5ca52d Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 16 May 2022 16:19:41 +0800 Subject: [PATCH 19/31] add tags --- setup.cfg | 3 -- .../package_tools/configs/linux_x86_trt.yaml | 3 ++ tools/package_tools/configs/windows_ort.yaml | 2 + tools/package_tools/mmdeploy_builder.py | 47 +++++++++++++------ 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/setup.cfg b/setup.cfg index f2dac821a1..2073768695 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,3 @@ -[bdist_wheel] -universal=1 - [aliases] test=pytest diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml index ed4b9f9b64..4285019603 100644 --- a/tools/package_tools/configs/linux_x86_trt.yaml +++ b/tools/package_tools/configs/linux_x86_trt.yaml @@ -1,10 +1,13 @@ global_config: + bdist_tags: + python_tag: "py37" cmake_envs: CMAKE_CXX_COMPILER: "g++-7" MMDEPLOY_BUILD_SDK: "ON" MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" + CUDNN_DIR: "/usr/lib/x86_64-linux-gnu" pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: diff --git a/tools/package_tools/configs/windows_ort.yaml b/tools/package_tools/configs/windows_ort.yaml index 62972bb231..cf6b8579ca 100644 --- a/tools/package_tools/configs/windows_ort.yaml +++ b/tools/package_tools/configs/windows_ort.yaml @@ -1,4 +1,6 @@ global_config: + bdist_tags: + python_tag: "py37" cmake_flags: ['-G "Visual Studio 17 2022" -A x64 -T v143'] cmake_envs: MMDEPLOY_BUILD_SDK: "ON" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 6a91dcca7e..63246cd665 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -7,6 +7,7 @@ import shutil import sys import tarfile +from distutils.util import get_platform from glob import glob from subprocess import CalledProcessError, run from typing import Dict @@ -18,6 +19,7 @@ CUR_DIR = os.path.dirname(os.path.abspath(__file__)) PACKAGING_DIR = osp.join(CUR_DIR, 'packaging') +PLATFORM_TAG = get_platform().replace('-', '_').replace('.', '_') def _merge_cfg(cfg0, cfg1): @@ -73,6 +75,28 @@ def _create_tar(path, tar_name): tar.add(path, arcname=os.path.basename(path)) +def _create_bdist_cmd(cfg, dist_dir=None): + + bdist_tags = cfg.get('bdist_tags', {}) + + # base + bdist_cmd = 'python setup.py bdist_wheel ' + + # platform + bdist_cmd += f' --plat-name {PLATFORM_TAG} ' + + # python tag + if 'python_tag' in bdist_tags: + python_tag = bdist_tags['python_tag'] + bdist_cmd += f' --python-tag {python_tag} ' + + # dist dir + if dist_dir is not None: + dist_dir = osp.abspath(dist_dir) + bdist_cmd += f' --dist-dir {dist_dir} ' + return bdist_cmd + + def clear_mmdeploy(mmdeploy_dir: str): logging.info(f'cleaning mmdeploy: {mmdeploy_dir}') @@ -98,7 +122,7 @@ def _remove_in_mmdeploy(path): os.remove(ncnn_ext_path) -def build_mmdeploy(cfg, mmdeploy_dir): +def build_mmdeploy(cfg, mmdeploy_dir, dist_dir=None): cmake_flags = cfg.get('cmake_flags', []) cmake_envs = cfg.get('cmake_envs', dict()) @@ -127,7 +151,7 @@ def build_mmdeploy(cfg, mmdeploy_dir): _call_command(build_cmd, build_dir) # build wheel - bdist_cmd = 'python setup.py bdist_wheel' + bdist_cmd = _create_bdist_cmd(cfg, dist_dir) _call_command(bdist_cmd, mmdeploy_dir) @@ -141,7 +165,7 @@ def get_dir_name(cfg, tag, default_name): def create_package(cfg: Dict, mmdeploy_dir: str): build_dir = 'build' - sdk_tar_name = 'sdk-tar' + sdk_tar_name = 'sdk' # load flags cfg, build_dir = get_dir_name(cfg, 'BUILD_NAME', build_dir) @@ -160,10 +184,9 @@ def create_package(cfg: Dict, mmdeploy_dir: str): logging.debug(f'with config: {cfg}') try: - # clear mmdeploy - clear_mmdeploy(mmdeploy_dir) - build_mmdeploy(cfg, mmdeploy_dir) - _copy(osp.join(mmdeploy_dir, 'dist'), osp.join(build_dir, 'dist')) + # build dist + dist_dir = osp.join(build_dir, 'dist') + build_mmdeploy(cfg, mmdeploy_dir, dist_dir=dist_dir) if build_sdk_flag: @@ -190,13 +213,9 @@ def create_package(cfg: Dict, mmdeploy_dir: str): _copy(PACKAGING_DIR, sdk_python_package_dir) _copy(python_api_lib_path, osp.join(sdk_python_package_dir, 'mmdeploy_python')) - create_wheel_cmd = 'python setup.py bdist_wheel' - _call_command(create_wheel_cmd, sdk_python_package_dir) - wheel_src_dir = osp.join(sdk_python_package_dir, 'dist') - _copy(wheel_src_dir, osp.join(sdk_tar_dir, 'python')) - - # create tar file - _create_tar(sdk_tar_dir, sdk_tar_dir + '.tar') + sdk_wheel_dir = osp.abspath(osp.join(sdk_tar_dir, 'python')) + bdist_cmd = _create_bdist_cmd(cfg, sdk_wheel_dir) + _call_command(bdist_cmd, sdk_python_package_dir) logging.info('build finish.') From fa92daed8b447e2dd15666ba2cf6463730711d0c Mon Sep 17 00:00:00 2001 From: grimoire Date: Tue, 17 May 2022 16:09:59 +0800 Subject: [PATCH 20/31] remove .mmdeploy_python --- tools/package_tools/mmdeploy_builder.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 63246cd665..eec052e09c 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -217,6 +217,9 @@ def create_package(cfg: Dict, mmdeploy_dir: str): bdist_cmd = _create_bdist_cmd(cfg, sdk_wheel_dir) _call_command(bdist_cmd, sdk_python_package_dir) + # remove temp package dir + _remove_if_exist(sdk_python_package_dir) + logging.info('build finish.') except CalledProcessError: From d616014372ff098df2fd1778540750253fd3a806 Mon Sep 17 00:00:00 2001 From: grimoire Date: Wed, 18 May 2022 16:52:13 +0800 Subject: [PATCH 21/31] read python version from system --- tools/package_tools/configs/linux_x86_trt.yaml | 16 ++-------------- tools/package_tools/configs/windows_ort.yaml | 2 -- tools/package_tools/mmdeploy_builder.py | 3 ++- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml index 4285019603..92a71d82c3 100644 --- a/tools/package_tools/configs/linux_x86_trt.yaml +++ b/tools/package_tools/configs/linux_x86_trt.yaml @@ -1,6 +1,4 @@ global_config: - bdist_tags: - python_tag: "py37" cmake_envs: CMAKE_CXX_COMPILER: "g++-7" MMDEPLOY_BUILD_SDK: "ON" @@ -11,17 +9,7 @@ global_config: pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - - BUILD_NAME: "linux-x86-cuda102-trt7216" + - BUILD_NAME: "mmdeploy-many-linux-x86_64-cuda113-tensorrt8230-0.5.0" cmake_envs: - TENSORRT_DIR: "${HOME}/TensorRT-7.2.1.6" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-10.2" - - - BUILD_NAME: "linux-x86-cuda111-trt8016" - cmake_envs: - TENSORRT_DIR: "${HOME}/TensorRT-8.0.1.6" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.1" - - - BUILD_NAME: "linux-x86-cuda113-trt8230" - cmake_envs: - TENSORRT_DIR: "${HOME}/TensorRT-8.2.3.0" + TENSORRT_DIR: "${TENSORRT_DIR}" CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" diff --git a/tools/package_tools/configs/windows_ort.yaml b/tools/package_tools/configs/windows_ort.yaml index cf6b8579ca..62972bb231 100644 --- a/tools/package_tools/configs/windows_ort.yaml +++ b/tools/package_tools/configs/windows_ort.yaml @@ -1,6 +1,4 @@ global_config: - bdist_tags: - python_tag: "py37" cmake_flags: ['-G "Visual Studio 17 2022" -A x64 -T v143'] cmake_envs: MMDEPLOY_BUILD_SDK: "ON" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index eec052e09c..49f8c6eb44 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -86,9 +86,10 @@ def _create_bdist_cmd(cfg, dist_dir=None): bdist_cmd += f' --plat-name {PLATFORM_TAG} ' # python tag + python_tag = f'py{sys.version_info.major}{sys.version_info.minor}' if 'python_tag' in bdist_tags: python_tag = bdist_tags['python_tag'] - bdist_cmd += f' --python-tag {python_tag} ' + bdist_cmd += f' --python-tag {python_tag} ' # dist dir if dist_dir is not None: From 31c9b10c680b52ba9cb862753d9ab8975d020382 Mon Sep 17 00:00:00 2001 From: grimoire Date: Thu, 19 May 2022 16:57:27 +0800 Subject: [PATCH 22/31] update windows config --- .../configs/{jetson_nano.yaml => jetson.yaml} | 3 +-- .../package_tools/configs/linux_x86_trt.yaml | 4 ++-- tools/package_tools/configs/windows_ort.yaml | 13 ------------ tools/package_tools/configs/windows_x64.yaml | 21 +++++++++++++++++++ tools/package_tools/mmdeploy_builder.py | 15 +++++++++++++ 5 files changed, 39 insertions(+), 17 deletions(-) rename tools/package_tools/configs/{jetson_nano.yaml => jetson.yaml} (82%) delete mode 100644 tools/package_tools/configs/windows_ort.yaml create mode 100644 tools/package_tools/configs/windows_x64.yaml diff --git a/tools/package_tools/configs/jetson_nano.yaml b/tools/package_tools/configs/jetson.yaml similarity index 82% rename from tools/package_tools/configs/jetson_nano.yaml rename to tools/package_tools/configs/jetson.yaml index 8d2645e8b2..b8a7c5a19c 100644 --- a/tools/package_tools/configs/jetson_nano.yaml +++ b/tools/package_tools/configs/jetson.yaml @@ -10,5 +10,4 @@ global_config: pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - - BUILD_NAME: "mmdeploy-jetson-nano" - TAR_NAME: "mmdeploy-jetson-nano-sdk" + - BUILD_NAME: "mmdeploy-jetson" diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml index 92a71d82c3..c93291d544 100644 --- a/tools/package_tools/configs/linux_x86_trt.yaml +++ b/tools/package_tools/configs/linux_x86_trt.yaml @@ -5,11 +5,11 @@ global_config: MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" - CUDNN_DIR: "/usr/lib/x86_64-linux-gnu" + CUDNN_DIR: "${CUDNN_DIR}" pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - - BUILD_NAME: "mmdeploy-many-linux-x86_64-cuda113-tensorrt8230-0.5.0" + - BUILD_NAME: "mmdeploy-many-linux-x86_64-cuda113-tensorrt8230" cmake_envs: TENSORRT_DIR: "${TENSORRT_DIR}" CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" diff --git a/tools/package_tools/configs/windows_ort.yaml b/tools/package_tools/configs/windows_ort.yaml deleted file mode 100644 index 62972bb231..0000000000 --- a/tools/package_tools/configs/windows_ort.yaml +++ /dev/null @@ -1,13 +0,0 @@ -global_config: - cmake_flags: ['-G "Visual Studio 17 2022" -A x64 -T v143'] - cmake_envs: - MMDEPLOY_BUILD_SDK: "ON" - MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" - MMDEPLOY_TARGET_DEVICES: '"cpu"' - MMDEPLOY_TARGET_BACKENDS: "ort" - MMDEPLOY_CODEBASES: "all" - -local_configs: - - BUILD_NAME: "windows-cpu-ort8230" - cmake_envs: - ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" diff --git a/tools/package_tools/configs/windows_x64.yaml b/tools/package_tools/configs/windows_x64.yaml new file mode 100644 index 0000000000..c451b3578f --- /dev/null +++ b/tools/package_tools/configs/windows_x64.yaml @@ -0,0 +1,21 @@ +global_config: + cmake_flags: ['-G "Visual Studio 16 2019" -A x64 -T v142'] + cmake_envs: + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + MMDEPLOY_CODEBASES: "all" + OpenCV_DIR: "%OpenCV_DIR%" + +local_configs: + # - BUILD_NAME: "mmdeploy-windows-x86_64-onnxruntime" + # cmake_envs: + # MMDEPLOY_TARGET_DEVICES: '"cpu"' + # MMDEPLOY_TARGET_BACKENDS: "ort" + # ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" + - BUILD_NAME: "mmdeploy-windows-x86_64-cuda113-tensorrt8230" + cmake_envs: + MMDEPLOY_TARGET_DEVICES: '"cuda"' + MMDEPLOY_TARGET_BACKENDS: "trt" + pplcv_DIR: "%PPLCV_DIR%\\pplcv-build\\install\\lib\\cmake\\ppl" + TENSORRT_DIR: "%TENSORRT_DIR%" + CUDNN_DIR: "%CUDNN_DIR%" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 49f8c6eb44..bff6796e9c 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -22,6 +22,12 @@ PLATFORM_TAG = get_platform().replace('-', '_').replace('.', '_') +def get_version(version_file): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + def _merge_cfg(cfg0, cfg1): cfg = copy.deepcopy(cfg0) for k, v in cfg1.items(): @@ -175,6 +181,11 @@ def create_package(cfg: Dict, mmdeploy_dir: str): if 'TAR_NAME' in cfg: cfg, sdk_tar_name = get_dir_name(cfg, 'TAR_NAME', sdk_tar_name) + # add version tag + version_file = osp.join(mmdeploy_dir, 'mmdeploy', 'version.py') + version_id = get_version(version_file) + build_dir = build_dir + '-' + version_id + # create package directory. if osp.exists(build_dir): logging.info(f'{build_dir} existed, deleting...') @@ -212,6 +223,10 @@ def create_package(cfg: Dict, mmdeploy_dir: str): sdk_python_package_dir = osp.join(build_dir, '.mmdeploy_python') _copy(PACKAGING_DIR, sdk_python_package_dir) + _copy( + osp.join(mmdeploy_dir, 'mmdeploy', 'version.py'), + osp.join(sdk_python_package_dir, 'mmdeploy_python', + 'version.py')) _copy(python_api_lib_path, osp.join(sdk_python_package_dir, 'mmdeploy_python')) sdk_wheel_dir = osp.abspath(osp.join(sdk_tar_dir, 'python')) From ace3b7dfcccb6ce47546a8576a1c464f327022eb Mon Sep 17 00:00:00 2001 From: grimoire Date: Thu, 19 May 2022 17:16:38 +0800 Subject: [PATCH 23/31] update linux config --- tools/package_tools/configs/linux_x64.yaml | 20 +++++++++++++++++++ .../package_tools/configs/linux_x86_trt.yaml | 15 -------------- 2 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 tools/package_tools/configs/linux_x64.yaml delete mode 100644 tools/package_tools/configs/linux_x86_trt.yaml diff --git a/tools/package_tools/configs/linux_x64.yaml b/tools/package_tools/configs/linux_x64.yaml new file mode 100644 index 0000000000..3b7f6174c7 --- /dev/null +++ b/tools/package_tools/configs/linux_x64.yaml @@ -0,0 +1,20 @@ +global_config: + cmake_envs: + CMAKE_CXX_COMPILER: "g++-7" + MMDEPLOY_BUILD_SDK: "ON" + MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" + +local_configs: + - BUILD_NAME: "mmdeploy-many-linux-x86_64-onnxruntime" + cmake_envs: + MMDEPLOY_TARGET_DEVICES: '"cpu"' + MMDEPLOY_TARGET_BACKENDS: "ort" + ONNXRUNTIME_DIR: "${ONNXRUNTIME_DIR}" + - BUILD_NAME: "mmdeploy-many-linux-x86_64-cuda113-tensorrt8230" + cmake_envs: + MMDEPLOY_TARGET_DEVICES: '"cuda"' + MMDEPLOY_TARGET_BACKENDS: "trt" + TENSORRT_DIR: "${TENSORRT_DIR}" + CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" + CUDNN_DIR: "${CUDNN_DIR}" + pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl diff --git a/tools/package_tools/configs/linux_x86_trt.yaml b/tools/package_tools/configs/linux_x86_trt.yaml deleted file mode 100644 index c93291d544..0000000000 --- a/tools/package_tools/configs/linux_x86_trt.yaml +++ /dev/null @@ -1,15 +0,0 @@ -global_config: - cmake_envs: - CMAKE_CXX_COMPILER: "g++-7" - MMDEPLOY_BUILD_SDK: "ON" - MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" - MMDEPLOY_TARGET_DEVICES: '"cpu;cuda"' - MMDEPLOY_TARGET_BACKENDS: "trt" - CUDNN_DIR: "${CUDNN_DIR}" - pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl - -local_configs: - - BUILD_NAME: "mmdeploy-many-linux-x86_64-cuda113-tensorrt8230" - cmake_envs: - TENSORRT_DIR: "${TENSORRT_DIR}" - CUDA_TOOLKIT_ROOT_DIR: "/usr/local/cuda-11.3" From 414327970cae75485e4dc7f3c69550af4a1d78cf Mon Sep 17 00:00:00 2001 From: grimoire Date: Sat, 21 May 2022 17:28:20 +0800 Subject: [PATCH 24/31] remote many --- tools/package_tools/configs/linux_x64.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/package_tools/configs/linux_x64.yaml b/tools/package_tools/configs/linux_x64.yaml index 3b7f6174c7..271eaa884f 100644 --- a/tools/package_tools/configs/linux_x64.yaml +++ b/tools/package_tools/configs/linux_x64.yaml @@ -5,12 +5,12 @@ global_config: MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" local_configs: - - BUILD_NAME: "mmdeploy-many-linux-x86_64-onnxruntime" + - BUILD_NAME: "mmdeploy-linux-x86_64-onnxruntime" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cpu"' MMDEPLOY_TARGET_BACKENDS: "ort" ONNXRUNTIME_DIR: "${ONNXRUNTIME_DIR}" - - BUILD_NAME: "mmdeploy-many-linux-x86_64-cuda113-tensorrt8230" + - BUILD_NAME: "mmdeploy-linux-x86_64-cuda113-tensorrt8230" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" From f2e7b002ad4f1b8f1475a675c9268fdd92889a47 Mon Sep 17 00:00:00 2001 From: grimoire Date: Sat, 21 May 2022 17:45:33 +0800 Subject: [PATCH 25/31] better build name --- tools/package_tools/configs/jetson.yaml | 2 +- tools/package_tools/configs/linux_x64.yaml | 4 ++-- tools/package_tools/configs/windows_x64.yaml | 2 +- tools/package_tools/mmdeploy_builder.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/package_tools/configs/jetson.yaml b/tools/package_tools/configs/jetson.yaml index b8a7c5a19c..7b756ba167 100644 --- a/tools/package_tools/configs/jetson.yaml +++ b/tools/package_tools/configs/jetson.yaml @@ -10,4 +10,4 @@ global_config: pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - - BUILD_NAME: "mmdeploy-jetson" + - BUILD_NAME: "mmdeploy-{version}-jetson" diff --git a/tools/package_tools/configs/linux_x64.yaml b/tools/package_tools/configs/linux_x64.yaml index 271eaa884f..4f2c3b5a39 100644 --- a/tools/package_tools/configs/linux_x64.yaml +++ b/tools/package_tools/configs/linux_x64.yaml @@ -5,12 +5,12 @@ global_config: MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" local_configs: - - BUILD_NAME: "mmdeploy-linux-x86_64-onnxruntime" + - BUILD_NAME: "mmdeploy-{version}-linux-x86_64-onnxruntime" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cpu"' MMDEPLOY_TARGET_BACKENDS: "ort" ONNXRUNTIME_DIR: "${ONNXRUNTIME_DIR}" - - BUILD_NAME: "mmdeploy-linux-x86_64-cuda113-tensorrt8230" + - BUILD_NAME: "mmdeploy-{version}-linux-x86_64-cuda113-tensorrt8230" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" diff --git a/tools/package_tools/configs/windows_x64.yaml b/tools/package_tools/configs/windows_x64.yaml index c451b3578f..2900ddeed6 100644 --- a/tools/package_tools/configs/windows_x64.yaml +++ b/tools/package_tools/configs/windows_x64.yaml @@ -12,7 +12,7 @@ local_configs: # MMDEPLOY_TARGET_DEVICES: '"cpu"' # MMDEPLOY_TARGET_BACKENDS: "ort" # ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" - - BUILD_NAME: "mmdeploy-windows-x86_64-cuda113-tensorrt8230" + - BUILD_NAME: "mmdeploy-{version}-windows-x86_64-cuda113-tensorrt8230" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index bff6796e9c..eb6dbf478d 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -184,7 +184,7 @@ def create_package(cfg: Dict, mmdeploy_dir: str): # add version tag version_file = osp.join(mmdeploy_dir, 'mmdeploy', 'version.py') version_id = get_version(version_file) - build_dir = build_dir + '-' + version_id + build_dir = build_dir.format(version=version_id) # create package directory. if osp.exists(build_dir): From 8eec447b8bb20cd459a39a696befdea99deaa117 Mon Sep 17 00:00:00 2001 From: grimoire Date: Sat, 21 May 2022 18:20:22 +0800 Subject: [PATCH 26/31] rename python tag --- tools/package_tools/mmdeploy_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index eb6dbf478d..36b34a4974 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -92,7 +92,7 @@ def _create_bdist_cmd(cfg, dist_dir=None): bdist_cmd += f' --plat-name {PLATFORM_TAG} ' # python tag - python_tag = f'py{sys.version_info.major}{sys.version_info.minor}' + python_tag = f'cp{sys.version_info.major}{sys.version_info.minor}' if 'python_tag' in bdist_tags: python_tag = bdist_tags['python_tag'] bdist_cmd += f' --python-tag {python_tag} ' From 5a59ab109619469db7c0df93992ab9c5f9a975a9 Mon Sep 17 00:00:00 2001 From: grimoire Date: Sat, 21 May 2022 20:29:18 +0800 Subject: [PATCH 27/31] fix pyhon-tag --- tools/package_tools/mmdeploy_builder.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 36b34a4974..b08f652225 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -81,7 +81,7 @@ def _create_tar(path, tar_name): tar.add(path, arcname=os.path.basename(path)) -def _create_bdist_cmd(cfg, dist_dir=None): +def _create_bdist_cmd(cfg, c_ext=False, dist_dir=None): bdist_tags = cfg.get('bdist_tags', {}) @@ -92,7 +92,8 @@ def _create_bdist_cmd(cfg, dist_dir=None): bdist_cmd += f' --plat-name {PLATFORM_TAG} ' # python tag - python_tag = f'cp{sys.version_info.major}{sys.version_info.minor}' + py_flag = 'cp' if c_ext else 'py' + python_tag = f'{py_flag}{sys.version_info.major}{sys.version_info.minor}' if 'python_tag' in bdist_tags: python_tag = bdist_tags['python_tag'] bdist_cmd += f' --python-tag {python_tag} ' @@ -158,7 +159,7 @@ def build_mmdeploy(cfg, mmdeploy_dir, dist_dir=None): _call_command(build_cmd, build_dir) # build wheel - bdist_cmd = _create_bdist_cmd(cfg, dist_dir) + bdist_cmd = _create_bdist_cmd(cfg, c_ext=False, dist_dir=dist_dir) _call_command(bdist_cmd, mmdeploy_dir) @@ -230,7 +231,8 @@ def create_package(cfg: Dict, mmdeploy_dir: str): _copy(python_api_lib_path, osp.join(sdk_python_package_dir, 'mmdeploy_python')) sdk_wheel_dir = osp.abspath(osp.join(sdk_tar_dir, 'python')) - bdist_cmd = _create_bdist_cmd(cfg, sdk_wheel_dir) + bdist_cmd = _create_bdist_cmd( + cfg, c_ext=True, dist_dir=sdk_wheel_dir) _call_command(bdist_cmd, sdk_python_package_dir) # remove temp package dir From a55b214d7f685570fc03fe0582f5526c9d1c7381 Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 23 May 2022 10:00:16 +0800 Subject: [PATCH 28/31] update window config --- tools/package_tools/configs/windows_x64.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tools/package_tools/configs/windows_x64.yaml b/tools/package_tools/configs/windows_x64.yaml index 2900ddeed6..155c102089 100644 --- a/tools/package_tools/configs/windows_x64.yaml +++ b/tools/package_tools/configs/windows_x64.yaml @@ -5,13 +5,14 @@ global_config: MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" MMDEPLOY_CODEBASES: "all" OpenCV_DIR: "%OpenCV_DIR%" + spdlog_DIR: '"%spdlog_DIR%"' local_configs: - # - BUILD_NAME: "mmdeploy-windows-x86_64-onnxruntime" - # cmake_envs: - # MMDEPLOY_TARGET_DEVICES: '"cpu"' - # MMDEPLOY_TARGET_BACKENDS: "ort" - # ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" + - BUILD_NAME: "mmdeploy-windows-x86_64-onnxruntime" + cmake_envs: + MMDEPLOY_TARGET_DEVICES: '"cpu"' + MMDEPLOY_TARGET_BACKENDS: "ort" + ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" - BUILD_NAME: "mmdeploy-{version}-windows-x86_64-cuda113-tensorrt8230" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cuda"' From 6e7415304edb0866dbdb35d1829e794b4190b892 Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 23 May 2022 11:50:48 +0800 Subject: [PATCH 29/31] add env search --- tools/package_tools/configs/jetson.yaml | 2 +- tools/package_tools/configs/linux_x64.yaml | 4 +- tools/package_tools/configs/windows_x64.yaml | 4 +- tools/package_tools/mmdeploy_builder.py | 84 ++++++++++++++++++-- 4 files changed, 82 insertions(+), 12 deletions(-) diff --git a/tools/package_tools/configs/jetson.yaml b/tools/package_tools/configs/jetson.yaml index 7b756ba167..55b2d3545e 100644 --- a/tools/package_tools/configs/jetson.yaml +++ b/tools/package_tools/configs/jetson.yaml @@ -10,4 +10,4 @@ global_config: pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - - BUILD_NAME: "mmdeploy-{version}-jetson" + - BUILD_NAME: "mmdeploy-{version}-jetson-cuda{cuda_v}" diff --git a/tools/package_tools/configs/linux_x64.yaml b/tools/package_tools/configs/linux_x64.yaml index 4f2c3b5a39..a1dc7bc45f 100644 --- a/tools/package_tools/configs/linux_x64.yaml +++ b/tools/package_tools/configs/linux_x64.yaml @@ -5,12 +5,12 @@ global_config: MMDEPLOY_BUILD_SDK_PYTHON_API: "ON" local_configs: - - BUILD_NAME: "mmdeploy-{version}-linux-x86_64-onnxruntime" + - BUILD_NAME: "mmdeploy-{mmdeploy_v}-{system}-{machine}-onnxruntime{ort_v}" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cpu"' MMDEPLOY_TARGET_BACKENDS: "ort" ONNXRUNTIME_DIR: "${ONNXRUNTIME_DIR}" - - BUILD_NAME: "mmdeploy-{version}-linux-x86_64-cuda113-tensorrt8230" + - BUILD_NAME: "mmdeploy-{mmdeploy_v}-{system}-{machine}-cuda{cuda_v}-tensorrt{trt_v}" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" diff --git a/tools/package_tools/configs/windows_x64.yaml b/tools/package_tools/configs/windows_x64.yaml index 155c102089..47d0ccf597 100644 --- a/tools/package_tools/configs/windows_x64.yaml +++ b/tools/package_tools/configs/windows_x64.yaml @@ -8,12 +8,12 @@ global_config: spdlog_DIR: '"%spdlog_DIR%"' local_configs: - - BUILD_NAME: "mmdeploy-windows-x86_64-onnxruntime" + - BUILD_NAME: "mmdeploy-{mmdeploy_v}-{system}-{machine}-onnxruntime{ort_v}" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cpu"' MMDEPLOY_TARGET_BACKENDS: "ort" ONNXRUNTIME_DIR: "%ONNXRUNTIME_DIR%" - - BUILD_NAME: "mmdeploy-{version}-windows-x86_64-cuda113-tensorrt8230" + - BUILD_NAME: "mmdeploy-{mmdeploy_v}-{system}-{machine}-cuda{cuda_v}-tensorrt{trt_v}" cmake_envs: MMDEPLOY_TARGET_DEVICES: '"cuda"' MMDEPLOY_TARGET_BACKENDS: "trt" diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index b08f652225..3741ebfc0b 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -4,12 +4,14 @@ import logging import os import os.path as osp +import platform +import re import shutil import sys import tarfile from distutils.util import get_platform from glob import glob -from subprocess import CalledProcessError, run +from subprocess import CalledProcessError, check_output, run from typing import Dict import yaml @@ -69,10 +71,10 @@ def _call_command(cmd, cwd, stdout=None, stderr=None): if ret.returncode != 0: logging.error(f'Process cmd: "{cmd}"' f' failed with returncode: {ret.returncode}') - exit() + exit(-1) except Exception: logging.error(f'Process cmd: {cmd} failed.') - exit() + exit(-1) def _create_tar(path, tar_name): @@ -171,6 +173,73 @@ def get_dir_name(cfg, tag, default_name): return cfg, default_name +def check_env(cfg: Dict): + env_info = {} + + cmake_envs = cfg.get('cmake_envs', dict()) + + # system + platform_system = platform.system().lower() + platform_machine = platform.machine().lower() + env_info['system'] = platform_system + env_info['machine'] = platform_machine + + # CUDA version + cuda_version = 'unknown' + + CUDA_TOOLKIT_ROOT_DIR = cmake_envs.get('CUDA_TOOLKIT_ROOT_DIR', '') + CUDA_TOOLKIT_ROOT_DIR = osp.expandvars(CUDA_TOOLKIT_ROOT_DIR) + nvcc_cmd = 'nvcc' if len(CUDA_TOOLKIT_ROOT_DIR) <= 0 else osp.join( + CUDA_TOOLKIT_ROOT_DIR, 'bin', 'nvcc') + + if osp.exists(nvcc_cmd): + nvcc = check_output(f'"{nvcc_cmd}" -V', shell=True) + nvcc = nvcc.decode('utf-8').strip() + pattern = r'Cuda compilation tools, release (\d+.\d+)' + match = re.search(pattern, nvcc) + if match is not None: + cuda_version = match.group(1) + + env_info['cuda_v'] = cuda_version + + # ONNX Runtime version + onnxruntime_version = 'unknown' + + ONNXRUNTIME_DIR = os.getenv('ONNXRUNTIME_DIR', '') + ONNXRUNTIME_DIR = cmake_envs.get('ONNXRUNTIME_DIR', ONNXRUNTIME_DIR) + ONNXRUNTIME_DIR = osp.expandvars(ONNXRUNTIME_DIR) + + if osp.exists(ONNXRUNTIME_DIR): + with open(osp.join(ONNXRUNTIME_DIR, 'VERSION_NUMBER'), mode='r') as f: + onnxruntime_version = f.readlines()[0].strip() + + env_info['ort_v'] = onnxruntime_version + + # TensorRT version + tensorrt_version = 'unknown' + + TENSORRT_DIR = os.getenv('TENSORRT_DIR', '') + TENSORRT_DIR = cmake_envs.get('TENSORRT_DIR', TENSORRT_DIR) + TENSORRT_DIR = osp.expandvars(TENSORRT_DIR) + + if osp.exists(TENSORRT_DIR): + with open( + osp.join(TENSORRT_DIR, 'include', 'NvInferVersion.h'), + mode='r') as f: + data = f.read() + major = re.search(r'#define NV_TENSORRT_MAJOR (\d+)', data) + minor = re.search(r'#define NV_TENSORRT_MINOR (\d+)', data) + patch = re.search(r'#define NV_TENSORRT_PATCH (\d+)', data) + if major is not None and minor is not None and patch is not None: + tensorrt_version = f'{major.group(1)}' +\ + f'{minor.group(1)}' +\ + f'{patch.group(1)}' + + env_info['trt_v'] = tensorrt_version + + return env_info + + def create_package(cfg: Dict, mmdeploy_dir: str): build_dir = 'build' sdk_tar_name = 'sdk' @@ -182,10 +251,11 @@ def create_package(cfg: Dict, mmdeploy_dir: str): if 'TAR_NAME' in cfg: cfg, sdk_tar_name = get_dir_name(cfg, 'TAR_NAME', sdk_tar_name) - # add version tag + # fill name + env_info = check_env(cfg) version_file = osp.join(mmdeploy_dir, 'mmdeploy', 'version.py') - version_id = get_version(version_file) - build_dir = build_dir.format(version=version_id) + mmdeploy_version = get_version(version_file) + build_dir = build_dir.format(mmdeploy_v=mmdeploy_version, **env_info) # create package directory. if osp.exists(build_dir): @@ -242,7 +312,7 @@ def create_package(cfg: Dict, mmdeploy_dir: str): except CalledProcessError: logging.error('build failed') - exit() + exit(-1) def parse_args(): From 35d27bd978af6939fd44dace894cb8bb43967867 Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 23 May 2022 14:54:18 +0800 Subject: [PATCH 30/31] update tag --- mmdeploy/mmcv/ops/deform_conv.py | 2 +- tools/package_tools/configs/jetson.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mmdeploy/mmcv/ops/deform_conv.py b/mmdeploy/mmcv/ops/deform_conv.py index ccd0542678..3e2a436f48 100644 --- a/mmdeploy/mmcv/ops/deform_conv.py +++ b/mmdeploy/mmcv/ops/deform_conv.py @@ -26,7 +26,7 @@ def deform_conv__default(ctx, padding_i=[p for pair in zip(padding, padding) for p in pair], dilation_i=dilation, groups_i=groups, - deformable_groups_i=deform_groups) + deform_groups_i=deform_groups) @SYMBOLIC_REWRITER.register_symbolic( diff --git a/tools/package_tools/configs/jetson.yaml b/tools/package_tools/configs/jetson.yaml index 55b2d3545e..8df61e6fc9 100644 --- a/tools/package_tools/configs/jetson.yaml +++ b/tools/package_tools/configs/jetson.yaml @@ -10,4 +10,4 @@ global_config: pplcv_DIR: ${pplcv_DIR}/cuda-build/install/lib/cmake/ppl local_configs: - - BUILD_NAME: "mmdeploy-{version}-jetson-cuda{cuda_v}" + - BUILD_NAME: "mmdeploy-{mmdeploy_v}-jetson-cuda{cuda_v}" From 2edc101901d44a4b809c607e952b0b4487cf85fe Mon Sep 17 00:00:00 2001 From: grimoire Date: Mon, 23 May 2022 15:28:19 +0800 Subject: [PATCH 31/31] fix build without CUDA_TOOLKIT_ROOT_DIR --- tools/package_tools/mmdeploy_builder.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/package_tools/mmdeploy_builder.py b/tools/package_tools/mmdeploy_builder.py index 3741ebfc0b..2e59d6cddf 100644 --- a/tools/package_tools/mmdeploy_builder.py +++ b/tools/package_tools/mmdeploy_builder.py @@ -192,13 +192,15 @@ def check_env(cfg: Dict): nvcc_cmd = 'nvcc' if len(CUDA_TOOLKIT_ROOT_DIR) <= 0 else osp.join( CUDA_TOOLKIT_ROOT_DIR, 'bin', 'nvcc') - if osp.exists(nvcc_cmd): + try: nvcc = check_output(f'"{nvcc_cmd}" -V', shell=True) nvcc = nvcc.decode('utf-8').strip() pattern = r'Cuda compilation tools, release (\d+.\d+)' match = re.search(pattern, nvcc) if match is not None: cuda_version = match.group(1) + except Exception: + pass env_info['cuda_v'] = cuda_version @@ -231,8 +233,8 @@ def check_env(cfg: Dict): minor = re.search(r'#define NV_TENSORRT_MINOR (\d+)', data) patch = re.search(r'#define NV_TENSORRT_PATCH (\d+)', data) if major is not None and minor is not None and patch is not None: - tensorrt_version = f'{major.group(1)}' +\ - f'{minor.group(1)}' +\ + tensorrt_version = f'{major.group(1)}.' +\ + f'{minor.group(1)}.' +\ f'{patch.group(1)}' env_info['trt_v'] = tensorrt_version