5.5. sail.Engine

Engine可以实现bmodel的加载与管理,是实现模型推理的主要模块。

5.5.1. __init__

初始化Engine

接口形式1:

创建Engine实例,并不加载bmodel

def __init__(tpu_id: int)

def __init__(self, handle: sail.Handle)

参数说明1:

  • tpu_id: int

指定Engine实例使用的智能视觉深度学习处理器的id

  • handle: sail.Handle

指定Engine实例使用的设备标识Handle

接口形式2:

创建Engine实例并加载bmodel,需指定bmodel路径或内存中的位置。

def __init__(self, bmodel_path: str, tpu_id: int, mode: sail.IOMode)

def __init__(self, bmodel_bytes: bytes, bmodel_size: int, tpu_id: int, mode: sail.IOMode)

参数说明2:

  • bmodel_path: str

指定bmodel文件的路径

  • tpu_id: int

指定Engine实例使用的智能视觉深度学习处理器的id

  • mode: sail.IOMode

指定输入/输出Tensor所在的内存位置:系统内存或设备内存。

  • bmodel_bytes: bytes

bmodel在系统内存中的bytes。

  • bmodel_size: int

bmodel在内存中的字节数

示例代码:
import sophon.sail as sail
import os

if __name__ == '__main__':
    engine1 = sail.Engine(0)
    bmodel_path = "your_bmodel.bmodel"
    handle = sail.Handle(0)
    engine2 = sail.Engine(handle)

    engine3 = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    file = open(bmodel_path,"rb")
    datas = file.read()
    file_size = os.path.getsize(bmodel_path)
    engine4 = sail.Engine(datas,file_size,0,sail.IOMode.SYSI)

5.5.2. get_handle

获取Engine中使用的设备句柄sail.Handle

接口形式:
def get_handle(self)->sail.Handle

返回值说明:

  • handle: sail.Handle

返回Engine中的设备句柄。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    engine1 = sail.Engine(0)
    handle = engine1.get_handle()

5.5.3. load

将bmodel载入Engine中。

接口形式1:

指定bmodel路径,从文件中载入bmodel。

def load(self, bmodel_path: str)->bool

参数说明1:

  • bmodel_path: str

bmodel的文件路径

接口形式2:

从系统内存中载入bmodel。

def load(self, bmodel_bytes: bytes, bmodel_size: int)->bool

参数说明2:

  • bmodel_bytes: bytes

bmodel在系统内存中的bytes。

  • bmodel_size: int

bmodel在内存中的字节数。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine1 = sail.Engine(0)
    engine1.load(bmodel_path)

5.5.4. get_graph_names

获取Engine中所有载入的计算图的名称。

接口形式:
def get_graph_names(self)->list

返回值说明:

  • graph_names: list

Engine中所有计算图的name的列表。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine1 = sail.Engine(0)
    engine1.load(bmodel_path)
    graph_names = engine1.get_graph_names()

5.5.5. set_io_mode

设置Engine的输入/输出Tensor所在的内存位置:系统内存或设备内存。

接口形式:
def set_io_mode(self, graph_name: str, mode: sail.IOMode)->None

参数说明:

  • graph_name: str

需要配置的计算图的name。

  • mode: sail.IOMode

设置Engine的输入/输出Tensor所在的内存位置:系统内存或设备内存。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    engine.set_io_mode(graph_name,sail.IOMode.SYSI)

5.5.6. graph_is_dynamic

判断选定计算图是否为动态。

接口形式:
def graph_is_dynamic(self, graph_name: str)->bool

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

返回值说明:

  • is_dynamic: bool

返回选定计算图是否为动态的判断结果。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    is_dynamic = engine.graph_is_dynamic(graph_name)

5.5.7. get_input_names

获取选定计算图中所有输入Tensor的name

接口形式:
def get_input_names(self, graph_name: str)->list

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

返回值说明:

  • input_names: list

返回选定计算图中所有输入Tensor的name的列表。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    input_names = engine.get_input_names(graph_name)

5.5.8. get_output_names

获取选定计算图中所有输出Tensor的name。

接口形式:
def get_output_names(self, graph_name: str)->list

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

返回值说明:

  • output_names: list

