ONNX Simplifier
类别: AI Optimization 标签: ONNX onnxsim目录
onnxsim 本身只提供 constant folding/propagation(即消除结果恒为常量的算子)的能力,而图变换(即合并 conv 和 bn 等等)的能力是由 onnxsim 调用 onnx optimizer 的各种 pass 实现的。constant folding 和图变换同时使用时,很多隐藏的优化机会会被挖掘出来,这也是 onnxsim 优化效果出色的原因之一。例如 add(add(x, 1), 2) 在变换为 add(x, add(1, 2)) 之后就可以通过 constant folding 变为 add(x, 3),而 pad(conv(x, w, padding=0), add(1, 1)) 在经过 constant folding 变为 pad(conv(x, w, padding=0), 2) 后,就可以进一步融合成 conv(x, w, padding=2)。
安装
pip install -U pip
pip install onnx-simplifier
使用
命令
onnxsim input_onnx_model output_onnx_model
脚本集成
import onnx
from onnxsim import simplify
# load your predefined ONNX model
model = onnx.load(filename)
# convert model
model_simp, check = simplify(model)
assert check, "Simplified ONNX model could not be validated"
# use model_simp as a standard ONNX model object
模型转换
模型格式的转换都是在浏览器上执行的,不会被上传到服务器。
实践
我在使用的时候发现 PyTorch 框架在导出 ONNX 的时候已经做了许多优化。查看 ONNX 导出函数 torch.onnx.export
torch.onnx.export(model, args, f, export_params=True, verbose=False, training=<TrainingMode.EVAL: 0>,
input_names=None, output_names=None, operator_export_type=None, opset_version=None,
do_constant_folding=True, dynamic_axes=None, keep_initializers_as_inputs=None,
custom_opsets=None, export_modules_as_functions=False)
- do_constant_folding=True