aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/softmax.py
diff options
context:
space:
mode:
authorLouis Verhaard <louis.verhaard@arm.com>2020-09-30 09:01:52 +0200
committerLouis Verhaard <louis.verhaard@arm.com>2020-10-08 16:29:29 +0200
commitaee5d7537ff81ffda5ba222721b72f914ce50fb8 (patch)
tree495b9dfff2a188c6916f8ca2e390ee88f7da8ccc /ethosu/vela/softmax.py
parent36ad73a0fb46d3f844845c97c56d92de2a7a9b3d (diff)
downloadethos-u-vela-aee5d7537ff81ffda5ba222721b72f914ce50fb8.tar.gz
MLBEDSW-3148: Refactor Operation
- op.type is now an enum instead of a string - Removed unused operator codes - Refactored some attributes like npu_block_type, fused_activation_function - Refactored operator index calculation - Refactored a number of operator sets Change-Id: I641f65ee375794b7aec42abc0664251ae37d78e8 Signed-off-by: Louis Verhaard <louis.verhaard@arm.com>
Diffstat (limited to 'ethosu/vela/softmax.py')
-rw-r--r--ethosu/vela/softmax.py71
1 files changed, 36 insertions, 35 deletions
diff --git a/ethosu/vela/softmax.py b/ethosu/vela/softmax.py
index 5a5396f4..12c20164 100644
--- a/ethosu/vela/softmax.py
+++ b/ethosu/vela/softmax.py
@@ -25,6 +25,7 @@ import numpy as np
from . import fp_math
from . import scaling
from .data_type import DataType
+from .operation import Op
from .operation import Operation
from .tensor import create_const_tensor
from .tensor import create_reshape_tensor
@@ -229,7 +230,7 @@ class SoftMax:
# PASS 0 - Depthwise Maxpool
maxpool_op = self.op.clone("_maxpool0")
- maxpool_op.type = "MaxPool"
+ maxpool_op.type = Op.MaxPool
maxpool_h = ifm.shape[1] * ifm.shape[2]
maxpool_w = ifm.shape[3]
maxpool_ifm_shape = [1, maxpool_h, maxpool_w, 1]
@@ -246,7 +247,7 @@ class SoftMax:
maxpool_op.set_output_tensor(ifm_max)
# PASS 1 - Sub+LUT(exp)
- sub_op = Operation("SubAct", self.op.name + "_sub1")
+ sub_op = Operation(Op.Sub, self.op.name + "_sub1")
sub_op.add_input_tensor(ifm)
sub_op.add_input_tensor(create_reshape_tensor(ifm_max, [1, ifm.shape[1], ifm.shape[2], 1]))
sub_op.set_activation_lut(
@@ -262,7 +263,7 @@ class SoftMax:
sub_op.set_output_tensor(ifm_exp)
# PASS 2 - SHR
- shr2_op = Operation("SHR", self.op.name + "_shr2")
+ shr2_op = Operation(Op.SHR, self.op.name + "_shr2")
shr2_op.attrs["rounding_mode"] = b"NATURAL"
shr2_op.add_input_tensor(ifm_exp)
shr2_op.add_input_tensor(
@@ -275,7 +276,7 @@ class SoftMax:
shr2_op.set_output_tensor(rescaled_exp)
# PASS 3 - Reduce sum
- reduce_sum_op = Operation("ReduceSum", self.op.name + "_reduce_sum3")
+ reduce_sum_op = Operation(Op.ReduceSum, self.op.name + "_reduce_sum3")
reduce_sum_op.attrs["padding"] = b"VALID"
reduce_sum_op.attrs["stride_w"] = 1
reduce_sum_op.attrs["stride_h"] = 1
@@ -291,14 +292,14 @@ class SoftMax:
reduce_sum_op.set_output_tensor(sum_of_exp)
# PASS 4 - CLZ
- clz_op = Operation("CLZ", self.op.name + "_clz4")
+ clz_op = Operation(Op.CLZ, self.op.name + "_clz4")
clz_op.add_input_tensor(sum_of_exp)
headroom_plus_one = Tensor(reduce_sum_shape, DataType.int32, clz_op.name + "_0")
headroom_plus_one.quantization = no_scale_quant
clz_op.set_output_tensor(headroom_plus_one)
# PASS 5 - Sub
- sub5_op = Operation("SubAct", self.op.name + "_sub5")
+ sub5_op = Operation(Op.Sub, self.op.name + "_sub5")
sub5_op.add_input_tensor(
create_const_tensor(
"headroom_offset_const",
@@ -316,7 +317,7 @@ class SoftMax:
# PASS 6 - Sub
one = create_const_tensor("one_const", [1, 1, 1, 1], DataType.int32, [1], np.int32, quantization=no_scale_quant)
- sub6_op = Operation("SubAct", self.op.name + "_sub6")
+ sub6_op = Operation(Op.Sub, self.op.name + "_sub6")
sub6_op.add_input_tensor(headroom_plus_one)
sub6_op.add_input_tensor(one)
headroom = Tensor(reduce_sum_shape, DataType.int32, sub6_op.name + "_0")
@@ -324,7 +325,7 @@ class SoftMax:
sub6_op.set_output_tensor(headroom)
# PASS 7 - SHL
- shl7_op = Operation("SHL", self.op.name + "_shl7")
+ shl7_op = Operation(Op.SHL, self.op.name + "_shl7")
shl7_op.add_input_tensor(sum_of_exp)
shl7_op.add_input_tensor(headroom)
shifted_sum = Tensor(reduce_sum_shape, DataType.int32, shl7_op.name + "_0")
@@ -332,7 +333,7 @@ class SoftMax:
shl7_op.set_output_tensor(shifted_sum)
# PASS 8 - Sub
- sub8_op = Operation("SubAct", self.op.name + "_sub8")
+ sub8_op = Operation(Op.Sub, self.op.name + "_sub8")
sub8_op.add_input_tensor(shifted_sum)
sub8_op.add_input_tensor(
create_const_tensor(
@@ -344,7 +345,7 @@ class SoftMax:
sub8_op.set_output_tensor(shifted_sum_minus_one)
# PASS 9 - SHL
- shl9_op = Operation("SHL", self.op.name + "_shl9")
+ shl9_op = Operation(Op.SHL, self.op.name + "_shl9")
shl9_op.add_input_tensor(shifted_sum_minus_one)
shl9_op.add_input_tensor(one)
shifted_sum_minus_one = Tensor(reduce_sum_shape, DataType.int32, shl9_op.name + "_0")
@@ -352,7 +353,7 @@ class SoftMax:
shl9_op.set_output_tensor(shifted_sum_minus_one)
# PASS 10 - Add
- add10_op = Operation("AddAct", self.op.name + "_add10")
+ add10_op = Operation(Op.Add, self.op.name + "_add10")
add10_op.add_input_tensor(
create_const_tensor(
"F0_one_const", [1, 1, 1, 1], DataType.int32, [(1 << 31) - 1], np.int32, quantization=no_scale_quant
@@ -365,7 +366,7 @@ class SoftMax:
add10_op.set_output_tensor(half_denominator)
# PASS 11 - Multiply
- mul11_op = Operation("MulAct", self.op.name + "_mul11")
+ mul11_op = Operation(Op.Mul, self.op.name + "_mul11")
mul11_op.add_input_tensor(half_denominator)
mul11_op.add_input_tensor(
create_const_tensor(
@@ -383,7 +384,7 @@ class SoftMax:
mul11_op.set_output_tensor(rescaled)
# PASS 12 - Add
- add12_op = Operation("AddAct", self.op.name + "_add12")
+ add12_op = Operation(Op.Add, self.op.name + "_add12")
add12_op.add_input_tensor(rescaled)
add12_op.add_input_tensor(
create_const_tensor(
@@ -403,7 +404,7 @@ class SoftMax:
)
for i in range(3):
# PASS 13, 18, 23 - MUL
- mul_op = Operation("MulAct", self.op.name + "_mul%d" % (13 + i * 5))
+ mul_op = Operation(Op.Mul, self.op.name + "_mul%d" % (13 + i * 5))
mul_op.add_input_tensor(nr_x)
mul_op.add_input_tensor(half_denominator)
half_denominator_times_x = Tensor(reduce_sum_shape, DataType.int32, mul_op.name + "_0")
@@ -411,14 +412,14 @@ class SoftMax:
half_denominator_times_x.quantization.scale_f32 = 2.0
mul_op.set_output_tensor(half_denominator_times_x)
# PASS 14, 19, 24 - SUB
- sub_op = Operation("SubAct", self.op.name + "_sub%d" % (14 + i * 5))
+ sub_op = Operation(Op.Sub, self.op.name + "_sub%d" % (14 + i * 5))
sub_op.add_input_tensor(F2_one)
sub_op.add_input_tensor(half_denominator_times_x)
one_minus_half_denominator_times_x = Tensor(reduce_sum_shape, DataType.int32, sub_op.name + "_0")
one_minus_half_denominator_times_x.quantization = one_scale_quant
sub_op.set_output_tensor(one_minus_half_denominator_times_x)
# PASS 15, 20, 25 - MUL
- mul_op = Operation("MulAct", self.op.name + "_mul%d" % (15 + i * 5))
+ mul_op = Operation(Op.Mul, self.op.name + "_mul%d" % (15 + i * 5))
mul_op.add_input_tensor(nr_x)
mul_op.add_input_tensor(one_minus_half_denominator_times_x)
to_rescale = Tensor(reduce_sum_shape, DataType.int32, mul_op.name + "_0")
@@ -426,14 +427,14 @@ class SoftMax:
to_rescale.quantization.scale_f32 = 2.0
mul_op.set_output_tensor(to_rescale)
# PASS 16, 21, 26 - MUL
- shl_op = Operation("MulAct", self.op.name + "_mul%d" % (16 + i * 5))
+ shl_op = Operation(Op.Mul, self.op.name + "_mul%d" % (16 + i * 5))
shl_op.add_input_tensor(to_rescale)
shl_op.add_input_tensor(four)
to_add = Tensor(reduce_sum_shape, DataType.int32, shl_op.name + "_0")
to_add.quantization = no_scale_quant
shl_op.set_output_tensor(to_add)
# PASS 17, 22, 27 - ADD
- add_op = Operation("AddAct", self.op.name + "_add%d" % (17 + i * 5))
+ add_op = Operation(Op.Add, self.op.name + "_add%d" % (17 + i * 5))
add_op.add_input_tensor(nr_x)
add_op.add_input_tensor(to_add)
nr_x = Tensor(reduce_sum_shape, DataType.int32, add_op.name + "_0")
@@ -441,7 +442,7 @@ class SoftMax:
add_op.set_output_tensor(nr_x)
# PASS 28 - Multiply
- mul28_op = Operation("MulAct", self.op.name + "_mul28")
+ mul28_op = Operation(Op.Mul, self.op.name + "_mul28")
mul28_op.add_input_tensor(nr_x)
mul28_op.add_input_tensor(
create_const_tensor("two_const", [1, 1, 1, 1], DataType.int32, [2], np.int32, quantization=no_scale_quant)
@@ -451,7 +452,7 @@ class SoftMax:
mul28_op.set_output_tensor(scale_factor)
# PASS 29 - Multiply
- mul_op = Operation("MulAct", self.op.name + "_mul29")
+ mul_op = Operation(Op.Mul, self.op.name + "_mul29")
mul_op.add_input_tensor(ifm_exp)
mul_op.add_input_tensor(scale_factor)
scaled_exp = Tensor(ifm_exp.shape, DataType.int32, mul_op.name + "_0")
@@ -460,7 +461,7 @@ class SoftMax:
mul_op.set_output_tensor(scaled_exp)
# PASS 30 - SHR
- shr30_op = Operation("SHR", self.op.name + "_shr30")
+ shr30_op = Operation(Op.SHR, self.op.name + "_shr30")
shr30_op.attrs["rounding_mode"] = b"NATURAL"
shr30_op.add_input_tensor(scaled_exp)
shr30_op.add_input_tensor(right_shift)
@@ -474,7 +475,7 @@ class SoftMax:
# PASS 0 - Depthwise Maxpool
maxpool_op = self.op.clone("_maxpool0")
- maxpool_op.type = "MaxPool"
+ maxpool_op.type = Op.MaxPool
maxpool_h = ifm.shape[1] * ifm.shape[2]
maxpool_w = ifm.shape[3]
maxpool_ifm_shape = [1, maxpool_h, maxpool_w, 1]
@@ -491,7 +492,7 @@ class SoftMax:
maxpool_op.set_output_tensor(maxpool_ofm)
# PASS 1 - Sub
- sub1_op = Operation("SubAct", self.op.name + "_sub1")
+ sub1_op = Operation(Op.Sub, self.op.name + "_sub1")
sub1_op.add_input_tensor(ifm)
sub1_op.add_input_tensor(create_reshape_tensor(maxpool_ofm, [1, ifm.shape[1], ifm.shape[2], 1]))
sub1_ofm = Tensor(ifm.shape, DataType.int32, sub1_op.name + "_0")
@@ -504,7 +505,7 @@ class SoftMax:
mul2_scale, _ = scaling.elementwise_mul_scale(sub1_ofm.quantization.scale_f32, beta, mul2_out_range)
mul2_quant = ifm.quantization.clone()
mul2_quant.scale_f32 = beta
- mul2_op = Operation("MulAct", self.op.name + "_mul2")
+ mul2_op = Operation(Op.Mul, self.op.name + "_mul2")
mul2_op.add_input_tensor(sub1_ofm)
mul2_op.add_input_tensor(
create_const_tensor(
@@ -517,7 +518,7 @@ class SoftMax:
mul2_op.set_output_tensor(mul2_ofm)
# PASS 3 - Add+LUT(exp)
- add_op = Operation("AddAct", self.op.name + "_add3")
+ add_op = Operation(Op.Add, self.op.name + "_add3")
add_op.add_input_tensor(mul2_ofm)
add_op.add_input_tensor(
create_const_tensor(
@@ -534,7 +535,7 @@ class SoftMax:
add_op.set_output_tensor(exp_ofm)
# PASS 4 - Reduce sum
- reduce_sum_op = Operation("ReduceSum", self.op.name + "_reduce_sum4")
+ reduce_sum_op = Operation(Op.ReduceSum, self.op.name + "_reduce_sum4")
reduce_sum_op.attrs["padding"] = b"VALID"
reduce_sum_op.attrs["stride_w"] = 1
reduce_sum_op.attrs["stride_h"] = 1
@@ -550,14 +551,14 @@ class SoftMax:
reduce_sum_op.set_output_tensor(sum_of_exp)
# PASS 5 - CLZ
- clz_op = Operation("CLZ", self.op.name + "_clz5")
+ clz_op = Operation(Op.CLZ, self.op.name + "_clz5")
clz_op.add_input_tensor(sum_of_exp)
headroom_plus_one = Tensor(reduce_sum_shape, DataType.int32, clz_op.name + "_0")
headroom_plus_one.quantization = no_scale_quant
clz_op.set_output_tensor(headroom_plus_one)
# PASS 6 - Sub
- sub6_op = Operation("SubAct", self.op.name + "_sub6")
+ sub6_op = Operation(Op.Sub, self.op.name + "_sub6")
sub6_op.add_input_tensor(
create_const_tensor(
sub6_op.name + "_const", [1, 1, 1, 1], DataType.int32, [31], np.int32, quantization=no_scale_quant
@@ -569,7 +570,7 @@ class SoftMax:
sub6_op.set_output_tensor(reciprocal_right_shift)
# PASS 7 - SHL
- shl7_op = Operation("SHL", self.op.name + "_shl7")
+ shl7_op = Operation(Op.SHL, self.op.name + "_shl7")
shl7_op.add_input_tensor(
create_const_tensor(
shl7_op.name + "_const", [1, 1, 1, 1], DataType.int32, [1], np.int32, quantization=no_scale_quant
@@ -581,7 +582,7 @@ class SoftMax:
shl7_op.set_output_tensor(constant_one)
# PASS 8 - Sub
- sub8_op = Operation("SubAct", self.op.name + "_sub8")
+ sub8_op = Operation(Op.Sub, self.op.name + "_sub8")
sub8_op.add_input_tensor(sum_of_exp)
sub8_op.add_input_tensor(constant_one)
sum_of_exps_minus_one = Tensor(reduce_sum_shape, DataType.int32, sub8_op.name + "_0")
@@ -589,7 +590,7 @@ class SoftMax:
sub8_op.set_output_tensor(sum_of_exps_minus_one)
# PASS 9 - SHL
- shl9_op = Operation("SHL", self.op.name + "_shl9")
+ shl9_op = Operation(Op.SHL, self.op.name + "_shl9")
shl9_op.add_input_tensor(sum_of_exps_minus_one)
shl9_op.add_input_tensor(headroom_plus_one)
shifted_sum_minus_one = Tensor(reduce_sum_shape, DataType.int32, shl9_op.name + "_0")
@@ -597,7 +598,7 @@ class SoftMax:
shl9_op.set_output_tensor(shifted_sum_minus_one)
# PASS 10 - SHR
- shr10_op = Operation("SHR", self.op.name + "_shr10")
+ shr10_op = Operation(Op.SHR, self.op.name + "_shr10")
shr10_op.add_input_tensor(shifted_sum_minus_one)
shr10_op.add_input_tensor(
create_const_tensor(
@@ -609,7 +610,7 @@ class SoftMax:
shr10_op.set_output_tensor(shifted_sum_minus_one_16)
# PASS 11 - Sub+LUT(one over one plus x)
- sub11_op = Operation("SubAct", self.op.name + "_sub11")
+ sub11_op = Operation(Op.Sub, self.op.name + "_sub11")
sub11_op.add_input_tensor(shifted_sum_minus_one_16)
sub11_op.add_input_tensor(
create_const_tensor(
@@ -631,7 +632,7 @@ class SoftMax:
sub11_op.set_output_tensor(reciprocal_scale)
# PASS 12 - Multiply
- mul_op = Operation("MulAct", self.op.name + "_mul12")
+ mul_op = Operation(Op.Mul, self.op.name + "_mul12")
mul_op.add_input_tensor(exp_ofm)
mul_op.add_input_tensor(reciprocal_scale)
mul_ofm = Tensor(exp_ofm.shape, DataType.int32, mul_op.name + "_0")
@@ -639,7 +640,7 @@ class SoftMax:
mul_op.set_output_tensor(mul_ofm)
# PASS 13 - SHR
- shr13_op = Operation("SHR", self.op.name + "_shr13")
+ shr13_op = Operation(Op.SHR, self.op.name + "_shr13")
shr13_op.add_input_tensor(mul_ofm)
shr13_op.add_input_tensor(reciprocal_right_shift)
shr13_op.set_output_tensor(ofm)