提交 f59c5017 编写于 作者: T TeslaZhao

Update doc

上级 ed943208
# FAQ
# 常见问题与解答
常见问题解答分为8大类问题:
- [版本升级问题](#1)
- [基础知识](#2)
- [安装问题](#3)
- [编译问题](#4)
- [环境问题](#5)
- [部署问题](#6)
- [预测问题](#7)
- [日志排查](#8)
<a name="1"></a>
## 版本升级问题
......@@ -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) 即可。
<a name="2"></a>
## 基础知识
#### 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 格式。
<a name="3"></a>
## 安装问题
#### 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
```
<a name="4"></a>
## 编译问题
#### 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`
<a name="5"></a>
## 环境问题
#### 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).
<a name="6"></a>
## 部署问题
#### 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`,接收不到来自外部的连接。
<a name="7"></a>
## 预测问题
#### 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
<a name="8"></a>
## 日志排查
......@@ -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 始终得不到正确的预测结果
......
# C++ Serving 快速部署案例
- [模型介绍](#1)
- [部署步骤](#2)
- [2.1 保存模型](#2.1)
- [2.2 保存 Serving 部署的模型参数](#2.2)
- [2.3 启动服务](#2.3)
- [2.4 启动客户端](#2.4)
<a name="1"></a>
## 模型介绍
残差网络(ResNet)于2015年被提出,摘得 ImageNet 榜单5项第一,成绩大幅领先第二名,是 CNN 图像史上的一个里程碑。
......@@ -7,6 +16,8 @@
ResNet 网络是参考了 VGG19 网络,加入残差单元,ResNet50 有50层网络。
<a name="2"></a>
## 部署步骤
前提条件是你已完成[环境安装]()步骤,并已验证环境安装成功,此处不在赘述。
......@@ -22,6 +33,8 @@ git clone https://github.com/PaddlePaddle/Serving
- 三.启动服务
- 四.启动客户端
<a name="2.1"></a>
**一.获取模型**
下载 `ResNet50_vd` 的 推理模型
......@@ -30,6 +43,8 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet5
```
<a name="2.2"></a>
**二.保存 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
```
<a name="2.3"></a>
**三.启动服务**
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
```
<a name="2.4"></a>
**四.启动客户端**
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
......
......@@ -138,8 +138,7 @@ Channel的设计原则:
</div>
**三. 服务日志**
**三.服务日志**
Pipeline 服务日志在当前目录的 `PipelineServingLogs` 目录下,有3种类型日志,分别是 `pipeline.log``pipeline.log.wf``pipeline.tracer`
- `pipeline.log` : 记录 debug & info日志信息
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册