2022-08-23 21:21:29 +08:00
|
|
|
|
## nn.RuntimeManager
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
class RuntimeManager
|
|
|
|
|
```
|
|
|
|
|
RuntimeManager持有运行时资源,在CPU时持有线程池,内存池等资源;在GPU时持有Kernal池等资源;
|
|
|
|
|
模型的执行需要使用RuntimeManager的资源,在同一个线程内RuntimeManager可以被共享使用,*注意:不可跨线程使用*
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `RuntimeManager()`
|
|
|
|
|
创建一个空Tensor
|
|
|
|
|
|
|
|
|
|
*在实际使用中创建空RuntimeManager没有意义,请使用`nn.create_runtime_manager`来创建RuntimeManager*
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:RuntimeManager对象
|
|
|
|
|
|
|
|
|
|
返回类型:`RuntimeManager`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `set_cache(cache_path)`
|
|
|
|
|
|
|
|
|
|
设置缓存文件路径,在GPU情况下可以把kernel和Op-info缓存到该文件中
|
|
|
|
|
|
|
|
|
|
参考:[Interpreter.setCacheFile](Interpreter.html#setcachefile-cache-path)
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `cache_path:str`
|
|
|
|
|
|
|
|
|
|
返回:`None`
|
|
|
|
|
|
|
|
|
|
返回类型:`None`
|
|
|
|
|
|
2022-12-30 15:18:58 +08:00
|
|
|
|
---
|
|
|
|
|
### `set_external(path)`
|
|
|
|
|
|
|
|
|
|
设置额外数据文件路径,使用该文件中的数据作为权重或常量
|
|
|
|
|
|
|
|
|
|
参考:[Interpreter.setExternalFile](Interpreter.html#setexternalfile-path)
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `path:str`
|
|
|
|
|
|
|
|
|
|
返回:`None`
|
|
|
|
|
|
|
|
|
|
返回类型:`None`
|
|
|
|
|
|
2022-08-23 21:21:29 +08:00
|
|
|
|
---
|
|
|
|
|
### `update_cache()`
|
|
|
|
|
|
|
|
|
|
在执行推理之后,更新GPU的kernel信息到缓存文件;应该在每次推理结束后指定该函数
|
|
|
|
|
|
|
|
|
|
参考:[Interpreter.updateCacheFile](Interpreter.html#updatecachefile-session-flag)
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `None`
|
|
|
|
|
|
|
|
|
|
返回:`None`
|
|
|
|
|
|
|
|
|
|
返回类型:`None`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `set_mode(mode)`
|
|
|
|
|
|
|
|
|
|
设置会话的执行模式
|
|
|
|
|
|
|
|
|
|
参考:[Interpreter.setSessionMode](Interpreter.html#setsessionmode-mode)
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `mode:int` 执行Session的模式,请参考[mode](Interpreter.html#setsessionmode-mode)
|
|
|
|
|
|
|
|
|
|
返回:`None`
|
|
|
|
|
|
|
|
|
|
返回类型:`None`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `set_hint(mode, value)`
|
|
|
|
|
|
|
|
|
|
设置执行时的额外信息
|
|
|
|
|
|
|
|
|
|
参考:[Interpreter.setSessionMode](Interpreter.html#setsessionhint-mode-value)
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
- `mode:int` hint类型
|
|
|
|
|
- `value:int` hint值
|
|
|
|
|
|
|
|
|
|
返回:`None`
|
|
|
|
|
|
|
|
|
|
返回类型:`None`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
### `Example`
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
import MNN.nn as nn
|
|
|
|
|
import MNN.cv as cv
|
|
|
|
|
import MNN.numpy as np
|
|
|
|
|
import MNN.expr as expr
|
|
|
|
|
|
|
|
|
|
config = {}
|
|
|
|
|
config['precision'] = 'low'
|
|
|
|
|
# 使用GPU后端
|
|
|
|
|
config['backend'] = 3
|
|
|
|
|
config['numThread'] = 4
|
|
|
|
|
|
|
|
|
|
# 创建RuntimeManager
|
|
|
|
|
rt = nn.create_runtime_manager((config,))
|
|
|
|
|
rt.set_cache(".cachefile")
|
|
|
|
|
# mode = auto_backend
|
|
|
|
|
rt.set_mode(9)
|
|
|
|
|
# tune_num = 20
|
|
|
|
|
rt.set_hint(0, 20)
|
|
|
|
|
# 加载模型并使用RuntimeManager
|
|
|
|
|
net = nn.load_module_from_file('mobilenet_v1.mnn', ['data'], ['prob'], runtime_manager=rt)
|
|
|
|
|
# cv读取bgr图片
|
|
|
|
|
image = cv.imread('cat.jpg')
|
|
|
|
|
# 转换为float32, 形状为[224,224,3]
|
|
|
|
|
image = cv.resize(image, (224, 224), mean=[103.94, 116.78, 123.68], norm=[0.017, 0.017, 0.017])
|
|
|
|
|
# 增加batch HWC to NHWC
|
|
|
|
|
input_var = np.expand_dims(image, 0)
|
|
|
|
|
# NHWC to NC4HW4
|
|
|
|
|
input_var = expr.convert(input_var, expr.NC4HW4)
|
|
|
|
|
# 执行推理
|
|
|
|
|
output_var = net.forward(input_var)
|
|
|
|
|
# NC4HW4 to NHWC
|
|
|
|
|
output_var = expr.convert(output_var, expr.NHWC)
|
|
|
|
|
# 打印出分类结果, 282为猫
|
|
|
|
|
print("output belong to class: {}".format(np.argmax(output_var)))
|
|
|
|
|
```
|