AIMET TensorFlow Bias Correction API¶
User Guide Link¶
To learn more about this technique, please see Cross-Layer Equalization
Bias Correction API¶
Bias correction is performed after Cross layer equalization on models. Main api to perform bias correction on entire model is listed below.
-
aimet_tensorflow.bias_correction.BiasCorrection.
correct_bias
(reference_model, bias_correct_params, quant_params, data_set, conv_bn_dict=None, perform_only_empirical_bias_corr=True)¶ Top level function for bias correction
- Parameters
reference_model (
Session
) – active tf.compat.v1.Session for the model to be corrected.bias_correct_params (
BiasCorrectionParams
) – input params for bias correctionquant_params (
QuantParams
) – QuantParams type with params for quantization simulation for bias correction.data_set (
DatasetV2
) – input data setconv_bn_dict (
Optional
[Dict
[Operation
,ConvBnInfoType
]]) – Dict of conv and bn with activation info. If None, the function looks for it. This can be obtained on the model with bns and convs using BiasCorrection.find_all_convs_bn_with_activation() api.perform_only_empirical_bias_corr (
bool
) – a flag to indicate only empirical bias correction is to be performed.
- Returns
updated session with corrected bias for given ops
Input Parameter Types¶
Quantization Params
-
class
aimet_tensorflow.bias_correction.
QuantParams
(quant_mode='tf_enhanced', round_mode='nearest', use_cuda=True, ops_to_ignore=None)[source]¶ Quant Params to be passed in by user
Constructor
- Parameters
quant_mode – Indicates which quantization algorithm should be used, either ‘tf’ or ‘tf_enhanced’. Defaults to ‘tf_enhanced’
round_mode – The round scheme to used. One of: ‘nearest’ or ‘stochastic’. Default is ‘nearest’.
use_cuda – flag to indicate if GPU is to be used
ops_to_ignore – ops to be ignored
Bias Correction Params
-
aimet_tensorflow.bias_correction.
BiasCorrectionParams
(batch_size: int, num_quant_samples: int, num_bias_correct_samples: int, input_op_names: List[str], output_op_names: List[str])[source]¶ Input for bias correction to be passed by the user
- Parameters
batch_size – input batch size to be used
num_quant_samples – samples to be used for quantization
num_bias_correct_samples – samples to be used for bias correction
input_op_names – list of input op names of the given model
output_op_names – list of output op names of the given model
Data Input Type¶
Format expected is tf.Data.DataSet type
Dataset represents the input data as a tensor or nested structures of tensors, one per input to model along with an iterator that operates on them.
Code Examples for Bias Correction¶
Required imports
# tensorflow
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50
# Cross layer Equalization related imports
from aimet_tensorflow.cross_layer_equalization import equalize_model
from aimet_tensorflow.cross_layer_equalization import GraphSearchUtils, CrossLayerScaling, HighBiasFold
from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
from aimet_tensorflow.batch_norm_fold import fold_given_batch_norms
from aimet_tensorflow.utils.graph_saver import save_and_load_graph
from aimet_tensorflow.utils.op.conv import BiasUtils
# Bias correction related imports
from aimet_tensorflow.bias_correction import BiasCorrectionParams, QuantParams, BiasCorrection
Only Empirical Bias correction on a given model
def bias_correction_empirical(dataset: tf.data.Dataset):
"""
Perform bias correction on a given model
:param dataset: Data passed by user as tf.Dataset type.
:return: None
"""
# load a model
tf.keras.backend.clear_session()
_ = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
sess = tf.compat.v1.keras.backend.get_session()
# input parameters for bias correction
# populate required parameters in two data types QuantParams and BiasCorrectParams
quant_params = QuantParams(quant_mode='tf_enhanced',
round_mode='nearest',
use_cuda=True,
ops_to_ignore=None)
bias_correction_params = BiasCorrectionParams(batch_size=1,
num_quant_samples=10,
num_bias_correct_samples=10,
input_op_names=['input_1'],
output_op_names=['fc1000/Softmax'])
with sess.as_default():
# run bias correction on the model
_new_session = BiasCorrection.correct_bias(sess, bias_correction_params, quant_params, dataset)
sess.close()
Empirical and Analytical Bias correction on a given model
def bias_correction_empirical_analytical(dataset: tf.data.Dataset):
"""
Perform bias correction on a given model (mix of empirical and analytical)
:param dataset: Data passed by user as tf.Dataset type.
:return: None
"""
# load a model
tf.keras.backend.clear_session()
_ = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
sess = tf.compat.v1.keras.backend.get_session()
# input parameters for bias correction
# populate required parameters in two data types QuantParams and BiasCorrectParams
quant_params = QuantParams(quant_mode='tf_enhanced',
round_mode='nearest',
use_cuda=True,
ops_to_ignore=None)
bias_correction_params = BiasCorrectionParams(batch_size=1,
num_quant_samples=10,
num_bias_correct_samples=10,
input_op_names=['input_1'],
output_op_names=['fc1000/Softmax'])
with sess.as_default():
# run empirical and analytical bias correction on the model
_new_session = BiasCorrection.correct_bias(sess, bias_correction_params, quant_params,
dataset,
perform_only_empirical_bias_corr=False)
sess.close()
Empirical and Analytical Bias correction on a given model after performing CLE
def bias_correction_after_cle(dataset: tf.data.Dataset):
"""
Perform bias correction on a given model (mix of empirical and analytical) after
cross layer equalization.
:param dataset: Data passed by user as tf.Dataset type.
:return: None
"""
# load a model
tf.keras.backend.clear_session()
_ = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
sess = tf.compat.v1.keras.backend.get_session()
# input parameters for bias correction
# populate required parameters in two data types QuantParams and BiasCorrectParams
quant_params = QuantParams(quant_mode='tf_enhanced',
round_mode='nearest',
use_cuda=True,
ops_to_ignore=None)
bias_correction_params = BiasCorrectionParams(batch_size=1,
num_quant_samples=10,
num_bias_correct_samples=10,
input_op_names=['input_1'],
output_op_names=['fc1000/Softmax'])
with sess.as_default():
# store conv bns info before performing CLE
conv_bn_dict = BiasCorrection.find_all_convs_bn_with_activation(sess,
start_op_names=['input_1'],
output_op_names=['fc1000/Softmax'])
# perform CLE
sess_after_cle = equalize_model(sess, start_op_names=['input_1'], output_op_names=['fc1000/Softmax'])
# run empirical and analytical bias correction on the model
_new_session = BiasCorrection.correct_bias(sess_after_cle, bias_correction_params, quant_params,
dataset,
conv_bn_dict=conv_bn_dict,
perform_only_empirical_bias_corr=False)
sess.close()
Bias Correction Per Layer API¶
Empirical/ analytical Bias correction can also be performed on a subset of selected layers in a given model using the api listed below.
-
aimet_tensorflow.bias_correction.BiasCorrection.
bias_correction_per_layer
(reference_model, corrected_model, bias_correct_params, layer_name_to_be_corrected, data_set)¶ Helper function to perform empirical bias correction per layer.
- Parameters
reference_model (
Session
) – active tensorflow session for reference modelcorrected_model (
Session
) – active tensorflow session for corrected modelbias_correct_params (
BiasCorrectionParams
) – bias correction paramslayer_name_to_be_corrected (
str
) – name of layer on which bias correction is to be performedquant_params – Quantization specific params from user
- Return type
Session
- Returns
None, updates corrected model in-place.
-
aimet_tensorflow.bias_correction.BiasCorrection.
analytical_bias_correction_per_layer
(corrected_model, layer, preceeding_bn_layer_info, quant_params, is_first_conv=False)¶ Perform bn based bias correction (analytical bc).
- Parameters
corrected_model (
Session
) – active tensorflow session for corrected modellayer (
Operation
) – conv/linear layer to be correctedpreceeding_bn_layer_info (
ConvBnInfoType
) – corresponding preceeding bn/ activation infoquant_params (
QuantParams
) – Quantization specific params from useris_first_conv (
bool
) – flag to indicate if it’s the first conv layer
- Return type
Session
- Returns
None, updates corrected_model in place
Code Example for Per-Layer Bias Correction¶
Empirical Bias correction on one layer
def bias_correction_single_layer_empirical(dataset: tf.data.Dataset):
""" perform bias correction on one layer """
# load a model
tf.keras.backend.clear_session()
_ = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
sess = tf.compat.v1.keras.backend.get_session()
# input parameters for bias correction
# populate required parameters in two data types QuantParams and BiasCorrectParams
quant_params = QuantParams(quant_mode='tf_enhanced',
round_mode='nearest',
use_cuda=True,
ops_to_ignore=None)
bias_correction_params = BiasCorrectionParams(batch_size=1,
num_quant_samples=10,
num_bias_correct_samples=10,
input_op_names=['input_1'],
output_op_names=['fc1000/Softmax'])
with sess.as_default():
# initialize model with zero bias
sess = BiasUtils.initialize_model_with_bias(sess, bias_correction_params.input_op_names,
bias_correction_params.output_op_names)
# pick a layer for bias correction
example_conv_layer = sess.graph.get_operation_by_name('res2a_branch2a/Conv2D')
# invoke bias correction of one layer
BiasCorrection.bias_correction_per_layer(reference_model=sess,
corrected_model=sess,
bias_correct_params=bias_correction_params,
layer_name_to_be_corrected=example_conv_layer.name,
quant_params=quant_params,
data_set=dataset)
sess.close()
Analytical Bias correction on one layer
def bias_correction_single_layer_analytical():
""" perform analytical bias correction on one layer """
# load a model
tf.keras.backend.clear_session()
_ = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
sess = tf.compat.v1.keras.backend.get_session()
# input parameters for bias correction
# populate required parameters in two data types QuantParams and BiasCorrectParams
quant_params = QuantParams(quant_mode='tf_enhanced',
round_mode='nearest',
use_cuda=True,
ops_to_ignore=None)
with sess.as_default():
# initialize model with zero bias
sess = BiasUtils.initialize_model_with_bias(sess, ['input_1'], ['fc1000/Softmax'])
# pick a layer for bias correction
example_conv_layer = sess.graph.get_operation_by_name('res2a_branch2a/Conv2D')
# get candidate conv bns in the model
convs_bn_activation_info_dict = BiasCorrection.find_all_convs_bn_with_activation(sess,
['input_1'],
['fc1000/Softmax'])
# make sure to pick example_conv_layer that has a bn op associated with it
if example_conv_layer in convs_bn_activation_info_dict.keys():
preceding_bn_layer_info = convs_bn_activation_info_dict[example_conv_layer]
# invoke analytical bias correction on this layer
BiasCorrection.analytical_bias_correction_per_layer(sess,
example_conv_layer,
preceding_bn_layer_info,
quant_params)
sess.close()