[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2)
2023-12-18 17:48:17
[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2)
简介
上篇重点介绍了OnnxSimplifier的库,其中的FixedPointFn迭代优化函数利用到了OnnxOptimizer这个官方的优化库,大部分的优化细节是在OnnxOptimizer内的。因此本篇重点介绍一下OnnxOptimizer库的内部优化细节和逐个介绍每个优化pass和手段。
OnnxOptimizer基本概念原理
Pass
- 含义:所有优化项的基类,每个优化项必须拥有唯一的名字,用来注册和管理。
- 概念:
- 优化类型(PassType):
- Fuse: 会融合算子的优化项
- Nop: 会移除无用的算子的优化项
- Separate:
- Immutable:
- Replace: 会进行节点替换的优化项
- Other: 其他
- (PassAnalysisType):
- Empty
- CountBased
- (PassEfficiency):
- Partial
- Complete
- (PassOptimizationType):
- None
- Compute: 针对计算优化
- Memory: 针对内存优化
- ComputeMemory: 针对计算和内存优化
- Stability: 稳定
- 优化类型(PassType):
- 基类的代码:
class Pass {
PassType pass_type;
PassEfficiency pass_efficiency;
PassOptimizationType pass_optimization_type;
public:
Pass(PassType pass_type, PassEfficiency pass_efficiency,
PassOptimizationType pass_optimization_type);
virtual ~Pass();
PassType getPassType() const {
return this->pass_type;
}
PassEfficiency getPassEfficiency() const {
return this->pass_efficiency;
}
PassOptimizationType getPassOptimizationType() const {
return this->pass_optimization_type;
}
virtual PassAnalysisType getPassAnalysisType() const = 0; //
virtual std::string getPassName() const = 0; // 返回优化项的名字
virtual bool initializePass(Graph &) { // 可有可无的函数实现
return false;
}
virtual bool finalizePass(Graph &) { // 可有可无的函数实现
return false;
}
virtual std::shared_ptr<PostPassAnalysis> runPass(Graph &graph) = 0; // 子类必须实现该函数,用于运行模型优化
protected:
// Iterates through the elements in the graph and counts the number of times
// the transform is successfully run.
unsigned int DescendOnGraphAttributesAndCount(
Node *n, std::function<unsigned int(Graph &)> fn);
// A more general version of the function above that doesn't constrain the
// return type of fn.
void DescendOnGraphAttributesUnconstrained(Node *n,
std::function<void(Graph &)> fn);
};
具体的Pass实现和细节罗列
Pass | PassName | PassType | PassEfficiency | PassOptimizationType | 描述 |
---|---|---|---|---|---|
AdjustAdd | adjust_add | Immutable | Complete | Compute | 交换add第一个constant_input到第二位置上 |
RenameInputOutput | rename_input_output | Other | Complete | None | 修改模型输入/输出为统一的预设的或者默认的格式:input_%d/output_%d |
SetUniqueNameForNodes | set_unique_name_for_nodes | Other | Complete | None | 为name为空的node设置唯一的node_name |
EliminateNopCast | eliminate_nop_cast | Nop | Complete | Compute | 移除那些目标输出数据类型等于输入数据类型的cast算子 |
EliminateNopDropout | eliminate_nop_dropout | Nop | Complete | Compute | 移除那些ratio=0.0的dropout算子 |
EliminateNopFlatten | eliminate_nop_flatten | Nop | Complete | Compute | 移除那些对shape无影响的Flatten算子 |
ExtractConstantToInitializer | extract_constant_to_initializer | Nop | Complete | Memory | 移除Constant算子,放置到Initializer内 |
EliminateConsecutiveIdempotentOps | eliminate_consecutive_idempotent_ops | Fuse | Complete | Compute | 融合连续的op,比如"Ceil", “Floor”, “Round”, “Relu”, "Reshape"等 |
EliminateIfWithConstCond | eliminate_if_with_const_cond | Nop | Complete | Compute | 消除输入条件cond为常量的if算子 |
EliminateNopMonotoneArgmax | eliminate_nop_monotone_argmax | Nop | Partial | Compute | 消除输入条件cond为常量的if算子 |
…
总结
上述的Pass只是其中的一小部分,还有将近二十来个Pass没有说明清楚,因此这个留到后续的文章继续说明。
文章来源:https://blog.csdn.net/Pengcode/article/details/135065928
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!