mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-10-06 00:57:33 +08:00

* Add poros backend * Add torch lib * Add python3 lib * set c++ 14 for poros * fixed bugs * fixed grammer bugs * fixed grammer bugs * fixed code bugs * fixed code bugs * fixed CreatePorosValue bug * Add AtType2String for Log * fixed trt_option * fixed poros.cmake path * fixed grammer bug * fixed grammer bug * fixed ambiguous reference * fixed ambiguous reference * fixed reference error * fixed include files * rm ENABLE_TRT_BACKEND in poros * update CMakeLists.txt * fixed CMakeLists.txt * Add libtorch.so in CMakeLists.txt * Fixed CMakeLists.txt * Fixed CMakeLists.txt * Fixed copy bug * Fixed copy bug * Fixed copy bug * Fixed Cmake * Fixed Cmake * debug * debug * debug * debug * debug * debug * debug utils * debug utils * copy to cpu * rm log info * test share mem * test share mem * test share mem * test multi outputs * test multi outputs * test multi outputs * test multi outputs * test multi outputs * test multi outputs * test multi outputs * time cost * time cost * fixed bug * time collect * mem copy * mem copy * rm time log * rm share mem * fixed multi inputs bug * add set_input_dtypes func * add SetInputDtypes * fixed bug * fixed bug * fixed prewarm data order * debug * debug * debug * debug * debug * debug * debug * debug * debug * debug * debug * fixed bug * Add compile func * Add compile func * Add compile func * Add is_dynamic option * Add is_dynamic option * Add is_dynamic option * Add is_dynamic option * rm infer log * add cuda11.6 poros lib * fixed bug * fixed bug * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * fixed multi outputs * rm logs * test * test * test * add test log * add test log * add test log * add test log * support cpu * support cpu * support cpu * support cpu * support member variable definition * rm useless log * fixed name * resolve conflict * resolve conflict * resolve conflict * fixed cmake * add GetInputInfos&GetOutputInfos * add GetInputInfos&GetOutputInfos * fixed bug * fixed runtime.py * add compile func * add np * deal with comments * rm to_inter func * add property
168 lines
5.2 KiB
C++
Executable File
168 lines
5.2 KiB
C++
Executable File
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
|
||
//
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
#pragma once
|
||
|
||
#include <string>
|
||
#include <algorithm>
|
||
#include <unordered_map>
|
||
#include <set>
|
||
|
||
#include "torch/script.h"
|
||
#include "iengine.h"
|
||
#include "poros_module.h"
|
||
|
||
namespace baidu {
|
||
namespace mirana {
|
||
namespace poros {
|
||
|
||
/**
|
||
* @brief compile graph
|
||
*
|
||
* @param [in] module : original module
|
||
* @param [in] input_ivalues : prewarm datas
|
||
* @param [in] options : Inference options
|
||
* @return porosmodule
|
||
* @retval !nullptr => succeed nullptr => failed
|
||
**/
|
||
std::unique_ptr<PorosModule> Compile(const torch::jit::Module& module,
|
||
const std::vector<std::vector<c10::IValue> >& prewarm_datas,
|
||
const PorosOptions& options);
|
||
|
||
class Compiler {
|
||
public:
|
||
typedef std::unordered_map<const torch::jit::Node*, IEngine*> engine_map_t;
|
||
typedef std::vector<std::vector<c10::IValue> > ivalue_vec_t;
|
||
|
||
Compiler() : _origin_module(NULL) {}
|
||
~Compiler();
|
||
|
||
/**
|
||
* @brief initial Compiler
|
||
*
|
||
* @param [in] options : poros options
|
||
* @return int
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
int init(const PorosOptions& options);
|
||
|
||
/**
|
||
* @brief compile whole graph
|
||
*
|
||
* @param [in] origin_module
|
||
* @param [in] prewarm_datas : ivalue_vec_t, vector of IValue
|
||
* @param [out] optimized_module : optimized graph
|
||
* @return int
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
int compile(const torch::jit::Module& origin_module,
|
||
const ivalue_vec_t& prewarm_datas,
|
||
torch::jit::Module* optimized_module);
|
||
|
||
private:
|
||
|
||
/**
|
||
* @brief preprocess this calculation graph
|
||
*
|
||
* @param [in] prewarm_datas : ivalue_vec_t, vector of IValue
|
||
* @param [out] graph : preprcessed graph
|
||
* @return int
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
int preprocess_graph(const ivalue_vec_t& prewarm_datas, std::shared_ptr<torch::jit::Graph>& graph);
|
||
|
||
/**
|
||
* @brief segement this calculation graph
|
||
*
|
||
* @param [in/out] graph
|
||
* @return int
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
int segment_graph(std::shared_ptr<torch::jit::Graph>& graph);
|
||
|
||
// Split subgraph(block)
|
||
// The divided subgraph, as a subgraph, is associated with the block
|
||
int segment_block(torch::jit::Block& block, IEngine* engine, int current_depth);
|
||
|
||
// Subgraph optimization
|
||
/**
|
||
* @brief Subgraph optimization
|
||
*
|
||
* @param [in] prewarm_datas : ivalue_vec_t, vector of IValue
|
||
* @param [in] opt_graph : ivalue_vec_t, vector of IValue
|
||
* @param [out] optimized_module : optimized graph
|
||
* @return int
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
int optimize_subgraph(const ivalue_vec_t& prewarm_datas,
|
||
const std::shared_ptr<torch::jit::Graph>& opt_graph,
|
||
torch::jit::Module* optimized_module);
|
||
|
||
// Subgraph optimization(block)
|
||
int optimize_subblock(torch::jit::Block* block,
|
||
torch::jit::Module* optimized_module);
|
||
|
||
/**
|
||
* @brief Compile the subgraph into a new graph based on the engine
|
||
*
|
||
* @param [in] engine : The engine used by the subgraph
|
||
* @param [in] subgraph_node : Subgraph node
|
||
* @return [out] module : Transformed model
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
int transform(IEngine* engine, torch::jit::Node& subgraph_node,
|
||
torch::jit::Module& module);
|
||
|
||
/**
|
||
* @brief Select engine based on subgraph and options
|
||
*
|
||
* @param [in] node : Jit Node
|
||
* @return int
|
||
* @retval 0 => succeed <0 => failed
|
||
**/
|
||
IEngine* select_engine(const torch::jit::Node* n);
|
||
|
||
/**
|
||
* @brief destory
|
||
*
|
||
* @return void
|
||
**/
|
||
void close();
|
||
|
||
private:
|
||
int _max_segment_depth{5}; // Maximum subgraph segmentation depth
|
||
ivalue_vec_t _prewarm_datas; // Prewarm datas
|
||
PorosOptions _options;
|
||
engine_map_t _engine_map; // The engine used to record the subgraph
|
||
const torch::jit::Module* _origin_module; // Origin_module
|
||
std::atomic<int> _engine_index = {0}; // Record engine index
|
||
};
|
||
|
||
/**
|
||
* @brief compile graph, internal use
|
||
*
|
||
* @param [in] module : Origin module
|
||
* @param [in] input_ivalues : Prewarm datas
|
||
* @param [in] options : Inference options
|
||
* @return optimized_module
|
||
* @retval !nullptr => succeed nullptr => failed
|
||
**/
|
||
std::unique_ptr<torch::jit::Module> CompileGraph(const torch::jit::Module& module,
|
||
const std::vector<std::vector<c10::IValue> >& prewarm_datas,
|
||
const PorosOptions& options);
|
||
|
||
} // namespace poros
|
||
} // namespace mirana
|
||
} // namespace baidu
|