def make_default_quantizer(self, mode) -> quantizer_impl.IQuantizer: """make quantizer given qkeras quantizer type.""" if mode == "fp32": return quantizer_impl.FloatingPoint(bits=32) elif mode == "fp16": return quantizer_impl.FloatingPoint(bits=16) elif mode == "int8": qbits = quantizer_impl.QuantizedBits() qbits.convert_qkeras_quantizer(quantizers.quantized_bits(8, 0, 1)) return qbits elif mode == "int16": qbits = quantizer_impl.QuantizedBits() qbits.convert_qkeras_quantizer(quantizers.quantized_bits(16, 7, 1)) return qbits elif mode == "int32": qbits = quantizer_impl.QuantizedBits() qbits.convert_qkeras_quantizer(quantizers.quantized_bits( 32, 10, 1)) return qbits else: try: # string to quantizer object q_name = "quantizers." + mode qkeras_object = eval(q_name) # pylint: disable=eval-used return self._make_quantizer_util(qkeras_object) except: # pylint: disable=bare-except raise ValueError("unaccepted quantizer {}!".format(mode))
def __init__(self, multiplier: multiplier_impl.IMultiplier): super().__init__() self.multiplier = multiplier self.output = quantizer_impl.FloatingPoint( bits=self.multiplier.output.bits) self.output.bits = self.multiplier.output.bits self.output.int_bits = -1 self.output.is_signed = self.multiplier.output.is_signed self.output.is_floating_point = True self.output.op_type = "accumulator"
def __init__(self, input_qe_list): super().__init__(input_qe_list) is_same = True is_floating_point = False bits = 0 quantizer = self.input_quantizers[0] for cur in self.input_quantizers[1:]: if (quantizer.name != cur.name or quantizer.bits != cur.bits or quantizer.int_bits != cur.int_bits or quantizer.is_signed != cur.is_signed): is_same = False break if is_same: self.output = quantizer else: max_bits = -1 max_int_bits = -1 is_signed = False for quantizer in self.input_quantizers: if quantizer.is_floating_point: is_floating_point = True bits = max(bits, quantizer.bits) else: if quantizer.is_po2: qbits_quantizer = adder_impl.po2_qbits_converter( quantizer) else: qbits_quantizer = quantizer if qbits_quantizer.bits > max_bits: max_bits = qbits_quantizer.bits if qbits_quantizer.int_bits > max_int_bits: max_int_bits = qbits_quantizer.int_bits is_signed |= quantizer.is_signed if is_floating_point: self.output = quantizer_impl.FloatingPoint(bits=bits) else: self.output = quantizer_impl.QuantizedBits() self.output.bits = max_bits self.output.int_bits = max_int_bits self.output.is_signed = is_signed self.output.mode = 0 self.output.is_floating_point = False self.output.is_po2 = 0 self.gate_factor = 0.2 self.gate_bits = self.output.bits
def __init__(self, input_qe_list): super().__init__(input_qe_list) max_bits = -1 max_int_bits = -1 is_signed = False bits = 0 is_floating_point = False for quantizer in self.input_quantizers: if quantizer.is_floating_point: is_floating_point = True bits = max(bits, quantizer.bits) else: if quantizer.is_po2: qbits_quantizer = adder_impl.po2_qbits_converter(quantizer) else: qbits_quantizer = quantizer if qbits_quantizer.bits > max_bits: max_bits = qbits_quantizer.bits if qbits_quantizer.int_bits > max_int_bits: max_int_bits = qbits_quantizer.int_bits is_signed |= quantizer.is_signed if is_floating_point: self.output = quantizer_impl.FloatingPoint(bits=bits) else: self.output = quantizer_impl.QuantizedBits() self.output.bits = max_bits + 1 self.output.int_bits = max_int_bits + 1 self.output.is_signed = is_signed self.output.mode = 0 self.output.is_floating_point = False self.output.is_po2 = 0 self.gate_factor = 1 self.gate_bits = self.output.bits
def __init__(self, quantizer_1, quantizer_2): bits = max(quantizer_1.bits, quantizer_2.bits) self.output = quantizer_impl.FloatingPoint(bits=bits)
def __init__(self): # also attached the output datatype in the table self.divider_impl_table = [ [ # when qbits is denominator, use default bits for float result (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint( bits=quantizer_impl.FLOATINGPOINT_BITS)), (divider_impl.Shifter, quantizer_impl.QuantizedBits()), (None, None), (None, None), (None, None), # when bits sets to None, will decide f16/f32 according # to input quantizer (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None)) ], [(divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint( bits=quantizer_impl.FLOATINGPOINT_BITS)), (divider_impl.Subtractor, quantizer_impl.PowerOfTwo()), (None, None), (None, None), (None, None), (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None))], [(divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint( bits=quantizer_impl.FLOATINGPOINT_BITS)), (divider_impl.Shifter, quantizer_impl.QuantizedBits()), (None, None), (None, None), (None, None), (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None))], [(divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint( bits=quantizer_impl.FLOATINGPOINT_BITS)), (divider_impl.Shifter, quantizer_impl.PowerOfTwo()), (None, None), (None, None), (None, None), (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None))], [(divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint( bits=quantizer_impl.FLOATINGPOINT_BITS)), (divider_impl.Shifter, quantizer_impl.PowerOfTwo()), (None, None), (None, None), (None, None), (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None))], [(divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None)), (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None)), (None, None), (None, None), (None, None), (divider_impl.FloatingPointDivider, quantizer_impl.FloatingPoint(bits=None))] ]
def __init__(self): # the table below is found in this slides: # https://docs.google.com/presentation/d/1pcmoB6ZpX0IqjhSwgzO-oQwpMRYwIcDe/edit#slide=id.p40 # also attached the output datatype in the table self.multiplier_impl_table = [ [(multiplier_impl.FixedPointMultiplier, quantizer_impl.QuantizedBits()), (multiplier_impl.Shifter, quantizer_impl.QuantizedBits()), (multiplier_impl.Mux, quantizer_impl.QuantizedBits()), (multiplier_impl.Mux, quantizer_impl.QuantizedBits()), (multiplier_impl.AndGate, quantizer_impl.QuantizedBits()), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None))], [(multiplier_impl.Shifter, quantizer_impl.QuantizedBits()), (multiplier_impl.Adder, quantizer_impl.PowerOfTwo()), (multiplier_impl.Mux, quantizer_impl.PowerOfTwo()), (multiplier_impl.Mux, quantizer_impl.PowerOfTwo()), (multiplier_impl.AndGate, quantizer_impl.PowerOfTwo()), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None))], [(multiplier_impl.Mux, quantizer_impl.QuantizedBits()), (multiplier_impl.Mux, quantizer_impl.PowerOfTwo()), (multiplier_impl.Mux, quantizer_impl.Ternary()), (multiplier_impl.Mux, quantizer_impl.Ternary()), (multiplier_impl.AndGate, quantizer_impl.Ternary()), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None))], [(multiplier_impl.Mux, quantizer_impl.QuantizedBits()), (multiplier_impl.Mux, quantizer_impl.PowerOfTwo()), (multiplier_impl.Mux, quantizer_impl.Ternary()), (multiplier_impl.XorGate, quantizer_impl.Binary(use_01=False)), (multiplier_impl.AndGate, quantizer_impl.Ternary()), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None))], [(multiplier_impl.AndGate, quantizer_impl.QuantizedBits()), (multiplier_impl.AndGate, quantizer_impl.PowerOfTwo()), (multiplier_impl.AndGate, quantizer_impl.Ternary()), (multiplier_impl.AndGate, quantizer_impl.Ternary()), (multiplier_impl.AndGate, quantizer_impl.Binary(use_01=True)), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None))], [(multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None)), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None)), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None)), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None)), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None)), (multiplier_impl.FloatingPointMultiplier, quantizer_impl.FloatingPoint(bits=None))] ]