mirror of
https://github.com/open-mmlab/mmdeploy.git
synced 2025-01-14 08:09:43 +08:00
* make -install -> make install (#621) change `make -install` to `make install` https://github.com/open-mmlab/mmdeploy/issues/618 * [Fix] fix csharp api detector release result (#620) * fix csharp api detector release result * fix wrong count arg of xxx_release_result in c# api * [Enhancement] Support two-stage rotated detector TensorRT. (#530) * upload * add fake_multiclass_nms_rotated * delete unused code * align with pytorch * Update delta_midpointoffset_rbbox_coder.py * add trt rotated roi align * add index feature in nms * not good * fix index * add ut * add benchmark * move to csrc/mmdeploy * update unit test Co-authored-by: zytx121 <592267829@qq.com> * Reduce mmcls version dependency (#635) * fix shufflenetv2 with trt (#645) * fix shufflenetv2 and pspnet * fix ci * remove print * ' -> " (#654) If there is a variable in the string, single quotes will ignored it, while double quotes will bring the variable into the string after parsing * ' -> " (#655) same with https://github.com/open-mmlab/mmdeploy/pull/654 * Support deployment of Segmenter (#587) * support segmentor with ncnn * update regression yml * replace chunk with split to support ts * update regression yml * update docs * fix segmenter ncnn inference failure brought by #477 * add test * fix test for ncnn and trt * fix lint * export nn.linear to Gemm op in onnx for ncnn * fix ci * simplify `Expand` (#617) * Fix typo (#625) * Add make install in en docs * Add make install in zh docs * Fix typo * Merge and add windows build Co-authored-by: tripleMu <865626@163.com> * [Enhancement] Fix ncnn unittest (#626) * optmize-csp-darknet * replace floordiv to torch.div * update csp_darknet default implement * fix test * [Enhancement] TensorRT Anchor generator plugin (#646) * custom trt anchor generator * add ut * add docstring, update doc * Add partition doc and sample code (#599) * update torch2onnx tool to support onnx partition * add model partition of yolov3 * add cn doc * update torch2onnx tool to support onnx partition * add model partition of yolov3 * add cn doc * add to index.rst * resolve comment * resolve comments * fix lint * change caption level in docs * update docs (#624) * Add java apis and demos (#563) * add java classifier detector * add segmentor * fix lint * add ImageRestorer java apis and demo * remove useless count parameter for Segmentor and Restorer, add PoseDetector * add RotatedDetection java api and demo * add Ocr java demo and apis * remove mmrotate ncnn java api and demo * fix lint * sync java api folder after rebase to master * fix include * remove record * fix java apis dir path in cmake * add java demo readme * fix lint mdformat * add test javaapi ci * fix lint * fix flake8 * fix test javaapi ci * refactor readme.md * fix install opencv for ci * fix install opencv : add permission * add all codebases and mmcv install * add torch * install mmdeploy * fix image path * fix picture path * fix import ncnn * fix import ncnn * add submodule of pybind * fix pybind submodule * change download to git clone for submodule * fix ncnn dir * fix README error * simplify the github ci * fix ci * fix yapf * add JNI as required * fix Capitalize * fix Capitalize * fix copyright * ignore .class changed * add OpenJDK installation docs * install target of javaapi * simplify ci * add jar * fix ci * fix ci * fix test java command * debugging what failed * debugging what failed * debugging what failed * add java version info * install openjdk * add java env var * fix export * fix export * fix export * fix export * fix picture path * fix picture path * fix file name * fix file name * fix README * remove java_api strategy * fix python version * format task name * move args position * extract common utils code * show image class result * add detector result * segmentation result format * add ImageRestorer result * add PoseDetection java result format * fix ci * stage ocr * add visualize * move utils * fix lint * fix ocr bugs * fix ci demo * fix java classpath for ci * fix popd * fix ocr demo text garbled * fix ci * fix ci * fix ci * fix path of utils ci * update the circleci config file by adding workflows both for linux, windows and linux-gpu (#368) * update circleci by adding more workflows * fix test workflow failure on windows platform * fix docker exec command for SDK unittests * Fixed tensorrt plugin not found in Windows (#672) * update introduction.png (#674) * [Enhancement] Add fuse select assign pass (#589) * Add fuse select assign pass * move code to csrc * add config flag * remove bool cast * fix export sdk info of input shape (#667) * Update get_started.md (#675) Fix backend model assignment * Update get_started.md (#676) Fix backend model assignment * [Fix] fix clang build (#677) * fix clang build * fix ndk build * fix ndk build * switch to `std::filesystem` for clang-7 and later * Deploy the Swin Transformer on TensorRT. (#652) * resolve conflicts * update ut and docs * fix ut * refine docstring * add comments and refine UT * resolve comments * resolve comments * update doc * add roll export * check backend * update regression test * bump version to 0.6.0 (#680) * bump vertion to 0.6.0 * update version * pass img_metas while exporting to onnx (#681) * pass img_metas while exporting to onnx * remove try-catch in tools for beter debugging * use get * fix typo * [Fix] fix ssd ncnn ut (#692) * fix ssd ncnn ut * fix yapf * fix passing img_metas to pytorch2onnx for mmedit (#700) * fix passing img_metas for mmdet3d (#707) * [Fix] Fix android build (#698) * fix android build * fix cmake * fix url link * fix wrong exit code in pipeline_manager (#715) * fix exit * change to general exit errorcode=1 * fix passing wrong backend type (#719) * Rename onnx2ncnn to mmdeploy_onnx2ncnn (#694) * improvement(tools/onnx2ncnn.py): rename to mmdeploy_onnx2ncnn * format(tools/deploy.py): clean code * fix(init_plugins.py): improve if condition * fix(CI): update target * fix(test_onnx2ncnn.py): update desc * Update init_plugins.py * [Fix] Fix mmdet ort static shape bug (#687) * fix shape * add device * fix yapf * fix rewriter for transforms * reverse image shape * fix ut of distance2bbox * fix rewriter name * fix c4 for torchscript (#724) * [Enhancement] Standardize C API (#634) * unify C API naming * fix demo and move apis/c/* -> apis/c/mmdeploy/* * fix lint * fix C# project * fix Java API * [Enhancement] Support Slide Vertex TRT (#650) * reorgnize mmrotate * fix * add hbb2obb * add ut * fix rotated nms * update docs * update benchmark * update test * remove ort regression test, remove comment * Fix get-started rendering issues in readthedocs (#740) * fix mermaid markdown rendering issue in readthedocs * fix error in C++ example * fix error in c++ example in zh_cn get_started doc * [Fix] set default topk for dump info (#702) * set default topk for dump info * remove redundant docstrings * add ci densenet * fix classification warnings * fix mmcls version * fix logger.warnings * add version control (#754) * fix satrn for ORT (#753) * fix satrn for ORT * move rewrite into pytorch * Add inference latency test tool (#665) * add profile tool * remove print envs in profile tool * set cudnn_benchmark to True * add doc * update tests * fix typo * support test with images from a directory * update doc * resolve comments * [Enhancement] Add CSE ONNX pass (#647) * Add fuse select assign pass * move code to csrc * add config flag * Add fuse select assign pass * Add CSE for ONNX * remove useless code * Test robot Just test robot * Update README.md Revert * [Fix] fix yolox point_generator (#758) * fix yolox point_generator * add a UT * resolve comments * fix comment lines * limit markdown version (#773) * [Enhancement] Better index put ONNX export. (#704) * Add rewriter for tensor setitem * add version check * Upgrade Dockerfile to use TensorRT==8.2.4.2 (#706) * Upgrade TensorRT to 8.2.4.2 * upgrade pytorch&mmcv in CPU Dockerfile * Delete redundant port example in Docker * change 160x160-608x608 to 64x64-608x608 for yolov3 * [Fix] reduce log verbosity & improve error reporting (#755) * reduce log verbosity & improve error reporting * improve error reporting * [Enhancement] Support latest ppl.nn & ppl.cv (#564) * support latest ppl.nn * fix pplnn for model convertor * fix lint * update memory policy * import algo from buffer * update ppl.cv * use `ppl.cv==0.7.0` * document supported ppl.nn version * skip pplnn dependency when building shared libs * [Fix][P0] Fix for torch1.12 (#751) * fix for torch1.12 * add comment * fix check env (#785) * [Fix] fix cascade mask rcnn (#787) * fix cascade mask rcnn * fix lint * add regression * [Feature] Support RoITransRoIHead (#713) * [Feature] Support RoITransRoIHead * Add docs * Add mmrotate models regression test * Add a draft for test code * change the argument name * fix test code * fix minor change for not class agnostic case * fix sample for test code * fix sample for test code * Add mmrotate in requirements * Revert "Add mmrotate in requirements" This reverts commit 043490075e6dbe4a8fb98e94b2b583b91fc5038d. * [Fix] fix triu (#792) * fix triu * triu -> triu_default * [Enhancement] Install Optimizer by setuptools (#690) * Add fuse select assign pass * move code to csrc * add config flag * Add fuse select assign pass * Add CSE for ONNX * remove useless code * Install optimizer by setup tools * fix comment * [Feature] support MMRotate model with le135 (#788) * support MMRotate model with le135 * cse before fuse select assign * remove unused import * [Fix] Support macOS build (#762) * fix macOS build * fix missing * add option to build & install examples (#822) * [Fix] Fix setup on non-linux-x64 (#811) * fix setup * replace long to int64_t * [Feature] support build single sdk library (#806) * build single lib for c api * update csharp doc & project * update test build * fix test build * fix * update document for building android sdk (#817) Co-authored-by: dwSun <dwsunny@icloud.com> * [Enhancement] support kwargs in SDK python bindings (#794) * support-kwargs * make '__call__' as single image inference and add 'batch' API to deal with batch images inference * fix linting error and typo * fix lint * improvement(sdk): add sdk code coverage (#808) * feat(doc): add CI * CI(sdk): add sdk coverage * style(test): code format * fix(CI): update coverage.info path * improvement(CI): use internal image * improvement(CI): push coverage info once * [Feature] Add C++ API for SDK (#831) * add C++ API * unify result type & add examples * minor fix * install cxx API headers * fix Mat, add more examples * fix monolithic build & fix lint * install examples correctly * fix lint * feat(tools/deploy.py): support snpe (#789) * fix(tools/deploy.py): support snpe * improvement(backend/snpe): review advices * docs(backend/snpe): update build * docs(backend/snpe): server support specify port * docs(backend/snpe): update path * fix(backend/snpe): time counter missing argument * docs(backend/snpe): add missing argument * docs(backend/snpe): update download and using * improvement(snpe_net.cpp): load model with modeldata * Support setup on environment with no PyTorch (#843) * support test with multi batch (#829) * support test with multi batch * resolve comment * import algorithm from buffer (#793) * [Enhancement] build sdk python api in standard-alone manner (#810) * build sdk python api in standard-alone manner * enable MMDEPLOY_BUILD_SDK_MONOLITHIC and MMDEPLOY_BUILD_EXAMPLES in prebuild config * link mmdeploy to python target when monolithic option is on * checkin README to describe precompiled package build procedure * use packaging.version.parse(python_version) instead of list(python_version) * fix according to review results * rebase master * rollback cmake.in and apis/python/CMakeLists.txt * reorganize files in install/example * let cmake detect visual studio instead of specifying 2019 * rename whl name of precompiled package * fix according to review results * Fix SDK backend (#844) * fix mmpose python api (#852) * add prebuild package usage docs on windows (#816) * add prebuild package usage docs on windows * fix lint * update * try fix lint * add en docs * update * update * udpate faq * fix typo (#862) * [Enhancement] Improve get_started documents and bump version to 0.7.0 (#813) * simplify commands in get_started * add installation commands for Windows * fix typo * limit markdown and sphinx_markdown_tables version * adopt html <details open> tag * bump mmdeploy version * bump mmdeploy version * update get_started * update get_started * use python3.8 instead of python3.7 * remove duplicate section * resolve issue #856 * update according to review results * add reference to prebuilt_package_windows.md * fix error when build sdk demos * fix mmcls Co-authored-by: Ryan_Huang <44900829+DrRyanHuang@users.noreply.github.com> Co-authored-by: Chen Xin <xinchen.tju@gmail.com> Co-authored-by: q.yao <yaoqian@sensetime.com> Co-authored-by: zytx121 <592267829@qq.com> Co-authored-by: Li Zhang <lzhang329@gmail.com> Co-authored-by: tripleMu <gpu@163.com> Co-authored-by: tripleMu <865626@163.com> Co-authored-by: hanrui1sensetime <83800577+hanrui1sensetime@users.noreply.github.com> Co-authored-by: lvhan028 <lvhan_028@163.com> Co-authored-by: Bryan Glen Suello <11388006+bgsuello@users.noreply.github.com> Co-authored-by: zambranohally <63218980+zambranohally@users.noreply.github.com> Co-authored-by: AllentDan <41138331+AllentDan@users.noreply.github.com> Co-authored-by: tpoisonooo <khj.application@aliyun.com> Co-authored-by: Hakjin Lee <nijkah@gmail.com> Co-authored-by: 孙德伟 <5899962+dwSun@users.noreply.github.com> Co-authored-by: dwSun <dwsunny@icloud.com> Co-authored-by: Chen Xin <irexyc@gmail.com>
414 lines
13 KiB
Python
414 lines
13 KiB
Python
# Copyright (c) OpenMMLab. All rights reserved.
|
|
import argparse
|
|
import copy
|
|
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, check_output, run
|
|
from typing import Dict
|
|
|
|
import yaml
|
|
from packaging import version
|
|
|
|
logger = logging.getLogger()
|
|
logger.setLevel(logging.INFO)
|
|
|
|
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
PACKAGING_DIR = osp.join(CUR_DIR, 'packaging')
|
|
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():
|
|
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}.')
|
|
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}')
|
|
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}')
|
|
exit(-1)
|
|
except Exception:
|
|
logging.error(f'Process cmd: {cmd} failed.')
|
|
exit(-1)
|
|
|
|
|
|
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 _create_bdist_cmd(cfg, c_ext=False, 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
|
|
python_tag = f'cp{sys.version_info.major}{sys.version_info.minor}'\
|
|
if c_ext else 'py3'
|
|
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}')
|
|
|
|
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')
|
|
_remove_in_mmdeploy('mmdeploy/backend/ncnn/mmdeploy_onnx2ncnn')
|
|
_remove_in_mmdeploy('mmdeploy/backend/ncnn/mmdeploy_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)
|
|
|
|
# remove ts_optmizer
|
|
ts_optimizer_paths = glob(
|
|
osp.join(mmdeploy_dir, 'mmdeploy/backend/torchscript/ts_optimizer.*'))
|
|
for ts_optimizer_path in ts_optimizer_paths:
|
|
os.remove(ts_optimizer_path)
|
|
|
|
|
|
def build_mmdeploy(cfg, mmdeploy_dir, dist_dir=None):
|
|
cmake_flags = cfg.get('cmake_flags', [])
|
|
cmake_envs = cfg.get('cmake_envs', dict())
|
|
|
|
args = [f'-D{k}={v}' for k, v in cmake_envs.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 ..'] + cmake_flags + args)
|
|
_call_command(cmake_cmd, build_dir)
|
|
|
|
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 = _create_bdist_cmd(cfg, c_ext=False, dist_dir=dist_dir)
|
|
_call_command(bdist_cmd, mmdeploy_dir)
|
|
|
|
|
|
def build_mmdeploy_python(python_executable, 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 cmake_envs.items()]
|
|
args.append(
|
|
f'-DMMDeploy_DIR={mmdeploy_dir}/build/install/lib/cmake/MMDeploy')
|
|
args.append(f'-DPYTHON_EXECUTABLE={python_executable}')
|
|
|
|
if sys.platform == 'win32':
|
|
build_cmd = 'cmake --build . --config Release -- /m'
|
|
pass
|
|
else:
|
|
build_cmd = 'cmake --build . -- -j$(nproc)'
|
|
cmake_cmd = ' '.join(['cmake ../csrc/mmdeploy/apis/python'] + cmake_flags +
|
|
args)
|
|
|
|
build_dir = osp.join(mmdeploy_dir, 'build_python')
|
|
_remove_if_exist(build_dir)
|
|
os.mkdir(build_dir)
|
|
|
|
_call_command(cmake_cmd, build_dir)
|
|
_call_command(build_cmd, build_dir)
|
|
|
|
python_api_lib_path = []
|
|
lib_patterns = ['*mmdeploy_python*.so', '*mmdeploy_python*.pyd']
|
|
for pattern in lib_patterns:
|
|
python_api_lib_path.extend(
|
|
glob(
|
|
osp.join(mmdeploy_dir, 'build_python/**', pattern),
|
|
recursive=True,
|
|
))
|
|
return python_api_lib_path[0]
|
|
|
|
|
|
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]
|
|
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'))
|
|
|
|
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
|
|
|
|
# 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)
|
|
build = re.search(r'#define NV_TENSORRT_BUILD (\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)}.' + f'{build.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'
|
|
|
|
# load flags
|
|
cfg, build_dir = get_dir_name(cfg, 'BUILD_NAME', build_dir)
|
|
cmake_envs = cfg.get('cmake_envs', dict())
|
|
build_sdk_flag = cmake_envs.get('MMDEPLOY_BUILD_SDK', 'OFF')
|
|
if 'TAR_NAME' in cfg:
|
|
cfg, sdk_tar_name = get_dir_name(cfg, 'TAR_NAME', sdk_tar_name)
|
|
|
|
# fill name
|
|
env_info = check_env(cfg)
|
|
version_file = osp.join(mmdeploy_dir, 'mmdeploy', 'version.py')
|
|
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):
|
|
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:
|
|
# build dist
|
|
dist_dir = osp.join(build_dir, 'dist')
|
|
build_mmdeploy(cfg, mmdeploy_dir, dist_dir=dist_dir)
|
|
|
|
if build_sdk_flag == 'ON':
|
|
|
|
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)
|
|
_copy(f'{mmdeploy_dir}/demo/python',
|
|
f'{sdk_tar_dir}/example/python')
|
|
_remove_if_exist(osp.join(sdk_tar_dir, 'example', 'build'))
|
|
|
|
# build SDK Python API according to different python version
|
|
for python_version in ['3.6', '3.7', '3.8', '3.9']:
|
|
_version = version.parse(python_version)
|
|
python_major, python_minor = _version.major, _version.minor
|
|
|
|
# create sdk python api wheel
|
|
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'),
|
|
)
|
|
|
|
# build mmdeploy sdk python api
|
|
python_executable = shutil.which('python')\
|
|
.replace('mmdeploy-3.6', f'mmdeploy-{python_version}')
|
|
python_api_lib_path = build_mmdeploy_python(
|
|
python_executable, cfg, mmdeploy_dir)
|
|
_copy(
|
|
python_api_lib_path,
|
|
osp.join(sdk_python_package_dir, 'mmdeploy_python'),
|
|
)
|
|
_remove_if_exist(osp.join(mmdeploy_dir, 'build_python'))
|
|
|
|
sdk_wheel_dir = osp.abspath(osp.join(sdk_tar_dir, 'python'))
|
|
|
|
bdist_cmd = (f'{python_executable} '
|
|
f'setup.py bdist_wheel --plat-name '
|
|
f'{PLATFORM_TAG} --python-tag '
|
|
f'cp{python_major}{python_minor} '
|
|
f'--dist-dir {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:
|
|
logging.error('build failed')
|
|
exit(-1)
|
|
|
|
|
|
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', [])
|
|
|
|
merged_cfgs = [
|
|
_merge_cfg(global_cfg, local_cfg) for local_cfg in local_cfgs
|
|
]
|
|
|
|
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()
|