返回选定计算图中所有输出Tensor的name的列表。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    output_names = engine.get_output_names(graph_name)

5.5.9. get_max_input_shapes

查询选定计算图中所有输入Tensor对应的最大shape。

在静态模型中,输入Tensor的shape是固定的,应等于最大shape。

在动态模型中,输入Tensor的shape应小于等于最大shape。

接口形式:
def get_max_input_shapes(self, graph_name: str)->dict {str : list}

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

返回值说明:

  • max_shapes: dict{str : list}

返回输入Tensor中的最大shape。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    max_input_shapes = engine.get_max_input_shapes(graph_name)

5.5.10. get_input_shape

查询选定计算图中特定输入Tensor的shape。

接口形式:
def get_input_shape(self, graph_name: str, tensor_name: str)->list

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

  • tensor_name: str

需要查询的Tensor的name。

返回值说明:

  • tensor_shape: list

该name下的输入Tensor中的最大维度的shape。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    input_name = engine.get_input_names(graph_name)[0]
    input_shape = engine.get_input_shape(graph_name,input_name)

5.5.11. get_max_output_shapes

查询选定计算图中所有输出Tensor对应的最大shape。

在静态模型中,输出Tensor的shape是固定的,应等于最大shape。

在动态模型中,输出Tensor的shape应小于等于最大shape。

接口形式:
def get_max_output_shapes(self, graph_name: str)->dict {str : list}

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

返回值说明:

  • max_shapes: dict{str : list}

返回输出Tensor中的最大shape。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    max_output_shapes = engine.get_max_output_shapes(graph_name)

5.5.12. get_output_shape

查询选定计算图中特定输出Tensor的shape。

接口形式:
def get_output_shape(self, graph_name: str, tensor_name: str)->list

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

  • tensor_name: str

需要查询的Tensor的name。

返回值说明:

  • tensor_shape: list

该name下的输出Tensor的shape。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    output_name = engine.get_output_names(graph_name)[0]
    output_shape = engine.get_output_shape(graph_name,output_name)

5.5.13. get_input_dtype

获取特定计算图的特定输入Tensor的数据类型。

接口形式:
def get_input_dtype(self, graph_name: str, tensor_name: str)->sail.Dtype

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

  • tensor_name: str

需要查询的Tensor的name。

返回值说明:

  • datatype: sail.Dtype

返回Tensor中数据的数据类型。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    input_name = engine.get_input_names(graph_name)[0]
    input_dtype = engine.get_input_dtype(graph_name,input_name)

5.5.14. get_output_dtype

获取特定计算图的特定输出Tensor的数据类型。

接口形式:
def get_output_dtype(self, graph_name: str, tensor_name: str)->sail.Dtype

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

  • tensor_name: str

需要查询的Tensor的name。

返回值说明:

  • datatype: sail.Dtype

返回Tensor中数据的数据类型。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    output_name = engine.get_output_names(graph_name)[0]
    output_dtype = engine.get_output_dtype(graph_name,output_name)

5.5.15. get_input_scale

获取特定计算图的特定输入Tensor的scale,只在int8模型中有效。

接口形式:
def get_input_scale(self, graph_name: str, tensor_name: str)->float32

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

  • tensor_name: str

需要查询的Tensor的name。

返回值说明:

  • scale: float32

返回Tensor数据的scale。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    input_name = engine.get_input_names(graph_name)[0]
    input_scale = engine.get_input_scale(graph_name,input_name)

5.5.16. get_output_scale

获取特定计算图的特定输出Tensor的scale,只在int8模型中有效。

接口形式:
def get_output_scale(self, graph_name: str, tensor_name: str)->float32

参数说明:

  • graph_name: str

设定需要查询的计算图的name。

  • tensor_name: str

需要查询的Tensor的name。

返回值说明:

  • scale: float32

返回Tensor数据的scale。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    output_name = engine.get_output_names(graph_name)[0]
    output_scale = engine.get_output_scale(graph_name,output_name)

5.5.17. process

在特定的计算图上进行前向推理。

