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 265 of file CircleOptimizer.cpp.

266{
267 canonicalize(g);
268
269 logo::Phase phase;
270
271 // Conversion from NCHW to NHWC is done first to avoid interference with other optimizations.
272 if (_options->query(Options::Algorithm::ConvertNCHWToNHWC))
273 {
274 bool preserve_input =
275 _options->param(Options::AlgorithmParameters::NCHW_to_NHWC_input_shape) != "true";
276 bool preserve_output =
277 _options->param(Options::AlgorithmParameters::NCHW_to_NHWC_output_shape) != "true";
278
279 bool fuse_fc = _options->query(Options::Algorithm::FuseAddWithFullyConnected);
280 bool fuse_gelu = _options->query(Options::Algorithm::FuseGelu);
281
282 convert_nchw_to_nhwc(g, preserve_input, preserve_output, fuse_fc, fuse_gelu);
283 }
284
285 /* TRANSFORM DECLARATION BEGIN */
286 phase.emplace_back(std::make_unique<logo::RemoveDeadNodeWithQueryPass>());
287
288 // Following passes are needed everytime when other passes create new node or modify some nodes.
289 phase.emplace_back(std::make_unique<luci::CircleShapeInferencePass>());
290 phase.emplace_back(std::make_unique<luci::CircleTypeInferencePass>());
291
292 // Forward Reshape/Transpose is done after
293 // 1. SubstituteXXXToReshape
294 // 2. RemoveRedundantReshape/Transpose
295 // See https://github.com/Samsung/ONE/pull/10596 for more details
297 {
298 phase.emplace_back(std::make_unique<luci::SubstituteExpandDimsToReshapePass>());
299 }
301 {
302 phase.emplace_back(std::make_unique<luci::SubstitutePackToReshapePass>());
303 }
305 {
306 phase.emplace_back(std::make_unique<luci::SubstituteSqueezeToReshapePass>());
307 }
309 {
310 phase.emplace_back(std::make_unique<luci::SubstituteStridedSliceToReshapePass>());
311 }
313 {
314 phase.emplace_back(std::make_unique<luci::SubstituteTransposeToReshapePass>());
315 }
317 {
318 phase.emplace_back(std::make_unique<luci::RemoveRedundantReshapePass>());
319 }
321 {
322 phase.emplace_back(std::make_unique<luci::RemoveRedundantTransposePass>());
323 }
324
325 // clang-format off
326 std::map<Options::Algorithm, std::unique_ptr<logo::Pass> (*)(void)> option_to_pass;
327
328 option_to_pass[Options::Algorithm::CommonSubExpressionElimination] = &createPassInstance<luci::CommonSubExpressionEliminationPass>;
329 option_to_pass[Options::Algorithm::ResolveCustomOpAdd] = &createPassInstance<luci::ResolveCustomOpAddPass>;
330 option_to_pass[Options::Algorithm::ResolveCustomOpBatchMatMul] = &createPassInstance<luci::ResolveCustomOpBatchMatMulPass>;
331 option_to_pass[Options::Algorithm::ResolveCustomOpMatMul] = &createPassInstance<luci::ResolveCustomOpMatMulPass>;
332 option_to_pass[Options::Algorithm::ResolveFormerCustomOp] = &createPassInstance<luci::ResolveFormerCustomOpPass>;
333 option_to_pass[Options::Algorithm::FuseMeanWithMean] = &createPassInstance<luci::FuseMeanWithMeanPass>;
334 option_to_pass[Options::Algorithm::FuseMulWithConv] = &createPassInstance<luci::FuseMulWithConvPass>;
335 option_to_pass[Options::Algorithm::FuseMulWithDiv] = &createPassInstance<luci::FuseMulWithDivPass>;
336 option_to_pass[Options::Algorithm::FuseMulWithFullyConnected] = &createPassInstance<luci::FuseMulWithFullyConnectedPass>;
337 option_to_pass[Options::Algorithm::FuseMulWithRmsNorm] = &createPassInstance<luci::FuseMulWithRmsNormPass>;
338 option_to_pass[Options::Algorithm::ResolveCustomOpMaxPoolWithArgmax] = &createPassInstance<luci::ResolveCustomOpMaxPoolWithArgmaxPass>;
339 option_to_pass[Options::Algorithm::ResolveCustomOpSplitV] = &createPassInstance<luci::ResolveCustomOpSplitVPass>;
340 option_to_pass[Options::Algorithm::FuseInstanceNorm] = &createPassInstance<luci::FuseInstanceNormPass>;
341 option_to_pass[Options::Algorithm::FuseBatchNormWithConv] = &createPassInstance<luci::FuseBatchNormWithConvPass>;
342 option_to_pass[Options::Algorithm::FuseBatchNormWithDwConv] = &createPassInstance<luci::FuseBatchNormWithDwConvPass>;
343 option_to_pass[Options::Algorithm::FuseBatchNormWithTConv] = &createPassInstance<luci::FuseBatchNormWithTConvPass>;
344 option_to_pass[Options::Algorithm::FuseSliceWithTConv] = &createPassInstance<luci::FuseSliceWithTConvPass>;
345 option_to_pass[Options::Algorithm::FuseAddToFullyConnectedBias] = &createPassInstance<luci::FuseAddToFullyConnectedBiasPass>;
346 option_to_pass[Options::Algorithm::FuseAddWithConv] = &createPassInstance<luci::FuseAddWithConvPass>;
347 option_to_pass[Options::Algorithm::FuseAddWithFullyConnected] = &createPassInstance<luci::FuseAddWithFullyConnectedPass>;
348 option_to_pass[Options::Algorithm::FuseAddWithTConv] = &createPassInstance<luci::FuseAddWithTConvPass>;
349 option_to_pass[Options::Algorithm::FuseActivationFunction] = &createPassInstance<luci::FuseActivationFunctionPass>;
350 option_to_pass[Options::Algorithm::FuseMulToFullyConnectedWeights] = &createPassInstance<luci::FuseMulToFullyConnectedWeightsPass>;
351 option_to_pass[Options::Algorithm::FusePRelu] = &createPassInstance<luci::FusePReluPass>;
352 option_to_pass[Options::Algorithm::FuseGelu] = &createPassInstance<luci::FuseGeluPass>;
353 option_to_pass[Options::Algorithm::FuseRsqrt] = &createPassInstance<luci::FuseRsqrtPass>;
354 option_to_pass[Options::Algorithm::FuseHorizontalFullyConnected] = &createPassInstance<luci::FuseHorizontalFullyConnectedPass>;
355 option_to_pass[Options::Algorithm::FuseTransposeWithMean] = &createPassInstance<luci::FuseTransposeWithMeanPass>;
356 option_to_pass[Options::Algorithm::FuseRmsNorm] = &createPassInstance<luci::FuseRmsNormPass>;
357 option_to_pass[Options::Algorithm::FuseRoPE] = &createPassInstance<luci::FuseRoPEPass>;
358 option_to_pass[Options::Algorithm::FoldAddV2] = &createPassInstance<luci::FoldAddV2Pass>;
359 option_to_pass[Options::Algorithm::FoldCast] = &createPassInstance<luci::FoldCastPass>;
360 option_to_pass[Options::Algorithm::FoldDensify] = &createPassInstance<luci::FoldDensifyPass>;
361 option_to_pass[Options::Algorithm::FoldDepthwiseConv2D] = &createPassInstance<luci::FoldDepthwiseConv2DPass>;
362 option_to_pass[Options::Algorithm::FoldDequantize] = &createPassInstance<luci::FoldDequantizePass>;
363 option_to_pass[Options::Algorithm::FoldFullyConnected] = &createPassInstance<luci::FoldFullyConnectedPass>;
364 option_to_pass[Options::Algorithm::FoldGather] = &createPassInstance<luci::FoldGatherPass>;
365 option_to_pass[Options::Algorithm::FoldMul] = &createPassInstance<luci::FoldMulPass>;
366 option_to_pass[Options::Algorithm::FoldReshape] = &createPassInstance<luci::FoldReshapePass>;
367 option_to_pass[Options::Algorithm::FoldShape] = &createPassInstance<luci::FoldShapePass>;
368 option_to_pass[Options::Algorithm::FoldSparseToDense] = &createPassInstance<luci::FoldSparseToDensePass>;
369 option_to_pass[Options::Algorithm::FoldSqueeze] = &createPassInstance<luci::FoldSqueezePass>;
370 option_to_pass[Options::Algorithm::FusePreActivationBatchNorm] = &createPassInstance<luci::FusePreActivationBatchNormPass>;
371 option_to_pass[Options::Algorithm::MakeBatchNormGammaPositive] = &createPassInstance<luci::MakeBatchNormGammaPositivePass>;
372 option_to_pass[Options::Algorithm::ShuffleWeightTo16x1Float32] = &createPassInstance<luci::ShuffleWeightTo16x1Float32Pass>;
373 option_to_pass[Options::Algorithm::ExpandBroadcastConst] = &createPassInstance<luci::ExpandBroadcastConstPass>;
374 option_to_pass[Options::Algorithm::RemoveDuplicateConst] = &createPassInstance<luci::RemoveDuplicateConstPass>;
375 option_to_pass[Options::Algorithm::RemoveFakeQuant] = &createPassInstance<luci::RemoveFakeQuantPass>;
376 option_to_pass[Options::Algorithm::RemoveGatherGuard] = &createPassInstance<luci::RemoveGatherGuardPass>;
377 option_to_pass[Options::Algorithm::RemoveQDQForMixedPrecisionOp] = &createPassInstance<luci::RemoveQDQForMixedPrecisionOpPass>;
378 option_to_pass[Options::Algorithm::RemoveQuantDequantSeq] = &createPassInstance<luci::RemoveQuantDequantSeqPass>;
379 option_to_pass[Options::Algorithm::RemoveUnnecessaryAdd] = &createPassInstance<luci::RemoveUnnecessaryAddPass>;
380 option_to_pass[Options::Algorithm::RemoveUnnecessaryCast] = &createPassInstance<luci::RemoveUnnecessaryCastPass>;
381 option_to_pass[Options::Algorithm::RemoveUnnecessarySlice] = &createPassInstance<luci::RemoveUnnecessarySlicePass>;
382 option_to_pass[Options::Algorithm::RemoveUnnecessaryStridedSlice] = &createPassInstance<luci::RemoveUnnecessaryStridedSlicePass>;
383 option_to_pass[Options::Algorithm::RemoveUnnecessarySplit] = &createPassInstance<luci::RemoveUnnecessarySplitPass>;
384 option_to_pass[Options::Algorithm::RemoveUnnecessaryTranspose] = &createPassInstance<luci::RemoveUnnecessaryTransposeNetPass>;
385 option_to_pass[Options::Algorithm::RemoveRedundantQuantize] = &createPassInstance<luci::RemoveRedundantQuantizePass>;
386 option_to_pass[Options::Algorithm::ReplaceNonConstFCWithBatchMatMul] = &createPassInstance<luci::ReplaceNonConstFCWithBatchMatMulPass>;
387 option_to_pass[Options::Algorithm::ReplaceMulAddWithDepthwiseConv] = &createPassInstance<luci::ReplaceMulAddWithDepthwiseConvPass>;
388 option_to_pass[Options::Algorithm::ReplaceSubWithAdd] = &createPassInstance<luci::ReplaceSubWithAddPass>;
389 option_to_pass[Options::Algorithm::ReplaceWithFCGeluFC] = &createPassInstance<luci::ReplaceWithFCGeluFCPass>;
390 option_to_pass[Options::Algorithm::SubstitutePadV2ToPad] = &createPassInstance<luci::SubstitutePadV2ToPadPass>;
391 option_to_pass[Options::Algorithm::SubstituteSplitVToSplit] = &createPassInstance<luci::SubstituteSplitVToSplitPass>;
392 option_to_pass[Options::Algorithm::TransformMinMaxToRelu6Pass] = &createPassInstance<luci::TransformMinMaxToRelu6Pass>;
393 option_to_pass[Options::Algorithm::TransformMinReluToRelu6Pass] = &createPassInstance<luci::TransformMinReluToRelu6Pass>;
394 option_to_pass[Options::Algorithm::TransformSqrtDivToRsqrtMul] = &createPassInstance<luci::TransformSqrtDivToRsqrtMulPass>;
395 option_to_pass[Options::Algorithm::DecomposeHardSwishPass] = &createPassInstance<luci::DecomposeHardSwishPass>;
396 option_to_pass[Options::Algorithm::DecomposeSoftmaxPass] = &createPassInstance<luci::DecomposeSoftmaxPass>;
397 option_to_pass[Options::Algorithm::UnrollUnidirSeqLSTM] = &createPassInstance<luci::UnrollUnidirectionalSequenceLSTMPass>;
398 // NOTE Experimental options; these will be removed someday
399 // Add experimental options here
400 option_to_pass[Options::Algorithm::XpSepActFromTransposeConv] = &createPassInstance<luci::XpSepActFromTransposeConvPass>;
401 option_to_pass[Options::Algorithm::ForwardReshapeToUnaryOp] = &createPassInstance<luci::ForwardReshapeToUnaryOpPass>;
402 option_to_pass[Options::Algorithm::ForwardTransposeOp] = &createPassInstance<luci::ForwardTransposeOpPass>;
403 // clang-format on
404
405 for (auto const &m : option_to_pass)
406 {
407 if (_options->query(m.first))
408 {
409 phase.emplace_back(m.second());
410 }
411 }
412
413 // TODO Extend `option_to_pass` to be able to instantiate two or more pass objects.
415 {
416 phase.emplace_back(std::make_unique<luci::RemoveUnnecessaryReshapePass>());
417 phase.emplace_back(std::make_unique<luci::RemoveUnnecessaryReshapeNetPass>());
418 }
419
420 /* TRANSFORM DECLARATION END */
421
424 phase_runner.attach(&prog);
425 phase_runner.run(phase);
426}
std::vector< std::unique_ptr< Pass > > Phase
Definition Phase.h:31

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::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::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 241 of file CircleOptimizer.cpp.

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

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

