AMDMIGraphX icon indicating copy to clipboard operation
AMDMIGraphX copied to clipboard

Horizontal fusion Conv->add->sigmoid->mul issue in YoloX

Open CharlieL7 opened this issue 10 months ago • 0 comments

Sigmoid not being merged into horizontally fused convolution because of multiple outputs. Minimal example program:

import migraphx
import numpy as np

p = migraphx.program()
mm = p.get_main_module()

shape_1 = migraphx.shape(lens=[1, 128, 160, 160], type='float_type')
shape_2 = migraphx.shape(lens=[1, 64, 160, 160], type='float_type')

x1 = mm.add_parameter('x1', shape_1)

w1 = mm.add_literal(np.ones([64, 128, 1, 1], dtype=np.float32) * 0.5)
w2 = mm.add_literal(np.ones([64, 128, 1, 1], dtype=np.float32) * 0.75)

conv1 = mm.add_instruction(migraphx.op('convolution', padding=[0, 0, 0, 0], stride=[1, 1], dilation=[1, 1], padding_mode=0, group=1), [x1, w1])
conv2 = mm.add_instruction(migraphx.op('convolution', padding=[0, 0, 0, 0], stride=[1, 1], dilation=[1, 1], padding_mode=0, group=1), [x1, w2])

lit1 = mm.add_literal(np.ones([64], dtype=np.float32) * 0.5)
lit2 = mm.add_literal(np.ones([64], dtype=np.float32) * 0.25)

broadcast1 = mm.add_instruction(migraphx.op('broadcast', axis=1, out_lens=[1, 64, 160, 160]), [lit1])
broadcast2 = mm.add_instruction(migraphx.op('broadcast', axis=1, out_lens=[1, 64, 160, 160]), [lit2])

add1 = mm.add_instruction(migraphx.op('add'), [conv1, broadcast1])
sig1 = mm.add_instruction(migraphx.op('sigmoid'), [add1])
mul1 = mm.add_instruction(migraphx.op('mul'), [sig1, add1])

add2 = mm.add_instruction(migraphx.op('add'), [conv2, broadcast2])
sig2 = mm.add_instruction(migraphx.op('sigmoid'), [add2])
mul2 = mm.add_instruction(migraphx.op('mul'), [sig2, add2])

mm.add_return([mul1, mul2])

CharlieL7 avatar Feb 25 '25 17:02 CharlieL7