From cfc759293acf9c41f5c4a7f8ae42b3134c6380c2 Mon Sep 17 00:00:00 2001 From: chengang06 Date: Mon, 30 Nov 2020 13:40:23 +0800 Subject: [PATCH] add unet benckmark scripts --- doc/FAQ.md | 50 ++++++ .../unet_benchmark/README.md | 8 + .../unet_benchmark/img_data/N0060.jpg | Bin 0 -> 49567 bytes .../unet_benchmark/launch_benckmark.sh | 3 + .../unet_benchmark/unet_benchmark.py | 159 ++++++++++++++++++ 5 files changed, 220 insertions(+) create mode 100644 python/examples/unet_for_image_seg/unet_benchmark/README.md create mode 100644 python/examples/unet_for_image_seg/unet_benchmark/img_data/N0060.jpg create mode 100644 python/examples/unet_for_image_seg/unet_benchmark/launch_benckmark.sh create mode 100644 python/examples/unet_for_image_seg/unet_benchmark/unet_benchmark.py diff --git a/doc/FAQ.md b/doc/FAQ.md index 5571269a..00630bd6 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -4,6 +4,35 @@ ## 基础知识 +#### Q: Paddle Serving 、Paddle Inference、PaddleHub Serving三者的区别及联系? + +**A:** paddle serving是远程服务,即发起预测的设备(手机、浏览器、客户端等)与实际预测的硬件不在一起。 paddle inference是一个library,适合嵌入到一个大系统中保证预测效率,paddle serving调用了paddle inference做远程服务。paddlehub serving可以认为是一个示例,都会使用paddle serving作为统一预测服务入口。如果在web端交互,一般是调用远程服务的形式,可以使用paddle serving的web service搭建。 + +#### Q: paddle-serving是否支持Int32支持 + +**A:** 在protobuf定feed_type和fetch_type编号与数据类型对应如下 + +​ 0-int64 + +​ 1-float32 + +​ 2-int32 + +#### Q: paddle-serving是否支持windows和Linux环境下的多线程调用 + +**A:** 客户端可以发起多线程访问调用服务端 + +#### Q: paddle-serving如何修改消息大小限制 + +**A:** 在server端和client但通过FLAGS_max_body_size来扩大数据量限制,单位为字节,默认为64MB + +#### Q: paddle-serving客户端目前支持哪些语言 + +**A:** java c++ python + +#### Q: paddle-serving目前支持哪些协议 + +**A:** http rpc ## 编译问题 @@ -46,7 +75,15 @@ InvalidArgumentError: Device id must be less than GPU count, but received id is: **A:** 目前(0.4.0)仅支持CentOS,具体列表查阅[这里](https://github.com/PaddlePaddle/Serving/blob/develop/doc/DOCKER_IMAGES.md) +#### Q: python编译的GCC版本与serving的版本不匹配 + +**A:**:1)使用[GPU docker](https://github.com/PaddlePaddle/Serving/blob/develop/doc/RUN_IN_DOCKER.md#gpunvidia-docker)解决环境问题 + +​ 2)修改anaconda的虚拟环境下安装的python的gcc版本[参考](https://www.jianshu.com/p/c498b3d86f77) +#### Q: paddle-serving是否支持本地离线安装 + +**A:** 支持离线部署,需要把一些相关的[依赖包](https://github.com/PaddlePaddle/Serving/blob/develop/doc/COMPILE.md)提前准备安装好 ## 预测问题 @@ -105,6 +142,19 @@ client端的日志直接打印到标准输出。 通过在部署服务之前 'export GLOG_v=3'可以输出更为详细的日志信息。 +#### Q: paddle-serving启动成功后,相关的日志在哪里设置 + +**A:** 1)警告是glog组件打印的,告知glog初始化之前日志打印在STDERR + +​ 2)一般采用GLOG_v方式启动服务同时设置日志级别。 + +例如: +``` +GLOG_v=2 python -m paddle_serving_server.serve --model xxx_conf/ --port 9999 +``` + + + #### Q: (GLOG_v=2下)Server端日志一切正常,但Client端始终得不到正确的预测结果 **A:** 可能是配置文件有问题,检查下配置文件(is_load_tensor,fetch_type等有没有问题) diff --git a/python/examples/unet_for_image_seg/unet_benchmark/README.md b/python/examples/unet_for_image_seg/unet_benchmark/README.md new file mode 100644 index 00000000..edb2af58 --- /dev/null +++ b/python/examples/unet_for_image_seg/unet_benchmark/README.md @@ -0,0 +1,8 @@ +#UNET_BENCHMARK 使用说明 +## 功能 +* benchmark测试 +## 注意事项 +* 示例图片(可以有多张)请放置于与img_data路径中,支持jpg,jpeg +* 图片张数应该大于等于并发数量 +## TODO +* http benchmark diff --git a/python/examples/unet_for_image_seg/unet_benchmark/img_data/N0060.jpg b/python/examples/unet_for_image_seg/unet_benchmark/img_data/N0060.jpg new file mode 100644 index 0000000000000000000000000000000000000000..feac2837eaa5ae5db414d9769a0c5a830dde268d GIT binary patch literal 49567 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

;_S=X_8e)|c}IO^)Xhw<`d- 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 1: + l_start = time.time() + feed_batch = [] + b_start = time.time() + for bi in range(args.batch_size): + feed_batch.append({"image": img_list[bi]}) + b_end = time.time() + if profile_flags: + sys.stderr.write( + "PROFILE\tpid:{}\tunt_pre_0:{} unet_pre_1:{}\n".format( + os.getpid(), + int(round(b_start * 1000000)), + int(round(b_end * 1000000)))) + result = client_handler.predict( + feed={"image": img_list[bi]}, fetch=["output"]) + #result["filename"] = "./img_data/N0060.jpg" % (os.getpid(), idx, time.time()) + #postprocess(result) # if you want to measure post process time, you have to uncomment this line + l_end = time.time() + if latency_flags: + latency_list.append(l_end * 1000 - l_start * 1000) + else: + print("unsupport batch size {}".format(args.batch_size)) + end = time.time() + if latency_flags: + return [[end - start], latency_list] + else: + return [[end - start]] + + +if __name__ == '__main__': + """ + usage: + """ + img_file_list = get_img_names("./img_data") + img_content_list = preprocess_img(img_file_list) + multi_thread_runner = MultiThreadRunner() + endpoint_list = ["127.0.0.1:9494"] + turns = 1 + start = time.time() + result = multi_thread_runner.run(benckmark_worker, args.thread, { + "endpoint": endpoint_list, + "turns": turns, + "img_list": img_content_list + }) + end = time.time() + total_cost = end - start + avg_cost = 0 + for i in range(args.thread): + avg_cost += result[0][i] + avg_cost = avg_cost / args.thread + print("total cost: {}s".format(total_cost)) + print("each thread cost: {}s. ".format(avg_cost)) + print("qps: {}samples/s".format(args.batch_size * args.thread * turns / + total_cost)) + if os.getenv("FLAGS_serving_latency"): + show_latency(result[1]) -- GitLab