support build cpu/gpu package (#75)

* support build cpu/gpu package

* remove useless modification
This commit is contained in:
Jason
2022-08-08 15:24:36 +08:00
committed by GitHub
parent 0494fdc96b
commit 9c67653e34
26 changed files with 593 additions and 89 deletions

View File

@@ -224,7 +224,9 @@ if(ENABLE_TEXT)
endif() endif()
configure_file(${PROJECT_SOURCE_DIR}/${CSRCS_DIR_NAME}/fastdeploy/core/config.h.in ${PROJECT_SOURCE_DIR}/${CSRCS_DIR_NAME}/fastdeploy/core/config.h) configure_file(${PROJECT_SOURCE_DIR}/${CSRCS_DIR_NAME}/fastdeploy/core/config.h.in ${PROJECT_SOURCE_DIR}/${CSRCS_DIR_NAME}/fastdeploy/core/config.h)
configure_file(${PROJECT_SOURCE_DIR}/${CSRCS_DIR_NAME}/fastdeploy/pybind/main.cc.in ${PROJECT_SOURCE_DIR}/${CSRCS_DIR_NAME}/fastdeploy/pybind/main.cc)
configure_file(${PROJECT_SOURCE_DIR}/FastDeploy.cmake.in ${PROJECT_SOURCE_DIR}/FastDeploy.cmake @ONLY) configure_file(${PROJECT_SOURCE_DIR}/FastDeploy.cmake.in ${PROJECT_SOURCE_DIR}/FastDeploy.cmake @ONLY)
configure_file(${PROJECT_SOURCE_DIR}/fastdeploy/c_lib_wrap.py.in ${PROJECT_SOURCE_DIR}/fastdeploy/c_lib_wrap.py)
list(REMOVE_ITEM ALL_DEPLOY_SRCS ${DEPLOY_PYBIND_SRCS}) list(REMOVE_ITEM ALL_DEPLOY_SRCS ${DEPLOY_PYBIND_SRCS})

View File

@@ -99,7 +99,7 @@ cv::Mat PyArrayToCvMat(pybind11::array& pyarray) {
} }
#endif #endif
PYBIND11_MODULE(fastdeploy_main, m) { PYBIND11_MODULE(@PY_LIBRARY_NAME@, m) {
m.doc() = m.doc() =
"Make programer easier to deploy deeplearning model, save time to save " "Make programer easier to deploy deeplearning model, save time to save "
"the world!"; "the world!";

View File

@@ -16,56 +16,9 @@ import logging
import os import os
import sys import sys
try: from .c_lib_wrap import Frontend, Backend, FDDataType, TensorInfo, Device
import paddle
except:
pass
def add_dll_search_dir(dir_path):
os.environ["path"] = dir_path + ";" + os.environ["path"]
sys.path.insert(0, dir_path)
if sys.version_info[:2] >= (3, 8):
os.add_dll_directory(dir_path)
if os.name == "nt":
current_path = os.path.abspath(__file__)
dirname = os.path.dirname(current_path)
third_libs_dir = os.path.join(dirname, "libs")
add_dll_search_dir(third_libs_dir)
for root, dirs, filenames in os.walk(third_libs_dir):
for d in dirs:
if d == "lib" or d == "bin":
add_dll_search_dir(os.path.join(dirname, root, d))
from .fastdeploy_main import Frontend, Backend, FDDataType, TensorInfo, Device
from .runtime import Runtime, RuntimeOption from .runtime import Runtime, RuntimeOption
from .model import FastDeployModel from .model import FastDeployModel
from . import fastdeploy_main as C from . import c_lib_wrap as C
from . import vision from . import vision
from .download import download, download_and_decompress from .download import download, download_and_decompress
def TensorInfoStr(tensor_info):
message = "TensorInfo(name : '{}', dtype : '{}', shape : '{}')".format(
tensor_info.name, tensor_info.dtype, tensor_info.shape)
return message
def RuntimeOptionStr(runtime_option):
attrs = dir(runtime_option)
message = "RuntimeOption(\n"
for attr in attrs:
if attr.startswith("__"):
continue
if hasattr(getattr(runtime_option, attr), "__call__"):
continue
message += " {} : {}\t\n".format(attr, getattr(runtime_option, attr))
message.strip("\n")
message += ")"
return message
C.TensorInfo.__repr__ = TensorInfoStr
C.RuntimeOption.__repr__ = RuntimeOptionStr

View File

@@ -0,0 +1,59 @@
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import absolute_import
import logging
import os
import sys
def add_dll_search_dir(dir_path):
os.environ["path"] = dir_path + ";" + os.environ["path"]
sys.path.insert(0, dir_path)
if sys.version_info[:2] >= (3, 8):
os.add_dll_directory(dir_path)
if os.name == "nt":
current_path = os.path.abspath(__file__)
dirname = os.path.dirname(current_path)
third_libs_dir = os.path.join(dirname, "libs")
add_dll_search_dir(third_libs_dir)
for root, dirs, filenames in os.walk(third_libs_dir):
for d in dirs:
if d == "lib" or d == "bin":
add_dll_search_dir(os.path.join(dirname, root, d))
from .@PY_LIBRARY_NAME@ import *
def TensorInfoStr(tensor_info):
message = "TensorInfo(name : '{}', dtype : '{}', shape : '{}')".format(
tensor_info.name, tensor_info.dtype, tensor_info.shape)
return message
def RuntimeOptionStr(runtime_option):
attrs = dir(runtime_option)
message = "RuntimeOption(\n"
for attr in attrs:
if attr.startswith("__"):
continue
if hasattr(getattr(runtime_option, attr), "__call__"):
continue
message += " {} : {}\t\n".format(attr, getattr(runtime_option, attr))
message.strip("\n")
message += ")"
return message
TensorInfo.__repr__ = TensorInfoStr
RuntimeOption.__repr__ = RuntimeOptionStr

View File

@@ -13,7 +13,7 @@
# limitations under the License. # limitations under the License.
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from . import fastdeploy_main as C from . import c_lib_wrap as C
class FastDeployModel: class FastDeployModel:

View File

@@ -13,7 +13,7 @@
# limitations under the License. # limitations under the License.
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from . import fastdeploy_main as C from . import c_lib_wrap as C
class Runtime: class Runtime:

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class RetinaFace(FastDeployModel): class RetinaFace(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class YOLOv5Face(FastDeployModel): class YOLOv5Face(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class SCRFD(FastDeployModel): class SCRFD(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class UltraFace(FastDeployModel): class UltraFace(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class YOLOX(FastDeployModel): class YOLOX(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class YOLOv6(FastDeployModel): class YOLOv6(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class Model(FastDeployModel): class Model(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class PPYOLOE(FastDeployModel): class PPYOLOE(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class YOLOv5Lite(FastDeployModel): class YOLOv5Lite(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class Model(FastDeployModel): class Model(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class NanoDetPlus(FastDeployModel): class NanoDetPlus(FastDeployModel):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class YOLOv5(FastDeployModel): class YOLOv5(FastDeployModel):

View File

@@ -14,7 +14,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
def vis_detection(im_data, det_result, line_size=1, font_size=0.5): def vis_detection(im_data, det_result, line_size=1, font_size=0.5):

View File

@@ -15,7 +15,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from ... import FastDeployModel, Frontend from ... import FastDeployModel, Frontend
from ... import fastdeploy_main as C from ... import c_lib_wrap as C
class YOLOv7(FastDeployModel): class YOLOv7(FastDeployModel):

View File

@@ -0,0 +1,230 @@
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import absolute_import
from six import text_type as _text_type
import logging
import argparse
# Since the source code is not fully open sourced,
# currently we will provide the prebuilt library
# and demo codes
import os
__version__ = "0.1.1"
def is_installed(package_name):
import pkg_resources
try:
pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
return False
return True
def get_version(package_name):
if not is_installed(package_name):
raise Exception("{} is not installed.".format(package_name))
major = pkg_resources.get_distribution(package).parsed_version.major
micro = pkg_resources.get_distribution(package).parsed_version.micro
minor = pkg_resources.get_distribution(package).parsed_version.minor
return major, micro, minor
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument(
'--model',
type=_text_type,
default=None,
help='Name of model, which can be listed by --list_models')
parser.add_argument(
'--platform',
type=_text_type,
default=None,
help='Define platform, supports Windows/Linux/Android/iOS.')
parser.add_argument(
'--soc',
type=_text_type,
default=None,
help='Define soc for the platform, supports x86/x86-NVIDIA_GPU/ARM/jetson.'
)
parser.add_argument(
'--save_dir',
type=_text_type,
default=".",
help='Path to download and extract deployment SDK.')
parser.add_argument(
'--list_models',
required=False,
action="store_true",
default=False,
help='List all the supported models.')
parser.add_argument(
'--download_sdk',
required=False,
action="store_true",
default=False,
help='List all the supported models.')
return parser.parse_args()
def read_sources():
from .download import download, download_and_decompress
user_dir = os.path.expanduser('~')
print("Updating the newest sdk information...")
source_cfgs = "https://bj.bcebos.com/paddlehub/fastdeploy/fastdeploy_newest_sources.cfg.1"
if os.path.exists(
os.path.join(user_dir, "fastdeploy_newest_sources.cfg.1")):
os.remove(os.path.join(user_dir, "fastdeploy_newest_sources.cfg.1"))
download(source_cfgs, user_dir)
categories = dict()
res = dict()
with open(os.path.join(user_dir, "fastdeploy_newest_sources.cfg.1")) as f:
for line in f:
if line.strip().startswith("#"):
continue
if line.strip() == "":
continue
category, model, plat, soc, url = line.strip().split('\t')
if category not in categories:
categories[category] = set()
categories[category].add(model)
if model not in res:
res[model] = dict()
if plat not in res[model]:
res[model][plat] = dict()
if soc not in res[model][plat]:
res[model][plat][soc] = dict()
res[model][plat][soc] = url
return categories, res
def main():
from .download import download, download_and_decompress
args = parse_arguments()
if not args.list_models and not args.download_sdk:
print(
"Please use flag --list_models to show all the supported models, or use flag --download_sdk to download the specify SDK to deploy you model."
)
return
categories, all_sources = read_sources()
all_models = list(all_sources.keys())
all_models.sort()
if args.list_models:
print("Currently, FastDeploy supports {} models, list as below,\n".
format(len(all_models)))
for k, v in categories.items():
print("\nModel Category: {}".format(k))
print("_" * 100)
models = list(categories[k])
models.sort()
i = 0
while i < len(models):
if i == len(models) - 1:
print(models[i].center(30))
i += 1
elif i == len(models) - 2:
print(models[i].center(30), models[i + 1].center(30))
i += 2
else:
print(models[i].center(30), models[i + 1].center(30),
models[i + 2].center(30))
i += 3
return
if not os.path.exists(args.save_dir):
print("The specified save_dir: {} is not exist.".format(args.save_dir))
return
if args.model is None or args.model == "":
print(
"Please define --model to choose which kind of model to deploy, use --list_models to show all the supported models."
)
return
if args.model not in all_sources:
print(
"{} is not supported, use --list_models to list all the models FastDeploy supported.".
format(args.model))
return
if args.platform is None or args.platform == "":
print(
"Please define --platform to choose which platform to deploy, supports windows/linux/android/ios."
)
return
if args.platform not in all_sources[args.model]:
print(
"The model:{} only supports platform of {}, {} is not supported now.".
format(args.model,
list(all_sources[args.model].keys()), args.platform))
return
if args.soc is None or args.soc == "":
print(
"Please define --soc to choose which hardware to deploy, for model:{} and platform:{}, the available socs are {}.".
format(args.model, args.platform,
list(all_sources[args.model][args.platform].keys())))
return
if args.soc not in all_sources[args.model][args.platform]:
print(
"The model:{} in platform:{} only supports soc of {}, {} is not supported now.".
format(args.model, args.platform,
list(all_sources[args.model][args.platform].keys()),
args.soc))
return
print("\nDownloading SDK:",
all_sources[args.model][args.platform][args.soc])
save_dir = args.save_dir
sdk_name = os.path.split(all_sources[args.model][args.platform][args.soc])[
-1].strip()
if all_sources[args.model][args.platform][args.soc].count(".zip") > 0:
sdk_name = os.path.split(all_sources[args.model][args.platform][
args.soc])[-1].strip().split(".zip")[0]
new_save_dir = os.path.join(args.save_dir, sdk_name)
if not os.path.exists(new_save_dir):
os.mkdir(new_save_dir)
save_dir = new_save_dir
download_and_decompress(
all_sources[args.model][args.platform][args.soc],
new_save_dir,
rename=sdk_name + ".zip")
os.remove(os.path.join(new_save_dir, sdk_name + ".zip"))
print("Done. All the files of SDK have been extracted in {}.".format(
new_save_dir))
if __name__ == "__main__":
main()
if is_installed('cpu_fastdeploy'):
from cpu_fastdeploy import *
elif is_installed('gpu_fastdeploy'):
from gpu_fastdeploy import *
else:
print(
"[INFO] Didn't install cpu/gpu sdk in your environment now, refer https://github.com/PaddlePaddle/FastDeploy/blob/release/0.2.0/docs/server_install.md for more details."
)

View File

@@ -0,0 +1,18 @@
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import fastdeploy
if __name__ == "__main__":
fastdeploy.main()

View File

@@ -0,0 +1,186 @@
# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import os.path as osp
import shutil
import requests
import time
import zipfile
import hashlib
import tqdm
import logging
DOWNLOAD_RETRY_LIMIT = 3
def md5check(fullname, md5sum=None):
if md5sum is None:
return True
logging.info("File {} md5 checking...".format(fullname))
md5 = hashlib.md5()
with open(fullname, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
md5.update(chunk)
calc_md5sum = md5.hexdigest()
if calc_md5sum != md5sum:
logging.info("File {} md5 check failed, {}(calc) != "
"{}(base)".format(fullname, calc_md5sum, md5sum))
return False
return True
def move_and_merge_tree(src, dst):
"""
Move src directory to dst, if dst is already exists,
merge src to dst
"""
if not osp.exists(dst):
shutil.move(src, dst)
else:
if not osp.isdir(src):
shutil.move(src, dst)
return
for fp in os.listdir(src):
src_fp = osp.join(src, fp)
dst_fp = osp.join(dst, fp)
if osp.isdir(src_fp):
if osp.isdir(dst_fp):
move_and_merge_tree(src_fp, dst_fp)
else:
shutil.move(src_fp, dst_fp)
elif osp.isfile(src_fp) and \
not osp.isfile(dst_fp):
shutil.move(src_fp, dst_fp)
def download(url, path, rename=None, md5sum=None, show_progress=False):
"""
Download from url, save to path.
url (str): download url
path (str): download to given path
"""
if not osp.exists(path):
os.makedirs(path)
fname = osp.split(url)[-1]
fullname = osp.join(path, fname)
if rename is not None:
fullname = osp.join(path, rename)
retry_cnt = 0
while not (osp.exists(fullname) and md5check(fullname, md5sum)):
if retry_cnt < DOWNLOAD_RETRY_LIMIT:
retry_cnt += 1
else:
logging.debug("{} download failed.".format(fname))
raise RuntimeError("Download from {} failed. "
"Retry limit reached".format(url))
logging.info("Downloading {} from {}".format(fname, url))
req = requests.get(url, stream=True)
if req.status_code != 200:
raise RuntimeError("Downloading from {} failed with code "
"{}!".format(url, req.status_code))
# For protecting download interupted, download to
# tmp_fullname firstly, move tmp_fullname to fullname
# after download finished
tmp_fullname = fullname + "_tmp"
total_size = req.headers.get('content-length')
with open(tmp_fullname, 'wb') as f:
if total_size and show_progress:
for chunk in tqdm.tqdm(
req.iter_content(chunk_size=1024),
total=(int(total_size) + 1023) // 1024,
unit='KB'):
f.write(chunk)
else:
for chunk in req.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
shutil.move(tmp_fullname, fullname)
logging.debug("{} download completed.".format(fname))
return fullname
def decompress(fname):
"""
Decompress for zip and tar file
"""
logging.info("Decompressing {}...".format(fname))
# For protecting decompressing interupted,
# decompress to fpath_tmp directory firstly, if decompress
# successed, move decompress files to fpath and delete
# fpath_tmp and remove download compress file.
fpath = osp.split(fname)[0]
fpath_tmp = osp.join(fpath, 'tmp')
if osp.isdir(fpath_tmp):
shutil.rmtree(fpath_tmp)
os.makedirs(fpath_tmp)
if fname.find('.tar') >= 0 or fname.find('.tgz') >= 0:
with tarfile.open(fname) as tf:
tf.extractall(path=fpath_tmp)
elif fname.find('.zip') >= 0:
with zipfile.ZipFile(fname) as zf:
zf.extractall(path=fpath_tmp)
else:
raise TypeError("Unsupport compress file type {}".format(fname))
for f in os.listdir(fpath_tmp):
src_dir = osp.join(fpath_tmp, f)
dst_dir = osp.join(fpath, f)
move_and_merge_tree(src_dir, dst_dir)
shutil.rmtree(fpath_tmp)
logging.debug("{} decompressed.".format(fname))
return dst_dir
def url2dir(url, path, rename=None):
full_name = download(url, path, rename, show_progress=True)
print("SDK is donwloaded, now extracting...")
if url.count(".tgz") > 0 or url.count(".tar") > 0 or url.count("zip") > 0:
return decompress(full_name)
def download_and_decompress(url, path='.', rename=None):
fname = osp.split(url)[-1]
fullname = osp.join(path, fname)
# if url.endswith(('tgz', 'tar.gz', 'tar', 'zip')):
# fullname = osp.join(path, fname.split('.')[0])
nranks = 0
if nranks <= 1:
dst_dir = url2dir(url, path, rename)
if dst_dir is not None:
fullname = dst_dir
else:
lock_path = fullname + '.lock'
if not os.path.exists(fullname):
with open(lock_path, 'w'):
os.utime(lock_path, None)
if local_rank == 0:
dst_dir = url2dir(url, path, rename)
if dst_dir is not None:
fullname = dst_dir
os.remove(lock_path)
else:
while os.path.exists(lock_path):
time.sleep(1)
return

View File

@@ -0,0 +1,2 @@
tqdm
six

36
sdk_mannager/setup.py Normal file
View File

@@ -0,0 +1,36 @@
import setuptools
import fastdeploy
import io
import os
with open("requirements.txt") as fin:
REQUIRED_PACKAGES = fin.read()
def read(*names, **kwargs):
with io.open(
os.path.join(os.path.dirname(__file__), *names),
encoding=kwargs.get("encoding", "utf8")) as fp:
return fp.read()
setuptools.setup(
name="fastdeploy-python",
version=fastdeploy.__version__,
author="FastDeploy",
author_email="fastdeploy@baidu.com",
description="FastDeploy is a toolkit to deploy deeplearning models.",
long_description=read("../README.md"),
long_description_content_type="text/markdown",
url="https://github.com/PaddlePaddle/FastDeploy",
packages=setuptools.find_packages(),
install_requires=REQUIRED_PACKAGES,
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
],
license='Apache 2.0',
entry_points={
'console_scripts': ['fastdeploy=fastdeploy.__init__:main', ]
})

View File

@@ -17,6 +17,17 @@ from __future__ import absolute_import
from __future__ import division from __future__ import division
from __future__ import print_function from __future__ import print_function
from __future__ import unicode_literals from __future__ import unicode_literals
import shutil
import os
PACKAGE_NAME = os.getenv("PACKAGE_NAME", "fastdeploy")
assert PACKAGE_NAME in [
"cpu_fastdeploy", "gpu_fastdeploy", "fastdeploy"
], "Only support PACKAGE_NAME set to ['cpu_fastdeploy', 'gpu_fastdeploy', 'fastdeploy'] now."
if PACKAGE_NAME != "fastdeploy":
if os.path.exists(PACKAGE_NAME):
shutil.rmtree(PACKAGE_NAME)
shutil.copytree("fastdeploy", PACKAGE_NAME)
from distutils.spawn import find_executable from distutils.spawn import find_executable
from distutils import sysconfig, log from distutils import sysconfig, log
@@ -28,7 +39,6 @@ import setuptools.command.build_ext
from collections import namedtuple from collections import namedtuple
from contextlib import contextmanager from contextlib import contextmanager
import glob import glob
import os
import shlex import shlex
import subprocess import subprocess
import sys import sys
@@ -39,7 +49,6 @@ import multiprocessing
with open("requirements.txt") as fin: with open("requirements.txt") as fin:
REQUIRED_PACKAGES = fin.read() REQUIRED_PACKAGES = fin.read()
PACKAGE_NAME = "fastdeploy"
setup_configs = dict() setup_configs = dict()
setup_configs["ENABLE_PADDLE_FRONTEND"] = os.getenv("ENABLE_PADDLE_FRONTEND", setup_configs["ENABLE_PADDLE_FRONTEND"] = os.getenv("ENABLE_PADDLE_FRONTEND",
"ON") "ON")
@@ -53,11 +62,14 @@ setup_configs["WITH_GPU"] = os.getenv("WITH_GPU", "OFF")
setup_configs["TRT_DIRECTORY"] = os.getenv("TRT_DIRECTORY", "UNDEFINED") setup_configs["TRT_DIRECTORY"] = os.getenv("TRT_DIRECTORY", "UNDEFINED")
setup_configs["CUDA_DIRECTORY"] = os.getenv("CUDA_DIRECTORY", setup_configs["CUDA_DIRECTORY"] = os.getenv("CUDA_DIRECTORY",
"/usr/local/cuda") "/usr/local/cuda")
setup_configs["LIBRARY_NAME"] = PACKAGE_NAME
setup_configs["PY_LIBRARY_NAME"] = PACKAGE_NAME + "_main"
if os.getenv("CMAKE_CXX_COMPILER", None) is not None: if os.getenv("CMAKE_CXX_COMPILER", None) is not None:
setup_configs["CMAKE_CXX_COMPILER"] = os.getenv("CMAKE_CXX_COMPILER") setup_configs["CMAKE_CXX_COMPILER"] = os.getenv("CMAKE_CXX_COMPILER")
TOP_DIR = os.path.realpath(os.path.dirname(__file__)) TOP_DIR = os.path.realpath(os.path.dirname(__file__))
SRC_DIR = os.path.join(TOP_DIR, "fastdeploy") SRC_DIR = os.path.join(TOP_DIR, PACKAGE_NAME)
CMAKE_BUILD_DIR = os.path.join(TOP_DIR, '.setuptools-cmake-build') CMAKE_BUILD_DIR = os.path.join(TOP_DIR, '.setuptools-cmake-build')
WINDOWS = (os.name == 'nt') WINDOWS = (os.name == 'nt')
@@ -237,8 +249,8 @@ class build_py(setuptools.command.build_py.build_py):
self.run_command('cmake_build') self.run_command('cmake_build')
generated_python_files = \ generated_python_files = \
glob.glob(os.path.join(CMAKE_BUILD_DIR, 'fastdeploy', '*.py')) + \ glob.glob(os.path.join(CMAKE_BUILD_DIR, PACKAGE_NAME, '*.py')) + \
glob.glob(os.path.join(CMAKE_BUILD_DIR, 'fastdeploy', '*.pyi')) glob.glob(os.path.join(CMAKE_BUILD_DIR, PACKAGE_NAME, '*.pyi'))
for src in generated_python_files: for src in generated_python_files:
dst = os.path.join(TOP_DIR, os.path.relpath(src, CMAKE_BUILD_DIR)) dst = os.path.join(TOP_DIR, os.path.relpath(src, CMAKE_BUILD_DIR))
@@ -273,7 +285,7 @@ class build_ext(setuptools.command.build_ext.build_ext):
lib_path = release_lib_dir lib_path = release_lib_dir
src = os.path.join(lib_path, filename) src = os.path.join(lib_path, filename)
dst = os.path.join( dst = os.path.join(
os.path.realpath(self.build_lib), "fastdeploy", filename) os.path.realpath(self.build_lib), PACKAGE_NAME, filename)
self.copy_file(src, dst) self.copy_file(src, dst)
@@ -305,7 +317,8 @@ cmdclass = {
ext_modules = [ ext_modules = [
setuptools.Extension( setuptools.Extension(
name=str(PACKAGE_NAME + '.fastdeploy_main'), sources=[]), name=str(PACKAGE_NAME + '.' + setup_configs["PY_LIBRARY_NAME"]),
sources=[]),
] ]
################################################################################ ################################################################################
@@ -313,6 +326,9 @@ ext_modules = [
################################################################################ ################################################################################
# no need to do fancy stuff so far # no need to do fancy stuff so far
if PACKAGE_NAME != "fastdeploy":
packages = setuptools.find_packages(exclude=['fastdeploy*'])
else:
packages = setuptools.find_packages() packages = setuptools.find_packages()
################################################################################ ################################################################################
@@ -335,8 +351,8 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel":
sys.exit(0) sys.exit(0)
import shutil import shutil
shutil.copy("ThirdPartyNotices.txt", "fastdeploy") shutil.copy("ThirdPartyNotices.txt", PACKAGE_NAME)
shutil.copy("LICENSE", "fastdeploy") shutil.copy("LICENSE", PACKAGE_NAME)
depend_libs = list() depend_libs = list()
# copy fastdeploy library # copy fastdeploy library
@@ -344,10 +360,11 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel":
for f in os.listdir(".setuptools-cmake-build"): for f in os.listdir(".setuptools-cmake-build"):
if not os.path.isfile(os.path.join(".setuptools-cmake-build", f)): if not os.path.isfile(os.path.join(".setuptools-cmake-build", f)):
continue continue
if f.count("fastdeploy") > 0: if f.count(PACKAGE_NAME) > 0:
shutil.copy( shutil.copy(
os.path.join(".setuptools-cmake-build", f), "fastdeploy/libs") os.path.join(".setuptools-cmake-build", f),
if f.count("fastdeploy_main.cpython-"): os.path.join(PACKAGE_NAME, "libs"))
if f.count(".cpython-") > 0:
pybind_so_file = os.path.join(".setuptools-cmake-build", f) pybind_so_file = os.path.join(".setuptools-cmake-build", f)
if not os.path.exists(".setuptools-cmake-build/third_libs/install"): if not os.path.exists(".setuptools-cmake-build/third_libs/install"):
@@ -355,11 +372,11 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel":
"Cannot find directory third_libs/install in .setuptools-cmake-build." "Cannot find directory third_libs/install in .setuptools-cmake-build."
) )
if os.path.exists("fastdeploy/libs/third_libs"): if os.path.exists(os.path.join(PACKAGE_NAME, "libs/third_libs")):
shutil.rmtree("fastdeploy/libs/third_libs") shutil.rmtree(os.path.join(PACKAGE_NAME, "libs/third_libs"))
shutil.copytree( shutil.copytree(
".setuptools-cmake-build/third_libs/install", ".setuptools-cmake-build/third_libs/install",
"fastdeploy/libs/third_libs", os.path.join(PACKAGE_NAME, "libs/third_libs"),
symlinks=True) symlinks=True)
third_party_path = os.path.join(".setuptools-cmake-build", "third_party") third_party_path = os.path.join(".setuptools-cmake-build", "third_party")
@@ -372,12 +389,12 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel":
release_dir = os.path.join(lib_dir_name, f1) release_dir = os.path.join(lib_dir_name, f1)
if f1 == "Release" and not os.path.isfile(release_dir): if f1 == "Release" and not os.path.isfile(release_dir):
if os.path.exists( if os.path.exists(
os.path.join("fastdeploy/libs/third_libs", f)): os.path.join(PACKAGE_NAME, "libs/third_libs", f)):
shutil.rmtree( shutil.rmtree(
os.path.join("fastdeploy/libs/third_libs", f)) os.path.join(PACKAGE_NAME, "libs/third_libs", f))
shutil.copytree(release_dir, shutil.copytree(release_dir,
os.path.join("fastdeploy/libs/third_libs", os.path.join(PACKAGE_NAME,
f, "lib")) "libs/third_libs", f, "lib"))
if platform.system().lower() == "windows": if platform.system().lower() == "windows":
release_dir = os.path.join(".setuptools-cmake-build", "Release") release_dir = os.path.join(".setuptools-cmake-build", "Release")
@@ -387,7 +404,7 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel":
continue continue
if filename.endswith(".pyd"): if filename.endswith(".pyd"):
continue continue
shutil.copy(filename, "fastdeploy/libs") shutil.copy(filename, os.path.join(PACKAGE_NAME, "libs"))
if platform.system().lower() == "linux": if platform.system().lower() == "linux":
rpaths = ["$ORIGIN:$ORIGIN/libs"] rpaths = ["$ORIGIN:$ORIGIN/libs"]
@@ -445,9 +462,10 @@ if sys.argv[1] == "install" or sys.argv[1] == "bdist_wheel":
command) == 0, "command execute failed! command: {}".format( command) == 0, "command execute failed! command: {}".format(
command) command)
all_files = get_all_files("fastdeploy/libs") all_files = get_all_files(os.path.join(PACKAGE_NAME, "libs"))
for f in all_files: for f in all_files:
package_data[PACKAGE_NAME].append(os.path.relpath(f, "fastdeploy")) package_data[PACKAGE_NAME].append(os.path.relpath(f, PACKAGE_NAME))
setuptools.setup( setuptools.setup(
name=PACKAGE_NAME, name=PACKAGE_NAME,
version=VersionInfo.version, version=VersionInfo.version,