Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Serving
提交
24afa1b8
S
Serving
项目概览
PaddlePaddle
/
Serving
接近 2 年 前同步成功
通知
186
Star
833
Fork
253
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
105
列表
看板
标记
里程碑
合并请求
10
Wiki
2
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Serving
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
105
Issue
105
列表
看板
标记
里程碑
合并请求
10
合并请求
10
Pages
分析
分析
仓库分析
DevOps
Wiki
2
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
24afa1b8
编写于
2月 18, 2021
作者:
W
wangjiawei04
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix doc for 0.5.0
上级
3a49ec4a
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
235 addition
and
151 deletion
+235
-151
README_CN.md
README_CN.md
+45
-59
doc/COMPILE_CN.md
doc/COMPILE_CN.md
+75
-64
doc/DOCKER_IMAGES_CN.md
doc/DOCKER_IMAGES_CN.md
+43
-4
doc/RUN_IN_DOCKER_CN.md
doc/RUN_IN_DOCKER_CN.md
+5
-3
doc/SAVE_CN.md
doc/SAVE_CN.md
+67
-21
未找到文件。
README_CN.md
浏览文件 @
24afa1b8
...
...
@@ -20,6 +20,15 @@
<br>
<p>
<h2
align=
"center"
>
0.5.0版本新特性
</h2>
-
支持PaddlePaddle 2.0版本和动态图模式
-
支持Pipeline模式的多模型部署
-
支持ARM和XPU架构的预测服务
-
支持模型加密
-
新增Cuda 10.2/11的支持,新增Python 3.8支持
<h2
align=
"center"
>
动机
</h2>
Paddle Serving 旨在帮助深度学习开发者轻易部署在线预测服务。
**本项目目标**
: 当用户使用
[
Paddle
](
https://github.com/PaddlePaddle/Paddle
)
训练了一个深度神经网络,就同时拥有了该模型的预测服务。
...
...
@@ -34,25 +43,33 @@ Paddle Serving 旨在帮助深度学习开发者轻易部署在线预测服务
**强烈建议**
您在
**Docker内构建**
Paddle Serving,请查看
[
如何在Docker中运行PaddleServing
](
doc/RUN_IN_DOCKER_CN.md
)
。更多镜像请查看
[
Docker镜像列表
](
doc/DOCKER_IMAGES_CN.md
)
。
**提示**
:目前paddlepaddle 2.0版本的默认GPU环境是Cuda 10.2,因此GPU Docker的示例代码以Cuda 10.2为准。镜像和pip安装包也提供了其余GPU环境,用户如果使用其他环境,需要仔细甄别并选择合适的版本。
```
# 启动 CPU Docker
docker pull hub.baidubce.com/paddlepaddle/serving:
latest
docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:
latest
docker pull hub.baidubce.com/paddlepaddle/serving:
0.5.0-devel
docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:
0.5.0-devel
docker exec -it test bash
git clone https://github.com/PaddlePaddle/Serving
```
```
# 启动 GPU Docker
nvidia-docker pull hub.baidubce.com/paddlepaddle/serving:
latest-cuda9.0-cudnn7
nvidia-docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:
latest-cuda9.0-cudnn7
nvidia-docker pull hub.baidubce.com/paddlepaddle/serving:
0.5.0-cuda10.2-cudnn8-devel
nvidia-docker run -p 9292:9292 --name test -dit hub.baidubce.com/paddlepaddle/serving:
0.5.0-cuda10.2-cudnn8-devel
nvidia-docker exec -it test bash
git clone https://github.com/PaddlePaddle/Serving
```
```
shell
pip
install
paddle-serving-client
==
0.
4
.0
pip
install
paddle-serving-server
==
0.
4
.0
# CPU
pip
install
paddle-serving-client
==
0.
5
.0
pip
install
paddle-serving-server
==
0.
5
.0
# CPU
pip
install
paddle-serving-app
==
0.2.0
pip
install
paddle-serving-server-gpu
==
0.4.0.post9
# GPU with CUDA9.0
pip
install
paddle-serving-server-gpu
==
0.4.0.post10
# GPU with CUDA10.0
pip
install
paddle-serving-server-gpu
==
0.4.0.100
# GPU with CUDA10.1+TensorRT
pip
install
paddle-serving-server-gpu
==
0.5.0.post102
#GPU with CUDA10.2 + TensorRT7
# 其他GPU环境需要确认环境再选择执行哪一条
pip
install
paddle-serving-server-gpu
==
0.5.0.post9
# GPU with CUDA9.0
pip
install
paddle-serving-server-gpu
==
0.5.0.post10
# GPU with CUDA10.0
pip
install
paddle-serving-server-gpu
==
0.5.0.post101
# GPU with CUDA10.1 + TensorRT6
pip
install
paddle-serving-server-gpu
==
0.5.0.post11
# GPU with CUDA10.1 + TensorRT7
```
您可能需要使用国内镜像源(例如清华源, 在pip命令中添加
`-i https://pypi.tuna.tsinghua.edu.cn/simple`
)来加速下载。
...
...
@@ -61,39 +78,27 @@ pip install paddle-serving-server-gpu==0.4.0.100 # GPU with CUDA10.1+TensorRT
paddle-serving-server和paddle-serving-server-gpu安装包支持Centos 6/7, Ubuntu 16/18和Windows 10。
paddle-serving-client和paddle-serving-app安装包支持Linux和Windows,其中paddle-serving-client仅支持python2.7/3.5/3.6。
paddle-serving-client和paddle-serving-app安装包支持Linux和Windows,其中paddle-serving-client仅支持python2.7/3.5/3.6
/3.7/3.8
。
推荐安装
1.8.4
及以上版本的paddle
推荐安装
2.0.0
及以上版本的paddle
对于
**Windows 10 用户**
,请参考文档
[
Windows平台使用Paddle Serving指导
](
./doc/WINDOWS_TUTORIAL_CN.md
)
。
<h2
align=
"center"
>
Paddle Serving预装的服务
</h2>
<h3
align=
"center"
>
中文分词
</h4>
```
shell
>
python
-m
paddle_serving_app.package
--get_model
lac
>
tar
-xzf
lac.tar.gz
>
python lac_web_service.py lac_model/ lac_workdir 9393 &
>
curl
-H
"Content-Type:application/json"
-X
POST
-d
'{"feed":[{"words": "我爱北京天安门"}], "fetch":["word_seg"]}'
http://127.0.0.1:9393/lac/prediction
{
"result"
:[
{
"word_seg"
:
"我|爱|北京|天安门"
}]}
```
# CPU环境请执行
pip install paddlepaddle==2.0.0
<h3
align=
"center"
>
图像分类
</h4>
# GPU Cuda10.2环境请执行
pip install paddlepaddle-gpu==2.0.0
```
<p
align=
"center"
>
<br>
<img
src=
'https://paddle-serving.bj.bcebos.com/imagenet-example/daisy.jpg'
width =
"200"
height =
"200"
>
<br>
<p>
如果是其他GPU环境,需要参考
[
Paddle官方文档-多版本whl包列表
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/install/Tables.html#whl-release
)
```
shell
>
python
-m
paddle_serving_app.package
--get_model
resnet_v2_50_imagenet
>
tar
-xzf
resnet_v2_50_imagenet.tar.gz
>
python resnet50_imagenet_classify.py resnet50_serving_model &
>
curl
-H
"Content-Type:application/json"
-X
POST
-d
'{"feed":[{"image": "https://paddle-serving.bj.bcebos.com/imagenet-example/daisy.jpg"}], "fetch": ["score"]}'
http://127.0.0.1:9292/image/prediction
{
"result"
:
{
"label"
:[
"daisy"
]
,
"prob"
:[0.9341403245925903]
}}
选择相应的GPU环境的url链接并进行安装,例如Cuda 9.0的Python2.7用户,请选择表格当中的
`cp27-cp27mu`
和
`cuda9.0_cudnn7-mkl`
对应的url,复制下来并执行
```
pip install https://paddle-wheel.bj.bcebos.com/2.0.0-gpu-cuda9-cudnn7-mkl/paddlepaddle_gpu-2.0.0.post90-cp27-cp27mu-linux_x86_64.whl
```
如果是其他环境和Python版本,请在表格中找到对应的链接并用pip安装。
对于
**Windows 10 用户**
,请参考文档
[
Windows平台使用Paddle Serving指导
](
./doc/WINDOWS_TUTORIAL_CN.md
)
。
<h2
align=
"center"
>
快速开始示例
</h2>
...
...
@@ -102,9 +107,10 @@ paddle-serving-client和paddle-serving-app安装包支持Linux和Windows,其
<h3
align=
"center"
>
波士顿房价预测
</h3>
进入到Serving的git目录下,进入到
`fit_a_line`
例子
```
shell
wget
--no-check-certificate
https://paddle-serving.bj.bcebos.com/uci_housing.tar.gz
tar
-xzf
uci_housing.tar.gz
cd
Serving/python/examples/fit_a_line
sh get_data.sh
```
Paddle Serving 为用户提供了基于 HTTP 和 RPC 的服务
...
...
@@ -127,10 +133,8 @@ python -m paddle_serving_server.serve --model uci_housing_model --thread 10 --po
|
`mem_optim_off`
| - | - | Disable memory optimization |
|
`ir_optim`
| - | - | Enable analysis and optimization of calculation graph |
|
`use_mkl`
(Only for cpu version) | - | - | Run inference with MKL |
|
`use_trt`
(Only for
trt
version) | - | - | Run inference with TensorRT |
|
`use_trt`
(Only for
Cuda>=10.1
version) | - | - | Run inference with TensorRT |
我们使用
`curl`
命令来发送HTTP POST请求给刚刚启动的服务。用户也可以调用python库来发送HTTP POST请求,请参考英文文
档
[
requests
](
https://requests.readthedocs.io/en/master/
)
。
</center>
```
python
...
...
@@ -152,25 +156,7 @@ print(fetch_map)
用户也可以将数据格式处理逻辑放在服务器端进行,这样就可以直接用curl去访问服务,参考如下案例,在目录
`python/examples/fit_a_line`
```
python
from
paddle_serving_server.web_service
import
WebService
import
numpy
as
np
class
UciService
(
WebService
):
def
preprocess
(
self
,
feed
=
[],
fetch
=
[]):
feed_batch
=
[]
is_batch
=
True
new_data
=
np
.
zeros
((
len
(
feed
),
1
,
13
)).
astype
(
"float32"
)
for
i
,
ins
in
enumerate
(
feed
):
nums
=
np
.
array
(
ins
[
"x"
]).
reshape
(
1
,
1
,
13
)
new_data
[
i
]
=
nums
feed
=
{
"x"
:
new_data
}
return
feed
,
fetch
,
is_batch
uci_service
=
UciService
(
name
=
"uci"
)
uci_service
.
load_model_config
(
"uci_housing_model"
)
uci_service
.
prepare_server
(
workdir
=
"workdir"
,
port
=
9292
)
uci_service
.
run_rpc_service
()
uci_service
.
run_web_service
()
python
-
m
paddle_serving_server
.
serve
--
model
uci_housing_model
--
thread
10
--
port
9292
--
name
uci
```
客户端输入
```
...
...
doc/COMPILE_CN.md
浏览文件 @
24afa1b8
...
...
@@ -6,12 +6,11 @@
| 组件 | 版本要求 |
| :--------------------------: | :-------------------------------: |
| OS | CentOS 7 |
| gcc | 4.8.5 and later |
| gcc-c++ | 4.8.5 and later |
| git | 3.82 and later |
| OS | Ubuntu16/CentOS 7 |
| gcc | 4.8.5(Cuda 9.0 and 10.0) and 8.2(Others) |
| gcc-c++ | 4.8.5(Cuda 9.0 and 10.0) and 8.2(Others) |
| cmake | 3.2.0 and later |
| Python | 2.7.2 and later / 3.
6 and later
|
| Python | 2.7.2 and later / 3.
5.1 and later
|
| Go | 1.9.2 and later |
| git | 2.17.1 and later |
| glibc-static | 2.17 |
...
...
@@ -24,13 +23,7 @@
| libSM | 1.2.2 |
| libXrender | 0.9.10 |
推荐使用Docker编译,我们已经为您准备好了Paddle Serving编译环境,详见
[
该文档
](
DOCKER_IMAGES_CN.md
)
。
本文档将以Python2为例介绍如何编译Paddle Serving。如果您想用Python3进行编译,只需要调整cmake的Python相关选项即可:
-
将
`DPYTHON_INCLUDE_DIR`
设置为
`$PYTHONROOT/include/python3.6m/`
-
将
`DPYTHON_LIBRARIES`
设置为
`$PYTHONROOT/lib64/libpython3.6.so`
-
将
`DPYTHON_EXECUTABLE`
设置为
`$PYTHONROOT/bin/python3.6`
推荐使用Docker编译,我们已经为您准备好了Paddle Serving编译环境并配置好了上述编译依赖,详见
[
该文档
](
DOCKER_IMAGES_CN.md
)
。
## 获取代码
...
...
@@ -39,19 +32,46 @@ git clone https://github.com/PaddlePaddle/Serving
cd
Serving
&&
git
submodule
update
--
init
--
recursive
```
## PYTHONROOT设置
```
shell
# 例如python的路径为/usr/bin/python,可以设置PYTHONROOT
export
PYTHONROOT
=
/usr
/
export
PYTHONROOT
=
/usr
```
我们提供默认Centos7的Python路径为
`/usr/bin/python`
,如果您要使用我们的Centos6镜像,需要将其设置为
`export PYTHONROOT=/usr/local/python2.7/`
。
如果您使用的是Docker开发镜像,请按照如下,确定好需要编译的Python版本,设置对应的环境变量
```
#Python 2.7
export PYTHONROOT=/usr/local/python2.7.15/
export PYTHON_INCLUDE_DIR=$PYTHONROOT/include/python2.7/
export PYTHON_LIBRARIES=$PYTHONROOT/lib/libpython2.7.so
export PYTHON_EXECUTABLE=$PYTHONROOT/bin/python2.7
#Python 3.5
export PYTHONROOT=/usr/local/python3.5.1
export PYTHON_INCLUDE_DIR=$PYTHONROOT/include/python3.5m
export PYTHON_LIBRARIES=$PYTHONROOT/lib/libpython3.5m.so
export PYTHON_EXECUTABLE=$PYTHONROOT/bin/python3.5
#Python3.6
export PYTHONROOT=/usr/local/
export PYTHON_INCLUDE_DIR=$PYTHONROOT/include/python3.6m
export PYTHON_LIBRARIES=$PYTHONROOT/lib/libpython3.6m.so
export PYTHON_EXECUTABLE=$PYTHONROOT/bin/python3.6
#Python3.7
export PYTHONROOT=/usr/local/
export PYTHON_INCLUDE_DIR=$PYTHONROOT/include/python3.7m
export PYTHON_LIBRARIES=$PYTHONROOT/lib/libpython3.7m.so
export PYTHON_EXECUTABLE=$PYTHONROOT/bin/python3.7
#Python3.8
export PYTHONROOT=/usr/local/
export PYTHON_INCLUDE_DIR=$PYTHONROOT/include/python3.8
export PYTHON_LIBRARIES=$PYTHONROOT/lib/libpython3.8.so
export PYTHON_EXECUTABLE=$PYTHONROOT/bin/python3.8
```
## 安装Python依赖
...
...
@@ -59,11 +79,11 @@ export PYTHONROOT=/usr/
pip
install
-r
python/requirements.txt
```
如果使用
Python3,请以
`pip3`
替换
`pip`
。
如果使用
其他Python版本,请使用对应版本的
`pip`
。
## GOPATH 设置
默认 GOPATH 设置为
`$HOME/go`
,您也可以设置为其他值。
默认 GOPATH 设置为
`$HOME/go`
,您也可以设置为其他值。
** 如果是Serving提供的Docker环境,可以不需要设置。**
```
shell
export
GOPATH
=
$HOME
/go
export
PATH
=
$PATH
:
$GOPATH
/bin
...
...
@@ -87,9 +107,9 @@ go get -u google.golang.org/grpc@v1.33.0
```
shell
mkdir
server-build-cpu
&&
cd
server-build-cpu
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHON
ROOT
/include/python2.7
/
\
-DPYTHON_LIBRARIES
=
$PYTHON
ROOT
/lib/libpython2.7.so
\
-DPYTHON_EXECUTABLE
=
$PYTHON
ROOT
/bin/python
\
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHON
_INCLUDE_DIR
/
\
-DPYTHON_LIBRARIES
=
$PYTHON
_LIBRARIES
\
-DPYTHON_EXECUTABLE
=
$PYTHON
_EXECUTABLE
\
-DSERVER
=
ON ..
make
-j10
```
...
...
@@ -97,44 +117,35 @@ make -j10
可以执行
`make install`
把目标产出放在
`./output`
目录下,cmake阶段需添加
`-DCMAKE_INSTALL_PREFIX=./output`
选项来指定存放路径。
### 集成GPU版本Paddle Inference Library
### CUDA_PATH是cuda的安装路径,可以使用命令行whereis cuda命令确认你的cuda安装路径,通常应该是/usr/local/cuda
### CUDNN_LIBRARY CUDA_CUDART_LIBRARY 是cuda库文件的路径,通常应该是/usr/local/cuda/lib64/
```
shell
export
CUDA_PATH
=
'/usr/local/cuda'
export
CUDNN_LIBRARY
=
'/usr/local/cuda/lib64/'
export
CUDA_CUDART_LIBRARY
=
"/usr/local/cuda/lib64/"
mkdir
server-build-gpu
&&
cd
server-build-gpu
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHONROOT
/include/python2.7/
\
-DPYTHON_LIBRARIES
=
$PYTHONROOT
/lib/libpython2.7.so
\
-DPYTHON_EXECUTABLE
=
$PYTHONROOT
/bin/python
\
-DCUDA_TOOLKIT_ROOT_DIR
=
${
CUDA_PATH
}
\
-DCUDNN_LIBRARY
=
${
CUDNN_LIBRARY
}
\
-DCUDA_CUDART_LIBRARY
=
${
CUDA_CUDART_LIBRARY
}
\
-DSERVER
=
ON
\
-DWITH_GPU
=
ON ..
make
-j10
```
相比CPU环境,GPU环境需要参考以下表格,
**需要说明的是,以下表格对非Docker编译环境作为参考,Docker编译环境已经配置好相关参数,无需在cmake过程指定。**
### 集成TensorRT版本Paddle Inference Library
| cmake环境变量 | 含义 | GPU环境注意事项 | Docker环境是否需要 |
|-----------------------|-------------------------------------|-------------------------------|--------------------|
| CUDA_TOOLKIT_ROOT_DIR | cuda安装路径,通常为/usr/local/cuda | 全部环境都需要 | 否(/usr/local/cuda) |
| CUDNN_LIBRARY | libcudnn.so.
*
所在目录,通常为/usr/local/cuda/lib64/ | 全部环境都需要 | 否(/usr/local/cuda/lib64/) |
| CUDA_CUDART_LIBRARY | libcudart.so.
*
所在目录,通常为/usr/local/cuda/lib64/ | 全部环境都需要 | 否(/usr/local/cuda/lib64/) |
| TENSORRT_ROOT | libnvinfer.so.
*
所在目录的上一级目录,取决于TensorRT安装目录 | Cuda 9.0/10.0不需要,其他需要 | 否(/usr) |
```
非Docker环境下,用户可以参考如下执行方式,具体的路径以当时环境为准,代码仅作为参考。
```
shell
export
CUDA_PATH
=
'/usr/local/cuda'
export
CUDNN_LIBRARY
=
'/usr/local/cuda/lib64/'
export
CUDA_CUDART_LIBRARY
=
"/usr/local/cuda/lib64/"
export
TENSORRT_LIBRARY_PATH
=
"/usr/local/TensorRT-6.0.1.5/targets/x86_64-linux-gnu/"
mkdir server-build-trt && cd server-build-trt
cmake -DPYTHON_INCLUDE_DIR=$PYTHONROOT/include/python2.7/ \
-DPYTHON_LIBRARIES=$PYTHONROOT/lib/libpython2.7.so \
-DPYTHON_EXECUTABLE=$PYTHONROOT/bin/python \
-DTENSORRT_ROOT=${TENSORRT_LIBRARY_PATH} \
mkdir
server-build-gpu
&&
cd
server-build-gpu
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHON_INCLUDE_DIR
\
-DPYTHON_LIBRARIES
=
$PYTHON_LIBRARIES
\
-DPYTHON_EXECUTABLE
=
$PYTHON_EXECUTABLE
\
-DCUDA_TOOLKIT_ROOT_DIR
=
${
CUDA_PATH
}
\
-DCUDNN_LIBRARY
=
${
CUDNN_LIBRARY
}
\
-DCUDA_CUDART_LIBRARY
=
${
CUDA_CUDART_LIBRARY
}
\
-DTENSORRT_ROOT
=
${
TENSORRT_LIBRARY_PATH
}
-DSERVER
=
ON
\
-DWITH_GPU=ON \
-DWITH_TRT=ON ..
-DWITH_GPU
=
ON ..
make
-j10
```
...
...
@@ -146,9 +157,9 @@ make -j10
```
shell
mkdir
client-build
&&
cd
client-build
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHON
ROOT
/include/python2.7/
\
-DPYTHON_LIBRARIES
=
$PYTHON
ROOT
/lib/libpython2.7.so
\
-DPYTHON_EXECUTABLE
=
$PYTHON
ROOT
/bin/python
\
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHON
_INCLUDE_DIR
\
-DPYTHON_LIBRARIES
=
$PYTHON
_LIBRARIES
\
-DPYTHON_EXECUTABLE
=
$PYTHON
_EXECUTABLE
\
-DCLIENT
=
ON ..
make
-j10
```
...
...
@@ -161,10 +172,9 @@ make -j10
```
bash
mkdir
app-build
&&
cd
app-build
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHONROOT
/include/python2.7/
\
-DPYTHON_LIBRARIES
=
$PYTHONROOT
/lib/libpython2.7.so
\
-DPYTHON_EXECUTABLE
=
$PYTHONROOT
/bin/python
\
-DCMAKE_INSTALL_PREFIX
=
./output
\
cmake
-DPYTHON_INCLUDE_DIR
=
$PYTHON_INCLUDE_DIR
\
-DPYTHON_LIBRARIES
=
$PYTHON_LIBRARIES
\
-DPYTHON_EXECUTABLE
=
$PYTHON_EXECUTABLE
\
-DAPP
=
ON ..
make
```
...
...
@@ -183,7 +193,7 @@ make
运行python端Server时,会检查
`SERVING_BIN`
环境变量,如果想使用自己编译的二进制文件,请将设置该环境变量为对应二进制文件的路径,通常是
`export SERVING_BIN=${BUILD_DIR}/core/general-server/serving`
。
其中BUILD_DIR为server-build-cpu或server-build-gpu的绝对路径。
可以cd server-build-cpu路径下,执行
export SERVING_BIN=${PWD}/core/general-server/serving
可以cd server-build-cpu路径下,执行
`export SERVING_BIN=${PWD}/core/general-server/serving`
...
...
@@ -207,7 +217,6 @@ make
| CLIENT | Compile Paddle Serving Client | OFF |
| SERVER | Compile Paddle Serving Server | OFF |
| APP | Compile Paddle Serving App package | OFF |
| WITH_ELASTIC_CTR | Compile ELASITC-CTR solution | OFF |
| PACK | Compile for whl | OFF |
### WITH_GPU选项
...
...
@@ -226,13 +235,15 @@ Paddle Serving通过PaddlePaddle预测库支持在GPU上做预测。WITH_GPU选
1.
编译Serving所在的系统上所安装的CUDA/CUDNN等基础库版本,需要兼容实际的GPU设备。例如,Tesla V100卡至少要CUDA 9.0。如果编译时所用CUDA等基础库版本过低,由于生成的GPU代码和实际硬件设备不兼容,会导致Serving进程无法启动,或出现coredump等严重问题。
2.
运行Paddle Serving的系统上安装与实际GPU设备兼容的CUDA driver,并安装与编译期所用的CUDA/CuDNN等版本兼容的基础库。如运行Paddle Serving的系统上安装的CUDA/CuDNN的版本低于编译时所用版本,可能会导致奇怪的cuda函数调用失败等问题。
以下是Paddle
Paddle发布版本所使用的基础库版本
匹配关系,供参考:
以下是Paddle
Serving 镜像的Cuda与Cudnn,TensorRT的
匹配关系,供参考:
| | CUDA | CuDNN | TensorRT |
| :----: | :-----: | :----------------------: | :----: |
| post9 | 9.0 | CuDNN 7.3.1 for CUDA 9.0 | |
| post10 | 10.0 | CuDNN 7.5.1 for CUDA 10.0| |
| trt | 10.1 | CuDNN 7.5.1 for CUDA 10.1| 6.0.1.5 |
| | CUDA | CuDNN | TensorRT |
| :----: | :-----: | :----------: | :----: |
| post9 | 9.0 | CuDNN 7.6.4 | |
| post10 | 10.0 | CuDNN 7.6.5 | |
| post101 | 10.1 | CuDNN 7.6.5 | 6.0.1 |
| post102 | 10.2 | CuDNN 8.0.5 | 7.1.3 |
| post11 | 11.0 | CuDNN 8.0.4 | 7.1.3 |
### 如何让Paddle Serving编译系统探测到CuDNN库
...
...
doc/DOCKER_IMAGES_CN.md
浏览文件 @
24afa1b8
...
...
@@ -8,11 +8,10 @@
您可以通过两种方式获取镜像。
1.
通过 TAG 直接从
`hub.baidubce.com `
或
`docker.io`
拉取镜像:
1.
通过 TAG 直接从
`hub.baidubce.com `
或
拉取镜像,具体TAG请参见下文的
**镜像说明**
章节的表格。
```
shell
docker pull hub.baidubce.com/paddlepaddle/serving:<TAG>
# hub.baidubce.com
docker pull paddlepaddle/serving:<TAG>
# hub.docker.com
docker pull registry.baidubce.com/paddlepaddle/serving:<TAG>
# hub.baidubce.com
```
2.
基于 Dockerfile 构建镜像
...
...
@@ -20,7 +19,8 @@
建立新目录,复制对应 Dockerfile 内容到该目录下 Dockerfile 文件。执行
```
shell
docker build
-t
<image-name>:<images-tag> .
cd
tools
docker build
-f
${
DOCKERFILE
}
-t
<image-name>:<images-tag> .
```
...
...
@@ -29,6 +29,8 @@
运行时镜像不能用于开发编译。
若需要基于源代码二次开发编译,请使用后缀为-devel的版本。
**在TAG列,latest也可以替换成对应的版本号,例如0.5.0/0.4.1等,但需要注意的是,部分开发环境随着某个版本迭代才增加,因此并非所有环境都有对应的版本号可以使用。**
| 镜像选择 | 操作系统 | TAG | Dockerfile |
| :----------------------------------------------------------: | :-----: | :--------------------------: | :----------------------------------------------------------: |
...
...
@@ -55,6 +57,7 @@ hub.baidubce.com/paddlepaddle/serving:latest-java
hub.baidubce.com/paddlepaddle/serving:xpu-beta
```
## 运行CUDA容器的要求
运行CUDA容器需要至少具有一个支持CUDA的GPU以及与您所使用的CUDA工具包版本兼容的驱动程序。
...
...
@@ -62,3 +65,39 @@ hub.baidubce.com/paddlepaddle/serving:xpu-beta
运行CUDA容器的机器
**只需要相应的NVIDIA驱动程序**
,而CUDA工具包不是必要的。
相关CUDA工具包版本、驱动版本和GPU架构的关系请参阅
[
nvidia-docker wiki
](
https://github.com/NVIDIA/nvidia-docker/wiki/CUDA
)
。
# (附录)所有镜像列表
编译镜像:
| Env | Version | Docker images tag | OS |
|----------|---------|------------------------------|-----------|
| CPU | 0.5.0 | 0.5.0-devel | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-devel | CentOS 7 |
| Cuda9.0 | 0.5.0 | 0.5.0-cuda9.0-cudnn7-devel | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-cuda9.0-cudnn7-devel | CentOS 7 |
| Cuda10.0 | 0.5.0 | 0.5.0-cuda10.0-cudnn7-devel | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-cuda10.0-cudnn7-devel | CentOS 7 |
| Cuda10.1 | 0.5.0 | 0.5.0-cuda10.1-cudnn7-devel | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-cuda10.1-cudnn7-devel | CentOS 7 |
| Cuda10.2 | 0.5.0 | 0.5.0-cuda10.2-cudnn8-devel | Ubuntu 16 |
| | <=0.4.0 | Nan | Nan |
| Cuda11.0 | 0.5.0 | 0.5.0-cuda11.0-cudnn8-devel | Ubuntu 18 |
| | <=0.4.0 | Nan | Nan |
运行镜像:
| Env | Version | Docker images tag | OS |
|----------|---------|-----------------------|-----------|
| CPU | 0.5.0 | 0.5.0 | Ubuntu 16 |
| | <=0.4.0 | 0.4.0 | CentOS 7 |
| Cuda9.0 | 0.5.0 | 0.5.0-cuda9.0-cudnn7 | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-cuda9.0-cudnn7 | CentOS 7 |
| Cuda10.0 | 0.5.0 | 0.5.0-cuda10.0-cudnn7 | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-cuda10.0-cudnn7 | CentOS 7 |
| Cuda10.1 | 0.5.0 | 0.5.0-cuda10.1-cudnn7 | Ubuntu 16 |
| | <=0.4.0 | 0.4.0-cuda10.1-cudnn7 | CentOS 7 |
| Cuda10.2 | 0.5.0 | 0.5.0-cuda10.2-cudnn8 | Ubuntu 16 |
| | <=0.4.0 | Nan | Nan |
| Cuda11.0 | 0.5.0 | 0.5.0-cuda11.0-cudnn8 | Ubuntu 18 |
| | <=0.4.0 | Nan | Nan |
doc/RUN_IN_DOCKER_CN.md
浏览文件 @
24afa1b8
...
...
@@ -16,8 +16,10 @@ Docker(GPU版本需要在GPU机器上安装nvidia-docker)
参考
[
该文档
](
DOCKER_IMAGES_CN.md
)
获取镜像:
以CPU编译镜像为例
```
shell
docker pull hub.baidubce.com/paddlepaddle/serving:latest
docker pull hub.baidubce.com/paddlepaddle/serving:latest
-devel
```
### 创建容器并进入
...
...
@@ -40,12 +42,12 @@ docker exec -it test bash
### 创建容器并进入
```
bash
nvidia-docker run
-p
9292:9292
--name
test
-dit
hub.baidubce.com/paddlepaddle/serving:latest-cuda
9.0-cudnn7
nvidia-docker run
-p
9292:9292
--name
test
-dit
hub.baidubce.com/paddlepaddle/serving:latest-cuda
10.2-cudnn8-devel
nvidia-docker
exec
-it
test
bash
```
或者
```
bash
docker run
--gpus
all
-p
9292:9292
--name
test
-dit
hub.baidubce.com/paddlepaddle/serving:latest-cuda
9.0-cudnn7
docker run
--gpus
all
-p
9292:9292
--name
test
-dit
hub.baidubce.com/paddlepaddle/serving:latest-cuda
10.2-cudnn8-devel
docker
exec
-it
test
bash
```
...
...
doc/SAVE_CN.md
浏览文件 @
24afa1b8
...
...
@@ -2,14 +2,79 @@
(简体中文|
[
English
](
./SAVE.md
)
)
## 从训练或预测脚本中保存
## 从已保存的模型文件中导出
如果已使用Paddle 的
`save_inference_model`
接口保存出预测要使用的模型,你可以使用Paddle Serving提供的名为
`paddle_serving_client.convert`
的内置模块进行转换。
```
python
python
-
m
paddle_serving_client
.
convert
--
dirname
.
/
your_inference_model_dir
```
也可以通过Paddle Serving的
`inference_model_to_serving`
接口转换成可用于Paddle Serving的模型文件。
```
python
import
paddle_serving_client.io
as
serving_io
serving_io
.
inference_model_to_serving
(
dirname
,
serving_server
=
"serving_server"
,
serving_client
=
"serving_client"
,
model_filename
=
None
,
params_filename
=
None
)
```
模块参数与
`inference_model_to_serving`
接口参数相同。
| 参数 | 类型 | 默认值 | 描述 |
|--------------|------|-----------|--------------------------------|
|
`dirname`
| str | - | 需要转换的模型文件存储路径,Program结构文件和参数文件均保存在此目录。|
|
`serving_server`
| str |
`"serving_server"`
| 转换后的模型文件和配置文件的存储路径。默认值为serving_server |
|
`serving_client`
| str |
`"serving_client"`
| 转换后的客户端配置文件存储路径。默认值为serving_client |
|
`model_filename`
| str | None | 存储需要转换的模型Inference Program结构的文件名称。如果设置为None,则使用
`__model__`
作为默认的文件名 |
|
`params_filename`
| str | None | 存储需要转换的模型所有参数的文件名称。当且仅当所有模型参数被保>存在一个单独的二进制文件中,它才需要被指定。如果模型参数是存储在各自分离的文件中,设置它的值为None |
**示例:从动态图模型中导出**
PaddlePaddle 2.0提供了全新的动态图模式,因此我们这里以imagenet ResNet50动态图为示例教学如何从已保存模型导出,并用于真实的在线预测场景。
```
wget https://paddle-serving.bj.bcebos.com/others/dygraph_res50.tar #模型
wget https://paddle-serving.bj.bcebos.com/imagenet-example/daisy.jpg #示例输入(向日葵)
tar xf dygraph_res50.tar
python -m paddle_serving_client.convert --dirname . --model_filename dygraph_model.pdmodel --params_filename dygraph_model.pdiparams --serving_server serving_server --serving_client serving_client
```
我们可以看到
`serving_server`
和
`serving_client`
文件夹分别保存着模型的服务端和客户端配置
启动服务端(GPU)
```
python -m paddle_serving_server_gpu.serve --model serving_server --port 9393 --gpu_id 0
```
客户端写法,保存为
`test_client.py`
```
from paddle_serving_client import Client
from paddle_serving_app.reader import Sequential, File2Image, Resize, CenterCrop
from paddle_serving_app.reader import RGB2BGR, Transpose, Div, Normalize
client = Client()
client.load_client_config(
"serving_client/serving_client_conf.prototxt")
client.connect(["127.0.0.1:9393"])
seq = Sequential([
File2Image(), Resize(256), CenterCrop(224), RGB2BGR(), Transpose((2, 0, 1)),
Div(255), Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], True)
])
image_file = "daisy.jpg"
img = seq(image_file)
fetch_map = client.predict(feed={"inputs": img}, fetch=["save_infer_model/scale_0.tmp_0"])
print(fetch_map["save_infer_model/scale_0.tmp_0"].reshape(-1))
```
执行
```
python test_client.py
```
即可看到成功的执行了预测,以上就是动态图ResNet50模型在Serving上预测的内容,其他动态图模型使用方式与之类似。
## 从训练或预测脚本中保存(静态图)
目前,Paddle Serving提供了一个save_model接口供用户访问,该接口与Paddle的
`save_inference_model`
类似。
```
python
import
paddle_serving_client.io
as
serving_io
serving_io
.
save_model
(
"imdb_model"
,
"imdb_client_conf"
,
{
"words"
:
data
},
{
"prediction"
:
prediction
},
fluid
.
default_main_program
())
paddle
.
static
.
default_main_program
())
```
imdb_model是具有服务配置的服务器端模型。 imdb_client_conf是客户端rpc配置。
...
...
@@ -32,22 +97,3 @@ for line in sys.stdin:
fetch_map
=
client
.
predict
(
feed
=
feed
,
fetch
=
fetch
)
print
(
"{} {}"
.
format
(
fetch_map
[
"prediction"
][
1
],
label
[
0
]))
```
## 从已保存的模型文件中导出
如果已使用Paddle 的
`save_inference_model`
接口保存出预测要使用的模型,则可以通过Paddle Serving的
`inference_model_to_serving`
接口转换成可用于Paddle Serving的模型文件。
```
python
import
paddle_serving_client.io
as
serving_io
serving_io
.
inference_model_to_serving
(
dirname
,
serving_server
=
"serving_server"
,
serving_client
=
"serving_client"
,
model_filename
=
None
,
params_filename
=
None
)
```
或者你可以使用Paddle Serving提供的名为
`paddle_serving_client.convert`
的内置模块进行转换。
```
python
python
-
m
paddle_serving_client
.
convert
--
dirname
.
/
your_inference_model_dir
```
模块参数与
`inference_model_to_serving`
接口参数相同。
| 参数 | 类型 | 默认值 | 描述 |
|--------------|------|-----------|--------------------------------|
|
`dirname`
| str | - | 需要转换的模型文件存储路径,Program结构文件和参数文件均保存在此目录。|
|
`serving_server`
| str |
`"serving_server"`
| 转换后的模型文件和配置文件的存储路径。默认值为serving_server |
|
`serving_client`
| str |
`"serving_client"`
| 转换后的客户端配置文件存储路径。默认值为serving_client |
|
`model_filename`
| str | None | 存储需要转换的模型Inference Program结构的文件名称。如果设置为None,则使用
`__model__`
作为默认的文件名 |
|
`params_filename`
| str | None | 存储需要转换的模型所有参数的文件名称。当且仅当所有模型参数被保存在一个单独的二进制文件中,它才需要被指定。如果模型参数是存储在各自分离的文件中,设置它的值为None |
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录