| 12 | |
| 13 | |
| 14 | class Quantizer(object): |
| 15 | |
| 16 | def __init__(self, |
| 17 | q_groups=1, |
| 18 | q_mixed_fp16=False, |
| 19 | q_change_ratio=0.01, |
| 20 | q_type=0, |
| 21 | q_rounding=0, |
| 22 | q_verbose=False, |
| 23 | q_eigenvalue=False, |
| 24 | use_quantizer_kernel=False, |
| 25 | layer_num=0): |
| 26 | |
| 27 | self.q_groups = q_groups |
| 28 | self.q_mixed_fp16 = q_mixed_fp16 |
| 29 | self.q_change_ratio = q_change_ratio |
| 30 | self.q_type = q_type |
| 31 | self.qsteps = 0 |
| 32 | self.quantize_real_ratio = 1.000 |
| 33 | self.q_verbose = q_verbose |
| 34 | self.q_eigenvalue = q_eigenvalue |
| 35 | self.use_quantizer_kernel = use_quantizer_kernel |
| 36 | self.q_rounding = q_rounding |
| 37 | self.layer_num = layer_num |
| 38 | |
| 39 | def any_precision_switch(self): |
| 40 | # Temporary disabled functionality |
| 41 | if self.layer_num == 0: |
| 42 | return True |
| 43 | result = False |
| 44 | for index in range(self.layer_num): |
| 45 | if self.q_start_bits[index] != self.q_target_bits: |
| 46 | next_step = self.qsteps + (TWO_D_PARAMS * (self.layer_num if self.layer_num != 0 else 1)) |
| 47 | if next_step >= self.q_period[index]: |
| 48 | result = True |
| 49 | return result |
| 50 | |
| 51 | def quantize(self, parameter_group, overflow, eigenvalue_enabled, block_eigenvalue={}): |
| 52 | |
| 53 | if overflow and not eigenvalue_enabled: |
| 54 | return |
| 55 | |
| 56 | self.step() |
| 57 | |
| 58 | self.update_fp16_ratio() |
| 59 | |
| 60 | for i in range(len(parameter_group)): |
| 61 | for p in parameter_group[i]: |
| 62 | if len(p.size()) > 1 and hasattr(p, "start_bits") and p.start_bits: |
| 63 | param_id = id(p) |
| 64 | if block_eigenvalue is None: |
| 65 | eigenvalue, layer_id = None, 0 |
| 66 | else: |
| 67 | eigenvalue, layer_id = block_eigenvalue[param_id] if param_id in block_eigenvalue else (None, |
| 68 | 0) |
| 69 | if eigenvalue is not None: |
| 70 | factor = 1 + math.floor(eigenvalue * 4) |
| 71 | p.data = self.compute_quantization(p.data, layer_id, factor) |
no outgoing calls
no test coverage detected