ONE - On-device Neural Engine
Loading...
Searching...
No Matches
luci::CircleOptimizer Class Referencefinal

#include <CircleOptimizer.h>

Data Structures

struct  Options
 

Public Member Functions

Optionsoptions (void)
 
void optimize (luci::Module *) const
 
void optimize (loco::Graph *) const
 
void sparsify (loco::Graph *) const
 

Detailed Description

Definition at line 30 of file CircleOptimizer.h.

Member Function Documentation

◆ optimize() [1/2]

void luci::CircleOptimizer::optimize ( loco::Graph g) const

Definition at line 266 of file CircleOptimizer.cpp.

267{
268 canonicalize(g);
269
271
272 // Conversion from NCHW to NHWC is done first to avoid interference with other optimizations.
273 if (_options->query(Options::Algorithm::ConvertNCHWToNHWC))
274 {
275 bool preserve_input =
276 _options->param(Options::AlgorithmParameters::NCHW_to_NHWC_input_shape) != "true";
277 bool preserve_output =
278 _options->param(Options::AlgorithmParameters::NCHW_to_NHWC_output_shape) != "true";
279
281 bool fuse_gelu = _options->query(Options::Algorithm::FuseGelu);
282
284 }
285
286 /* TRANSFORM DECLARATION BEGIN */
287 phase.emplace_back(std::make_unique<logo::RemoveDeadNodeWithQueryPass>());
288
289 // Following passes are needed everytime when other passes create new node or modify some nodes.
290 phase.emplace_back(std::make_unique<luci::CircleShapeInferencePass>());
291 phase.emplace_back(std::make_unique<luci::CircleTypeInferencePass>());
292
293 // Forward Reshape/Transpose is done after
294 // 1. SubstituteXXXToReshape
295 // 2. RemoveRedundantReshape/Transpose
296 // See https://github.com/Samsung/ONE/pull/10596 for more details
298 {
299 phase.emplace_back(std::make_unique<luci::SubstituteExpandDimsToReshapePass>());
300 }
302 {
303 phase.emplace_back(std::make_unique<luci::SubstitutePackToReshapePass>());
304 }
306 {
307 phase.emplace_back(std::make_unique<luci::SubstituteSqueezeToReshapePass>());
308 }
310 {
311 phase.emplace_back(std::make_unique<luci::SubstituteStridedSliceToReshapePass>());
312 }
314 {
315 phase.emplace_back(std::make_unique<luci::SubstituteTransposeToReshapePass>());
316 }
318 {
319 phase.emplace_back(std::make_unique<luci::RemoveRedundantReshapePass>());
320 }
322 {
323 phase.emplace_back(std::make_unique<luci::RemoveRedundantTransposePass>());
324 }
325
326 // clang-format off
327 std::map<Options::Algorithm, std::unique_ptr<logo::Pass> (*)(void)> option_to_pass;
328
401 // NOTE Experimental options; these will be removed someday
402 // Add experimental options here
406 // clang-format on
407
408 for (auto const &m : option_to_pass)
409 {
410 if (_options->query(m.first))
411 {
412 phase.emplace_back(m.second());
413 }
414 }
415
416 // TODO Extend `option_to_pass` to be able to instantiate two or more pass objects.
418 {
419 phase.emplace_back(std::make_unique<luci::RemoveUnnecessaryReshapePass>());
420 phase.emplace_back(std::make_unique<luci::RemoveUnnecessaryReshapeNetPass>());
421 }
422
423 /* TRANSFORM DECLARATION END */
424
427 phase_runner.attach(&prog);
428 phase_runner.run(phase);
429}
std::vector< std::unique_ptr< Pass > > Phase
Definition Phase.h:31
T must_cast(loco::Node *node)

