|
|
|
@ -114,7 +114,6 @@ class ConvertToQuantNetwork:
|
|
|
|
|
def run(self):
|
|
|
|
|
self.network.update_cell_prefix()
|
|
|
|
|
network = self._convert_subcells2quant(self.network)
|
|
|
|
|
network = _AddFakeQuantInput(network)
|
|
|
|
|
self.network.update_cell_type("quant")
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
@ -275,16 +274,20 @@ class ExportToQuantInferNetwork:
|
|
|
|
|
Args:
|
|
|
|
|
network (Cell): MindSpore network API `convert_quant_network`.
|
|
|
|
|
inputs (Tensor): Input tensors of the `quantization aware training network`.
|
|
|
|
|
mean (int): Input data mean. Default: 127.5.
|
|
|
|
|
std_dev (int, float): Input data variance. Default: 127.5.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Cell, GEIR backend Infer network.
|
|
|
|
|
"""
|
|
|
|
|
__quant_op_name__ = ["TensorAdd", "Sub", "Mul", "RealDiv"]
|
|
|
|
|
|
|
|
|
|
def __init__(self,
|
|
|
|
|
network,
|
|
|
|
|
*inputs):
|
|
|
|
|
def __init__(self, network, mean, std_dev, *inputs):
|
|
|
|
|
network = validator.check_isinstance('network', network, (nn.Cell,))
|
|
|
|
|
# quantize for inputs: q = f / scale + zero_point
|
|
|
|
|
# dequantize for outputs: f = (q - zero_point) * scale
|
|
|
|
|
self.input_scale = round(mean)
|
|
|
|
|
self.input_zero_point = 1 / std_dev
|
|
|
|
|
self.data_type = mstype.int8
|
|
|
|
|
self.network = copy.deepcopy(network)
|
|
|
|
|
self.all_parameters = {p.name: p for p in self.network.get_parameters()}
|
|
|
|
@ -395,7 +398,7 @@ class ExportToQuantInferNetwork:
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def export(network, *inputs, file_name, file_format='GEIR'):
|
|
|
|
|
def export(network, *inputs, file_name, mean=127.5, std_dev=127.5, file_format='GEIR'):
|
|
|
|
|
"""
|
|
|
|
|
Exports MindSpore quantization predict model to deploy with GEIR.
|
|
|
|
|
|
|
|
|
@ -403,12 +406,17 @@ def export(network, *inputs, file_name, file_format='GEIR'):
|
|
|
|
|
network (Cell): MindSpore network produced by `convert_quant_network`.
|
|
|
|
|
inputs (Tensor): Inputs of the `quantization aware training network`.
|
|
|
|
|
file_name (str): File name of model to export.
|
|
|
|
|
mean (int): Input data mean. Default: 127.5.
|
|
|
|
|
std_dev (int, float): Input data variance. Default: 127.5.
|
|
|
|
|
file_format (str): MindSpore currently supports 'GEIR' format for exported quantization aware model.
|
|
|
|
|
- GEIR: Graph Engine Intermediate Representation. An Intermediate representation format of Ascend model.
|
|
|
|
|
"""
|
|
|
|
|
supported_device = ["Ascend"]
|
|
|
|
|
supported_formats = ['GEIR']
|
|
|
|
|
|
|
|
|
|
mean = validator.check_type("mean", mean, (int, float))
|
|
|
|
|
std_dev = validator.check_type("std_dev", std_dev, (int, float))
|
|
|
|
|
|
|
|
|
|
if context.get_context('device_target') not in supported_device:
|
|
|
|
|
raise KeyError("Unsupported {} device target.".format(context.get_context('device_target')))
|
|
|
|
|
|
|
|
|
@ -418,7 +426,7 @@ def export(network, *inputs, file_name, file_format='GEIR'):
|
|
|
|
|
network.set_train(False)
|
|
|
|
|
|
|
|
|
|
if file_format == 'GEIR':
|
|
|
|
|
exporter = ExportToQuantInferNetwork(network, *inputs)
|
|
|
|
|
exporter = ExportToQuantInferNetwork(network, mean, std_dev, *inputs)
|
|
|
|
|
deploy_net = exporter.run()
|
|
|
|
|
serialization.export(deploy_net, *inputs, file_name=file_name, file_format=file_format)
|
|
|
|
|
|
|
|
|
|