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; }