Skip to content

fuse_relus_clips optimization crashes on Clip without an explicit max value #2836

@bas-aarts

Description

@bas-aarts

converting the attached ONNX model with the following script:

from onnxscript import ir
from onnxscript.optimizer import optimize

ir_model = ir.load("input.onnx")
optimized_model = optimize(ir_model)
ir.save(optimized_model, "output.onnx")

crashed the optimizer:

Traceback (most recent call last):
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnx_ir/passes/_pass_infra.py", line 250, in call
    pass_result = pass_(model)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnx_ir/passes/_pass_infra.py", line 127, in __call__
    result = self.call(model)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/__init__.py", line 83, in call
    count = self.rules.apply_to_model(model)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/_rewrite_rule.py", line 802, in apply_to_model
    count = self._apply_to_graph_or_function(
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/_rewrite_rule.py", line 669, in _apply_to_graph_or_function
    delta = rule.try_rewrite(
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/_rewrite_rule.py", line 324, in try_rewrite
    replacement_subgraph = self._replacement_pattern.get_replacement(match)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/_rewrite_rule.py", line 220, in get_replacement
    new_outputs = self._function(context, **match.bindings)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/rules/common/_fuse_relus_clips.py", line 39, in rewrite
    min_clip, max_clip = self.compute_clip_min_max(first_clip_node, second_clip_node)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/rules/common/_fuse_relus_clips.py", line 152, in compute_clip_min_max
    min_clip, max_clip, dtype = self.extract_min_max(first_clip_node)
  File "/local/mnt/workspace/onnxscript/lib/python3.10/site-packages/onnxscript/rewriter/rules/common/_fuse_relus_clips.py", line 77, in extract_min_max
    max_clip = node.inputs[2].const_value.numpy()
AttributeError: 'NoneType' object has no attribute 'const_value'

This happens because the Clip has no explicit max value, but relies on the default

input.onnx.zip

versions of relevant packages:

ml_dtypes         0.5.4
onnx              1.20.1
onnx-ir           0.1.16
onnxscript        0.6.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions