setSessionHint(mode,
value)
getSessionInput(session,
|tensorName)
getSessionInputAll(session)
getSessionOutput(session,
|tensorName)
getSessionOutputAll(session)
resizeTensor(tensor,
shape)
resizeSession(session)
runSession(session)
runSessionWithCallBack(session,
begin_callback,
end_callback)
runSessionWithCallBackInfo(session,
begin_callback,
end_callback)
cache()
removeCache()
Example
MNN.Session
MNN.OpInfo
MNN.Tensor
MNN.CVImageProcess
MNN.CVMatrix
expr.Var
nn._Module
nn.RuntimeManager
optim.Optimizer
data.Dataset
data.DataLoader
model_path:str
MNN模型所放置的完整文件路径,其中MNN模型可由Tensorflow、Caffe、PyTorch和 ONNX等模型进行转换得到
返回:Interpreter对象
返回类型:
Interpreter
createRuntime(config)
根据配置创建一个Runtime,并获取config中指定的参数是否生效;默认情况下,在
createSession
时对应create单独一个Runtime。对于串行的一系列模型,可以先单独创建Runtime,然后在各Session创建时传入,使各模型用共享同样的运行时资源(对CPU而言为线程池、内存池,对GPU而言Kernel池等),参考
RuntimeManager
config:dict
创建Runtime的配置, 其key, value和含义如下变所示
backend
str
or
int
可选值:
"CPU"或0
(默认),
"OPENCL"或3
,
"OPENGL"或6
,
"VULKAN"或7
,
"METAL"或1
,
"TRT"或9
,
"CUDA"或2
,
"HIAI"或8
precision
可选值:
"normal"
(默认),
"low"
,
"high","lowBF"
numThread
int
or
long
value
为推理线程数,只在 CPU 后端下起作用
saveTensors
tuple
of
str
value
为想要保留成为输出层的
tensorName
inputPaths
tuple
of
str
推理路径的起点,输入
tensorName
outputPaths
tuple
of
str
推理路径的终点,输出
tensorName
返回:一个
pair
,
first:Runtime对象的
PyCapsule
,可以用来创建Session
second:为
tuple
of
bool
;代表config中对应的配置是否生效
返回类型:
pair
createSession(config,
|runtime)
根据配置创建
Session
,返回一个
Session
对象。
config:dict
创建推理会话的配置,含义同
createRuntime
方法
runtime:PyCapsule
指定的runtime信息,如果不指定,则使用config中的配置创建runtime
返回:持有推理会话数据的Session对象
返回类型:
Session
setCacheFile(cache_path)
设置缓存文件路径,在GPU情况下可以把kernel和Op-info缓存到该文件中
cache_path:str
缓存文件的路径
返回:
None
返回类型:
None
setExternalFile(path)
设置额外数据文件路径,使用该文件中的数据作为权重或常量
path:str
额外数据文件的路径
返回:
None
返回类型:
None
updateCacheFile(session,
flag)
在执行推理之后,更新GPU的kernel信息到缓存文件;应该在每次推理结束后指定该函数
session:Session
需要缓存的会话
flag
保留参数,目前未使用;输入
0
即可
返回:error code 参考
runSession
方法
返回类型:
int
setSessionMode(mode)
设置会话的执行模式
mode:int
执行Session的模式,含义如下表所示
getSessionInput(session,
|tensorName)
根据tensorName,返回模型指定会话的输入tensor;如果没有指定tensor名称,则返回第一个输入tensor
session:Session
持有推理会话数据的Session对象
tensorName:str
Tensor的名称
返回:输入Tensor对象
返回类型:
Tensor
getSessionInputAll(session)
返回模型指定会话的所有的输入tensor
session:Session
持有推理会话数据的Session对象
返回:所有的输入Tensor对象,类型为字典,其中key为tensorName,类型为str;value为一个输入tensor,类型为Tensor
返回类型:
dict
getSessionOutput(session,
|tensorName)
根据tensorName,返回模型指定会话的输出tensor;如果没有指定tensor名称,则返回第一个输出tensor
session:Session
持有推理会话数据的Session对象
tensorName:str
Tensor的名称
返回:输出Tensor对象
返回类型:
Tensor
getSessionOutputAll(session)
返回模型指定会话的所有的输出tensor
session:Session
持有推理会话数据的Session对象
返回:所有的输出Tensor对象,类型为字典,其中key为tensorName,类型为str;value为一个输入tensor,类型为Tensor
返回类型:
dict
resizeTensor(tensor,
shape)
改变tensor形状,并重新分配内存
tensor:Tensor
需要改变形状的Tensor对象,一般为输入tensor
shape:tuple
新的形状,元素类型为
int
返回:
None
返回类型:
None
resizeSession(session)
为session分配内存,进行推理准备工作;该API一般配合
resizeTensor
一起调用,修改Tensor输入形状后对应整个推理过程中的内存分配也需要修改。
session:Session
改变输入形状后需要重新分配内存的Session对象
返回:成功返回True,否则抛出相应的异常
返回类型:
bool
runSession(session)
运行session执行模型推理,返回对应的error code,需要根据错误码来判断后续是否成功执行模型推理
session:Session
执行推理的Session对象
返回:错误码,具体含义如下表
value
runSessionWithCallBack(session,
begin_callback,
end_callback)
该API本质上与runSession一致,但是提供了用户hook函数的接口,在运行session做网络推理,每层推理前前后会执行的begin_callback和end_callback 并根据返回值来决定是否继续执行
session:Session
执行推理的Session对象
begin_callback:function|lambda
每层推理前执行的回调函数,函数原型为:
def begin_callback(tensors, name):
# do something
return True
tensors:[Tensor]
该层的输入tensor
name:str
该层的名称
返回:True
继续执行推理,False
停止执行推理
返回类型:bool
end_callback:function|lambda
每层推理后执行的回调函数,函数原型同上
返回:同runSession
返回类型:int
runSessionWithCallBackInfo(session, begin_callback, end_callback)
该API与runSessionWithCallBack相似,但是回调函数中增加了Op的类型和计算量信息,可以用来评估模型的计算量
session:Session
执行推理的Session对象
begin_callback:function|lambda
每层推理前执行的回调函数,函数原型为:
def begin_callback(tensors, opinfo):
# do something
return True
tensors:[Tensor]
该层的输入tensor
opinfo:OpInfo
该层Op的相关信息,参考OpInfo
返回:True
继续执行推理,False
停止执行推理
返回类型:bool
end_callback:function|lambda
每层推理后执行的回调函数,函数原型同上
返回:同runSession
返回类型:int
cache()
将该Interpreter存储到当前线程的缓存中,以便多次使
返回:None
返回类型:None
removeCache()
将该Session从当前线程的缓存中移除
返回:None
返回类型:None
Example
import MNN
import MNN.cv as cv
import MNN.numpy as np
# 创建interpreter
interpreter = MNN.Interpreter("mobilenet_v1.mnn")
# 创建session
session = interpreter.createSession()
# 获取会话的输入输出张量
input_tensor = interpreter.getSessionInput(session)
output_tensor = interpreter.getSessionOutput(session)
# 将输入resize到[1, 3, 224, 224]
interpreter.resizeTensor(input_tensor, (1, 3, 224, 224))
# 读取图片,转换为size=(224, 224), dtype=float32,并赋值给input_tensor
image = cv.imread('cat.jpg')
image = cv.resize(image, (224, 224), mean=[103.94, 116.78, 123.68], norm=[0.017, 0.017, 0.017])
# HWC to NHWC
image = np.expand_dims(image, 0)
tmp_input = MNN.Tensor(image)
input_tensor.copyFrom(tmp_input)
# 执行会话推理
interpreter.runSession(session)
# 将输出结果拷贝到tmp_output中
tmp_output = MNN.Tensor((1, 1001), MNN.Halide_Type_Float, MNN.Tensor_DimensionType_Caffe)
output_tensor.copyToHostTensor(tmp_output)
# 打印出分类结果, 282为猫
print("output belong to class: {}".format(np.argmax(tmp_output.getData())))