diff --git a/doc/DOCKER_IMAGES.md b/doc/DOCKER_IMAGES.md index 47a300eabc85689f9bce7c46c353b35b85db9376..dcaa34b1844bca5347569235fa8309d57f7a6b9c 100644 --- a/doc/DOCKER_IMAGES.md +++ b/doc/DOCKER_IMAGES.md @@ -24,7 +24,6 @@ You can get images in two ways: ``` - ## Image description @@ -40,3 +39,13 @@ Runtime images cannot be used for compilation. | GPU (cuda10.0-cudnn7) development | CentOS7 | latest-cuda10.0-cudnn7-devel | [Dockerfile.cuda10.0-cudnn7.devel](../tools/Dockerfile.cuda10.0-cudnn7.devel) | | CPU development (Used to compile packages on Ubuntu) | CentOS6 | | [Dockerfile.centos6.devel](../tools/Dockerfile.centos6.devel) | | GPU (cuda9.0-cudnn7) development (Used to compile packages on Ubuntu) | CentOS6 | | [Dockerfile.centos6.cuda9.0-cudnn7.devel](../tools/Dockerfile.centos6.cuda9.0-cudnn7.devel) | + + + +## Requirements for running CUDA containers + +Running a CUDA container requires a machine with at least one CUDA-capable GPU and a driver compatible with the CUDA toolkit version you are using. + +The machine running the CUDA container **only requires the NVIDIA driver**, the CUDA toolkit doesn't have to be installed. + +For the relationship between CUDA toolkit version, Driver version and GPU architecture, please refer to [nvidia-docker wiki](https://github.com/NVIDIA/nvidia-docker/wiki/CUDA). diff --git a/doc/DOCKER_IMAGES_CN.md b/doc/DOCKER_IMAGES_CN.md index 26ef5e8bd8c23a281604e5ff0319416c3e408472..6865eb773665f5bc51aa9976b2d330e607e7c83d 100644 --- a/doc/DOCKER_IMAGES_CN.md +++ b/doc/DOCKER_IMAGES_CN.md @@ -22,7 +22,6 @@ ```shell docker build -t : . ``` - @@ -40,3 +39,13 @@ | GPU (cuda10.0-cudnn7) 开发镜像 | CentOS7 | latest-cuda10.0-cudnn7-devel | [Dockerfile.cuda10.0-cudnn7.devel](../tools/Dockerfile.cuda10.0-cudnn7.devel) | | CPU 开发镜像 (用于编译 Ubuntu 包) | CentOS6 | <无> | [Dockerfile.centos6.devel](../tools/Dockerfile.centos6.devel) | | GPU (cuda9.0-cudnn7) 开发镜像 (用于编译 Ubuntu 包) | CentOS6 | <无> | [Dockerfile.centos6.cuda9.0-cudnn7.devel](../tools/Dockerfile.centos6.cuda9.0-cudnn7.devel) | + + + +## 运行CUDA容器的要求 + +运行CUDA容器需要至少具有一个支持CUDA的GPU以及与您所使用的CUDA工具包版本兼容的驱动程序。 + +运行CUDA容器的机器**只需要相应的NVIDIA驱动程序**,而CUDA工具包不是必要的。 + +相关CUDA工具包版本、驱动版本和GPU架构的关系请参阅 [nvidia-docker wiki](https://github.com/NVIDIA/nvidia-docker/wiki/CUDA)。 diff --git a/python/examples/faster_rcnn_model/000000570688.jpg b/python/examples/cascade_rcnn/000000570688.jpg similarity index 100% rename from python/examples/faster_rcnn_model/000000570688.jpg rename to python/examples/cascade_rcnn/000000570688.jpg diff --git a/python/examples/faster_rcnn_model/label_list.txt b/python/examples/cascade_rcnn/label_list.txt similarity index 100% rename from python/examples/faster_rcnn_model/label_list.txt rename to python/examples/cascade_rcnn/label_list.txt diff --git a/python/examples/cascade_rcnn/test_client.py b/python/examples/cascade_rcnn/test_client.py new file mode 100644 index 0000000000000000000000000000000000000000..75e25985799ca8d3c65cf46e0d270b063af57ba6 --- /dev/null +++ b/python/examples/cascade_rcnn/test_client.py @@ -0,0 +1,40 @@ +# 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 paddle_serving_client import Client +from paddle_serving_app.reader import * +import numpy as np + +preprocess = Sequential([ + File2Image(), BGR2RGB(), Div(255.0), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], False), + Resize(800, 1333), Transpose((2, 0, 1)), PadStride(32) +]) +postprocess = RCNNPostprocess("label_list.txt", "output") +client = Client() +client.load_client_config("serving_client/serving_client_conf.prototxt") +client.connect(['127.0.0.1:9292']) +im = preprocess('000000570688.jpg') +fetch_map = client.predict( + feed={ + "image": im, + "im_info": np.array(list(im.shape[1:]) + [1.0]), + "im_shape": np.array(list(im.shape[1:]) + [1.0]) + }, + fetch=["multiclass_nms_0.tmp_0"], + batch=True) +fetch_map["image"] = '000000570688.jpg' +print(fetch_map) +postprocess(fetch_map) +print(fetch_map) diff --git a/python/examples/faster_rcnn/000000570688.jpg b/python/examples/faster_rcnn/000000570688.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb304bd56c4010c08611a30dcca58ea9140cea54 Binary files /dev/null and b/python/examples/faster_rcnn/000000570688.jpg differ diff --git a/python/examples/faster_rcnn_model/000000570688_bbox.jpg b/python/examples/faster_rcnn/000000570688_bbox.jpg similarity index 100% rename from python/examples/faster_rcnn_model/000000570688_bbox.jpg rename to python/examples/faster_rcnn/000000570688_bbox.jpg diff --git a/python/examples/faster_rcnn_model/README.md b/python/examples/faster_rcnn/README.md similarity index 100% rename from python/examples/faster_rcnn_model/README.md rename to python/examples/faster_rcnn/README.md diff --git a/python/examples/faster_rcnn_model/README_CN.md b/python/examples/faster_rcnn/README_CN.md similarity index 100% rename from python/examples/faster_rcnn_model/README_CN.md rename to python/examples/faster_rcnn/README_CN.md diff --git a/python/examples/faster_rcnn_model/benchmark.py b/python/examples/faster_rcnn/benchmark.py similarity index 90% rename from python/examples/faster_rcnn_model/benchmark.py rename to python/examples/faster_rcnn/benchmark.py index 1930312341c0dac55e43b36c946c6e174a472b65..543ef3352ea629f5209b7e5252276bda46a4b2ae 100755 --- a/python/examples/faster_rcnn_model/benchmark.py +++ b/python/examples/faster_rcnn/benchmark.py @@ -29,13 +29,11 @@ from paddle_serving_app.reader import ChineseBertReader from paddle_serving_app.reader import * import numpy as np - - args = benchmark_args() def single_func(idx, resource): - img="./000000570688.jpg" + img = "./000000570688.jpg" profile_flags = False latency_flags = False if os.getenv("FLAGS_profile_client"): @@ -67,10 +65,12 @@ def single_func(idx, resource): for bi in range(args.batch_size): print("1111batch") print(bi) - feed_batch.append({"image": im, + feed_batch.append({ + "image": im, "im_info": np.array(list(im.shape[1:]) + [1.0]), - "im_shape": np.array(list(im.shape[1:]) + [1.0])}) - # im = preprocess(img) + "im_shape": np.array(list(im.shape[1:]) + [1.0]) + }) + # im = preprocess(img) b_end = time.time() if profile_flags: @@ -81,8 +81,7 @@ def single_func(idx, resource): int(round(b_end * 1000000)))) #result = client.predict(feed=feed_batch, fetch=fetch) fetch_map = client.predict( - feed=feed_batch, - fetch=["multiclass_nms"]) + feed=feed_batch, fetch=["multiclass_nms"]) fetch_map["image"] = img postprocess(fetch_map) @@ -102,13 +101,12 @@ def single_func(idx, resource): if __name__ == '__main__': multi_thread_runner = MultiThreadRunner() - endpoint_list = [ - "127.0.0.1:7777" - ] + endpoint_list = ["127.0.0.1:7777"] turns = 10 start = time.time() result = multi_thread_runner.run( - single_func, args.thread, {"endpoint": endpoint_list,"turns": turns}) + single_func, args.thread, {"endpoint": endpoint_list, + "turns": turns}) end = time.time() total_cost = end - start diff --git a/python/examples/faster_rcnn_model/benchmark.sh b/python/examples/faster_rcnn/benchmark.sh similarity index 100% rename from python/examples/faster_rcnn_model/benchmark.sh rename to python/examples/faster_rcnn/benchmark.sh diff --git a/python/examples/faster_rcnn/label_list.txt b/python/examples/faster_rcnn/label_list.txt new file mode 100644 index 0000000000000000000000000000000000000000..d7d43a94adf73208f997f0efd6581bef11ca734e --- /dev/null +++ b/python/examples/faster_rcnn/label_list.txt @@ -0,0 +1,81 @@ +background +person +bicycle +car +motorcycle +airplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +couch +potted plant +bed +dining table +toilet +tv +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/python/examples/faster_rcnn_model/test_client.py b/python/examples/faster_rcnn/test_client.py similarity index 100% rename from python/examples/faster_rcnn_model/test_client.py rename to python/examples/faster_rcnn/test_client.py diff --git a/python/examples/ocr/det_debugger_server.py b/python/examples/ocr/det_debugger_server.py index 913a0bb4c9a099cbef886beb3889337d024d10d6..ebaf0a3066c7e948b4ca37dda06c60423ad28da9 100644 --- a/python/examples/ocr/det_debugger_server.py +++ b/python/examples/ocr/det_debugger_server.py @@ -53,7 +53,9 @@ class OCRService(WebService): self.ori_h, self.ori_w, _ = im.shape det_img = self.det_preprocess(im) _, self.new_h, self.new_w = det_img.shape - return {"image": det_img[np.newaxis, :].copy()}, ["concat_1.tmp_0"] + return { + "image": det_img[np.newaxis, :].copy() + }, ["concat_1.tmp_0"], True def postprocess(self, feed={}, fetch=[], fetch_map=None): det_out = fetch_map["concat_1.tmp_0"] diff --git a/python/examples/ocr/det_web_server.py b/python/examples/ocr/det_web_server.py index 38c6541c70e9871d13dd81751d4edb2bc771a904..e90efc7813e96e6b768a09b4ec9f5108c5878527 100644 --- a/python/examples/ocr/det_web_server.py +++ b/python/examples/ocr/det_web_server.py @@ -54,7 +54,7 @@ class OCRService(WebService): det_img = self.det_preprocess(im) _, self.new_h, self.new_w = det_img.shape print(det_img) - return {"image": det_img}, ["concat_1.tmp_0"] + return {"image": det_img}, ["concat_1.tmp_0"], False def postprocess(self, feed={}, fetch=[], fetch_map=None): det_out = fetch_map["concat_1.tmp_0"] diff --git a/python/examples/ocr/ocr_debugger_server.py b/python/examples/ocr/ocr_debugger_server.py index 3cbc3a66ef620f5c8851b50a352a0c1587467b3b..163ff9788806db819329df769ac44982220f0423 100644 --- a/python/examples/ocr/ocr_debugger_server.py +++ b/python/examples/ocr/ocr_debugger_server.py @@ -42,10 +42,9 @@ class OCRService(WebService): self.det_client = LocalPredictor() if sys.argv[1] == 'gpu': self.det_client.load_model_config( - det_model_config, gpu=True, profile=False) + det_model_config, use_gpu=True, gpu_id=1) elif sys.argv[1] == 'cpu': - self.det_client.load_model_config( - det_model_config, gpu=False, profile=False) + self.det_client.load_model_config(det_model_config) self.ocr_reader = OCRReader() def preprocess(self, feed=[], fetch=[]): @@ -58,7 +57,7 @@ class OCRService(WebService): det_img = det_img[np.newaxis, :] det_img = det_img.copy() det_out = self.det_client.predict( - feed={"image": det_img}, fetch=["concat_1.tmp_0"]) + feed={"image": det_img}, fetch=["concat_1.tmp_0"], batch=True) filter_func = FilterBoxes(10, 10) post_func = DBPostProcess({ "thresh": 0.3, @@ -91,7 +90,7 @@ class OCRService(WebService): imgs[id] = norm_img feed = {"image": imgs.copy()} fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] - return feed, fetch + return feed, fetch, True def postprocess(self, feed={}, fetch=[], fetch_map=None): rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) @@ -107,7 +106,8 @@ ocr_service.load_model_config("ocr_rec_model") ocr_service.prepare_server(workdir="workdir", port=9292) ocr_service.init_det_debugger(det_model_config="ocr_det_model") if sys.argv[1] == 'gpu': - ocr_service.run_debugger_service(gpu=True) + ocr_service.set_gpus("2") + ocr_service.run_debugger_service() elif sys.argv[1] == 'cpu': ocr_service.run_debugger_service() ocr_service.run_web_service() diff --git a/python/examples/ocr/ocr_web_client.py b/python/examples/ocr/ocr_web_client.py index 3d25e288dd93014cf9c3f84edc01d42c013ba2d9..ce96a8bbcd585f37368d70070d649e25a0129029 100644 --- a/python/examples/ocr/ocr_web_client.py +++ b/python/examples/ocr/ocr_web_client.py @@ -36,4 +36,5 @@ for img_file in os.listdir(test_img_dir): image = cv2_to_base64(image_data1) data = {"feed": [{"image": image}], "fetch": ["res"]} r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r) print(r.json()) diff --git a/python/examples/ocr/ocr_web_server.py b/python/examples/ocr/ocr_web_server.py index de83ca94a4c1f55d886175d9a87b6a34db34c2a5..97e619f2b894144193ee8ed51050f0239616aa39 100644 --- a/python/examples/ocr/ocr_web_server.py +++ b/python/examples/ocr/ocr_web_server.py @@ -50,7 +50,7 @@ class OCRService(WebService): ori_h, ori_w, _ = im.shape det_img = self.det_preprocess(im) det_out = self.det_client.predict( - feed={"image": det_img}, fetch=["concat_1.tmp_0"]) + feed={"image": det_img}, fetch=["concat_1.tmp_0"], batch=False) _, new_h, new_w = det_img.shape filter_func = FilterBoxes(10, 10) post_func = DBPostProcess({ @@ -77,10 +77,10 @@ class OCRService(WebService): max_wh_ratio = max(max_wh_ratio, wh_ratio) for img in img_list: norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) - feed = {"image": norm_img} - feed_list.append(feed) + feed_list.append(norm_img[np.newaxis, :]) + feed_batch = {"image": np.concatenate(feed_list, axis=0)} fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] - return feed_list, fetch + return feed_batch, fetch, True def postprocess(self, feed={}, fetch=[], fetch_map=None): rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) diff --git a/python/examples/ocr/rec_debugger_server.py b/python/examples/ocr/rec_debugger_server.py index fbe67aafee5c8dcae269cd4ad6f6100ed514f0b7..9dc7b19b7bf17096cf3a0c18d0a337f990ecd1a4 100644 --- a/python/examples/ocr/rec_debugger_server.py +++ b/python/examples/ocr/rec_debugger_server.py @@ -52,7 +52,7 @@ class OCRService(WebService): imgs[i] = norm_img feed = {"image": imgs.copy()} fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] - return feed, fetch + return feed, fetch, True def postprocess(self, feed={}, fetch=[], fetch_map=None): rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) diff --git a/python/examples/ocr/rec_web_server.py b/python/examples/ocr/rec_web_server.py index aae97fd9e3fbd1d29b6cf2ef160b92a522db2e22..300c26be8f6b33c0cdd4a57e75648e444a25d763 100644 --- a/python/examples/ocr/rec_web_server.py +++ b/python/examples/ocr/rec_web_server.py @@ -51,10 +51,17 @@ class OCRService(WebService): max_wh_ratio = max(max_wh_ratio, wh_ratio) for img in img_list: norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) - feed = {"image": norm_img} - feed_list.append(feed) + #feed = {"image": norm_img} + feed_list.append(norm_img) + if len(feed_list) == 1: + feed_batch = { + "image": np.concatenate( + feed_list, axis=0)[np.newaxis, :] + } + else: + feed_batch = {"image": np.concatenate(feed_list, axis=0)} fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] - return feed_list, fetch + return feed_batch, fetch, True def postprocess(self, feed={}, fetch=[], fetch_map=None): rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) diff --git a/python/paddle_serving_server/web_service.py b/python/paddle_serving_server/web_service.py index 757492864843da5029c36cf7fe43819ff09e54c7..9bd559704b47205ab46ba5984986d843ba7e52ca 100644 --- a/python/paddle_serving_server/web_service.py +++ b/python/paddle_serving_server/web_service.py @@ -199,7 +199,7 @@ class WebService(object): from paddle_serving_app.local_predict import LocalPredictor self.client = LocalPredictor() self.client.load_model_config( - "{}".format(self.model_config), gpu=False, profile=False) + "{}".format(self.model_config), use_gpu=False) def run_web_service(self): print("This API will be deprecated later. Please do not use it") diff --git a/python/paddle_serving_server_gpu/web_service.py b/python/paddle_serving_server_gpu/web_service.py index 274e5441b836d13ec65fea0c99a76b957d557029..e77c3d29a375f71e48b968704945fe97866a6bdc 100644 --- a/python/paddle_serving_server_gpu/web_service.py +++ b/python/paddle_serving_server_gpu/web_service.py @@ -260,7 +260,7 @@ class WebService(object): from paddle_serving_app.local_predict import LocalPredictor self.client = LocalPredictor() self.client.load_model_config( - "{}".format(self.model_config), gpu=gpu, profile=False) + "{}".format(self.model_config), use_gpu=True, gpu_id=self.gpus[0]) def run_web_service(self): print("This API will be deprecated later. Please do not use it") diff --git a/python/setup.py.client.in b/python/setup.py.client.in index 5bbbb759b065abdb98cbb3e509c7eec6b4f28e8b..319ae9b24899e99e72f3de8612c44b1ae0d269f2 100644 --- a/python/setup.py.client.in +++ b/python/setup.py.client.in @@ -43,8 +43,8 @@ if '${PACK}' == 'ON': copy_lib() REQUIRED_PACKAGES = [ - 'six >= 1.10.0', 'protobuf >= 3.11.0', 'numpy >= 1.12', 'grpcio >= 1.28.1', - 'grpcio-tools >= 1.28.1', 'requests' + 'six >= 1.10.0', 'protobuf >= 3.11.0', 'numpy >= 1.12', 'grpcio <= 1.33.2', + 'grpcio-tools <= 1.33.2' ] diff --git a/python/setup.py.server.in b/python/setup.py.server.in index b602f129253e8f9d55ac17175e387f2232182766..ccce8a58480dfe8247a6595deb2b2f823497df0f 100644 --- a/python/setup.py.server.in +++ b/python/setup.py.server.in @@ -28,7 +28,7 @@ max_version, mid_version, min_version = util.python_version() util.gen_pipeline_code("paddle_serving_server") REQUIRED_PACKAGES = [ - 'six >= 1.10.0', 'protobuf >= 3.11.0', 'grpcio >= 1.28.1', 'grpcio-tools >= 1.28.1', + 'six >= 1.10.0', 'protobuf >= 3.11.0', 'grpcio <= 1.33.2', 'grpcio-tools <= 1.33.2', 'paddle_serving_client', 'flask >= 1.1.1', 'paddle_serving_app', 'func_timeout', 'pyyaml' ] diff --git a/python/setup.py.server_gpu.in b/python/setup.py.server_gpu.in index 1303e0404eb9b557dbfb6232ef391aa89c97747a..492df6c6f7d194bc4e94318cf0235f2c2cc7e882 100644 --- a/python/setup.py.server_gpu.in +++ b/python/setup.py.server_gpu.in @@ -30,7 +30,7 @@ max_version, mid_version, min_version = util.python_version() util.gen_pipeline_code("paddle_serving_server_gpu") REQUIRED_PACKAGES = [ - 'six >= 1.10.0', 'protobuf >= 3.11.0', 'grpcio >= 1.28.1', 'grpcio-tools >= 1.28.1', + 'six >= 1.10.0', 'protobuf >= 3.11.0', 'grpcio <= 1.33.2', 'grpcio-tools <= 1.33.2', 'paddle_serving_client', 'flask >= 1.1.1', 'paddle_serving_app', 'func_timeout', 'pyyaml' ]