Referenced by entry().

◆ options()

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

Definition at line 216 of file CircleOptimizer.cpp.

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

Referenced by entry().

◆ sparsify()

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

Definition at line 428 of file CircleOptimizer.cpp.

429{
430 if (_options->query(Options::Algorithm::SparsifyTensorPass))
431 {
432 std::string tensor_name = _options->param(Options::AlgorithmParameters::Sparsify_tensor_name);
433 std::string str_tarversal_order =
434 _options->param(Options::AlgorithmParameters::Sparsify_traversal_order);
435 std::string str_format = _options->param(Options::AlgorithmParameters::Sparsify_format);
436 std::string str_block_size = _options->param(Options::AlgorithmParameters::Sparsify_block_size);
437 std::string str_block_map = _options->param(Options::AlgorithmParameters::Sparsify_block_map);
438
439 // traversal order
440 std::vector<int32_t> traversal_order = pepper::csv_to_vector<int32_t>(str_tarversal_order);
441 // format
442 std::vector<DimensionType> format;
443 std::istringstream is(str_format);
444 for (char c; is >> c;)
445 {
446 assert(c != ',');
447 if (c == 'd')
448 format.push_back(DimensionType::DENSE);
449 else if (c == 's')
450 format.push_back(DimensionType::SPARSE_CSR);
451 if (is.peek() == ',')
452 is.ignore();
453 }
454 // block size
455 std::vector<int32_t> block_size = pepper::csv_to_vector<int32_t>(str_block_size);
456 // block map
457 std::vector<int32_t> block_map = pepper::csv_to_vector<int32_t>(str_block_map);
458
459 luci::SparsifyTensorPass sparsifier{tensor_name, traversal_order, format, block_size,
460 block_map};
461 sparsifier.run(g);
462 }
463}
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::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: