4.16. MultiEngine

多线程的推理引擎,实现特定计算图的多线程推理。

4.16.1. MultiEngine

初始化MutiEngine。

接口形式:
MultiEngine(const std::string& bmodel_path,
        std::vector<int>   tpu_ids,
        bool               sys_out=true,
        int                graph_idx=0);

参数说明:

  • bmodel_path: string

bmodel所在的文件路径。

  • tpu_ids: std::vector<int>

该MultiEngine可见的智能视觉深度学习处理器的ID。

  • sys_out: bool

表示是否将结果拷贝到系统内存,默认为True

  • graph_idx : int

特定的计算图的index。

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    return 0;
}

4.16.2. set_print_flag

设置是否打印调试信息。

接口形式:
void set_print_flag(bool print_flag);

参数说明:

  • print_flag: bool

为True时,打印调试信息,否则不打印。

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    engine.set_print_flag(true);
    return 0;
}

4.16.3. set_print_time

设置是否打印主要处理耗时。

接口形式:
void set_print_time(bool print_flag);

参数说明:

  • print_flag: bool

为True时,打印主要耗时,否则不打印。

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    engine.set_print_time(true);
    return 0;
}

4.16.4. get_device_ids

获取MultiEngine中所有可用的智能视觉深度学习处理器的id。

接口形式:
std::vector<int> get_device_ids();

返回值说明:

  • device_ids: std::vector<int>

返回可见的智能视觉深度学习处理器的ids

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    std::vector<int> device_ids = engine.get_device_ids();
    return 0;
}

4.16.5. get_graph_names

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

接口形式:
std::vector<std::string> get_graph_names();

返回值说明:

  • graph_names: std::vector<std::string>

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

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    std::vector<std::string> graph_names = engine.get_graph_names();
    return 0;
}

4.16.6. get_input_names

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

接口形式:
std::vector<std::string> get_input_names(const std::string& graph_name);

参数说明:

  • graph_name: string

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

返回值说明:

  • input_names: std::vector<std::string>

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

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    std::vector<std::string> graph_names = engine.get_graph_names();
    std::vector<std::string> input_names = engine.get_input_names(graph_names[0]);
    return 0;
}

4.16.7. get_output_names

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

接口形式:
std::vector<std::string> get_output_names(const std::string& graph_name);

参数说明:

  • graph_name: string

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

返回值说明:

  • output_names: std::vector<std::string>

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

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    std::vector<std::string> graph_names = engine.get_graph_names();
    std::vector<std::string> output_name = engine.get_output_names(graph_names[0]);
    return 0;
}

4.16.8. get_input_shape

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

接口形式:
std::vector<int> get_input_shape(
    const std::string& graph_name,
    const std::string& tensor_name);

参数说明:

  • graph_name: string

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

  • tensor_name: string

需要查询的Tensor的name。

返回值说明:

  • tensor_shape: std::vector<int>

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

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    std::vector<std::string> graph_names = engine.get_graph_names();
    std::vector<std::string> input_names = engine.get_input_names(graph_names[0]);
    std::vector<int> input_shape = engine.get_input_shape(graph_names[0],input_names[0]);
    return 0;
}

4.16.9. get_output_shape

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

接口形式:
std::vector<int> get_output_shape(
    const std::string& graph_name,
    const std::string& tensor_name);

参数说明:

  • graph_name: string

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

  • tensor_name: string

需要查询的Tensor的name。

返回值说明:

  • tensor_shape: std::vector<int>

该name下的输出Tensor的shape。

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};
    std::string bmodel_path = "your_bmodel.bmodel"
    sail::MultiEngine engine(bmodel_path, dev_id);
    std::vector<std::string> graph_names = engine.get_graph_names();
    std::vector<std::string> output_names = engine.get_output_names(graph_names[0]);
    std::vector<int> output_shape = engine.get_output_shape(graph_names[0],output_names[0]);
    return 0;
}

4.16.10. process

在特定的计算图上进行推理,需要提供系统内存的输入数据。

接口形式:
std::vector<std::map<std::string, Tensor*>> process(std::vector<std::map<std::string, Tensor*>>& input_tensors);

参数说明:

  • input_tensors: std::vector<std::map<std::string, Tensor*> >

输入的Tensors。

返回值说明:

  • output_tensors: std::vector<std::map<std::string, Tensor*> >

返回推理之后的结果。

示例代码:
#include <sail/engine_multi.h>

int main() {
    std::vector<int> dev_id = {0, 1};

    std::string bmodel_path = "/home/jingyu/SAM-ViT-B_embedding_fp16_1b.bmodel";
    sail::MultiEngine engine(bmodel_path, dev_id);


    std::vector<std::string> graph_names = engine.get_graph_names();
    std::vector<std::string> input_names = engine.get_input_names(graph_names[0]);

    std::vector<int> input_shape = engine.get_input_shape(graph_names[0], input_names[0]);

    // prepare one input tensor
    std::map<std::string, sail::Tensor*> input_tensors_map1;
    for (const auto& input_name : input_names) {
        sail::Tensor* input_tensor = new sail::Tensor(input_shape);
        input_tensors_map1[input_name] = input_tensor;
    }
    // prepare multi input...
    std::vector<std::map<std::string, sail::Tensor*>> input_tensors_vector;
    input_tensors_vector.push_back(input_tensors_map1);

    // get multi output
    auto output_tensors_vector = engine.process(input_tensors_vector);

    for(auto& pair : input_tensors_map1) {
        delete pair.second;
    }
    return 0;
}