Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
FluidDoc
提交
08cb0128
F
FluidDoc
项目概览
PaddlePaddle
/
FluidDoc
通知
5
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
23
列表
看板
标记
里程碑
合并请求
111
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FluidDoc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
23
Issue
23
列表
看板
标记
里程碑
合并请求
111
合并请求
111
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
08cb0128
编写于
1月 25, 2019
作者:
N
nhzlx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1. update analysis predictor interface 2. add trt int8 doc
上级
da680625
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
49 addition
and
17 deletion
+49
-17
doc/fluid/advanced_usage/deploy/inference/native_infer.md
doc/fluid/advanced_usage/deploy/inference/native_infer.md
+6
-5
doc/fluid/advanced_usage/deploy/inference/paddle_tensorrt_infer.md
.../advanced_usage/deploy/inference/paddle_tensorrt_infer.md
+43
-12
未找到文件。
doc/fluid/advanced_usage/deploy/inference/native_infer.md
浏览文件 @
08cb0128
...
@@ -98,7 +98,7 @@ CHECK(predictor->Run(slots, &outputs));
...
@@ -98,7 +98,7 @@ CHECK(predictor->Run(slots, &outputs));
两种模式中,第一种比较方便;第二种则可以严格控制内存的管理,便于与
`tcmalloc`
等库的集成。
两种模式中,第一种比较方便;第二种则可以严格控制内存的管理,便于与
`tcmalloc`
等库的集成。
### 基于 contrib::AnalysisConfig 提升性能
(预发布)
### 基于 contrib::AnalysisConfig 提升性能
*AnalyisConfig 目前正在预发布阶段,用 `namespace contrib` 进行了保护,后续可能会有调整*
*AnalyisConfig 目前正在预发布阶段,用 `namespace contrib` 进行了保护,后续可能会有调整*
类似
`NativeConfig`
,
`AnalysisConfig`
可以创建一个经过一系列优化的高性能预测引擎。 其中包含了计算图的分析和优化,以及对一些重要 Op 的融合改写等,
**对使用了 While, LSTM, GRU 等模型性能有大幅提升**
。
类似
`NativeConfig`
,
`AnalysisConfig`
可以创建一个经过一系列优化的高性能预测引擎。 其中包含了计算图的分析和优化,以及对一些重要 Op 的融合改写等,
**对使用了 While, LSTM, GRU 等模型性能有大幅提升**
。
...
@@ -107,9 +107,10 @@ CHECK(predictor->Run(slots, &outputs));
...
@@ -107,9 +107,10 @@ CHECK(predictor->Run(slots, &outputs));
```
c++
```
c++
AnalysisConfig
config
;
AnalysisConfig
config
;
config
.
model_dir
=
xxx
;
config
.
SetModel
(
dirname
);
// 设定模型的目录
config
.
use_gpu
=
false
;
// 目前还不支持 GPU 的优化
config
.
EnableUseGpu
(
100
,
0
/*gpu id*/
);
// 使用GPU, CPU下使用config.DisableGpu();
config
.
specify_input_name
=
true
;
// 需要指定输入的 name
config
.
SwitchSpecifyInputNames
(
true
);
// 需要指定输入的 name
config
.
SwitchIrOptim
();
// 打开优化开关,运行时会执行一系列的优化
```
```
这里需要注意的是,输入的 PaddleTensor 需要指定,比如之前的例子需要修改为
这里需要注意的是,输入的 PaddleTensor 需要指定,比如之前的例子需要修改为
...
@@ -129,7 +130,7 @@ tensor.name = "input0"; // 注意这里的 name 需要设定
...
@@ -129,7 +130,7 @@ tensor.name = "input0"; // 注意这里的 name 需要设定
### 性能建议
### 性能建议
1.
在 CPU型号允许的情况下,尽量使用带 AVX 和 MKL 的版本
1.
在 CPU型号允许的情况下,尽量使用带 AVX 和 MKL 的版本
2.
复用输入和输出的
`PaddleTensor`
以避免频繁分配内存拉低性能
2.
复用输入和输出的
`PaddleTensor`
以避免频繁分配内存拉低性能
3.
CPU预测,可以尝试把
`NativeConfig`
改成成
`AnalysisConfig`
来进行优化
3.
CPU
或GPU
预测,可以尝试把
`NativeConfig`
改成成
`AnalysisConfig`
来进行优化
## 详细代码参考
## 详细代码参考
...
...
doc/fluid/advanced_usage/deploy/inference/paddle_tensorrt_infer.md
浏览文件 @
08cb0128
# 使用TensorRT库预测
# 使用
Paddle-
TensorRT库预测
NVIDIA TensorRT 是一个高性能的深度学习预测库,可为深度学习推理应用程序提供低延迟和高吞吐量。Paddle
1.0 采用了子图的形式对TensorRT进行了初步集成,即我们可以使用该模块来提升Paddle模型的预测性能。该模块依旧在持续开发中,目前已支持的模型有:AlexNet, MobileNet, ResNet50, VGG19, ResNext, Se-ReNext, GoogleNet, DPN, ICNET
, MobileNet-SSD等。在这篇文档中,我们将会对Paddle-TensorRT库的获取、使用和原理进行介绍。
NVIDIA TensorRT 是一个高性能的深度学习预测库,可为深度学习推理应用程序提供低延迟和高吞吐量。Paddle
Paddle 采用了子图的形式对TensorRT进行了集成,即我们可以使用该模块来提升Paddle模型的预测性能。该模块依旧在持续开发中,目前已支持的模型有:AlexNet, MobileNet, ResNet50, VGG19, ResNext, Se-ReNext, GoogleNet, DPN, ICNET, Deeplabv3
, MobileNet-SSD等。在这篇文档中,我们将会对Paddle-TensorRT库的获取、使用和原理进行介绍。
## 内容
-
[
编译Paddle-TRT预测库
](
#编译Paddle-TRT预测库
)
-
[
Paddle-TRT接口使用
](
#Paddle-TRT接口使用
)
-
[
Paddle-TRT样例编译测试
](
#Paddle-TRT样例编译测试
)
-
[
Paddle-TRT INT8使用
](
#Paddle-TRT_INT8使用
)
-
[
Paddle-TRT子图运行原理
](
#Paddle-TRT子图运行原理
)
## 编译带`TensorRT`的预测库
## <a name="编译Paddle-TRT预测库">编译Paddle-TRT预测库</a>
**使用Docker编译预测库**
**使用Docker编译预测库**
...
@@ -59,7 +66,7 @@ NVIDIA TensorRT 是一个高性能的深度学习预测库,可为深度学习
...
@@ -59,7 +66,7 @@ NVIDIA TensorRT 是一个高性能的深度学习预测库,可为深度学习
`fluid_inference_install_dir`
下, paddle目录包含了预测库的头文件和预测库的lib, version.txt 中包含了lib的版本和配置信息,third_party 中包含了预测库依赖的第三方库
`fluid_inference_install_dir`
下, paddle目录包含了预测库的头文件和预测库的lib, version.txt 中包含了lib的版本和配置信息,third_party 中包含了预测库依赖的第三方库
##
Paddle TensorRT使用
##
<a name="Paddle-TRT接口使用">Paddle-TRT接口使用</a>
[
`paddle_inference_api.h`
](
'https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/api/paddle_inference_api.h'
)
定义了使用TensorRT的所有接口。
[
`paddle_inference_api.h`
](
'https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/api/paddle_inference_api.h'
)
定义了使用TensorRT的所有接口。
...
@@ -79,13 +86,13 @@ using paddle::contrib::AnalysisConfig;
...
@@ -79,13 +86,13 @@ using paddle::contrib::AnalysisConfig;
void
RunTensorRT
(
int
batch_size
,
std
::
string
model_dirname
)
{
void
RunTensorRT
(
int
batch_size
,
std
::
string
model_dirname
)
{
// 1. 创建MixedRTConfig
// 1. 创建MixedRTConfig
AnalysisConfig
config
(
tru
e
);
AnalysisConfig
config
(
model_dirnam
e
);
config
.
model_dir
=
model_dirname
;
// config->SetModel(model_dirname + "/model",
config
->
use_gpu
=
true
;
// model_dirname + "/params")
;
config
->
device
=
0
;
config
->
fraction_of_gpu_memory
=
0.15
;
config
->
EnableUseGpu
(
100
,
0
/*gpu_id*/
)
;
config
->
EnableTensorRtEngine
(
1
<<
20
/*work_space_size*/
,
batch_size
/*max_batch_size*/
);
config
->
EnableTensorRtEngine
(
1
<<
20
/*work_space_size*/
,
batch_size
/*max_batch_size*/
);
// 2. 根据config 创建predictor
// 2. 根据config 创建predictor
auto
predictor
=
CreatePaddlePredictor
(
config
);
auto
predictor
=
CreatePaddlePredictor
(
config
);
// 3. 创建输入 tensor
// 3. 创建输入 tensor
...
@@ -120,7 +127,8 @@ int main() {
...
@@ -120,7 +127,8 @@ int main() {
}
}
```
```
## 样例编译
## <a name="Paddle-TRT样例编译测试">Paddle-TRT样例编译测试</a>
1.
下载样例
1.
下载样例
```
```
wget http://paddle-inference-dist.cdn.bcebos.com/tensorrt_test/paddle_trt_samples.tar.gz
wget http://paddle-inference-dist.cdn.bcebos.com/tensorrt_test/paddle_trt_samples.tar.gz
...
@@ -161,8 +169,31 @@ int main() {
...
@@ -161,8 +169,31 @@ int main() {
sh run_impl.sh BASE_DIR/fluid_inference_install_dir/ thread_mobilenet_test SAMPLE_BASE_DIR/sample/mobilenetv1
sh run_impl.sh BASE_DIR/fluid_inference_install_dir/ thread_mobilenet_test SAMPLE_BASE_DIR/sample/mobilenetv1
```
```
## <a name="Paddle-TRT_INT8使用">Paddle-TRT INT8使用</a>
1.
Paddle-TRT INT8 简介
神经网络的参数在一定程度上是冗余的,在很多任务上,我们可以在保证模型精度的前提下,将Float32的模型转换成Int8的模型。目前,Paddle-TRT支持离线将预训练好的Float32模型转换成Int8的模型,具体的流程如下:1)
**生成校准表**
(Calibration table);我们准备500张左右的真实输入数据,并将数据输入到模型中去,Paddle-TRT会统计模型中每个op输入和输出值的范围信息,并将记录到校准表中,这些信息有效的减少了模型转换时的信息损失。2)生成校准表后,再次运行模型,
**Paddle-TRT会自动加载校准表**
,并进行INT8模式下的预测。
2.
编译测试INT8样例
```shell
cd SAMPLE_BASE_DIR/sample
# sh run_impl.sh {预测库的地址} {测试脚本的名字} {模型目录}
# 我们随机生成了500个输入来模拟这一过程,建议大家用真实样例进行实验。
sh run_impl.sh BASE_DIR/fluid_inference_install_dir/ fluid_generate_calib_test SAMPLE_BASE_DIR/sample/mobilenetv1
```
运行结束后,在 `SAMPLE_BASE_DIR/sample/build/mobilenetv1` 模型目录下会多出一个名字为trt_calib_*的文件,即校准表。
``` shell
# 执行INT8预测
# 将带校准表的模型文件拷贝到特定地址
cp -rf SAMPLE_BASE_DIR/sample/build/mobilenetv1 SAMPLE_BASE_DIR/sample/mobilenetv1_calib
sh run_impl.sh BASE_DIR/fluid_inference_install_dir/ fluid_int8_test SAMPLE_BASE_DIR/sample/mobilenetv1_calib
```
## 子图运行原理
## <a name="Paddle-TRT子图运行原理">Paddle-TRT子图运行原理</a>
PaddlePaddle采用子图的形式对TensorRT进行集成,当模型加载后,神经网络可以表示为由变量和运算节点组成的计算图。Paddle TensorRT实现的功能是能够对整个图进行扫描,发现图中可以使用TensorRT优化的子图,并使用TensorRT节点替换它们。在模型的推断期间,如果遇到TensorRT节点,Paddle会调用TensoRT库对该节点进行优化,其他的节点调用Paddle的原生实现。TensorRT在推断期间能够进行Op的横向和纵向融合,过滤掉冗余的Op,并对特定平台下的特定的Op选择合适的kenel等进行优化,能够加快模型的预测速度。
PaddlePaddle采用子图的形式对TensorRT进行集成,当模型加载后,神经网络可以表示为由变量和运算节点组成的计算图。Paddle TensorRT实现的功能是能够对整个图进行扫描,发现图中可以使用TensorRT优化的子图,并使用TensorRT节点替换它们。在模型的推断期间,如果遇到TensorRT节点,Paddle会调用TensoRT库对该节点进行优化,其他的节点调用Paddle的原生实现。TensorRT在推断期间能够进行Op的横向和纵向融合,过滤掉冗余的Op,并对特定平台下的特定的Op选择合适的kenel等进行优化,能够加快模型的预测速度。
下图使用一个简单的模型展示了这个过程:
下图使用一个简单的模型展示了这个过程:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录