From f59c5017b33f9bb01e420cc315e4d76e5e938e85 Mon Sep 17 00:00:00 2001 From: TeslaZhao Date: Fri, 6 May 2022 16:53:48 +0800 Subject: [PATCH] Update doc --- doc/Offical_Docs/12-0_FAQ_CN.md | 72 ++++++++++++------- .../3-1_QuickStart_Cpp_Resnet_CN.md | 25 ++++++- .../7-1_Python_Pipeline_Design_CN.md | 3 +- 3 files changed, 68 insertions(+), 32 deletions(-) diff --git a/doc/Offical_Docs/12-0_FAQ_CN.md b/doc/Offical_Docs/12-0_FAQ_CN.md index 5ef4a09b..724d74e7 100644 --- a/doc/Offical_Docs/12-0_FAQ_CN.md +++ b/doc/Offical_Docs/12-0_FAQ_CN.md @@ -1,4 +1,16 @@ -# FAQ +# 常见问题与解答 + +常见问题解答分为8大类问题: +- [版本升级问题](#1) +- [基础知识](#2) +- [安装问题](#3) +- [编译问题](#4) +- [环境问题](#5) +- [部署问题](#6) +- [预测问题](#7) +- [日志排查](#8) + + ## 版本升级问题 @@ -8,15 +20,17 @@ Failed to predict: (data_id=1 log_id=0) [det|0] Failed to postprocess: postproce ``` **A:** 在服务端程序(例如 web_service.py)的postprocess函数定义中增加参数data_id,改为 def postprocess(self, input_dicts, fetch_dict, **data_id**, log_id) 即可。 + + ## 基础知识 #### 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支持 +#### Q: Paddle Serving 支持哪些数据类型? -**A:** 在 protobuf 定义中 `feed_type` 和 `fetch_type` 编号与数据类型对应如下,完整信息可参考[保存用于 Paddle Serving 部署的模型参数](5-1_Save_Model_Params_CN.md) +**A:** 在 protobuf 定义中 `feed_type` 和 `fetch_type` 编号与数据类型对应如下,完整信息可参考[保存用于 Serving 部署的模型参数](./5-1_Save_Model_Params_CN.md) | 类型 | 类型值 | |------|------| @@ -33,9 +47,9 @@ Failed to predict: (data_id=1 log_id=0) [det|0] Failed to postprocess: postproce | complex64 | 10 | complex128 | 11 | -#### Q: Paddle Serving 是否支持 Windows 和 Linux 环境下部署? +#### Q: Paddle Serving 是否支持 Windows 和 Linux 原生环境部署? -**A:** 安装 `Linux Docker`,在 Docker 中部署 Paddle Serving +**A:** 安装 `Linux Docker`,在 Docker 中部署 Paddle Serving,参考[安装指南](./2-0_Index_CN.md) #### Q: Paddle Serving 如何修改消息大小限制 @@ -49,6 +63,8 @@ Failed to predict: (data_id=1 log_id=0) [det|0] Failed to postprocess: postproce **A:** 支持 HTTP、gRPC 和 bRPC 协议。其中 HTTP 协议既支持 HTTP + Json 格式,同时支持 HTTP + proto 格式。 + + ## 安装问题 #### Q: `pip install` 安装 `python wheel` 过程中,报错信息如何修复? @@ -88,7 +104,7 @@ Collecting opencv-python **A:** 指定 `opencv-python` 安装版本4.2.0.32,运行 `pip3 install opencv-python==4.2.0.32` -#### Q: pip3 install whEEl包过程报错信息如下: +#### Q: pip3 install wheel包过程报错,详细信息如下: ``` Complete output from command python setup.py egg_info: @@ -106,7 +122,7 @@ pip3 install --upgrade pip pip3 install --upgrade setuptools ``` -#### Q: 运行过程中报错,信息如下: +#### Q: 运行过程中出现 `No module named xxx` 错误,信息如下: ``` Traceback (most recent call last): @@ -119,7 +135,7 @@ Traceback (most recent call last): ImportError: No module named shapely.geometry ``` -**A:** 有2种方法,第一种通过 pip3 安装shapely,第二种通过 pip3 安装所有依赖组件。 +**A:** 有2种方法,第一种通过 pip3 安装shapely,第二种通过 pip3 安装所有依赖组件[requirements.txt](https://github.com/PaddlePaddle/Serving/blob/develop/python/requirements.txt)。 ``` 方法1: @@ -129,11 +145,13 @@ pip3 install shapely==1.7.0 pip3 install -r python/requirements.txt ``` + + ## 编译问题 #### Q: 如何使用自己编译的 Paddle Serving 进行预测? -**A:** 通过 pip3 命令安装自己编译出的 wheel 包,并设置环境变量 `export SERVING_BIN=serving二进制文件完全路径`。 +**A:** 编译 Paddle Serving 请阅读[编译 Serving](https://github.com/PaddlePaddle/Serving/blob/v0.8.3/doc/Compile_CN.md)。 #### Q: 使用 Java 客户端,mvn compile 过程出现 "No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?" 错误 @@ -151,13 +169,15 @@ Makefile:129: recipe for target 'all' failed make: *** [all] Error 2 ``` -**A:** 运行命令安装 libbz2: `apt install libbz2-dev` +**A:** Ubuntu 系统运行命令安装 libbz2: `apt install libbz2-dev`, + + ## 环境问题 #### Q:使用过程中出现 CXXABI 错误。 -这个问题出现的原因是 Python 使用的 gcc 版本和 Serving 编译的 gcc 版本对不上。对于 Docker 用户,推荐使用[Docker容器](https://github.com/PaddlePaddle/Serving/blob/develop/doc/Docker_Images_CN.md),由于 Docker 容器内的 Python 版本与 Serving 在发布前都做过适配,这样就不会出现类似的错误。如果是其他开发环境,首先需要确保开发环境中具备 GCC 8.2,如果没有 GCC 8.2,参考安装方式 +这个问题出现的原因是编译 Python 使用的 GCC 版本和编译 Serving 的 GCC 版本不一致。对于 Docker 用户,推荐使用[Docker容器](https://github.com/PaddlePaddle/Serving/blob/develop/doc/Docker_Images_CN.md),由于 Docker 容器内的 Python 版本与 Serving 在发布前都做过适配,这样就不会出现类似的错误。如果是其他开发环境,首先需要确保开发环境中具备 GCC 8.2,如果没有 GCC 8.2,参考安装方式 ```bash wget -q https://paddle-ci.gz.bcebos.com/gcc-8.2.0.tar.xz @@ -175,7 +195,7 @@ ln -s /usr/local/gcc-8.2/lib64/libstdc++.so.6 ${lib_so_6} && \ cp /usr/local/gcc-8.2/lib64/libstdc++.so.6.0.25 ${lib_path} ``` -如果已有 GCC 8.2,可以自行安装 Python,此外我们也提供了 GCC 8.2 编译的[Python3.6](https://paddle-serving.bj.bcebos.com/others/Python3.6.10-gcc82.tar) 。下载解压后,需要将对应的目录设置为 `PYTHONROOT`,并设置 `PATH` 和 `LD_LIBRARY_PATH`。 +推荐使用 GCC 8.2 预编译的 [Python3.6](https://paddle-serving.bj.bcebos.com/others/Python3.6.10-gcc82.tar) 包。下载解压后,需要将对应的目录设置为 `PYTHONROOT`,并设置 `PATH` 和 `LD_LIBRARY_PATH`。 ```bash export PYTHONROOT=/path/of/python # 对应解压后的Python目录 @@ -217,6 +237,8 @@ wget https://paddle-serving.bj.bcebos.com/others/centos_ssl.tar && \ (3) CUDA 10.1及更高版本需要 TensorRT。安装 TensorRT 相关文件的脚本参考 [install_trt.sh](../tools/dockerfiles/build_scripts/install_trt.sh). + + ## 部署问题 #### Q: GPU 环境运行 Serving 报错,GPU count is: 0。 @@ -249,10 +271,6 @@ InvalidArgumentError: Device id must be less than GPU count, but received id is: **A:** 支持 CentOS 和 Ubuntu 环境镜像 ,完整列表查阅[这里](https://github.com/PaddlePaddle/Serving/blob/develop/doc/Docker_Images_CN.md) -#### Q: python 编译的 GCC 版本与 Serving 的版本不匹配 - -**A:**: 1) 使用GPU Dockers, [这里是Docker镜像列表](https://github.com/PaddlePaddle/Serving/blob/develop/doc/Docker_Images_CN.md)解决环境问题;2) 修改 anaconda 的虚拟环境下安装的 python 的 GCC [改变python的GCC编译环境](https://www.jianshu.com/p/c498b3d86f77) - #### Q: Paddle Serving 是否支持本地离线安装 **A:** 支持离线部署,需要把一些相关的[依赖包](https://github.com/PaddlePaddle/Serving/blob/develop/doc/Compile_CN.md) 提前准备安装好 @@ -260,6 +278,8 @@ InvalidArgumentError: Device id must be less than GPU count, but received id is: #### Q: Docker 中启动 Server IP地址 127.0.0.1 与 0.0.0.0 差异 **A:** 必须将容器的主进程设置为绑定到特殊的 `0.0.0.0` 表示“所有接口”地址,否则它将无法从容器外部访问。在 Docker 中 `127.0.0.1` 仅代表“这个容器”,而不是“这台机器”。如果您从容器建立到 `127.0.0.1` 的出站连接,它将返回到同一个容器;如果您将服务器绑定到 `127.0.0.1`,接收不到来自外部的连接。 + + ## 预测问题 #### Q: 使用 GPU 第一次预测时特别慢,如何调整 RPC 服务的等待时间避免超时? @@ -276,11 +296,6 @@ client.load_client_config(sys.argv[1]) client.set_rpc_timeout_ms(100000) client.connect(["127.0.0.1:9393"]) ``` - -#### Q: 执行 GPU 预测时遇到 `InvalidArgumentError: Device id must be less than GPU count, but received id is: 0. GPU count is: 0`错误。 - -**A:** 将显卡驱动对应的 `libcuda.so` 的目录添加到 `LD_LIBRARY_PATH` 环境变量中 - #### Q: 执行 GPU 预测时遇到 `ExternalError: Cudnn error, CUDNN_STATUS_BAD_PARAM at (../batch_norm_op.cu:198)`错误 **A:** 将 cuDNN 的 lib64路径添加到 `LD_LIBRARY_PATH`,安装自 `pypi` 的 Paddle Serving 中 `post9` 版本使用的是 `cuDNN 7.3,post10` 使用的是 `cuDNN 7.5。如果是使用自己编译的 Paddle Serving,可以在 `log/serving.INFO` 日志文件中查看对应的 cuDNN 版本。 @@ -291,7 +306,7 @@ client.connect(["127.0.0.1:9393"]) #### Q: Client 的 `fetch var`变量名如何设置 -**A:** 可以查看配置文件 `serving_server_conf.prototxt`,获取需要的变量名 +**A:** 通过[保存用于 Serving 部署的模型参数](https://github.com/PaddlePaddle/Serving/blob/v0.8.3/doc/Save_EN.md) 生成配置文件 `serving_server_conf.prototxt`,获取需要的变量名。 #### Q: 如何使用多语言客户端 @@ -305,6 +320,7 @@ client.connect(["127.0.0.1:9393"]) **A:** 没有安装 TensorRT,安装 TensorRT 请参考链接: https://blog.csdn.net/hesongzefairy/article/details/105343525 + ## 日志排查 @@ -314,18 +330,20 @@ client.connect(["127.0.0.1:9393"]) Client 的日志直接打印到标准输出。 通过在部署服务之前 'export GLOG_v=3'可以输出更为详细的日志信息。 -#### Q: Paddle Serving 启动成功后,相关的日志在哪里设置 - -**A:** 1)警告是 `glog` 组件打印的,告知 `glog` 初始化之前日志打印在 STDERR +#### Q: C++ Serving 启动成功后,日志文件在哪里,在哪里设置日志级别? - 2)一般采用 `GLOG_v` 方式启动服务同时设置日志级别。 +**A:** C++ Serving 服务的所有日志在程序运行的当前目录的`log/`目录下,分为 serving.INFO、serving.WARNING 和 serving.ERROR 文件。 +1)警告是 `glog` 组件打印的,告知 `glog` 初始化之前日志打印在 STDERR; +2)一般采用 `GLOG_v` 方式启动服务同时设置日志级别。 例如: - ``` GLOG_v=2 python -m paddle_serving_server.serve --model xxx_conf/ --port 9999 ``` +#### Q: Python Pipeline 启动成功后,日志文件在哪里,在哪里设置日志级别? + +**A:** Python Pipeline 服务的日志信息请阅读[Python Pipeline 设计](./7-1_Python_Pipeline_Design_CN.md) 第三节服务日志。 #### Q: (GLOG_v=2下)Server 日志一切正常,但 Client 始终得不到正确的预测结果 diff --git a/doc/Offical_Docs/3-1_QuickStart_Cpp_Resnet_CN.md b/doc/Offical_Docs/3-1_QuickStart_Cpp_Resnet_CN.md index f1ba0b11..3395c25f 100644 --- a/doc/Offical_Docs/3-1_QuickStart_Cpp_Resnet_CN.md +++ b/doc/Offical_Docs/3-1_QuickStart_Cpp_Resnet_CN.md @@ -1,5 +1,14 @@ # C++ Serving 快速部署案例 +- [模型介绍](#1) +- [部署步骤](#2) + - [2.1 保存模型](#2.1) + - [2.2 保存 Serving 部署的模型参数](#2.2) + - [2.3 启动服务](#2.3) + - [2.4 启动客户端](#2.4) + + + ## 模型介绍 残差网络(ResNet)于2015年被提出,摘得 ImageNet 榜单5项第一,成绩大幅领先第二名,是 CNN 图像史上的一个里程碑。 @@ -7,6 +16,8 @@ ResNet 网络是参考了 VGG19 网络,加入残差单元,ResNet50 有50层网络。 + + ## 部署步骤 前提条件是你已完成[环境安装]()步骤,并已验证环境安装成功,此处不在赘述。 @@ -22,6 +33,8 @@ git clone https://github.com/PaddlePaddle/Serving - 三.启动服务 - 四.启动客户端 + + **一.获取模型** 下载 `ResNet50_vd` 的 推理模型 @@ -30,6 +43,8 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet5 ``` + + **二.保存 Serving 部署的模型参数** 用 `paddle_serving_client` 把下载的推理模型转换成易于 Serving 部署的模型格式,完整信息请参考 [保存用于 Serving 部署的模型参数](./5-1_Save_Model_Params_CN.md)。 @@ -42,7 +57,7 @@ python3 -m paddle_serving_client.convert --dirname ./ResNet50_vd_infer/ \ --serving_client ./ResNet50_vd_client/ ``` -保存参数后,会在当前文件夹多出 `ResNet50_vd_serving` 和 `ResNet50_vd_client` 的文件夹: +保存参数后,会在当前文件夹多出 `ResNet50_vd_serving` 和 `ResNet50_vd_client` 的文件夹,分别用户服务端和客户端。 ``` ├── daisy.jpg ├── http_client.py @@ -63,6 +78,8 @@ python3 -m paddle_serving_client.convert --dirname ./ResNet50_vd_infer/ \ ├── rpc_client.py ``` + + **三.启动服务** C++ Serving 服务可以指定一个网络端口同时接收 HTTP、gRPC 和 bRPC 请求。命令参数 `--model` 指定模型路径,`--gpu_ids` 指定 GPU 卡,`--port` 指定端口。 @@ -71,15 +88,17 @@ C++ Serving 服务可以指定一个网络端口同时接收 HTTP、gRPC 和 bRP python3 -m paddle_serving_server.serve --model ResNet50_vd_serving --gpu_ids 0 --port 9394 ``` + + **四.启动客户端** -PYTHON 程序 `http_client.py` 封装了 HTTP 请求客户端,运行以下命令: +HTTP 客户端程序 `http_client.py` 创建请求参数,向服务端发起 HTTP 请求。 ``` python3 http_client.py ``` -PYTHON 程序 `rpc_client.py` 封装了 gRPC 请求客户端,运行以下命令: +RPC 客户端程序 `rpc_client.py` 创建请求参数,向服务端发起 gRPC 请求。 ``` python3 rpc_client.py diff --git a/doc/Offical_Docs/7-1_Python_Pipeline_Design_CN.md b/doc/Offical_Docs/7-1_Python_Pipeline_Design_CN.md index 1f5269d2..5ba7086f 100644 --- a/doc/Offical_Docs/7-1_Python_Pipeline_Design_CN.md +++ b/doc/Offical_Docs/7-1_Python_Pipeline_Design_CN.md @@ -138,8 +138,7 @@ Channel的设计原则: - -**三. 服务日志** +**三.服务日志** Pipeline 服务日志在当前目录的 `PipelineServingLogs` 目录下,有3种类型日志,分别是 `pipeline.log`、`pipeline.log.wf`、`pipeline.tracer`。 - `pipeline.log` : 记录 debug & info日志信息 -- GitLab