mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-10-07 01:22:59 +08:00
171 lines
5.1 KiB
C++
Executable File
171 lines
5.1 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 <algorithm>
|
||
#include <set>
|
||
#include <string>
|
||
#include <unordered_map>
|
||
|
||
#include "iengine.h" // NOLINT
|
||
#include "poros_module.h" // NOLINT
|
||
#include "torch/script.h" // NOLINT
|
||
|
||
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
|