diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..83676bd1f52810098d898763bc917c247c38eae7 --- /dev/null +++ b/python/CMakeLists.txt @@ -0,0 +1,32 @@ +file(GLOB_RECURSE SERVING_CLIENT_PY_FILES serving_client/*.py) +set(PY_FILES ${SERVING_CLIENT_PY_FILES}) +SET(PACKAGE_NAME "serving_client") +set(SETUP_LOG_FILE "setup.py.log") + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in + ${CMAKE_CURRENT_BINARY_DIR}/setup.py) + +set(SERVING_CLIENT_CORE ${PADDLE_SERVING_BINARY_DIR}/general-client/serving_client.so) + +message("python env: " ${py_env}) + +add_custom_command( + OUTPUT ${PADDLE_SERVING_BINARY_DIR}/.timestamp + COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/paddle_serving/ ${PADDLE_SERVING_BINARY_DIR}/python/ + COMMAND ${CMAKE_COMMAND} -E copy ${PADDLE_SERVING_BINARY_DIR}/general-client/serving_client.so ${PADDLE_SERVING_BINARY_DIR}/python/paddle_serving/serving_client/ + COMMAND env ${py_env} ${PYTHON_EXECUTABLE} setup.py bdist_wheel + DEPENDS ${SERVING_CLIENT_CORE} sdk_configure_py_proto ${PY_FILES}) + +add_custom_target(paddle_python ALL DEPENDS ${PADDLE_SERVING_BINARY_DIR}/.timestamp) + +set(SERVING_CLIENT_PYTHON_PACKAGE_DIR ${CMAKE_CURRENT_BINARY_DIR}/dist/) + +install(DIRECTORY ${SERVING_CLIENT_PYTHON_PACKAGE_DIR} + DESTINATION opt/serving_client/share/wheels +) + +find_program(PATCHELF_EXECUTABLE patchelf) +if(NOT PATCHELF_EXECUTABLE) + message(FATAL_ERROR "patchelf not found, please install it.\n" + "For Ubuntu, the command is: apt-get install -y patchelf.") +endif() diff --git a/python/paddle_serving/__init__.py b/python/paddle_serving/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1b1ac92198b39c3d00c50af2e68baf68ca9ff75e --- /dev/null +++ b/python/paddle_serving/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) 2020 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 .serving_client import Client diff --git a/python/paddle_serving/serving_client/__init__.py b/python/paddle_serving/serving_client/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..6559c58ed3a65d12f0958e8fcb44ef40293eb6a6 --- /dev/null +++ b/python/paddle_serving/serving_client/__init__.py @@ -0,0 +1,75 @@ +# Copyright (c) 2020 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 .serving_client import PredictorClient + +class Client(object): + def __init__(self): + self.feed_names_ = [] + self.fetch_names_ = [] + self.client_handle_ = None + self.feed_shapes_ = [] + self.feed_types_ = [] + self.feed_names_to_idx_ = {} + + def load_client_config(self, path): + # load configuraion here + # get feed vars, fetch vars + # get feed shapes, feed types + # map feed names to index + return + + def connect(self, endpoint): + # check whether current endpoint is available + # init from client config + # create predictor here + return + + def get_feed_names(self): + return self.feed_names_ + + def get_fetch_names(self): + return self.fetch_names_ + + def predict(self, feed={}, fetch={}): + int_slot = [] + float_slot = [] + int_feed_names = [] + float_feed_names = [] + fetch_names = [] + for key in feed: + if key not in self.feed_names_: + continue + if self.feed_types_[key] == int_type: + int_feed_names.append(key) + int_slot.append(feed_map[key]) + elif self.feed_types_[key] == float_type: + float_feed_names.append(key) + float_slot.append(feed_map[key]) + + for key in fetch: + if key in self.fetch_names_: + fetch_names.append(key) + + result = self.client_handle_.predict( + float_slot, float_feed_names, + int_slot, int_feed_names, + fetch_names) + + result_map = {} + for i, name in enumerate(fetch_names): + result_map[name] = result[i] + + return result_map + diff --git a/python/paddle_serving/version.py b/python/paddle_serving/version.py new file mode 100644 index 0000000000000000000000000000000000000000..e199e2080bb1ec137a6c0e22b81ee4782defa34f --- /dev/null +++ b/python/paddle_serving/version.py @@ -0,0 +1,16 @@ +# Copyright (c) 2020 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. +""" Paddle Serving Client version string """ +serving_client_version = "0.1.0" +module_proto_version = "0.1.0" diff --git a/python/requirements.txt b/python/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..5359d565e8f612822e1a0c61ee27018daa4b0e1b --- /dev/null +++ b/python/requirements.txt @@ -0,0 +1,3 @@ +protobuf>=3.1.0 +six +paddlepaddle-gpu diff --git a/python/setup.py.in b/python/setup.py.in new file mode 100644 index 0000000000000000000000000000000000000000..a87e8b7f3ffb1af2054eeb79925ad379d1011d83 --- /dev/null +++ b/python/setup.py.in @@ -0,0 +1,74 @@ +# Copyright (c) 2020 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. +"""Setup for pip package.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import platform + +from setuptools import setup, Distribution, Extension +from setuptools import find_packages +from setuptools import setup +from paddle_serving.version import serving_client_version + +def python_version(): + return [int(v) for v in platform.python_version().split(".")] + +max_version, mid_version, min_version = python_version() + +REQUIRED_PACKAGES = [ + 'six >= 1.10.0', 'protobuf >= 3.1.0','paddlepaddle' +] + +packages=['paddle_serving', + 'paddle_serving.serving_client'] +package_data={'paddle_serving.serving_client': ['serving_client.so']} +package_dir={'paddle_serving.serving_client': + '${PADDLE_SERVING_BINARY_DIR}/python/paddle_serving/serving_client'} + +setup( + name='paddle-serving-client', + version=serving_client_version.replace('-', ''), + description= + ('Paddle Serving Package for saved model with PaddlePaddle'), + url='https://github.com/PaddlePaddle/Serving', + author='PaddlePaddle Author', + author_email='guru4elephant@gmail.com', + install_requires=REQUIRED_PACKAGES, + packages=packages, + package_data=package_data, + package_dir=package_dir, + # PyPI package information. + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'Intended Audience :: Education', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Topic :: Scientific/Engineering', + 'Topic :: Scientific/Engineering :: Mathematics', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Software Development', + 'Topic :: Software Development :: Libraries', + 'Topic :: Software Development :: Libraries :: Python Modules', + ], + license='Apache 2.0', + keywords=('paddle-serving serving-client deployment industrial easy-to-use')) +