furiosa.quantizer.frontend.onnx.transformer package

Subpackages

Submodules

furiosa.quantizer.frontend.onnx.transformer.convert_2d_sum_to_add module

class furiosa.quantizer.frontend.onnx.transformer.convert_2d_sum_to_add.Convert2dSumToAdd(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto

furiosa.quantizer.frontend.onnx.transformer.convert_conv1d_to_conv2d module

class furiosa.quantizer.frontend.onnx.transformer.convert_conv1d_to_conv2d.ConvertConv1dToConv2d(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.convert_conv1d_to_conv2d.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Reshape –> Conv(1d) –> Reshape –> next

to

prev –> Reshape –> Conv(2d) –> Reshape –> next

if Conv(1d).input[0].ndim == 3

get_conv2d_attrs(conv1d)
pattern_condition_checker(nodes_to_check)
pattern_matching(base_node)
pattern_to_match = ['Reshape', 'Conv', 'Reshape']

furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern module

class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.EliminateRedundantShapePattern(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Flatten/Squeeze –> Unsqueeze –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_condition_checker(nodes_to_check)
pattern_matching(base_node)
pattern_to_match = ['Flatten/Squeeze', 'Unsqueeze']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_2(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Reshape –> Flatten/Squeeze –> Unsqueeze –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Reshape', 'Flatten/Squeeze', 'Unsqueeze']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_3(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Reshape –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Reshape']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_4(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Reshape –> Expand –> Expand –> Reshape –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Reshape', 'Expand', 'Expand', 'Reshape']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_5(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Reshape –> Expand –> Reshape –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Reshape', 'Expand', 'Reshape']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_6(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Reshape –> Reshape –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Reshape', 'Reshape']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_7(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Reshape –> Reshape –> Reshape –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Reshape', 'Reshape', 'Reshape']
class furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_8(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.eliminate_redundant_shape_pattern.Pattern_1

transform

prev –> Expand –> next

to

prev –> ( ) –> next

if prev.output[0].shape == next.input[0].shape

pattern_to_match = ['Expand']

furiosa.quantizer.frontend.onnx.transformer.fuse_batchnorm module

class furiosa.quantizer.frontend.onnx.transformer.fuse_batchnorm.FuseBatchNorm(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_batchnorm.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Conv –> BatchNormalization –> next

to

prev –> Conv –> next

make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['Conv', 'BatchNormalization']
class furiosa.quantizer.frontend.onnx.transformer.fuse_batchnorm.Pattern_2(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> ConvTranspose –> BatchNormalization –> next

to

prev –> ConvTranspose –> next

make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['ConvTranspose', 'BatchNormalization']
class furiosa.quantizer.frontend.onnx.transformer.fuse_batchnorm.Pattern_3(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Conv –> Mul –> Add –> next

to

prev –> Conv –> next

if 1. Mul has only one initializer
  1. Add has only one initializer

get_multiplier_and_shifter(mul_node, add_node)
make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
pattern_condition_checker(nodes_to_check: List[onnx.onnx_ml_pb2.NodeProto]) bool
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['Conv', 'Mul', 'Add']
class furiosa.quantizer.frontend.onnx.transformer.fuse_batchnorm.Pattern_4(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> BatchNormalization –> next

to

prev –> Mul –> Add –> next

if prev.op_type != Conv

make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
make_new_vi(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.ValueInfoProto]
pattern_condition_checker(prev_node: onnx.onnx_ml_pb2.NodeProto) bool
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['BatchNormalization']

furiosa.quantizer.frontend.onnx.transformer.fuse_conv module

class furiosa.quantizer.frontend.onnx.transformer.fuse_conv.FuseConv(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_conv.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> MatMul –> Add –> next

to

prev –> Unsqueeze –> Conv –> Squeeze –> next

if 1. MatMul.ndim == 2
  1. MatMul must have exactly one initializer

  2. Add must have exactly one initializer

  3. Add’s input with initializer is multidirectional broadcastable to (1, oC)

check_condition_1(node: onnx.onnx_ml_pb2.NodeProto) bool
check_condition_2(node: onnx.onnx_ml_pb2.NodeProto) bool
check_condition_3(node: onnx.onnx_ml_pb2.NodeProto, node_1: onnx.onnx_ml_pb2.NodeProto) bool
make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
make_new_vi(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.ValueInfoProto]
pattern_condition_checker(nodes_to_check: Iterable[onnx.onnx_ml_pb2.NodeProto]) bool
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['MatMul', 'Add']
class furiosa.quantizer.frontend.onnx.transformer.fuse_conv.Pattern_2(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Gemm –> next

to

prev –> Unsqueeze –> Conv –> Squeeze –> next

if 1. Gemm.B must be defined in initializer whereas Gemm.A must not
  1. if Gemm.C is defined, Gemm.C must be an initializer and multidirectional broadcastable to (1, oC)

  2. all of Gemm.input must have onnx.TensorProto.FLOAT dtype

check_condition_1(node: onnx.onnx_ml_pb2.NodeProto) bool
check_condition_2(node: onnx.onnx_ml_pb2.NodeProto) bool
check_condition_3(node: onnx.onnx_ml_pb2.NodeProto) bool
make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
make_new_vi(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.ValueInfoProto]
pattern_condition_checker(nodes_to_check: Iterable[onnx.onnx_ml_pb2.NodeProto]) bool
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['Gemm']
class furiosa.quantizer.frontend.onnx.transformer.fuse_conv.Pattern_3(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Conv –> Add –> next

to

prev –> Conv –> next

if 1. len(Conv.input) == 2 or (len(Conv.input) == 3 and Conv.input[2] has initializer)
  1. Add has only one initializer

  2. Add’s input with initializer is multidirectional broadcastable to (1, oC, 1, 1)

check_condition_1(node: onnx.onnx_ml_pb2.NodeProto) bool
check_condition_2(node: onnx.onnx_ml_pb2.NodeProto) bool
check_condition_3(node: onnx.onnx_ml_pb2.NodeProto, node_1: onnx.onnx_ml_pb2.NodeProto) bool
make_new_init(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.TensorProto]
make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
pattern_condition_checker(nodes_to_check: Iterable[onnx.onnx_ml_pb2.NodeProto]) bool
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['Conv', 'Add']

furiosa.quantizer.frontend.onnx.transformer.fuse_depth_to_space module

class furiosa.quantizer.frontend.onnx.transformer.fuse_depth_to_space.FuseDepthToSpace(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_depth_to_space.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Reshape –> Transpose –> Reshape –> next

to

prev –> DepthToSpace –> next

if Transpose.perm == [0, 1, 4, 2, 5, 3] or == [0, 3, 4, 1, 5, 2]

get_attrs(top_node, mid_node)
pattern_condition_checker(nodes_to_check)
pattern_matching(base_node)

furiosa.quantizer.frontend.onnx.transformer.fuse_gather_matmul module

class furiosa.quantizer.frontend.onnx.transformer.fuse_gather_matmul.FuseGatherMatMul(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_gather_matmul.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Gather –> MatMul –> next

to

prev –> Gather –> next

if 1. MatMul.ndim == 2
  1. MatMul must have exactly one initializer

check_condition_1(tensor_name)
check_condition_2(node)
get_new_init_args(matched_nodes)
make_initializers(top_node_init, base_node_init)
make_nodes(matched_nodes)
pattern_condition_checker(nodes_to_check)
pattern_matching(base_node)
pattern_to_match = ['Gather', 'MatMul']

furiosa.quantizer.frontend.onnx.transformer.fuse_gelu module

class furiosa.quantizer.frontend.onnx.transformer.fuse_gelu.BertOnnxModel(model)

Bases: onnxruntime.transformers.onnx_model.OnnxModel

fuse_gelu()
class furiosa.quantizer.frontend.onnx.transformer.fuse_gelu.FuseGELU(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

from:
Input –> Div –> Erf –> Add –> M

——————> Mul –> ul–> Output

to:

GELU

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto

furiosa.quantizer.frontend.onnx.transformer.fuse_layer_normalization module

class furiosa.quantizer.frontend.onnx.transformer.fuse_layer_normalization.BertOnnxModel(model)

Bases: onnxruntime.transformers.onnx_model.OnnxModel

fuse_layer_normalization()
class furiosa.quantizer.frontend.onnx.transformer.fuse_layer_normalization.FuseLayerNormalization(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

from:
Input –> ReduceMean –> S –> Pow –> ReduceMean –> Add –> Sqrt –> D

—————–> ub —————————————–> iv –> Mul –> Add Output

to:

LayerNormalization

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto

furiosa.quantizer.frontend.onnx.transformer.fuse_lp_normalization module

class furiosa.quantizer.frontend.onnx.transformer.fuse_lp_normalization.FuseLpNormalization(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_lp_normalization.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform
prev –> ReduceL2/ReduceL1 –> Clip –> Expand –> Div –> next

——————————————–>

to

prev –> LpNormalization –> next

# TODO Check if Div has no initialzier

get_attrs(node)
pattern_matching(base_node)

furiosa.quantizer.frontend.onnx.transformer.fuse_pad module

class furiosa.quantizer.frontend.onnx.transformer.fuse_pad.FusePad(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_pad.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Pad –> MaxPool –> next

to

prev –> MaxPool –> next

if 1. Pad.mode == ‘constant’
  1. Pad.constant_value == -inf

  2. padded on spatial dimension

  3. fused_pads[i] < kernel_shape[i] and fused_pads[i + kernel_rank] < kernel_shape[i] for all i

check_condition_1(node_attr)
check_condition_2(node)
check_condition_3(pads_input)
check_condition_6(node_attrs, pad_input)
get_attrs(node)
get_pad_mode(node_attr)
make_maxpool_pad(pad_input)
make_new_node(matched_nodes)
pattern_condition_checker(nodes_to_check)
pattern_matching(base_node)
pattern_to_match = ['Pad', 'MaxPool']
update_attrs(attrs, pad_input)
class furiosa.quantizer.frontend.onnx.transformer.fuse_pad.Pattern_2(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.fuse_pad.Pattern_1

transform

prev –> Pad –> AveragePool –> next

to

prev –> AveragePool –> next

if 1. Pad.mode == ‘constant’
  1. Pad.constant_value == 0.0

  2. padded on spatial dimension

  3. AveragePool.count_include_pad == 1 or all AveragePool.pads == 0

  4. AveragePool.ceil_mode == 0

  5. fused_pads[i] < kernel_shape[i] and fused_pads[i + kernel_rank] < kernel_shape[i] for all i

check_condition_2(node)
check_condition_4(node)
check_condition_5(node)
get_attrs(node)
make_new_node(matched_nodes)
pattern_condition_checker(nodes_to_check)
pattern_to_match = ['Pad', 'AveragePool']
update_attrs(attrs, pad_input)

furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern module

class furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern.FuseRedundantReshapePattern(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Reshape –> Reshape –> next

to

prev –> Reshape –> next

if prev.output[0].shape != next.input[0].shape

make_new_init(matched_nodes)
make_new_node(matched_nodes)
pattern_condition_checker(nodes_to_check)
pattern_matching(base_node)
pattern_to_match = ['Reshape', 'Reshape']
postfix = '_reshape_fused'
class furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern.Pattern_2(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern.Pattern_1

transform

prev –> Reshape –> Reshape –> Reshape –> next

to

prev –> Reshape –> next

if prev.output[0].shape != next.input[0].shape

pattern_to_match = ['Reshape', 'Reshape', 'Reshape']
class furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern.Pattern_3(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.fuse_redundant_reshape_pattern.Pattern_1

transform

prev –> Flatten/Squeeze –> Unsqueeze –> next

to

prev –> Reshape –> next

if prev.output[0].shape != next.input[0].shape

make_new_init(matched_nodes)
make_new_node(matched_nodes)
make_new_vi(matched_nodes)
pattern_to_match = ['Flatten/Squeeze', 'Unsqueeze']

furiosa.quantizer.frontend.onnx.transformer.infer_squeeze_axes module

class furiosa.quantizer.frontend.onnx.transformer.infer_squeeze_axes.InferSqueezeAxes(*args, **kwds)

Bases: furiosa.quantizer.interfaces.transformer.Transformer

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto
class furiosa.quantizer.frontend.onnx.transformer.infer_squeeze_axes.Pattern_1(model)

Bases: furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer

transform

prev –> Squeeze (axes attribute is None) –> next

to

prev –> Squeeze (axes attribute is filled using input’s value info) –> next

if 1. model’s opset < 13.
  1. axes attribute of Squeeze does not exist

  2. Squeeze.input[0] has shape info (graph input or shape inferred value info)

make_new_node(matched_nodes: Iterable[onnx.onnx_ml_pb2.NodeProto]) List[onnx.onnx_ml_pb2.NodeProto]
pattern_condition_checker(nodes_to_check: Iterable[onnx.onnx_ml_pb2.NodeProto]) bool
pattern_matching(base_node: onnx.onnx_ml_pb2.NodeProto) List[str]
pattern_to_match = ['Squeeze']

furiosa.quantizer.frontend.onnx.transformer.polish_model module

class furiosa.quantizer.frontend.onnx.transformer.polish_model.PolishModel(input_shapes: Optional[Dict[str, List[int]]] = None)

Bases: furiosa.quantizer.interfaces.transformer.Transformer[onnx.onnx_ml_pb2.ModelProto]

Essential graph transformer/optimizers

transform(model: onnx.onnx_ml_pb2.ModelProto) onnx.onnx_ml_pb2.ModelProto

furiosa.quantizer.frontend.onnx.transformer.utils module

furiosa.quantizer.frontend.onnx.transformer.utils.eliminate_unused_initializer(model)
furiosa.quantizer.frontend.onnx.transformer.utils.eliminate_unused_input(model)
furiosa.quantizer.frontend.onnx.transformer.utils.eliminate_unused_output(model)
furiosa.quantizer.frontend.onnx.transformer.utils.eliminate_unused_protos(model)
furiosa.quantizer.frontend.onnx.transformer.utils.eliminate_unused_value_info(model)
furiosa.quantizer.frontend.onnx.transformer.utils.fix_batch_size_as_one(model)

fix batch_size = 1 if dim_param is given.

furiosa.quantizer.frontend.onnx.transformer.utils.fixed_point(x: furiosa.quantizer.frontend.onnx.transformer.utils.T, functions: Iterable[Callable[[furiosa.quantizer.frontend.onnx.transformer.utils.T], furiosa.quantizer.frontend.onnx.transformer.utils.T]]) furiosa.quantizer.frontend.onnx.transformer.utils.T
furiosa.quantizer.frontend.onnx.transformer.utils.include_initializer_to_graph_input(model)
furiosa.quantizer.frontend.onnx.transformer.utils.make_initializer_name_unique(model)
furiosa.quantizer.frontend.onnx.transformer.utils.name_nodes(model)
furiosa.quantizer.frontend.onnx.transformer.utils.rebuild_model(model, new_nodes, eliminate=True, renaming=True)

Module contents

class furiosa.quantizer.frontend.onnx.transformer.ONNXTransformer(model)

Bases: object

bridge_disconnected_nodes(node_0: onnx.onnx_ml_pb2.NodeProto, next_nodes: List[onnx.onnx_ml_pb2.NodeProto], new_input)
For a graph changed, for example,

before) prev –> node_1 –> node_0 –> next after) prev –> node_1 –> ( ) -/-> next

This function bridges node_1 and next as follows:

prev –> node_1 –> next by assigning next.input[y] = node_1.output[x]

build_optimized_model(model)
copy_value_info(name)
find_next_node(node: onnx.onnx_ml_pb2.NodeProto) List[onnx.onnx_ml_pb2.NodeProto]
find_prev_node(node_input: str) onnx.onnx_ml_pb2.NodeProto
get_data_node_input(node)
get_init_node_input(node)
get_initializer_array(node_input)
get_map_values(field)
get_node_input_idx(node_input)
get_value_info_dtype(tensor_name: str) List[int]
get_value_info_shape(value_info_name: str) List[int]
is_op_type(op_type: str, target_op_types: List[str])
is_same_shape(input_1, input_2)
make_field_unique(values)
make_initializer_from_array(array: numpy.ndarray, name: Optional[str] = None) onnx.onnx_ml_pb2.TensorProto
make_int64_initializer(name, target_name)
make_node(op_type, inputs, outputs, name=None, **attrs)
make_tensor_value_info(name, elem_type, shape)
pattern_matcher(node, pattern_to_match: List[str])
pattern_matching(base_node)
pop_multiple_initializer_map(nodes: List[onnx.onnx_ml_pb2.TensorProto])
pop_multiple_optimizer_map(nodes: List[onnx.onnx_ml_pb2.NodeProto])
pop_multiple_value_info_map(vis: List[onnx.onnx_ml_pb2.ValueInfoProto])
pop_single_initializer_map(init: onnx.onnx_ml_pb2.TensorProto)
pop_single_optimizer_map(node: onnx.onnx_ml_pb2.NodeProto)
pop_single_value_info_map(vi: onnx.onnx_ml_pb2.NodeProto)
transform()
transform_to_convert(nodes_to_remove: List[onnx.onnx_ml_pb2.NodeProto], nodes_to_add: Optional[List[onnx.onnx_ml_pb2.NodeProto]] = None, inits_to_add: Optional[List[onnx.onnx_ml_pb2.TensorProto]] = None, vis_to_add: Optional[List[onnx.onnx_ml_pb2.ValueInfoProto]] = None)
transform_to_eliminate(nodes_to_remove: List[onnx.onnx_ml_pb2.NodeProto], new_input)

This function eliminates designated nodes and bridges the previous and next nodes of them.

For example, if [B, C] is given to be removed, then removes [B, C] in A - B - C - D and connects [A, D] to make A - D.

transform_to_fuse(nodes_to_remove: List[onnx.onnx_ml_pb2.NodeProto], nodes_to_add: Optional[List[onnx.onnx_ml_pb2.NodeProto]] = None, inits_to_add: Optional[List[onnx.onnx_ml_pb2.TensorProto]] = None, vis_to_add: Optional[List[onnx.onnx_ml_pb2.ValueInfoProto]] = None)
traverse_prev_node(producer_map_key: str, target_op_types: List[str])
update_graph_fields(model)
update_multiple_initializer_map(initializers: List[onnx.onnx_ml_pb2.TensorProto])
update_multiple_optimizer_map(nodes: List[onnx.onnx_ml_pb2.NodeProto], dest_name)
update_multiple_value_info_map(value_infos: List[onnx.onnx_ml_pb2.ValueInfoProto])
update_single_initializer_map(initializer: onnx.onnx_ml_pb2.TensorProto)
update_single_optimizer_map(node: onnx.onnx_ml_pb2.NodeProto, dest_name)
update_single_value_info_map(value_info: onnx.onnx_ml_pb2.ValueInfoProto)