Predictor 方法¶
Paddle Inference 的推理器,由 NewPredictor
根据 Config
进行创建。用户可以根据 Predictor 提供的接口设置输入数据、执行模型推理、获取输出等。
创建 Predictor¶
API定义如下:
// 根据 Config 构建推理执行对象 Predictor
// 参数: config - 用于构建 Predictor 的配置信息
// 返回: *Predictor - 推理对象指针
func NewPredictor(config *Config) *Predictor
代码示例:
package main
// 引入 Paddle Golang Package
import pd "github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi"
import fmt
func main() {
// 创建 Config 对象
config := pd.NewConfig()
// 设置推理模型路径
config.SetModel("./model/resnet.pdmodel", "./model/resnet.pdiparams")
// 根据 Config 构建推理执行对象 Predictor
predictor := pd.NewPredictor(config)
fmt.Printf("%T\n", predictor)
}
输入输出与执行推理¶
API 定义如下:
// 获取模型输入 Tensor 的数量
// 参数:无
// 返回:uint - 模型输入 Tensor 的数量
func (p *Predictor) GetInputNum() uint
// 获取模型输出 Tensor 的数量
// 参数:无
// 返回:uint - 模型输出 Tensor 的数量
func (p *Predictor) GetOutputNum() uint
// 获取输入 Tensor 名称
// 参数:无
// 返回:[]string - 输入 Tensor 名称
func (p *Predictor) GetInputNames() []string
// 获取输出 Tensor 名称
// 参数:无
// 返回:[]string - 输出 Tensor 名称
func (p *Predictor) GetOutputNames() []string
// 获取输入 handle
// 参数:name - 输入handle名称
// 返回:*Tensor - 输入 handle
func (p *Predictor) GetInputHandle(name string) *Tensor
// 获取输出 handle
// 参数:name - 输出handle名称
// 返回:*Tensor - 输出 handle
func (p *Predictor) GetOutputHandle(name string) *Tensor
// 执行推理
// 参数:无
// 返回:None
func (p *Predictor) Run()
// 释放中间Tensor
// 参数:None
// 返回:None
func (p *Predictor) ClearIntermediateTensor()
// 释放内存池中的所有临时 Tensor
// 参数:None
// 返回:None
func (p *Predictor) TryShrinkMemory()
代码示例:
package main
// 引入 Paddle Golang Package
import pd "github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi"
import fmt
func main() {
// 创建 Config 对象
config := pd.NewConfig()
// 设置推理模型路径
config.SetModel("./model/resnet.pdmodel", "./model/resnet.pdiparams")
// 根据 Config 构建推理执行对象 Predictor
predictor := pd.NewPredictor(config)
// 获取输入输出 Tensor 信息
println("input num: ", predictor.GetInputNum())
println("input name: ", predictor.GetInputNames()[0])
println("output num: ", predictor.GetOutputNum())
println("output name: ", predictor.GetOutputNames()[0])
// 获取输入输出 Tensor 指针
input := predictor.GetInputHandle(predictor.GetInputNames()[0])
output := predictor.GetOutputTensors(predictor.GetOutputNames()[0])
inputData := make([]float32, 1 * 3 * 224 * 224)
for i := 0; i < 1 * 3 * 224 * 224; i++ {
inputData[i] = 1.0
}
input.Reshape([]int32{1, 3, 224, 224})
input.CopyFromCpu(inputData)
// 执行推理
predictor.Run()
// 获取输出 Tensor
outData := make([]float32, numElements(output.Shape()))
output.CopyToCpu(outData)
}
func numElements(shape []int32) int32 {
n := int32(1)
for _, v := range shape {
n *= v
}
return n
}