预测示例 (GO)

本章节包含2部分内容:(1) 运行 GO 示例程序;(2) GO 预测程序开发说明

运行 GO 示例程序

1. 获取 C 预测库

下载C预测库

您可以选择直接下载paddle_inference_c预测库

源码编译方式获取 C 预测库

您可以源码编译的方式获取 C 预测库,请参照以下两个文档进行源码编译

编译完成后,在编译目录下的 paddle_inference_c_install_dir 即为 C 预测库,目录结构如下:

paddle_inference_c_install_dir
├── paddle
│   ├── include               C 预测库头文件目录
│   │   └── pd_common.h
│   │   └── pd_config.h
│   │   └── pd_inference_api.h         C 预测库头文件
│   │   └── pd_predictor.h
│   │   └── pd_tensor.h
│   │   └── pd_types.h
│   │   └── pd_utils.h
│   └── lib
│       ├── libpaddle_inference_c.a          C 静态预测库文件
│       └── libpaddle_inference_c.so         C 动态预测库文件
├── third_party
│   └── install                          第三方链接库和头文件
│       ├── cryptopp
│       ├── gflags
│       ├── glog
│       ├── mkldnn
│       ├── mklml
│       ├── protobuf
│       └── xxhash
└── version.txt                          版本信息与编译选项信息

其中 version.txt 文件中记录了该预测库的版本信息,包括Git Commit ID、使用OpenBlas或MKL数学库、CUDA/CUDNN版本号,如:

GIT COMMIT ID: 1bf4836580951b6fd50495339a7a75b77bf539f6
WITH_MKL: ON
WITH_MKLDNN: ON
WITH_GPU: ON
CUDA version: 10.1
CUDNN version: v7.6
CXX compiler version: 8.2
WITH_TENSORRT: ON
TensorRT version: v6

2. 准备预测部署模型

下载 resnet50 模型后解压,得到 Paddle Combined 形式的模型。

wget https://paddle-inference-dist.bj.bcebos.com/Paddle-Inference-Demo/resnet50.tgz
tar zxf resnet50.tgz

# 获得 resnet50 目录结构如下
resnet50/
├── inference.pdmodel
├── inference.pdiparams
└── inference.pdiparams.info

3. 获取预测示例代码

本章节 GO 预测示例代码位于 Paddle-Inference-Demo,目录下的resnet50子目录。

4. 准备预测执行目录

执行预测程序之前需要完成以下几个步骤

  1. 使用go get获取golang paddle api,go 的版本需要大于等于 1.15

# 此处使用对应tag的CommitId,假设为76e5724,可在步骤1中查看到
go get -d -v github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi@76e5724
  1. 软链

go get默认会将代码下载到GOMODCACHE目录下,您可以通过go env | grep GOMODCACHE的方式,查看该路径,在官网发布的docker镜像中该路径一般默认为/root/gopath/pkg/mod,进入到golang api代码路径建立软连接,将c预测库命名为paddle_inference_c

eval $(go env | grep GOMODCACHE)
# 按需修改最后的goapi版本号
cd ${GOMODCACHE}/github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi\@v0.0.0-20210517084506-76e5724c16a5/
ln -s ${PADDLE_C_DOWNLOAD_DIR}/paddle_inference_c_install_dir paddle_inference_c
  1. 进入到golang api代码路径后,运行单测,验证。

bash test.sh

5. 编译执行

进入步骤3中预测示例代码所在目录,执行:

go mod init demo
go get -d -v github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi@76e5724
go build .

./demo -thread_num 1 -work_num 1 -cpu_math 2

GO 预测程序开发说明

使用 Paddle Inference 开发 GO 预测程序仅需以下六个步骤:

(1) 引用 Paddle Inference 的 GO API

import pd "github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi"

(2) 创建配置对象,并指定预测模型路径,详细可参考 go API 文档 - Config

// 配置 PD_AnalysisConfig
config := paddle.NewConfig()

// 设置预测模型路径,即为本小节第2步中下载的模型
config.SetModel("resnet50/inference.pdmodel", "resnet50/inference.pdiparams")

(3) 根据Config创建预测对象,详细可参考 go API 文档 - Predictor

predictor := paddle.NewPredictor(config)

(4) 设置模型输入和输出 Tensor,详细可参考 go API 文档 - Tensor

// 创建输入 Tensor
inNames := predictor.GetInputNames()
inHandle := predictor.GetInputHandle(inNames[0])

data := make([]float32, 1*3*224*224)
for i := 0; i < len(data); i++ {
    data[i] = float32(i%255) * 0.1
}
inHandle.Reshape([]int32{1, 3, 224, 224})
inHandle.CopyFromCpu(data)

(5) 执行预测引擎,详细可参考 go API 文档 - Predictor

predictor.Run()

(6) 获得预测结果,详细可参考 go API 文档 - Tensor

outNames := predictor.GetOutputNames()
outHandle := predictor.GetOutputHandle(outNames[0])
outData := make([]float32, numElements(outHandle.Shape()))
outHandle.CopyToCpu(outData)

func numElements(shape []int32) int32 {
	n := int32(1)
	for _, v := range shape {
		n *= v
	}
	return n
}