mul 重写

mul 重写#

import tvm
from tvm import relax
from tvm.relax.testing import nn
from tvm_book.nn import modules
from tvm.script import ir as I, relax as R, tir as T

测试当乘法算子的右操作数不是常量时的量化处理逻辑。

bb = relax.BlockBuilder()

with bb.function("main"):
    model = modules.Conv2D(16, 16, kernel_size=(3, 3), padding=(1, 1))
    x = nn.Placeholder((1, 16, 64, 64), dtype="float32", name="x")
    data = nn.Placeholder((1, 16, 1, 1), dtype="float32", name="const")
    multiplier = R.sigmoid(data)
    conv = model(x)
    act = R.nn.relu(data=conv)
    output = act * multiplier
    params = [x, data] + model.parameters()
    bb.emit_func_output(output, params)
mod = bb.get()
mod.show()
# from tvm.script import ir as I
# from tvm.script import relax as R

@I.ir_module
class Module:
    @R.function
    def main(x: R.Tensor((1, 16, 64, 64), dtype="float32"), const: R.Tensor((1, 16, 1, 1), dtype="float32"), bias: R.Tensor((16,)), weight: R.Tensor((16, 16, 3, 3))) -> R.Tensor((1, 16, 64, 64)):
        gv: R.Tensor((1, 16, 64, 64)) = conv2_d(x, bias, weight)
        gv1: R.Tensor((1, 16, 64, 64)) = R.nn.relu(gv)
        gv2: R.Tensor((1, 16, 1, 1), dtype="float32") = R.sigmoid(const)
        gv3: R.Tensor((1, 16, 64, 64)) = R.multiply(gv1, gv2)
        return gv3