References luci::CircleOptimizer::Options::CommonSubExpressionElimination, luci::CircleOptimizer::Options::ConvertNCHWToNHWC, luci::CircleOptimizer::Options::DecomposeHardSwishPass, luci::CircleOptimizer::Options::DecomposeSoftmaxPass, luci::CircleOptimizer::Options::ExpandBroadcastConst, luci::CircleOptimizer::Options::FoldAddV2, luci::CircleOptimizer::Options::FoldCast, luci::CircleOptimizer::Options::FoldDensify, luci::CircleOptimizer::Options::FoldDepthwiseConv2D, luci::CircleOptimizer::Options::FoldDequantize, luci::CircleOptimizer::Options::FoldFullyConnected, luci::CircleOptimizer::Options::FoldGather, luci::CircleOptimizer::Options::FoldMul, luci::CircleOptimizer::Options::FoldReshape, luci::CircleOptimizer::Options::FoldShape, luci::CircleOptimizer::Options::FoldSparseToDense, luci::CircleOptimizer::Options::FoldSqueeze, luci::CircleOptimizer::Options::ForwardReshapeToUnaryOp, luci::CircleOptimizer::Options::ForwardTransposeOp, luci::CircleOptimizer::Options::FuseActivationFunction, luci::CircleOptimizer::Options::FuseAddToFullyConnectedBias, luci::CircleOptimizer::Options::FuseAddWithConv, luci::CircleOptimizer::Options::FuseAddWithFullyConnected, luci::CircleOptimizer::Options::FuseAddWithTConv, luci::CircleOptimizer::Options::FuseBatchNormWithConv, luci::CircleOptimizer::Options::FuseBatchNormWithDwConv, luci::CircleOptimizer::Options::FuseBatchNormWithTConv, luci::CircleOptimizer::Options::FuseGelu, luci::CircleOptimizer::Options::FuseHorizontalFullyConnected, luci::CircleOptimizer::Options::FuseInstanceNorm, luci::CircleOptimizer::Options::FuseMeanWithMean, luci::CircleOptimizer::Options::FuseMulToFullyConnectedWeights, luci::CircleOptimizer::Options::FuseMulWithConv, luci::CircleOptimizer::Options::FuseMulWithDiv, luci::CircleOptimizer::Options::FuseMulWithFullyConnected, luci::CircleOptimizer::Options::FuseMulWithRmsNorm, luci::CircleOptimizer::Options::FusePreActivationBatchNorm, luci::CircleOptimizer::Options::FusePRelu, luci::CircleOptimizer::Options::FuseRmsNorm, luci::CircleOptimizer::Options::FuseRoPE, luci::CircleOptimizer::Options::FuseRsqrt, luci::CircleOptimizer::Options::FuseSliceWithTConv, luci::CircleOptimizer::Options::FuseTransposeWithMean, m, luci::CircleOptimizer::Options::MakeBatchNormGammaPositive, luci::must_cast(), luci::CircleOptimizer::Options::RemoveDuplicateConst, luci::CircleOptimizer::Options::RemoveFakeQuant, luci::CircleOptimizer::Options::RemoveGatherGuard, luci::CircleOptimizer::Options::RemoveQDQForMixedPrecisionOp, luci::CircleOptimizer::Options::RemoveQuantDequantSeq, luci::CircleOptimizer::Options::RemoveRedundantQuantize, luci::CircleOptimizer::Options::RemoveRedundantReshape, luci::CircleOptimizer::Options::RemoveRedundantTranspose, luci::CircleOptimizer::Options::RemoveUnnecessaryAdd, luci::CircleOptimizer::Options::RemoveUnnecessaryCast, luci::CircleOptimizer::Options::RemoveUnnecessaryDiv, luci::CircleOptimizer::Options::RemoveUnnecessaryMul, luci::CircleOptimizer::Options::RemoveUnnecessaryReshape, luci::CircleOptimizer::Options::RemoveUnnecessarySlice, luci::CircleOptimizer::Options::RemoveUnnecessarySplit, luci::CircleOptimizer::Options::RemoveUnnecessaryStridedSlice, luci::CircleOptimizer::Options::RemoveUnnecessaryTranspose, luci::CircleOptimizer::Options::ReplaceMulAddWithDepthwiseConv, luci::CircleOptimizer::Options::ReplaceNonConstFCWithBatchMatMul, luci::CircleOptimizer::Options::ReplaceSubWithAdd, luci::CircleOptimizer::Options::ReplaceWithFCGeluFC, luci::CircleOptimizer::Options::ResolveCustomOpAdd, luci::CircleOptimizer::Options::ResolveCustomOpBatchMatMul, luci::CircleOptimizer::Options::ResolveCustomOpMatMul, luci::CircleOptimizer::Options::ResolveCustomOpMaxPoolWithArgmax, luci::CircleOptimizer::Options::ResolveCustomOpSplitV, luci::CircleOptimizer::Options::ResolveFormerCustomOp, logo::Restart, luci::CircleOptimizer::Options::ShuffleWeightTo16x1Float32, luci::CircleOptimizer::Options::SubstituteExpandDimsToReshape, luci::CircleOptimizer::Options::SubstitutePackToReshape, luci::CircleOptimizer::Options::SubstitutePadV2ToPad, luci::CircleOptimizer::Options::SubstituteSplitVToSplit, luci::CircleOptimizer::Options::SubstituteSqueezeToReshape, luci::CircleOptimizer::Options::SubstituteStridedSliceToReshape, luci::CircleOptimizer::Options::SubstituteTransposeToReshape, luci::CircleOptimizer::Options::TransformMinMaxToRelu6Pass, luci::CircleOptimizer::Options::TransformMinReluToRelu6Pass, luci::CircleOptimizer::Options::TransformSqrtDivToRsqrtMul, luci::CircleOptimizer::Options::UnrollUnidirSeqLSTM, and luci::CircleOptimizer::Options::XpSepActFromTransposeConv.