接口形式1:
def process(self, graph_name: str, input_tensors: dict {str : numpy.array}, core_list: list[int])->dict {str : numpy.array}
    """ Inference with provided system data of input tensors.

参数说明1:

  • graph_name: str

特定的计算图name。

  • input_tensors: dict{str : numpy.array}

所有的输入Tensor的数据,利用系统内存中的numpy.array传入。

  • core_list: list[int]

输入参数。该参数仅对支持多核推理的处理器有效,可以选择推理时使用的core。设bmodel为对应的核数为N,此时core_list为空或者core_list的长度大于N,都会使用从core0开始的N个core来做推理。对于仅支持单核推理的处理器可忽略此参数。

返回值说明1:

  • output_tensors: dict{str : numpy.array}

所有的输出Tensor的数据,返回类型为numpy.array的数据。

接口形式2:
def process(self, graph_name: str, input_tensors: dict {str : sail.Tensor}, output_tensors: dict {str : sail.Tensor}, core_list: list[int])->None

def process(self, graph_name: str, input_tensors: dict {str : sail.Tensor}, input_shapes: dict {str : list}, output_tensors: dict {str : sail.Tensor}, core_list: list[int])->None

参数说明2:

  • graph_name: str

输入参数。特定的计算图name。

  • input_tensors: dict{str : sail.Tensor}

输入参数。所有的输入Tensor的数据,利用sail.Tensor传入。

  • input_shapes : dict {str : list}

输入参数。所有传入Tensor的shape。

  • output_tensors: dict{str : sail.Tensor}

输出参数。所有的输出Tensor的数据,利用sail.Tensor返回。

  • core_list: list[int]

输入参数。该参数仅对支持多核推理的处理器有效,可以选择推理时使用的core。设bmodel为对应的核数为N,若core_list为空则使用从core0开始的N个core做推理;若core_list的长度大于N,则使用core_list中对应的前N个core做推理。对于仅支持单核推理的处理器可忽略此参数。

示例代码:
import sophon.sail as sail

if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    # prepare tensor map
    input_tensors_map = engine.create_input_tensors_map(graph_name)
    data_dict = {key: tensor.asnumpy() for key, tensor in input_tensors_map.items()}
    # inference type1
    output_tensors_map = engine.process(graph_name, data_dict)

    # inference type2
    output_tensors_map_ = engine.create_output_tensors_map(graph_name)
    engine.process(graph_name, input_tensors_map, output_tensors_map_)

5.5.18. get_device_id

获取Engine中的设备id号

接口形式:
def get_device_id(self)->int

返回值说明:

  • tpu_id : int

返回Engine中的设备id号。

示例代码:
import sophon.sail as sail


if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    dev_id = engine.get_device_id()

5.5.19. create_input_tensors_map

创建输入Tensor的映射,在python接口中为字典dict{str : Tensor}

接口形式:
def create_input_tensors_map(self, graph_name: str, create_mode: int = -1)->dict{str : Tensor}

参数说明:

  • graph_name: str

特定的计算图name。

  • create_mode: int

创建Tensor分配内存的模式。为0时只分配系统内存,为1时只分配设备内存,其他时则根据Engine中IOMode的配置分配。

返回值说明:

output: dict{str : Tensor}

返回name:tensor的字典。

示例代码:
import sophon.sail as sail


if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    # prepare tensor map
    input_tensors_map = engine.create_input_tensors_map(graph_name)

5.5.20. create_output_tensors_map

创建输入Tensor的映射,在python接口中为字典dict{str : Tensor}

接口形式:
def create_output_tensors_map(self, graph_name: str, create_mode: int = -1)->dict{str : Tensor}

参数说明:

  • graph_name: str

特定的计算图name。

  • create_mode: int

创建Tensor分配内存的模式。为0时只分配系统内存,为1时只分配设备内存,其他时则根据Engine中IOMode的配置分配。

返回值说明:

output: dict{str : Tensor}

返回name:tensor的字典。

示例代码:
import sophon.sail as sail


if __name__ == '__main__':
    bmodel_path = "your_bmodel.bmodel"
    engine = sail.Engine(bmodel_path,0,sail.IOMode.SYSI)
    graph_name = engine.get_graph_names()[0]
    # prepare tensor map
    output_tensors_map = engine.create_output_tensors_map(graph_name)