◆ optimize() [2/2]

void luci::CircleOptimizer::optimize ( luci::Module m) const

Definition at line 242 of file CircleOptimizer.cpp.

243{
245
246 // Following passes are needed everytime when other passes create new node or modify some nodes.
247 phase.emplace_back(std::make_unique<luci::CircleShapeInferencePass>());
248 phase.emplace_back(std::make_unique<luci::CircleTypeInferencePass>());
249
250 if (_options->query(Options::Algorithm::FuseBCQ))
251 {
252 phase.emplace_back(std::make_unique<FuseBCQPass>());
253 }
254
257 phase_runner.attach(&prog);
258 phase_runner.run(phase);
259}
std::vector< std::unique_ptr< Pass > > Phase
Definition ModulePhase.h:29

References luci::CircleOptimizer::Options::FuseBCQ, m, luci::must_cast(), and logo::Restart.

Referenced by entry().

◆ options()

CircleOptimizer::Options * luci::CircleOptimizer::options ( void  )

Definition at line 217 of file CircleOptimizer.cpp.

218{
219 if (_options == nullptr)
220 {
221 _options = std::make_unique<OptimizeOptionsImpl>();
222 }
223
224 return _options.get();
225}

Referenced by entry().

◆ sparsify()

void luci::CircleOptimizer::sparsify ( loco::Graph g) const

Definition at line 431 of file CircleOptimizer.cpp.

432{
433 if (_options->query(Options::Algorithm::SparsifyTensorPass))
434 {
435 std::string tensor_name = _options->param(Options::AlgorithmParameters::Sparsify_tensor_name);
436 std::string str_tarversal_order =
437 _options->param(Options::AlgorithmParameters::Sparsify_traversal_order);
438 std::string str_format = _options->param(Options::AlgorithmParameters::Sparsify_format);
439 std::string str_block_size = _options->param(Options::AlgorithmParameters::Sparsify_block_size);
440 std::string str_block_map = _options->param(Options::AlgorithmParameters::Sparsify_block_map);
441
442 // traversal order
443 std::vector<int32_t> traversal_order = pepper::csv_to_vector<int32_t>(str_tarversal_order);
444 // format
445 std::vector<DimensionType> format;
446 std::istringstream is(str_format);
447 for (char c; is >> c;)
448 {
449 assert(c != ',');
450 if (c == 'd')
451 format.push_back(DimensionType::DENSE);
452 else if (c == 's')
453 format.push_back(DimensionType::SPARSE_CSR);
454 if (is.peek() == ',')
455 is.ignore();
456 }
457 // block size
458 std::vector<int32_t> block_size = pepper::csv_to_vector<int32_t>(str_block_size);
459 // block map
460 std::vector<int32_t> block_map = pepper::csv_to_vector<int32_t>(str_block_map);
461
462 luci::SparsifyTensorPass sparsifier{tensor_name, traversal_order, format, block_size,
463 block_map};
464 sparsifier.run(g);
465 }
466}
const char * tensor_name(const circle::Tensor *tensor)
@ SPARSE_CSR
Pass to sparsify tensor.
bool run(loco::Graph *g) final
Run the pass.

References luci::DENSE, luci::must_cast(), luci::SparsifyTensorPass::run(), luci::SPARSE_CSR, luci::CircleOptimizer::Options::SparsifyTensorPass, and luci::tensor_name().

Referenced by entry().


The documentation for this class was generated from the following files: