From a8b267b6aaa88166cacc92107c027f7ad894d8d7 Mon Sep 17 00:00:00 2001 From: Bharath Ramaswamy Date: Mon, 8 Jul 2024 23:16:40 +0000 Subject: [PATCH] Added documentation for release 1.32.2 Signed-off-by: Bharath Ramaswamy --- .../Examples/onnx/quantization/adaround.html | 1476 +++ .../Examples/onnx/quantization/adaround.ipynb | 558 + .../Examples/onnx/quantization/cle.html | 1416 ++ .../Examples/onnx/quantization/cle.ipynb | 551 + .../Examples/onnx/quantization/quantsim.html | 1367 ++ .../Examples/onnx/quantization/quantsim.ipynb | 479 + .../compression/channel_pruning.html | 1469 +++ .../compression/channel_pruning.ipynb | 509 + .../tensorflow/compression/spatial_svd.html | 1476 +++ .../tensorflow/compression/spatial_svd.ipynb | 519 + .../spatial_svd_channel_pruning.html | 1622 +++ .../spatial_svd_channel_pruning.ipynb | 714 + .../tensorflow/quantization/adaround.html | 1538 +++ .../tensorflow/quantization/adaround.ipynb | 803 ++ .../tensorflow/quantization/autoquant.html | 1453 +++ .../tensorflow/quantization/autoquant.ipynb | 539 + .../quantization/bn_reestimation.html | 1537 +++ .../quantization/bn_reestimation.ipynb | 565 + .../tensorflow/quantization/cle_bc.html | 1554 +++ .../tensorflow/quantization/cle_bc.ipynb | 670 + .../quantization/keras/adaround.html | 1408 ++ .../quantization/keras/adaround.ipynb | 481 + .../quantization/keras/autoquant.html | 1358 ++ .../quantization/keras/autoquant.ipynb | 380 + .../quantization/keras/bn_reestimation.html | 1502 +++ .../quantization/keras/bn_reestimation.ipynb | 624 + .../keras/keras_transformer_qat.html | 1325 ++ .../keras/keras_transformer_qat.ipynb | 461 + .../quantization/keras/model_preparer.html | 1347 ++ .../quantization/keras/model_preparer.ipynb | 326 + .../tensorflow/quantization/keras/qat.html | 1382 ++ .../tensorflow/quantization/keras/qat.ipynb | 549 + .../keras/qat_range_learning.html | 1388 ++ .../keras/qat_range_learning.ipynb | 551 + .../quantization/keras/quant_analyzer.html | 1408 ++ .../quantization/keras/quant_analyzer.ipynb | 459 + .../keras/quantsim_adaround_pcq.html | 1417 ++ .../keras/quantsim_adaround_pcq.ipynb | 498 + .../quantization/keras/quantsim_cle.html | 1398 ++ .../quantization/keras/quantsim_cle.ipynb | 467 + .../Examples/tensorflow/quantization/qat.html | 1474 +++ .../tensorflow/quantization/qat.ipynb | 536 + .../quantization/qat_range_learning.html | 1476 +++ .../quantization/qat_range_learning.ipynb | 528 + .../quantization/quant_analyzer.html | 1491 +++ .../quantization/quant_analyzer.ipynb | 618 + .../torch/compression/channel_pruning.html | 1401 ++ .../torch/compression/channel_pruning.ipynb | 408 + .../torch/compression/spatial_svd.html | 1380 ++ .../torch/compression/spatial_svd.ipynb | 384 + .../spatial_svd_channel_pruning.html | 1504 +++ .../spatial_svd_channel_pruning.ipynb | 555 + .../Examples/torch/quantization/adaround.html | 1467 +++ .../torch/quantization/adaround.ipynb | 571 + .../torch/quantization/autoquant.html | 1326 ++ .../torch/quantization/autoquant.ipynb | 318 + .../torch/quantization/bn_reestimation.html | 1382 ++ .../torch/quantization/bn_reestimation.ipynb | 409 + .../Examples/torch/quantization/cle_bc.html | 1506 +++ .../Examples/torch/quantization/cle_bc.ipynb | 574 + .../Examples/torch/quantization/qat.html | 1440 ++ .../Examples/torch/quantization/qat.ipynb | 490 + .../quantization/qat_range_learning.html | 1442 ++ .../quantization/qat_range_learning.ipynb | 561 + .../torch/quantization/quant_analyzer.html | 1466 +++ .../torch/quantization/quant_analyzer.ipynb | 574 + .../_images/AIMET_index_no_fine_tune.png | Bin 0 -> 36982 bytes releases/1.32.2/_images/adaround.png | Bin 0 -> 11474 bytes .../_images/auto_quant_v2_flowchart.png | Bin 0 -> 95155 bytes .../_images/bias_correction_analytical.png | Bin 0 -> 61604 bytes .../_images/bias_correction_empirical.png | Bin 0 -> 52495 bytes releases/1.32.2/_images/bn_reestimation.png | Bin 0 -> 98968 bytes releases/1.32.2/_images/channel_pruning_1.png | Bin 0 -> 27278 bytes releases/1.32.2/_images/cle_1.png | Bin 0 -> 88402 bytes releases/1.32.2/_images/cle_4.png | Bin 0 -> 44170 bytes releases/1.32.2/_images/cle_5.png | Bin 0 -> 122895 bytes releases/1.32.2/_images/compression_flow.png | Bin 0 -> 55762 bytes .../1.32.2/_images/compression_use_case.PNG | Bin 0 -> 46589 bytes releases/1.32.2/_images/cp_2.png | Bin 0 -> 58390 bytes releases/1.32.2/_images/cp_3.jpg | Bin 0 -> 68184 bytes releases/1.32.2/_images/cp_4.jpg | Bin 0 -> 70953 bytes releases/1.32.2/_images/flow_diagram_cle.png | Bin 0 -> 26072 bytes releases/1.32.2/_images/greedy_1.png | Bin 0 -> 25113 bytes releases/1.32.2/_images/greedy_2.png | Bin 0 -> 17884 bytes releases/1.32.2/_images/greedy_3.png | Bin 0 -> 8253 bytes releases/1.32.2/_images/greedy_4.jpg | Bin 0 -> 50524 bytes releases/1.32.2/_images/greedy_5.jpg | Bin 0 -> 31976 bytes .../1.32.2/_images/keras_min_max_ranges.PNG | Bin 0 -> 46462 bytes .../_images/keras_per_layer_mse_loss.PNG | Bin 0 -> 103129 bytes .../_images/keras_per_layer_quant_enabled.PNG | Bin 0 -> 53609 bytes .../1.32.2/_images/keras_post_quant_layer.png | Bin 0 -> 9544 bytes .../1.32.2/_images/keras_pre_quant_layer.png | Bin 0 -> 7062 bytes .../_images/keras_quantsim_callflow.png | Bin 0 -> 9628 bytes releases/1.32.2/_images/keras_weights_pdf.PNG | Bin 0 -> 19691 bytes releases/1.32.2/_images/logo-quic-on@h68.png | Bin 0 -> 4381 bytes ...etween_onnx_tensor_names_and_encodings.png | Bin 0 -> 110292 bytes .../pytorch_model_prep_and_validate.PNG | Bin 0 -> 24145 bytes releases/1.32.2/_images/quant_2.png | Bin 0 -> 301491 bytes releases/1.32.2/_images/quant_3.png | Bin 0 -> 148644 bytes .../_images/quant_analyzer_min_max_ranges.PNG | Bin 0 -> 40000 bytes .../quant_analyzer_per_layer_mse_loss.PNG | Bin 0 -> 72108 bytes ...quant_analyzer_per_layer_quant_enabled.PNG | Bin 0 -> 45404 bytes .../_images/quant_analyzer_weights_pdf.PNG | Bin 0 -> 16257 bytes releases/1.32.2/_images/quant_use_case_1.PNG | Bin 0 -> 19720 bytes releases/1.32.2/_images/quant_use_case_2.PNG | Bin 0 -> 35277 bytes releases/1.32.2/_images/quant_use_case_3.PNG | Bin 0 -> 17060 bytes .../quantization_debugging_flow_chart.png | Bin 0 -> 97284 bytes .../1.32.2/_images/quantization_workflow.PNG | Bin 0 -> 36946 bytes .../1.32.2/_images/quantsim_config_file.png | Bin 0 -> 23721 bytes releases/1.32.2/_images/spatial_svd.png | Bin 0 -> 43692 bytes ...f_quant_analyzer_min_max_range_weights.png | Bin 0 -> 173555 bytes .../_images/tf_quant_analyzer_mse_loss.png | Bin 0 -> 327558 bytes .../1.32.2/_images/tf_quant_analyzer_pdf.png | Bin 0 -> 103950 bytes ...tf_quant_analyzer_per_op_quant_enabled.png | Bin 0 -> 208315 bytes releases/1.32.2/_images/vis_1.png | Bin 0 -> 14614 bytes releases/1.32.2/_images/vis_3.png | Bin 0 -> 223470 bytes releases/1.32.2/_images/vis_4.png | Bin 0 -> 144633 bytes releases/1.32.2/_images/vis_5.png | Bin 0 -> 15286 bytes releases/1.32.2/_images/vis_6.png | Bin 0 -> 14581 bytes releases/1.32.2/_images/vis_7.png | Bin 0 -> 50987 bytes releases/1.32.2/_images/weight_svd.png | Bin 0 -> 58733 bytes releases/1.32.2/_images/winnow_1.png | Bin 0 -> 26858 bytes releases/1.32.2/_images/winnow_2.png | Bin 0 -> 38602 bytes .../aimet_common/bias_correction.html | 1264 ++ .../1.32.2/_modules/aimet_common/defs.html | 1549 +++ .../1.32.2/_modules/aimet_common/utils.html | 1629 +++ .../adaround/adaround_weight.html | 1540 +++ .../_modules/aimet_tensorflow/auto_quant.html | 1969 +++ .../aimet_tensorflow/batch_norm_fold.html | 1787 +++ .../aimet_tensorflow/bias_correction.html | 1704 +++ .../aimet_tensorflow/bn_reestimation.html | 1405 ++ .../_modules/aimet_tensorflow/compress.html | 1238 ++ .../cross_layer_equalization.html | 1977 +++ .../_modules/aimet_tensorflow/defs.html | 1318 ++ .../keras/batch_norm_fold.html | 2150 +++ .../keras/bn_reestimation.html | 1254 ++ .../aimet_tensorflow/keras/compress.html | 1233 ++ .../keras/cross_layer_equalization.html | 1618 +++ .../keras/layer_output_utils.html | 1281 ++ .../keras/model_preparer.html | 1970 +++ .../keras/quant_analyzer.html | 1734 +++ .../aimet_tensorflow/keras/quantsim.html | 1957 +++ .../aimet_tensorflow/layer_output_utils.html | 1298 ++ .../aimet_tensorflow/plotting_utils.html | 1614 +++ .../aimet_tensorflow/quant_analyzer.html | 1690 +++ .../_modules/aimet_tensorflow/quantsim.html | 2762 ++++ .../1.32.2/_modules/aimet_tensorflow/svd.html | 2176 +++ .../utils/convert_tf_sess_to_keras.html | 1304 ++ .../aimet_tensorflow/utils/graph.html | 1240 ++ .../aimet_torch/adaround/adaround_weight.html | 1771 +++ .../_modules/aimet_torch/auto_quant.html | 2575 ++++ .../_modules/aimet_torch/batch_norm_fold.html | 1751 +++ .../_modules/aimet_torch/bias_correction.html | 1521 +++ .../_modules/aimet_torch/bn_reestimation.html | 1308 ++ .../1.32.2/_modules/aimet_torch/compress.html | 1236 ++ .../aimet_torch/cross_layer_equalization.html | 2017 +++ .../1.32.2/_modules/aimet_torch/defs.html | 1358 ++ .../aimet_torch/layer_output_utils.html | 1521 +++ .../_modules/aimet_torch/model_preparer.html | 1904 +++ .../1.32.2/_modules/aimet_torch/peft.html | 1569 +++ .../_modules/aimet_torch/quant_analyzer.html | 1886 +++ .../1.32.2/_modules/aimet_torch/quantsim.html | 3346 +++++ .../_modules/aimet_torch/visualize_model.html | 1283 ++ .../visualize_serialized_data.html | 1214 ++ releases/1.32.2/_modules/index.html | 1163 ++ .../_sphinx_javascript_frameworks_compat.js | 134 + releases/1.32.2/_static/basic.css | 899 ++ releases/1.32.2/_static/brain_logo.png | Bin 0 -> 10266 bytes releases/1.32.2/_static/css/badge_only.css | 1 + .../_static/css/fonts/Roboto-Slab-Bold.woff | Bin 0 -> 87624 bytes .../_static/css/fonts/Roboto-Slab-Bold.woff2 | Bin 0 -> 67312 bytes .../css/fonts/Roboto-Slab-Regular.woff | Bin 0 -> 86288 bytes .../css/fonts/Roboto-Slab-Regular.woff2 | Bin 0 -> 66444 bytes .../_static/css/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../_static/css/fonts/fontawesome-webfont.svg | 2671 ++++ .../_static/css/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../css/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../css/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../_static/css/fonts/lato-bold-italic.woff | Bin 0 -> 323344 bytes .../_static/css/fonts/lato-bold-italic.woff2 | Bin 0 -> 193308 bytes .../1.32.2/_static/css/fonts/lato-bold.woff | Bin 0 -> 309728 bytes .../1.32.2/_static/css/fonts/lato-bold.woff2 | Bin 0 -> 184912 bytes .../_static/css/fonts/lato-normal-italic.woff | Bin 0 -> 328412 bytes .../css/fonts/lato-normal-italic.woff2 | Bin 0 -> 195704 bytes .../1.32.2/_static/css/fonts/lato-normal.woff | Bin 0 -> 309192 bytes .../_static/css/fonts/lato-normal.woff2 | Bin 0 -> 182708 bytes releases/1.32.2/_static/css/theme.css | 4 + releases/1.32.2/_static/doctools.js | 156 + .../1.32.2/_static/documentation_options.js | 14 + releases/1.32.2/_static/file.png | Bin 0 -> 286 bytes releases/1.32.2/_static/jquery-3.6.0.js | 10881 ++++++++++++++++ releases/1.32.2/_static/jquery.js | 2 + releases/1.32.2/_static/js/badge_only.js | 1 + .../_static/js/html5shiv-printshiv.min.js | 4 + releases/1.32.2/_static/js/html5shiv.min.js | 4 + releases/1.32.2/_static/js/theme.js | 1 + releases/1.32.2/_static/language_data.js | 199 + releases/1.32.2/_static/minus.png | Bin 0 -> 90 bytes .../_static/nbsphinx-broken-thumbnail.svg | 9 + .../1.32.2/_static/nbsphinx-code-cells.css | 259 + releases/1.32.2/_static/nbsphinx-gallery.css | 31 + .../1.32.2/_static/nbsphinx-no-thumbnail.svg | 9 + releases/1.32.2/_static/plus.png | Bin 0 -> 90 bytes releases/1.32.2/_static/pygments.css | 75 + releases/1.32.2/_static/searchtools.js | 566 + releases/1.32.2/_static/sphinx_highlight.js | 144 + releases/1.32.2/_static/style.css | 314 + releases/1.32.2/_static/underscore-1.13.1.js | 2042 +++ releases/1.32.2/_static/underscore.js | 6 + .../api_docs/convert_tf_sess_to_keras.html | 1366 ++ releases/1.32.2/api_docs/index.html | 1199 ++ releases/1.32.2/api_docs/keras.html | 1141 ++ releases/1.32.2/api_docs/keras_adaround.html | 1283 ++ .../keras_batchnorm_re_estimation.html | 1216 ++ .../1.32.2/api_docs/keras_compression.html | 1519 +++ .../keras_cross_layer_equalization.html | 1197 ++ .../keras_layer_output_generation.html | 1220 ++ .../api_docs/keras_model_guidelines.html | 1193 ++ .../1.32.2/api_docs/keras_model_preparer.html | 1371 ++ .../api_docs/keras_primitive_apis_cle.html | 1446 ++ .../1.32.2/api_docs/keras_quant_analyzer.html | 1305 ++ .../1.32.2/api_docs/keras_quantization.html | 1155 ++ releases/1.32.2/api_docs/keras_quantsim.html | 1253 ++ releases/1.32.2/api_docs/onnx.html | 1062 ++ releases/1.32.2/api_docs/onnx_adaround.html | 1166 ++ releases/1.32.2/api_docs/onnx_auto_quant.html | 1245 ++ .../onnx_cross_layer_equalization.html | 1106 ++ .../onnx_layer_output_generation.html | 1145 ++ .../1.32.2/api_docs/onnx_quant_analyzer.html | 1462 +++ .../1.32.2/api_docs/onnx_quantization.html | 1069 ++ releases/1.32.2/api_docs/onnx_quantsim.html | 1195 ++ .../quantization_encoding_specification.html | 1478 +++ releases/1.32.2/api_docs/tensorflow.html | 1144 ++ .../1.32.2/api_docs/tensorflow_adaround.html | 1316 ++ .../api_docs/tensorflow_auto_quant.html | 1328 ++ .../tensorflow_batchnorm_re_estimation.html | 1237 ++ .../api_docs/tensorflow_bias_correction.html | 1478 +++ .../1.32.2/api_docs/tensorflow_compress.html | 1834 +++ .../tensorflow_cross_layer_equalization.html | 1215 ++ .../tensorflow_layer_output_generation.html | 1224 ++ .../api_docs/tensorflow_model_guidelines.html | 1171 ++ .../tensorflow_primitive_apis_cle.html | 1512 +++ .../api_docs/tensorflow_quant_analyzer.html | 1298 ++ .../api_docs/tensorflow_quantization.html | 1147 ++ .../1.32.2/api_docs/tensorflow_quantsim.html | 1386 ++ ...tensorflow_visualization_quantization.html | 1225 ++ releases/1.32.2/api_docs/torch.html | 1143 ++ releases/1.32.2/api_docs/torch_adaround.html | 1404 ++ .../api_docs/torch_architecture_checker.html | 1280 ++ .../1.32.2/api_docs/torch_auto_quant.html | 1295 ++ .../torch_batchnorm_re_estimation.html | 1250 ++ .../api_docs/torch_bias_correction.html | 1306 ++ releases/1.32.2/api_docs/torch_compress.html | 1794 +++ .../torch_cross_layer_equalization.html | 1210 ++ .../torch_layer_output_generation.html | 1265 ++ .../api_docs/torch_model_guidelines.html | 1246 ++ .../1.32.2/api_docs/torch_model_preparer.html | 1430 ++ .../api_docs/torch_model_validator.html | 1285 ++ releases/1.32.2/api_docs/torch_multi_gpu.html | 1162 ++ releases/1.32.2/api_docs/torch_peft_lora.html | 1406 ++ .../api_docs/torch_primitive_apis_cle.html | 1442 ++ .../1.32.2/api_docs/torch_quant_analyzer.html | 1537 +++ .../1.32.2/api_docs/torch_quantization.html | 1162 ++ releases/1.32.2/api_docs/torch_quantsim.html | 1494 +++ .../torch_visualization_compression.html | 1239 ++ .../torch_visualization_quantization.html | 1287 ++ releases/1.32.2/genindex.html | 1705 +++ releases/1.32.2/install/index.html | 1206 ++ releases/1.32.2/install/install_docker.html | 1276 ++ releases/1.32.2/install/install_host.html | 1345 ++ releases/1.32.2/objects.inv | Bin 0 -> 35100 bytes releases/1.32.2/search.html | 1141 ++ releases/1.32.2/searchindex.js | 1 + releases/1.32.2/toplevelhidden.html | 1124 ++ .../_images/AIMET_index_no_fine_tune.png | Bin 0 -> 36982 bytes releases/1.32.2/torch_v2/_images/adaround.png | Bin 0 -> 11474 bytes .../_images/auto_quant_v2_flowchart.png | Bin 0 -> 95155 bytes .../_images/bias_correction_analytical.png | Bin 0 -> 61604 bytes .../_images/bias_correction_empirical.png | Bin 0 -> 52495 bytes .../torch_v2/_images/bn_reestimation.png | Bin 0 -> 98968 bytes .../torch_v2/_images/channel_pruning_1.png | Bin 0 -> 27278 bytes releases/1.32.2/torch_v2/_images/cle_1.png | Bin 0 -> 88402 bytes releases/1.32.2/torch_v2/_images/cle_4.png | Bin 0 -> 44170 bytes releases/1.32.2/torch_v2/_images/cle_5.png | Bin 0 -> 122895 bytes .../torch_v2/_images/compression_flow.png | Bin 0 -> 55762 bytes .../torch_v2/_images/compression_use_case.PNG | Bin 0 -> 46589 bytes releases/1.32.2/torch_v2/_images/cp_2.png | Bin 0 -> 58390 bytes releases/1.32.2/torch_v2/_images/cp_3.jpg | Bin 0 -> 68184 bytes releases/1.32.2/torch_v2/_images/cp_4.jpg | Bin 0 -> 70953 bytes .../torch_v2/_images/flow_diagram_cle.png | Bin 0 -> 26072 bytes releases/1.32.2/torch_v2/_images/greedy_1.png | Bin 0 -> 25113 bytes releases/1.32.2/torch_v2/_images/greedy_2.png | Bin 0 -> 17884 bytes releases/1.32.2/torch_v2/_images/greedy_3.png | Bin 0 -> 8253 bytes releases/1.32.2/torch_v2/_images/greedy_4.jpg | Bin 0 -> 50524 bytes releases/1.32.2/torch_v2/_images/greedy_5.jpg | Bin 0 -> 31976 bytes .../pytorch_model_prep_and_validate.PNG | Bin 0 -> 24145 bytes releases/1.32.2/torch_v2/_images/quant_2.png | Bin 0 -> 301491 bytes releases/1.32.2/torch_v2/_images/quant_3.png | Bin 0 -> 148644 bytes .../torch_v2/_images/quant_use_case_1.PNG | Bin 0 -> 19720 bytes .../torch_v2/_images/quant_use_case_2.PNG | Bin 0 -> 35277 bytes .../torch_v2/_images/quant_use_case_3.PNG | Bin 0 -> 17060 bytes .../quantization_debugging_flow_chart.png | Bin 0 -> 97284 bytes .../_images/quantization_workflow.PNG | Bin 0 -> 36946 bytes .../torch_v2/_images/quantsim_config_file.png | Bin 0 -> 23721 bytes .../1.32.2/torch_v2/_images/spatial_svd.png | Bin 0 -> 43692 bytes releases/1.32.2/torch_v2/_images/vis_1.png | Bin 0 -> 14614 bytes releases/1.32.2/torch_v2/_images/vis_3.png | Bin 0 -> 223470 bytes releases/1.32.2/torch_v2/_images/vis_4.png | Bin 0 -> 144633 bytes releases/1.32.2/torch_v2/_images/vis_5.png | Bin 0 -> 15286 bytes releases/1.32.2/torch_v2/_images/vis_6.png | Bin 0 -> 14581 bytes releases/1.32.2/torch_v2/_images/vis_7.png | Bin 0 -> 50987 bytes .../1.32.2/torch_v2/_images/weight_svd.png | Bin 0 -> 58733 bytes releases/1.32.2/torch_v2/_images/winnow_1.png | Bin 0 -> 26858 bytes releases/1.32.2/torch_v2/_images/winnow_2.png | Bin 0 -> 38602 bytes .../_modules/aimet_torch/v2/nn/base.html | 759 ++ .../aimet_torch/v2/nn/fake_quant.html | 1127 ++ .../aimet_torch/v2/nn/true_quant.html | 579 + .../v2/quantization/affine/backends.html | 528 + .../v2/quantization/affine/quantizer.html | 910 ++ .../v2/quantization/base/quantizer.html | 373 + .../v2/quantization/encoding_analyzer.html | 794 ++ .../v2/quantization/float/quantizer.html | 468 + .../aimet_torch/v2/quantization/tensor.html | 635 + releases/1.32.2/torch_v2/_modules/index.html | 172 + .../_sphinx_javascript_frameworks_compat.js | 134 + releases/1.32.2/torch_v2/_static/basic.css | 899 ++ .../1.32.2/torch_v2/_static/brain_logo.png | Bin 0 -> 10266 bytes .../torch_v2/_static/css/badge_only.css | 1 + .../_static/css/fonts/Roboto-Slab-Bold.woff | Bin 0 -> 87624 bytes .../_static/css/fonts/Roboto-Slab-Bold.woff2 | Bin 0 -> 67312 bytes .../css/fonts/Roboto-Slab-Regular.woff | Bin 0 -> 86288 bytes .../css/fonts/Roboto-Slab-Regular.woff2 | Bin 0 -> 66444 bytes .../_static/css/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../_static/css/fonts/fontawesome-webfont.svg | 2671 ++++ .../_static/css/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../css/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../css/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../_static/css/fonts/lato-bold-italic.woff | Bin 0 -> 323344 bytes .../_static/css/fonts/lato-bold-italic.woff2 | Bin 0 -> 193308 bytes .../torch_v2/_static/css/fonts/lato-bold.woff | Bin 0 -> 309728 bytes .../_static/css/fonts/lato-bold.woff2 | Bin 0 -> 184912 bytes .../_static/css/fonts/lato-normal-italic.woff | Bin 0 -> 328412 bytes .../css/fonts/lato-normal-italic.woff2 | Bin 0 -> 195704 bytes .../_static/css/fonts/lato-normal.woff | Bin 0 -> 309192 bytes .../_static/css/fonts/lato-normal.woff2 | Bin 0 -> 182708 bytes .../1.32.2/torch_v2/_static/css/theme.css | 4 + releases/1.32.2/torch_v2/_static/doctools.js | 156 + .../torch_v2/_static/documentation_options.js | 14 + releases/1.32.2/torch_v2/_static/file.png | Bin 0 -> 286 bytes .../1.32.2/torch_v2/_static/jquery-3.6.0.js | 10881 ++++++++++++++++ releases/1.32.2/torch_v2/_static/jquery.js | 2 + .../1.32.2/torch_v2/_static/js/badge_only.js | 1 + .../_static/js/html5shiv-printshiv.min.js | 4 + .../torch_v2/_static/js/html5shiv.min.js | 4 + releases/1.32.2/torch_v2/_static/js/theme.js | 1 + .../1.32.2/torch_v2/_static/language_data.js | 199 + releases/1.32.2/torch_v2/_static/minus.png | Bin 0 -> 90 bytes .../_static/nbsphinx-broken-thumbnail.svg | 9 + .../torch_v2/_static/nbsphinx-code-cells.css | 259 + .../torch_v2/_static/nbsphinx-gallery.css | 31 + .../_static/nbsphinx-no-thumbnail.svg | 9 + releases/1.32.2/torch_v2/_static/plus.png | Bin 0 -> 90 bytes releases/1.32.2/torch_v2/_static/pygments.css | 75 + .../1.32.2/torch_v2/_static/searchtools.js | 566 + .../torch_v2/_static/sphinx_highlight.js | 144 + releases/1.32.2/torch_v2/_static/style.css | 314 + .../torch_v2/_static/underscore-1.13.1.js | 2042 +++ .../1.32.2/torch_v2/_static/underscore.js | 6 + .../_templates/autosummary/class.html | 164 + .../_templates/autosummary/function.html | 164 + releases/1.32.2/torch_v2/genindex.html | 460 + releases/1.32.2/torch_v2/install/index.html | 247 + .../torch_v2/install/install_docker.html | 320 + .../1.32.2/torch_v2/install/install_host.html | 386 + releases/1.32.2/torch_v2/objects.inv | Bin 0 -> 9962 bytes releases/1.32.2/torch_v2/py-modindex.html | 192 + releases/1.32.2/torch_v2/search.html | 182 + releases/1.32.2/torch_v2/searchindex.js | 1 + releases/1.32.2/torch_v2/toplevelhidden.html | 165 + .../api/nn.fake_quantization_mixin.html | 351 + .../torch_docs/api/nn.quantization_mixin.html | 277 + ...torch.v2.quantization.affine.Quantize.html | 275 + ...uantization.affine.QuantizeDequantize.html | 289 + ...rch.v2.quantization.affine.dequantize.html | 180 + ...orch.v2.quantization.affine.quantize_.html | 297 + ...antization.affine.quantize_dequantize.html | 304 + .../api/quantization/affine/index.html | 211 + .../float/FloatQuantizeDequantize.html | 236 + .../api/quantization/float/index.html | 185 + .../torch_docs/api/quantization/tensor.html | 316 + .../torch_docs/encoding_analyzer.html | 199 + .../torch_v2/torch_docs/examples/ptq.html | 174 + ...oding_analyzer.MinMaxEncodingAnalyzer.html | 181 + ...g_analyzer.PercentileEncodingAnalyzer.html | 193 + ...ncoding_analyzer.SqnrEncodingAnalyzer.html | 216 + .../1.32.2/torch_v2/torch_docs/index.html | 250 + .../torch_docs/quantized_modules.html | 1200 ++ .../1.32.2/torch_v2/torch_docs/quantizer.html | 452 + .../tutorials/quickstart_guide.html | 568 + .../1.32.2/torch_v2/user_guide/adaround.html | 255 + .../torch_v2/user_guide/auto_quant.html | 210 + .../torch_v2/user_guide/bn_reestimation.html | 212 + .../torch_v2/user_guide/channel_pruning.html | 195 + .../compression_feature_guidebook.html | 200 + .../greedy_compression_ratio_selection.html | 203 + .../1.32.2/torch_v2/user_guide/index.html | 225 + .../torch_v2/user_guide/known_issues.html | 179 + .../user_guide/model_compression.html | 256 + .../torch_v2/user_guide/model_guidelines.html | 232 + .../user_guide/model_quantization.html | 387 + .../post_training_quant_techniques.html | 255 + .../torch_v2/user_guide/quant_analyzer.html | 254 + .../quantization_aware_training.html | 225 + .../quantization_configuration.html | 447 + .../quantization_feature_guidebook.html | 210 + .../torch_v2/user_guide/quantization_sim.html | 312 + .../torch_v2/user_guide/release_notes.html | 432 + .../torch_v2/user_guide/spatial_svd.html | 170 + .../user_guide/visualization_compression.html | 246 + .../user_guide/visualization_quant.html | 196 + .../torch_v2/user_guide/weight_svd.html | 170 + .../1.32.2/torch_v2/user_guide/winnowing.html | 184 + releases/1.32.2/user_guide/adaround.html | 1215 ++ releases/1.32.2/user_guide/auto_quant.html | 1178 ++ .../1.32.2/user_guide/bn_reestimation.html | 1180 ++ .../1.32.2/user_guide/channel_pruning.html | 1163 ++ .../compression_feature_guidebook.html | 1168 ++ releases/1.32.2/user_guide/examples.html | 1277 ++ .../greedy_compression_ratio_selection.html | 1171 ++ releases/1.32.2/user_guide/index.html | 1189 ++ releases/1.32.2/user_guide/known_issues.html | 1138 ++ .../1.32.2/user_guide/model_compression.html | 1223 ++ .../1.32.2/user_guide/model_guidelines.html | 1191 ++ .../1.32.2/user_guide/model_quantization.html | 1354 ++ .../post_training_quant_techniques.html | 1223 ++ .../1.32.2/user_guide/quant_analyzer.html | 1222 ++ .../quantization_aware_training.html | 1193 ++ .../quantization_configuration.html | 1406 ++ .../quantization_feature_guidebook.html | 1178 ++ .../1.32.2/user_guide/quantization_sim.html | 1280 ++ releases/1.32.2/user_guide/release_notes.html | 1391 ++ releases/1.32.2/user_guide/spatial_svd.html | 1138 ++ .../user_guide/visualization_compression.html | 1214 ++ .../user_guide/visualization_quant.html | 1164 ++ releases/1.32.2/user_guide/weight_svd.html | 1138 ++ releases/1.32.2/user_guide/winnowing.html | 1153 ++ releases/latest | 2 +- 447 files changed, 303286 insertions(+), 1 deletion(-) create mode 100644 releases/1.32.2/Examples/onnx/quantization/adaround.html create mode 100644 releases/1.32.2/Examples/onnx/quantization/adaround.ipynb create mode 100644 releases/1.32.2/Examples/onnx/quantization/cle.html create mode 100644 releases/1.32.2/Examples/onnx/quantization/cle.ipynb create mode 100644 releases/1.32.2/Examples/onnx/quantization/quantsim.html create mode 100644 releases/1.32.2/Examples/onnx/quantization/quantsim.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/compression/channel_pruning.html create mode 100644 releases/1.32.2/Examples/tensorflow/compression/channel_pruning.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/compression/spatial_svd.html create mode 100644 releases/1.32.2/Examples/tensorflow/compression/spatial_svd.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.html create mode 100644 releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/adaround.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/adaround.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/autoquant.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/autoquant.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/cle_bc.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/cle_bc.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/qat.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/qat.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/qat.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/qat.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.ipynb create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.html create mode 100644 releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.ipynb create mode 100644 releases/1.32.2/Examples/torch/compression/channel_pruning.html create mode 100644 releases/1.32.2/Examples/torch/compression/channel_pruning.ipynb create mode 100644 releases/1.32.2/Examples/torch/compression/spatial_svd.html create mode 100644 releases/1.32.2/Examples/torch/compression/spatial_svd.ipynb create mode 100644 releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.html create mode 100644 releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/adaround.html create mode 100644 releases/1.32.2/Examples/torch/quantization/adaround.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/autoquant.html create mode 100644 releases/1.32.2/Examples/torch/quantization/autoquant.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/bn_reestimation.html create mode 100644 releases/1.32.2/Examples/torch/quantization/bn_reestimation.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/cle_bc.html create mode 100644 releases/1.32.2/Examples/torch/quantization/cle_bc.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/qat.html create mode 100644 releases/1.32.2/Examples/torch/quantization/qat.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/qat_range_learning.html create mode 100644 releases/1.32.2/Examples/torch/quantization/qat_range_learning.ipynb create mode 100644 releases/1.32.2/Examples/torch/quantization/quant_analyzer.html create mode 100644 releases/1.32.2/Examples/torch/quantization/quant_analyzer.ipynb create mode 100644 releases/1.32.2/_images/AIMET_index_no_fine_tune.png create mode 100644 releases/1.32.2/_images/adaround.png create mode 100644 releases/1.32.2/_images/auto_quant_v2_flowchart.png create mode 100644 releases/1.32.2/_images/bias_correction_analytical.png create mode 100644 releases/1.32.2/_images/bias_correction_empirical.png create mode 100644 releases/1.32.2/_images/bn_reestimation.png create mode 100644 releases/1.32.2/_images/channel_pruning_1.png create mode 100644 releases/1.32.2/_images/cle_1.png create mode 100644 releases/1.32.2/_images/cle_4.png create mode 100644 releases/1.32.2/_images/cle_5.png create mode 100644 releases/1.32.2/_images/compression_flow.png create mode 100644 releases/1.32.2/_images/compression_use_case.PNG create mode 100644 releases/1.32.2/_images/cp_2.png create mode 100644 releases/1.32.2/_images/cp_3.jpg create mode 100644 releases/1.32.2/_images/cp_4.jpg create mode 100644 releases/1.32.2/_images/flow_diagram_cle.png create mode 100644 releases/1.32.2/_images/greedy_1.png create mode 100644 releases/1.32.2/_images/greedy_2.png create mode 100644 releases/1.32.2/_images/greedy_3.png create mode 100644 releases/1.32.2/_images/greedy_4.jpg create mode 100644 releases/1.32.2/_images/greedy_5.jpg create mode 100644 releases/1.32.2/_images/keras_min_max_ranges.PNG create mode 100644 releases/1.32.2/_images/keras_per_layer_mse_loss.PNG create mode 100644 releases/1.32.2/_images/keras_per_layer_quant_enabled.PNG create mode 100644 releases/1.32.2/_images/keras_post_quant_layer.png create mode 100644 releases/1.32.2/_images/keras_pre_quant_layer.png create mode 100644 releases/1.32.2/_images/keras_quantsim_callflow.png create mode 100644 releases/1.32.2/_images/keras_weights_pdf.PNG create mode 100644 releases/1.32.2/_images/logo-quic-on@h68.png create mode 100644 releases/1.32.2/_images/mapping_between_onnx_tensor_names_and_encodings.png create mode 100644 releases/1.32.2/_images/pytorch_model_prep_and_validate.PNG create mode 100644 releases/1.32.2/_images/quant_2.png create mode 100644 releases/1.32.2/_images/quant_3.png create mode 100644 releases/1.32.2/_images/quant_analyzer_min_max_ranges.PNG create mode 100644 releases/1.32.2/_images/quant_analyzer_per_layer_mse_loss.PNG create mode 100644 releases/1.32.2/_images/quant_analyzer_per_layer_quant_enabled.PNG create mode 100644 releases/1.32.2/_images/quant_analyzer_weights_pdf.PNG create mode 100644 releases/1.32.2/_images/quant_use_case_1.PNG create mode 100644 releases/1.32.2/_images/quant_use_case_2.PNG create mode 100644 releases/1.32.2/_images/quant_use_case_3.PNG create mode 100644 releases/1.32.2/_images/quantization_debugging_flow_chart.png create mode 100644 releases/1.32.2/_images/quantization_workflow.PNG create mode 100644 releases/1.32.2/_images/quantsim_config_file.png create mode 100644 releases/1.32.2/_images/spatial_svd.png create mode 100644 releases/1.32.2/_images/tf_quant_analyzer_min_max_range_weights.png create mode 100644 releases/1.32.2/_images/tf_quant_analyzer_mse_loss.png create mode 100644 releases/1.32.2/_images/tf_quant_analyzer_pdf.png create mode 100644 releases/1.32.2/_images/tf_quant_analyzer_per_op_quant_enabled.png create mode 100644 releases/1.32.2/_images/vis_1.png create mode 100644 releases/1.32.2/_images/vis_3.png create mode 100644 releases/1.32.2/_images/vis_4.png create mode 100644 releases/1.32.2/_images/vis_5.png create mode 100644 releases/1.32.2/_images/vis_6.png create mode 100644 releases/1.32.2/_images/vis_7.png create mode 100644 releases/1.32.2/_images/weight_svd.png create mode 100644 releases/1.32.2/_images/winnow_1.png create mode 100644 releases/1.32.2/_images/winnow_2.png create mode 100644 releases/1.32.2/_modules/aimet_common/bias_correction.html create mode 100644 releases/1.32.2/_modules/aimet_common/defs.html create mode 100644 releases/1.32.2/_modules/aimet_common/utils.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/adaround/adaround_weight.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/auto_quant.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/batch_norm_fold.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/bias_correction.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/bn_reestimation.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/compress.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/cross_layer_equalization.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/defs.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/batch_norm_fold.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/bn_reestimation.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/compress.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/cross_layer_equalization.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/layer_output_utils.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/model_preparer.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/quant_analyzer.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/keras/quantsim.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/layer_output_utils.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/plotting_utils.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/quant_analyzer.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/quantsim.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/svd.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/utils/convert_tf_sess_to_keras.html create mode 100644 releases/1.32.2/_modules/aimet_tensorflow/utils/graph.html create mode 100644 releases/1.32.2/_modules/aimet_torch/adaround/adaround_weight.html create mode 100644 releases/1.32.2/_modules/aimet_torch/auto_quant.html create mode 100644 releases/1.32.2/_modules/aimet_torch/batch_norm_fold.html create mode 100644 releases/1.32.2/_modules/aimet_torch/bias_correction.html create mode 100644 releases/1.32.2/_modules/aimet_torch/bn_reestimation.html create mode 100644 releases/1.32.2/_modules/aimet_torch/compress.html create mode 100644 releases/1.32.2/_modules/aimet_torch/cross_layer_equalization.html create mode 100644 releases/1.32.2/_modules/aimet_torch/defs.html create mode 100644 releases/1.32.2/_modules/aimet_torch/layer_output_utils.html create mode 100644 releases/1.32.2/_modules/aimet_torch/model_preparer.html create mode 100644 releases/1.32.2/_modules/aimet_torch/peft.html create mode 100644 releases/1.32.2/_modules/aimet_torch/quant_analyzer.html create mode 100644 releases/1.32.2/_modules/aimet_torch/quantsim.html create mode 100644 releases/1.32.2/_modules/aimet_torch/visualize_model.html create mode 100644 releases/1.32.2/_modules/aimet_torch/visualize_serialized_data.html create mode 100644 releases/1.32.2/_modules/index.html create mode 100644 releases/1.32.2/_static/_sphinx_javascript_frameworks_compat.js create mode 100644 releases/1.32.2/_static/basic.css create mode 100644 releases/1.32.2/_static/brain_logo.png create mode 100644 releases/1.32.2/_static/css/badge_only.css create mode 100644 releases/1.32.2/_static/css/fonts/Roboto-Slab-Bold.woff create mode 100644 releases/1.32.2/_static/css/fonts/Roboto-Slab-Bold.woff2 create mode 100644 releases/1.32.2/_static/css/fonts/Roboto-Slab-Regular.woff create mode 100644 releases/1.32.2/_static/css/fonts/Roboto-Slab-Regular.woff2 create mode 100644 releases/1.32.2/_static/css/fonts/fontawesome-webfont.eot create mode 100644 releases/1.32.2/_static/css/fonts/fontawesome-webfont.svg create mode 100644 releases/1.32.2/_static/css/fonts/fontawesome-webfont.ttf create mode 100644 releases/1.32.2/_static/css/fonts/fontawesome-webfont.woff create mode 100644 releases/1.32.2/_static/css/fonts/fontawesome-webfont.woff2 create mode 100644 releases/1.32.2/_static/css/fonts/lato-bold-italic.woff create mode 100644 releases/1.32.2/_static/css/fonts/lato-bold-italic.woff2 create mode 100644 releases/1.32.2/_static/css/fonts/lato-bold.woff create mode 100644 releases/1.32.2/_static/css/fonts/lato-bold.woff2 create mode 100644 releases/1.32.2/_static/css/fonts/lato-normal-italic.woff create mode 100644 releases/1.32.2/_static/css/fonts/lato-normal-italic.woff2 create mode 100644 releases/1.32.2/_static/css/fonts/lato-normal.woff create mode 100644 releases/1.32.2/_static/css/fonts/lato-normal.woff2 create mode 100644 releases/1.32.2/_static/css/theme.css create mode 100644 releases/1.32.2/_static/doctools.js create mode 100644 releases/1.32.2/_static/documentation_options.js create mode 100644 releases/1.32.2/_static/file.png create mode 100644 releases/1.32.2/_static/jquery-3.6.0.js create mode 100644 releases/1.32.2/_static/jquery.js create mode 100644 releases/1.32.2/_static/js/badge_only.js create mode 100644 releases/1.32.2/_static/js/html5shiv-printshiv.min.js create mode 100644 releases/1.32.2/_static/js/html5shiv.min.js create mode 100644 releases/1.32.2/_static/js/theme.js create mode 100644 releases/1.32.2/_static/language_data.js create mode 100644 releases/1.32.2/_static/minus.png create mode 100644 releases/1.32.2/_static/nbsphinx-broken-thumbnail.svg create mode 100644 releases/1.32.2/_static/nbsphinx-code-cells.css create mode 100644 releases/1.32.2/_static/nbsphinx-gallery.css create mode 100644 releases/1.32.2/_static/nbsphinx-no-thumbnail.svg create mode 100644 releases/1.32.2/_static/plus.png create mode 100644 releases/1.32.2/_static/pygments.css create mode 100644 releases/1.32.2/_static/searchtools.js create mode 100644 releases/1.32.2/_static/sphinx_highlight.js create mode 100644 releases/1.32.2/_static/style.css create mode 100644 releases/1.32.2/_static/underscore-1.13.1.js create mode 100644 releases/1.32.2/_static/underscore.js create mode 100644 releases/1.32.2/api_docs/convert_tf_sess_to_keras.html create mode 100644 releases/1.32.2/api_docs/index.html create mode 100644 releases/1.32.2/api_docs/keras.html create mode 100644 releases/1.32.2/api_docs/keras_adaround.html create mode 100644 releases/1.32.2/api_docs/keras_batchnorm_re_estimation.html create mode 100644 releases/1.32.2/api_docs/keras_compression.html create mode 100644 releases/1.32.2/api_docs/keras_cross_layer_equalization.html create mode 100644 releases/1.32.2/api_docs/keras_layer_output_generation.html create mode 100644 releases/1.32.2/api_docs/keras_model_guidelines.html create mode 100644 releases/1.32.2/api_docs/keras_model_preparer.html create mode 100644 releases/1.32.2/api_docs/keras_primitive_apis_cle.html create mode 100644 releases/1.32.2/api_docs/keras_quant_analyzer.html create mode 100644 releases/1.32.2/api_docs/keras_quantization.html create mode 100644 releases/1.32.2/api_docs/keras_quantsim.html create mode 100644 releases/1.32.2/api_docs/onnx.html create mode 100644 releases/1.32.2/api_docs/onnx_adaround.html create mode 100644 releases/1.32.2/api_docs/onnx_auto_quant.html create mode 100644 releases/1.32.2/api_docs/onnx_cross_layer_equalization.html create mode 100644 releases/1.32.2/api_docs/onnx_layer_output_generation.html create mode 100644 releases/1.32.2/api_docs/onnx_quant_analyzer.html create mode 100644 releases/1.32.2/api_docs/onnx_quantization.html create mode 100644 releases/1.32.2/api_docs/onnx_quantsim.html create mode 100644 releases/1.32.2/api_docs/quantization_encoding_specification.html create mode 100644 releases/1.32.2/api_docs/tensorflow.html create mode 100644 releases/1.32.2/api_docs/tensorflow_adaround.html create mode 100644 releases/1.32.2/api_docs/tensorflow_auto_quant.html create mode 100644 releases/1.32.2/api_docs/tensorflow_batchnorm_re_estimation.html create mode 100644 releases/1.32.2/api_docs/tensorflow_bias_correction.html create mode 100644 releases/1.32.2/api_docs/tensorflow_compress.html create mode 100644 releases/1.32.2/api_docs/tensorflow_cross_layer_equalization.html create mode 100644 releases/1.32.2/api_docs/tensorflow_layer_output_generation.html create mode 100644 releases/1.32.2/api_docs/tensorflow_model_guidelines.html create mode 100644 releases/1.32.2/api_docs/tensorflow_primitive_apis_cle.html create mode 100644 releases/1.32.2/api_docs/tensorflow_quant_analyzer.html create mode 100644 releases/1.32.2/api_docs/tensorflow_quantization.html create mode 100644 releases/1.32.2/api_docs/tensorflow_quantsim.html create mode 100644 releases/1.32.2/api_docs/tensorflow_visualization_quantization.html create mode 100644 releases/1.32.2/api_docs/torch.html create mode 100644 releases/1.32.2/api_docs/torch_adaround.html create mode 100644 releases/1.32.2/api_docs/torch_architecture_checker.html create mode 100644 releases/1.32.2/api_docs/torch_auto_quant.html create mode 100644 releases/1.32.2/api_docs/torch_batchnorm_re_estimation.html create mode 100644 releases/1.32.2/api_docs/torch_bias_correction.html create mode 100644 releases/1.32.2/api_docs/torch_compress.html create mode 100644 releases/1.32.2/api_docs/torch_cross_layer_equalization.html create mode 100644 releases/1.32.2/api_docs/torch_layer_output_generation.html create mode 100644 releases/1.32.2/api_docs/torch_model_guidelines.html create mode 100644 releases/1.32.2/api_docs/torch_model_preparer.html create mode 100644 releases/1.32.2/api_docs/torch_model_validator.html create mode 100644 releases/1.32.2/api_docs/torch_multi_gpu.html create mode 100644 releases/1.32.2/api_docs/torch_peft_lora.html create mode 100644 releases/1.32.2/api_docs/torch_primitive_apis_cle.html create mode 100644 releases/1.32.2/api_docs/torch_quant_analyzer.html create mode 100644 releases/1.32.2/api_docs/torch_quantization.html create mode 100644 releases/1.32.2/api_docs/torch_quantsim.html create mode 100644 releases/1.32.2/api_docs/torch_visualization_compression.html create mode 100644 releases/1.32.2/api_docs/torch_visualization_quantization.html create mode 100644 releases/1.32.2/genindex.html create mode 100644 releases/1.32.2/install/index.html create mode 100644 releases/1.32.2/install/install_docker.html create mode 100644 releases/1.32.2/install/install_host.html create mode 100644 releases/1.32.2/objects.inv create mode 100644 releases/1.32.2/search.html create mode 100644 releases/1.32.2/searchindex.js create mode 100644 releases/1.32.2/toplevelhidden.html create mode 100644 releases/1.32.2/torch_v2/_images/AIMET_index_no_fine_tune.png create mode 100644 releases/1.32.2/torch_v2/_images/adaround.png create mode 100644 releases/1.32.2/torch_v2/_images/auto_quant_v2_flowchart.png create mode 100644 releases/1.32.2/torch_v2/_images/bias_correction_analytical.png create mode 100644 releases/1.32.2/torch_v2/_images/bias_correction_empirical.png create mode 100644 releases/1.32.2/torch_v2/_images/bn_reestimation.png create mode 100644 releases/1.32.2/torch_v2/_images/channel_pruning_1.png create mode 100644 releases/1.32.2/torch_v2/_images/cle_1.png create mode 100644 releases/1.32.2/torch_v2/_images/cle_4.png create mode 100644 releases/1.32.2/torch_v2/_images/cle_5.png create mode 100644 releases/1.32.2/torch_v2/_images/compression_flow.png create mode 100644 releases/1.32.2/torch_v2/_images/compression_use_case.PNG create mode 100644 releases/1.32.2/torch_v2/_images/cp_2.png create mode 100644 releases/1.32.2/torch_v2/_images/cp_3.jpg create mode 100644 releases/1.32.2/torch_v2/_images/cp_4.jpg create mode 100644 releases/1.32.2/torch_v2/_images/flow_diagram_cle.png create mode 100644 releases/1.32.2/torch_v2/_images/greedy_1.png create mode 100644 releases/1.32.2/torch_v2/_images/greedy_2.png create mode 100644 releases/1.32.2/torch_v2/_images/greedy_3.png create mode 100644 releases/1.32.2/torch_v2/_images/greedy_4.jpg create mode 100644 releases/1.32.2/torch_v2/_images/greedy_5.jpg create mode 100644 releases/1.32.2/torch_v2/_images/pytorch_model_prep_and_validate.PNG create mode 100644 releases/1.32.2/torch_v2/_images/quant_2.png create mode 100644 releases/1.32.2/torch_v2/_images/quant_3.png create mode 100644 releases/1.32.2/torch_v2/_images/quant_use_case_1.PNG create mode 100644 releases/1.32.2/torch_v2/_images/quant_use_case_2.PNG create mode 100644 releases/1.32.2/torch_v2/_images/quant_use_case_3.PNG create mode 100644 releases/1.32.2/torch_v2/_images/quantization_debugging_flow_chart.png create mode 100644 releases/1.32.2/torch_v2/_images/quantization_workflow.PNG create mode 100644 releases/1.32.2/torch_v2/_images/quantsim_config_file.png create mode 100644 releases/1.32.2/torch_v2/_images/spatial_svd.png create mode 100644 releases/1.32.2/torch_v2/_images/vis_1.png create mode 100644 releases/1.32.2/torch_v2/_images/vis_3.png create mode 100644 releases/1.32.2/torch_v2/_images/vis_4.png create mode 100644 releases/1.32.2/torch_v2/_images/vis_5.png create mode 100644 releases/1.32.2/torch_v2/_images/vis_6.png create mode 100644 releases/1.32.2/torch_v2/_images/vis_7.png create mode 100644 releases/1.32.2/torch_v2/_images/weight_svd.png create mode 100644 releases/1.32.2/torch_v2/_images/winnow_1.png create mode 100644 releases/1.32.2/torch_v2/_images/winnow_2.png create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/nn/base.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/nn/fake_quant.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/nn/true_quant.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/quantization/affine/backends.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/quantization/affine/quantizer.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/quantization/base/quantizer.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/quantization/encoding_analyzer.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/quantization/float/quantizer.html create mode 100644 releases/1.32.2/torch_v2/_modules/aimet_torch/v2/quantization/tensor.html create mode 100644 releases/1.32.2/torch_v2/_modules/index.html create mode 100644 releases/1.32.2/torch_v2/_static/_sphinx_javascript_frameworks_compat.js create mode 100644 releases/1.32.2/torch_v2/_static/basic.css create mode 100644 releases/1.32.2/torch_v2/_static/brain_logo.png create mode 100644 releases/1.32.2/torch_v2/_static/css/badge_only.css create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/Roboto-Slab-Bold.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/Roboto-Slab-Bold.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/Roboto-Slab-Regular.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/Roboto-Slab-Regular.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/fontawesome-webfont.eot create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/fontawesome-webfont.svg create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/fontawesome-webfont.ttf create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/fontawesome-webfont.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/fontawesome-webfont.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-bold-italic.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-bold-italic.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-bold.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-bold.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-normal-italic.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-normal-italic.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-normal.woff create mode 100644 releases/1.32.2/torch_v2/_static/css/fonts/lato-normal.woff2 create mode 100644 releases/1.32.2/torch_v2/_static/css/theme.css create mode 100644 releases/1.32.2/torch_v2/_static/doctools.js create mode 100644 releases/1.32.2/torch_v2/_static/documentation_options.js create mode 100644 releases/1.32.2/torch_v2/_static/file.png create mode 100644 releases/1.32.2/torch_v2/_static/jquery-3.6.0.js create mode 100644 releases/1.32.2/torch_v2/_static/jquery.js create mode 100644 releases/1.32.2/torch_v2/_static/js/badge_only.js create mode 100644 releases/1.32.2/torch_v2/_static/js/html5shiv-printshiv.min.js create mode 100644 releases/1.32.2/torch_v2/_static/js/html5shiv.min.js create mode 100644 releases/1.32.2/torch_v2/_static/js/theme.js create mode 100644 releases/1.32.2/torch_v2/_static/language_data.js create mode 100644 releases/1.32.2/torch_v2/_static/minus.png create mode 100644 releases/1.32.2/torch_v2/_static/nbsphinx-broken-thumbnail.svg create mode 100644 releases/1.32.2/torch_v2/_static/nbsphinx-code-cells.css create mode 100644 releases/1.32.2/torch_v2/_static/nbsphinx-gallery.css create mode 100644 releases/1.32.2/torch_v2/_static/nbsphinx-no-thumbnail.svg create mode 100644 releases/1.32.2/torch_v2/_static/plus.png create mode 100644 releases/1.32.2/torch_v2/_static/pygments.css create mode 100644 releases/1.32.2/torch_v2/_static/searchtools.js create mode 100644 releases/1.32.2/torch_v2/_static/sphinx_highlight.js create mode 100644 releases/1.32.2/torch_v2/_static/style.css create mode 100644 releases/1.32.2/torch_v2/_static/underscore-1.13.1.js create mode 100644 releases/1.32.2/torch_v2/_static/underscore.js create mode 100644 releases/1.32.2/torch_v2/_templates/autosummary/class.html create mode 100644 releases/1.32.2/torch_v2/_templates/autosummary/function.html create mode 100644 releases/1.32.2/torch_v2/genindex.html create mode 100644 releases/1.32.2/torch_v2/install/index.html create mode 100644 releases/1.32.2/torch_v2/install/install_docker.html create mode 100644 releases/1.32.2/torch_v2/install/install_host.html create mode 100644 releases/1.32.2/torch_v2/objects.inv create mode 100644 releases/1.32.2/torch_v2/py-modindex.html create mode 100644 releases/1.32.2/torch_v2/search.html create mode 100644 releases/1.32.2/torch_v2/searchindex.js create mode 100644 releases/1.32.2/torch_v2/toplevelhidden.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/nn.fake_quantization_mixin.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/nn.quantization_mixin.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/affine/generated/aimet_torch.v2.quantization.affine.Quantize.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/affine/generated/aimet_torch.v2.quantization.affine.QuantizeDequantize.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/affine/generated/aimet_torch.v2.quantization.affine.dequantize.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/affine/generated/aimet_torch.v2.quantization.affine.quantize_.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/affine/generated/aimet_torch.v2.quantization.affine.quantize_dequantize.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/affine/index.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/float/FloatQuantizeDequantize.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/float/index.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/api/quantization/tensor.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/encoding_analyzer.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/examples/ptq.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/generated/aimet_torch.v2.quantization.encoding_analyzer.MinMaxEncodingAnalyzer.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/generated/aimet_torch.v2.quantization.encoding_analyzer.PercentileEncodingAnalyzer.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/generated/aimet_torch.v2.quantization.encoding_analyzer.SqnrEncodingAnalyzer.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/index.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/quantized_modules.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/quantizer.html create mode 100644 releases/1.32.2/torch_v2/torch_docs/tutorials/quickstart_guide.html create mode 100644 releases/1.32.2/torch_v2/user_guide/adaround.html create mode 100644 releases/1.32.2/torch_v2/user_guide/auto_quant.html create mode 100644 releases/1.32.2/torch_v2/user_guide/bn_reestimation.html create mode 100644 releases/1.32.2/torch_v2/user_guide/channel_pruning.html create mode 100644 releases/1.32.2/torch_v2/user_guide/compression_feature_guidebook.html create mode 100644 releases/1.32.2/torch_v2/user_guide/greedy_compression_ratio_selection.html create mode 100644 releases/1.32.2/torch_v2/user_guide/index.html create mode 100644 releases/1.32.2/torch_v2/user_guide/known_issues.html create mode 100644 releases/1.32.2/torch_v2/user_guide/model_compression.html create mode 100644 releases/1.32.2/torch_v2/user_guide/model_guidelines.html create mode 100644 releases/1.32.2/torch_v2/user_guide/model_quantization.html create mode 100644 releases/1.32.2/torch_v2/user_guide/post_training_quant_techniques.html create mode 100644 releases/1.32.2/torch_v2/user_guide/quant_analyzer.html create mode 100644 releases/1.32.2/torch_v2/user_guide/quantization_aware_training.html create mode 100644 releases/1.32.2/torch_v2/user_guide/quantization_configuration.html create mode 100644 releases/1.32.2/torch_v2/user_guide/quantization_feature_guidebook.html create mode 100644 releases/1.32.2/torch_v2/user_guide/quantization_sim.html create mode 100644 releases/1.32.2/torch_v2/user_guide/release_notes.html create mode 100644 releases/1.32.2/torch_v2/user_guide/spatial_svd.html create mode 100644 releases/1.32.2/torch_v2/user_guide/visualization_compression.html create mode 100644 releases/1.32.2/torch_v2/user_guide/visualization_quant.html create mode 100644 releases/1.32.2/torch_v2/user_guide/weight_svd.html create mode 100644 releases/1.32.2/torch_v2/user_guide/winnowing.html create mode 100644 releases/1.32.2/user_guide/adaround.html create mode 100644 releases/1.32.2/user_guide/auto_quant.html create mode 100644 releases/1.32.2/user_guide/bn_reestimation.html create mode 100644 releases/1.32.2/user_guide/channel_pruning.html create mode 100644 releases/1.32.2/user_guide/compression_feature_guidebook.html create mode 100644 releases/1.32.2/user_guide/examples.html create mode 100644 releases/1.32.2/user_guide/greedy_compression_ratio_selection.html create mode 100644 releases/1.32.2/user_guide/index.html create mode 100644 releases/1.32.2/user_guide/known_issues.html create mode 100644 releases/1.32.2/user_guide/model_compression.html create mode 100644 releases/1.32.2/user_guide/model_guidelines.html create mode 100644 releases/1.32.2/user_guide/model_quantization.html create mode 100644 releases/1.32.2/user_guide/post_training_quant_techniques.html create mode 100644 releases/1.32.2/user_guide/quant_analyzer.html create mode 100644 releases/1.32.2/user_guide/quantization_aware_training.html create mode 100644 releases/1.32.2/user_guide/quantization_configuration.html create mode 100644 releases/1.32.2/user_guide/quantization_feature_guidebook.html create mode 100644 releases/1.32.2/user_guide/quantization_sim.html create mode 100644 releases/1.32.2/user_guide/release_notes.html create mode 100644 releases/1.32.2/user_guide/spatial_svd.html create mode 100644 releases/1.32.2/user_guide/visualization_compression.html create mode 100644 releases/1.32.2/user_guide/visualization_quant.html create mode 100644 releases/1.32.2/user_guide/weight_svd.html create mode 100644 releases/1.32.2/user_guide/winnowing.html diff --git a/releases/1.32.2/Examples/onnx/quantization/adaround.html b/releases/1.32.2/Examples/onnx/quantization/adaround.html new file mode 100644 index 0000000..c67abf8 --- /dev/null +++ b/releases/1.32.2/Examples/onnx/quantization/adaround.html @@ -0,0 +1,1476 @@ + + + + + + Adaptive Rounding (AdaRound) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Adaptive Rounding (AdaRound)

+

This notebook shows a working code example of how to use AIMET to perform Adaptive Rounding (AdaRound).

+

AIMET quantization features typically use the “nearest rounding” technique for achieving quantization. When using the “nearest rounding” technique, the weight value is quantized to the nearest integer value.

+

AdaRound optimizes a loss function using unlabeled training data to decide whether to quantize a specific weight to the closer integer value or the farther one. Using AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.

+
+

Overall flow

+

This notebook covers the following: 1. Instantiate the example evaluation and training pipeline 2. Convert an FP32 PyTorch model to ONNX and evaluate the model’s baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply AdaRound and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results

  • +
  • For example, it uses a relatively quantization-friendly model like Resnet18

  • +
  • Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, use that. Otherwise, download the dataset from an appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The dataloader provided in this example notebook relies on the ImageNet dataset having the following characteristics: - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could reduce the dataset to 2 samples per class. This exercise is left up to the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a ONNX model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import torch
+import onnxruntime as ort
+from Examples.common import image_net_config
+from Examples.onnx.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: ort.InferenceSession) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param sess: the model to evaluate
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(sess, iterations=None)
+
+
+
+
+
+
+

2. Convert an FP32 PyTorch model to ONNX and evaluate the model’s baseline FP32 accuracy

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead or convert a model trained in a different framework altogether.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+import onnx
+
+input_shape = (1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+dummy_input = torch.randn(input_shape)
+filename = "./resnet18.onnx"
+
+# Load a pretrained ResNet-18 model in torch
+pt_model = resnet18(pretrained=True)
+
+# Export the torch model to onnx
+torch.onnx.export(pt_model.eval(),
+                  dummy_input,
+                  filename,
+                  export_params=True,
+                  do_constant_folding=True,
+                  input_names=['input'],
+                  output_names=['output'],
+                  dynamic_axes={
+                      'input' : {0 : 'batch_size'},
+                      'output' : {0 : 'batch_size'},
+                  }
+                  )
+
+model = onnx.load_model(filename)
+
+
+
+
+

We should decide whether to run the model on a CPU or CUDA device. This example code will use CUDA if available in your onnxruntime environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
# cudnn_conv_algo_search is fixing it to default to avoid changing in accuracies/outputs at every inference
+if 'CUDAExecutionProvider' in ort.get_available_providers():
+    providers = [('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT'}), 'CPUExecutionProvider']
+    use_cuda = True
+else:
+    providers = ['CPUExecutionProvider']
+    use_cuda = False
+
+
+
+
+

Let’s create an onnxruntime session and determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
sess = ort.InferenceSession(filename, providers=providers)
+accuracy = ImageNetDataPipeline.evaluate(sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this?

+

On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so results in an inferences/sec speedup since unnecessary computation is avoided.

+

From a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers.

+

This can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). We want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model:

+
+
[ ]:
+
+
+
from aimet_onnx.batch_norm_fold import fold_all_batch_norms_to_weight
+
+_ = fold_all_batch_norms_to_weight(model)
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_activation_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

In case the ONNX model has custom ops, we need to specify the paths of compiled custom ops via user_onnx_libs parameter. For example, user_onnx_libs=[‘path/to/custom_op1.so’, ‘path/to/custom_op2.so’]

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
import copy
+from aimet_common.defs import QuantScheme
+from aimet_onnx.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(model=copy.deepcopy(model),
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           default_activation_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node.

+

For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

We create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metrics, so we can just ignore the model output. A few pointers regarding the data samples:

+
    +
  • In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.

  • +
  • It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

  • +
+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session, samples):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+    input_name = sess.get_inputs()[0].name
+
+    batch_cntr = 0
+    for input_data, target_data in data_loader:
+
+        inputs_batch = input_data.numpy()
+        session.run(None, {input_name : inputs_batch})
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+
+
+

4. Apply Adaround

+

We can now apply AdaRound to this model.

+

Some of the parameters for AdaRound are described below

+
    +
  • dataloader: AdaRound needs a dataloader that iterates over unlabeled data for the layer-by-layer optimization to learn the rounding vectors. We should comply with the class signature for the dataloader which is expected by AdaRound.

  • +
  • num_batches: The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.

  • +
  • default_num_iterations: The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime.

  • +
+
+
[ ]:
+
+
+
import os
+from aimet_onnx.adaround.adaround_weight import Adaround, AdaroundParameters
+
+# Dataloader satisfying the class signature required by AdaRound
+class DataLoader:
+    """
+    This dataloader derives unlabeled samples in the form of numpy arrays from a torch dataloader
+    """
+    def __init__(self):
+        self._torch_data_loader = ImageNetDataPipeline.get_val_dataloader()
+        self._iterator = None
+        self.batch_size = self._torch_data_loader.batch_size
+
+    def __iter__(self):
+        self._iterator = iter(self._torch_data_loader)
+        return self
+
+    def __next__(self):
+        input_data, _ = next(self._iterator)
+        return input_data.numpy()
+
+    def __len__(self):
+        return len(self._torch_data_loader)
+
+data_loader = DataLoader()
+params = AdaroundParameters(data_loader=data_loader, num_batches=1, default_num_iterations=32,
+                            forward_fn=pass_calibration_data, forward_pass_callback_args=1000)
+
+os.makedirs('./output/', exist_ok=True)
+ada_model = Adaround.apply_adaround(model, params,
+                                    path="output",
+                                    filename_prefix='adaround',
+                                    default_param_bw=8,
+                                    default_quant_scheme=QuantScheme.post_training_tf_enhanced)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the model after applying Adaround. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+

Note: There are two important things to understand in the following cell. - Parameter Biwidth Precision: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.

+
    +
  • Freezing the parameter encodings: After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API. While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created. For Quantization Simulation accuracy, it is important to freeze these encodings. If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the +parameters encodings and Quantization Simulation accuracy will not reflect the AdaRounded accuracy.

  • +
+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=ada_model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           default_activation_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+sim.set_and_freeze_param_encodings(encoding_path=os.path.join("output", 'adaround.encodings'))
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization, using the newly AdaRounded model with updated parameters.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after applying AdaRound. The settings used in this notebook are designed only to serve as code examples, designed to run quickly, but may not be optimal. Please try this workflow against the model of your choice and play with the number of samples and other parameters to get the best results.

+

The next step would be to take this model to target. We need to do two things: - export the model with the updated weights without the fake quantization ops - export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
sim.export(path='./output/', filename_prefix='resnet18_after_adaround')
+
+
+
+
+
+
+

Summary

+

This example illustrated how the AIMET AdaRound API is invoked to achieve post training quantization. To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline. As indicated above, some parameters in this example have been chosen in such a way to make this example execute faster.

+

We hope this notebook was useful for you to understand how to use AIMET for performing AdaRound.

+

A few additional resources: - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/onnx/quantization/adaround.ipynb b/releases/1.32.2/Examples/onnx/quantization/adaround.ipynb new file mode 100644 index 0000000..e47cecf --- /dev/null +++ b/releases/1.32.2/Examples/onnx/quantization/adaround.ipynb @@ -0,0 +1,558 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Adaptive Rounding (AdaRound)\n", + "This notebook shows a working code example of how to use AIMET to perform Adaptive Rounding (AdaRound).\n", + "\n", + "AIMET quantization features typically use the \"nearest rounding\" technique for achieving quantization.\n", + "When using the \"nearest rounding\" technique, the weight value is quantized to the nearest integer value.\n", + "\n", + "AdaRound optimizes a loss function using unlabeled training data to decide whether to quantize a specific weight to the closer integer value or the farther one.\n", + "Using AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following:\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Convert an FP32 PyTorch model to ONNX and evaluate the model's baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply AdaRound and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results\n", + "* For example, it uses a relatively quantization-friendly model like Resnet18\n", + "* Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification.\n", + "If you already have a version of the dataset readily available, use that.\n", + "Otherwise, download the dataset from an appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The dataloader provided in this example notebook relies on the ImageNet dataset having the following characteristics:\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples.\n", + "Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset.\n", + "E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class.\n", + "But for the purpose of running this notebook, you could reduce the dataset to 2 samples per class.\n", + "This exercise is left up to the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a ONNX model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import onnxruntime as ort\n", + "from Examples.common import image_net_config\n", + "from Examples.onnx.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(sess: ort.InferenceSession) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param sess: the model to evaluate\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(sess, iterations=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Convert an FP32 PyTorch model to ONNX and evaluate the model's baseline FP32 accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead or convert a model trained in a different framework altogether." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "import onnx\n", + "\n", + "input_shape = (1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "dummy_input = torch.randn(input_shape)\n", + "filename = \"./resnet18.onnx\"\n", + "\n", + "# Load a pretrained ResNet-18 model in torch\n", + "pt_model = resnet18(pretrained=True)\n", + "\n", + "# Export the torch model to onnx\n", + "torch.onnx.export(pt_model.eval(),\n", + " dummy_input,\n", + " filename,\n", + " export_params=True,\n", + " do_constant_folding=True,\n", + " input_names=['input'],\n", + " output_names=['output'],\n", + " dynamic_axes={\n", + " 'input' : {0 : 'batch_size'},\n", + " 'output' : {0 : 'batch_size'},\n", + " }\n", + " )\n", + "\n", + "model = onnx.load_model(filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to run the model on a CPU or CUDA device. This example code will use CUDA if available in your onnxruntime environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# cudnn_conv_algo_search is fixing it to default to avoid changing in accuracies/outputs at every inference\n", + "if 'CUDAExecutionProvider' in ort.get_available_providers():\n", + " providers = [('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT'}), 'CPUExecutionProvider']\n", + " use_cuda = True\n", + "else:\n", + " providers = ['CPUExecutionProvider']\n", + " use_cuda = False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's create an onnxruntime session and determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sess = ort.InferenceSession(filename, providers=providers)\n", + "accuracy = ImageNetDataPipeline.evaluate(sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model.\n", + "These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers.\n", + "Doing so results in an inferences/sec speedup since unnecessary computation is avoided.\n", + "\n", + "From a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy.\n", + "However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers.\n", + "\n", + "This can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision).\n", + "We want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_onnx.batch_norm_fold import fold_all_batch_norms_to_weight\n", + "\n", + "_ = fold_all_batch_norms_to_weight(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_activation_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "In case the ONNX model has **custom ops**, we need to specify the paths of compiled custom ops via **user_onnx_libs** parameter.\n", + "For example, user_onnx_libs=['path/to/custom_op1.so', 'path/to/custom_op2.so']\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "from aimet_common.defs import QuantScheme\n", + "from aimet_onnx.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(model=copy.deepcopy(model),\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_activation_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph, the model is not ready to be used yet.\n", + "Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node.\n", + "\n", + "For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters.\n", + "This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "We create a routine to pass unlabeled data samples through the model.\n", + "This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model.\n", + "We don't need to compute any loss metrics, so we can just ignore the model output. A few pointers regarding the data samples:\n", + "\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + " For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed.\n", + " It's not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation.\n", + " However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings.\n", + "This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(session, samples):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + " input_name = sess.get_inputs()[0].name\n", + "\n", + " batch_cntr = 0\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.numpy()\n", + " session.run(None, {input_name : inputs_batch})\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings.\n", + "Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference.\n", + "First we can pass this model to the same evaluation routine we used before.\n", + "The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Apply Adaround\n", + "\n", + "We can now apply AdaRound to this model.\n", + "\n", + "Some of the parameters for AdaRound are described below\n", + "\n", + "- **dataloader:** AdaRound needs a dataloader that iterates over unlabeled data for the layer-by-layer optimization to learn the rounding vectors. We should comply with the class signature for the dataloader which is expected by AdaRound.\n", + "- **num_batches:** The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.\n", + "- **default_num_iterations:** The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import os\n", + "from aimet_onnx.adaround.adaround_weight import Adaround, AdaroundParameters\n", + "\n", + "# Dataloader satisfying the class signature required by AdaRound\n", + "class DataLoader:\n", + " \"\"\"\n", + " This dataloader derives unlabeled samples in the form of numpy arrays from a torch dataloader\n", + " \"\"\"\n", + " def __init__(self):\n", + " self._torch_data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " self._iterator = None\n", + " self.batch_size = self._torch_data_loader.batch_size\n", + "\n", + " def __iter__(self):\n", + " self._iterator = iter(self._torch_data_loader)\n", + " return self\n", + "\n", + " def __next__(self):\n", + " input_data, _ = next(self._iterator)\n", + " return input_data.numpy()\n", + "\n", + " def __len__(self):\n", + " return len(self._torch_data_loader)\n", + "\n", + "data_loader = DataLoader()\n", + "params = AdaroundParameters(data_loader=data_loader, num_batches=1, default_num_iterations=32, \n", + " forward_fn=pass_calibration_data, forward_pass_callback_args=1000)\n", + "\n", + "os.makedirs('./output/', exist_ok=True)\n", + "ada_model = Adaround.apply_adaround(model, params,\n", + " path=\"output\", \n", + " filename_prefix='adaround', \n", + " default_param_bw=8,\n", + " default_quant_scheme=QuantScheme.post_training_tf_enhanced)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the model after applying Adaround.\n", + "We again create a simulation model like before and evaluate to determine simulated quantized accuracy.\n", + "\n", + "**Note:** There are two important things to understand in the following cell.\n", + " - **Parameter Biwidth Precision**: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.\n", + " \n", + " - **Freezing the parameter encodings**:\n", + "After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API.\n", + "While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created.\n", + "For Quantization Simulation accuracy, it is important to freeze these encodings.\n", + "If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the parameters encodings and Quantization Simulation accuracy will not reflect the AdaRounded accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=ada_model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_activation_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)\n", + "\n", + "sim.set_and_freeze_param_encodings(encoding_path=os.path.join(\"output\", 'adaround.encodings'))\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference.\n", + "First we can pass this model to the same evaluation routine we used before.\n", + "The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization, using the newly AdaRounded model with updated parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after applying AdaRound.\n", + "The settings used in this notebook are designed only to serve as code examples, designed to run quickly, but may not be optimal.\n", + "Please try this workflow against the model of your choice and play with the number of samples and other parameters to get the best results.\n", + "\n", + "The next step would be to take this model to target.\n", + "We need to do two things:\n", + "- export the model with the updated weights without the fake quantization ops\n", + "- export the encodings (scale/offset quantization parameters).\n", + "AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sim.export(path='./output/', filename_prefix='resnet18_after_adaround')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This example illustrated how the AIMET AdaRound API is invoked to achieve post training quantization.\n", + "To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline.\n", + "As indicated above, some parameters in this example have been chosen in such a way to make this example execute faster.\n", + "\n", + "We hope this notebook was useful for you to understand how to use AIMET for performing AdaRound.\n", + "\n", + "A few additional resources:\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/onnx/quantization/cle.html b/releases/1.32.2/Examples/onnx/quantization/cle.html new file mode 100644 index 0000000..d210bea --- /dev/null +++ b/releases/1.32.2/Examples/onnx/quantization/cle.html @@ -0,0 +1,1416 @@ + + + + + + Cross-Layer Equalization (CLE) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Cross-Layer Equalization (CLE)

+

This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE). CLE is a post-training quantization techniques that aim to improve quantized accuracy of a given model. CLE does not need any data samples. This technique help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.

+

To learn more about this technique, please refer to the “Data-Free Quantization Through Weight Equalization and Bias Correction” paper from ICCV 2019 - https://arxiv.org/abs/1906.04721

+

Cross-Layer Equalization AIMET performs the following steps when running CLE: 1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers. 2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer. 3. High Bias Folding: Cross-layer scaling may +result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer’s parameters.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply CLE and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import torch
+import onnxruntime as ort
+from Examples.common import image_net_config
+from Examples.onnx.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: ort.InferenceSession) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param sess: the model to evaluate
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(sess, iterations=None)
+
+
+
+
+
+
+

2. Convert an FP32 PyTorch model to ONNX and evaluate the model’s baseline FP32 accuracy

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead or convert a model trained in a different framework altogether.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+import onnx
+
+input_shape = (1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+dummy_input = torch.randn(input_shape)
+filename = "./resnet18.onnx"
+
+# Load a pretrained ResNet-18 model in torch
+pt_model = resnet18(pretrained=True)
+
+# Export the torch model to onnx
+torch.onnx.export(pt_model.eval(),
+                  dummy_input,
+                  filename,
+                  training=torch.onnx.TrainingMode.PRESERVE,
+                  export_params=True,
+                  do_constant_folding=False,
+                  input_names=['input'],
+                  output_names=['output'],
+                  dynamic_axes={
+                      'input' : {0 : 'batch_size'},
+                      'output' : {0 : 'batch_size'},
+                  }
+                  )
+
+model = onnx.load_model(filename)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
# cudnn_conv_algo_search is fixing it to default to avoid changing in accuracies/outputs at every inference
+if 'CUDAExecutionProvider' in ort.get_available_providers():
+    providers = [('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT'}), 'CPUExecutionProvider']
+    use_cuda = True
+else:
+    providers = ['CPUExecutionProvider']
+    use_cuda = False
+
+
+
+
+

Let’s create an onnxruntime session and determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
sess = ort.InferenceSession(filename, providers=providers)
+accuracy = ImageNetDataPipeline.evaluate(sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model

+
+
[ ]:
+
+
+
from aimet_onnx.batch_norm_fold import fold_all_batch_norms_to_weight
+
+_ = fold_all_batch_norms_to_weight(model)
+
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision - num_batches: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the +number of images in these 5 batches should be sufficient for compute encodings - rounding_mode: The rounding mode used for quantization. There are two possible choices here - ‘nearest’ or ‘stochastic’ We will use “nearest.”

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_onnx.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           default_activation_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples

+

In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples. It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario +like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results. The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session, samples):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+    input_name = sess.get_inputs()[0].name
+
+    batch_cntr = 0
+    for input_data, target_data in data_loader:
+
+        inputs_batch = input_data.numpy()
+        session.run(None, {input_name : inputs_batch})
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+
+
+

4. 1 Cross Layer Equalization

+

The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.

+

Note: Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.

+

Note: CLE equalizes the model in-place

+
+
[ ]:
+
+
+
filename = "./resnet18.onnx"
+model = onnx.load_model(filename)
+
+
+
+
+
[ ]:
+
+
+
from aimet_onnx.cross_layer_equalization import equalize_model
+
+equalize_model(model)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           default_activation_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+accuracy = ImageNetDataPipeline.evaluate(sim.model)
+print(accuracy)
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE).

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/onnx/quantization/cle.ipynb b/releases/1.32.2/Examples/onnx/quantization/cle.ipynb new file mode 100644 index 0000000..463e537 --- /dev/null +++ b/releases/1.32.2/Examples/onnx/quantization/cle.ipynb @@ -0,0 +1,551 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Cross-Layer Equalization (CLE)\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE). CLE is a post-training quantization techniques that aim to improve quantized accuracy of a given model. CLE does not need any data samples. This technique help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.\n", + "\n", + "To learn more about this technique, please refer to the \"Data-Free Quantization Through Weight Equalization and Bias Correction\" paper from ICCV 2019 - https://arxiv.org/abs/1906.04721\n", + "\n", + "**Cross-Layer Equalization**\n", + "AIMET performs the following steps when running CLE:\n", + "1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers.\n", + "2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer.\n", + "3. High Bias Folding: Cross-layer scaling may result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer's parameters.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply CLE and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import torch\n", + "import onnxruntime as ort\n", + "from Examples.common import image_net_config\n", + "from Examples.onnx.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(sess: ort.InferenceSession) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param sess: the model to evaluate\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(sess, iterations=None)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "\n", + "## 2. Convert an FP32 PyTorch model to ONNX and evaluate the model's baseline FP32 accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead or convert a model trained in a different framework altogether." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "import onnx\n", + "\n", + "input_shape = (1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "dummy_input = torch.randn(input_shape)\n", + "filename = \"./resnet18.onnx\"\n", + "\n", + "# Load a pretrained ResNet-18 model in torch\n", + "pt_model = resnet18(pretrained=True)\n", + "\n", + "# Export the torch model to onnx\n", + "torch.onnx.export(pt_model.eval(),\n", + " dummy_input,\n", + " filename,\n", + " training=torch.onnx.TrainingMode.PRESERVE,\n", + " export_params=True,\n", + " do_constant_folding=False,\n", + " input_names=['input'],\n", + " output_names=['output'],\n", + " dynamic_axes={\n", + " 'input' : {0 : 'batch_size'},\n", + " 'output' : {0 : 'batch_size'},\n", + " }\n", + " )\n", + "\n", + "model = onnx.load_model(filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# cudnn_conv_algo_search is fixing it to default to avoid changing in accuracies/outputs at every inference\n", + "if 'CUDAExecutionProvider' in ort.get_available_providers():\n", + " providers = [('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT'}), 'CPUExecutionProvider']\n", + " use_cuda = True\n", + "else:\n", + " providers = ['CPUExecutionProvider']\n", + " use_cuda = False" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "Let's create an onnxruntime session and determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "sess = ort.InferenceSession(filename, providers=providers)\n", + "accuracy = ImageNetDataPipeline.evaluate(sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_onnx.batch_norm_fold import fold_all_batch_norms_to_weight\n", + "\n", + "_ = fold_all_batch_norms_to_weight(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Create Quantization Sim Model\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "- **num_batches**: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the number of images in these 5 batches should be sufficient for compute encodings\n", + "- **rounding_mode**: The rounding mode used for quantization. There are two possible choices here - 'nearest' or 'stochastic' We will use \"nearest.\"\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_onnx.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_activation_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "\n", + "In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def pass_calibration_data(session, samples):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + " input_name = sess.get_inputs()[0].name\n", + "\n", + " batch_cntr = 0\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.numpy()\n", + " session.run(None, {input_name : inputs_batch})\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 4. 1 Cross Layer Equalization\n", + "\n", + "The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.\n", + "\n", + "**Note:** Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.\n", + "\n", + "**Note:** CLE equalizes the model in-place" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "filename = \"./resnet18.onnx\"\n", + "model = onnx.load_model(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_onnx.cross_layer_equalization import equalize_model\n", + "\n", + "equalize_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_activation_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)\n", + "\n", + "accuracy = ImageNetDataPipeline.evaluate(sim.model)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE).\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/onnx/quantization/quantsim.html b/releases/1.32.2/Examples/onnx/quantization/quantsim.html new file mode 100644 index 0000000..5936194 --- /dev/null +++ b/releases/1.32.2/Examples/onnx/quantization/quantsim.html @@ -0,0 +1,1367 @@ + + + + + + Quantization Simulation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization Simulation

+

This notebook shows a working code example of how to use AIMET to perform quantization simulation (quantsim). Quantsim is an AIMET feature that adds quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model in order to compute quantization encodings and estimate the resulting accuracy of the model when deployed on quantized ML accelerators.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation pipeline 2. Convert an FP32 PyTorch model to ONNX and evaluate the model’s baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simulation model to get a quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art quantized accuracy. For example, it uses a relatively quantization-friendly model like Resnet18. Also, optimization techniques such as Quantization-Aware Training, AdaRound, and Cross-Layer Equalization can be employed to improve the accuracy of quantized models.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation pipeline

+

The following is an example validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model and provide a QuantizationSim session that acts as a regular onnxruntime inference session. However, it is recommended that users only use inference sessions created by the QuantizationSimModel, as this will automatically register the required custom operators.

  • +
+
+
[ ]:
+
+
+
import torch
+import onnxruntime as ort
+from Examples.common import image_net_config
+from Examples.onnx.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: ort.InferenceSession) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param sess: the model to evaluate
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(sess, iterations=None)
+
+
+
+
+
+
+

2. Convert an FP32 PyTorch model to ONNX and evaluate the model’s baseline FP32 accuracy

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead or convert a model trained in a different framework altogether.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+import onnx
+
+input_shape = (1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+dummy_input = torch.randn(input_shape)
+filename = "./resnet18.onnx"
+
+# Load a pretrained ResNet-18 model in torch
+pt_model = resnet18(pretrained=True)
+
+# Export the torch model to onnx
+torch.onnx.export(pt_model.eval(),
+                  dummy_input,
+                  filename,
+                  training=torch.onnx.TrainingMode.PRESERVE,
+                  export_params=True,
+                  do_constant_folding=False,
+                  input_names=['input'],
+                  output_names=['output'],
+                  dynamic_axes={
+                      'input' : {0 : 'batch_size'},
+                      'output' : {0 : 'batch_size'},
+                  }
+                  )
+
+model = onnx.load_model(filename)
+
+
+
+
+

We should decide whether to run the model on a CPU or CUDA device. This example code will use CUDA if available in your onnxruntime environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
# cudnn_conv_algo_search is fixing it to default to avoid changing in accuracies/outputs at every inference
+if 'CUDAExecutionProvider' in ort.get_available_providers():
+    providers = [('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT'}), 'CPUExecutionProvider']
+    use_cuda = True
+else:
+    providers = ['CPUExecutionProvider']
+    use_cuda = False
+
+
+
+
+

Let’s create an onnxruntime session and determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
sess = ort.InferenceSession(filename, providers=providers)
+accuracy = ImageNetDataPipeline.evaluate(sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model

+
+
[ ]:
+
+
+
from aimet_onnx.batch_norm_fold import fold_all_batch_norms_to_weight
+
+_ = fold_all_batch_norms_to_weight(model)
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_activation_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

In case the ONNX model has custom ops, we need to specify the paths of compiled custom ops via user_onnx_libs parameter. For example, user_onnx_libs=[‘path/to/custom_op1.so’, ‘path/to/custom_op2.so’]

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_onnx.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           default_activation_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization node, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as +calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session, samples):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+    input_name = sess.get_inputs()[0].name
+
+    batch_cntr = 0
+    for input_data, target_data in data_loader:
+
+        inputs_batch = input_data.numpy()
+        session.run(None, {input_name : inputs_batch})
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QuantizationSimulation.

+

Additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/onnx/quantization/quantsim.ipynb b/releases/1.32.2/Examples/onnx/quantization/quantsim.ipynb new file mode 100644 index 0000000..53eb57c --- /dev/null +++ b/releases/1.32.2/Examples/onnx/quantization/quantsim.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "# Quantization Simulation\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform quantization simulation (quantsim). Quantsim is an AIMET feature that adds quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model in order to compute quantization encodings and estimate the resulting accuracy of the model when deployed on quantized ML accelerators.\n", + "\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation pipeline\n", + "2. Convert an FP32 PyTorch model to ONNX and evaluate the model's baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simulation model to get a quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art quantized accuracy. For example, it uses a relatively quantization-friendly model like Resnet18. Also, optimization techniques such as Quantization-Aware Training, AdaRound, and Cross-Layer Equalization can be employed to improve the accuracy of quantized models." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "## 1. Example evaluation pipeline\n", + "\n", + "The following is an example validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model and provide a QuantizationSim session that acts as a regular onnxruntime inference session. However, it is recommended that users only use inference sessions created by the QuantizationSimModel, as this will automatically register the required custom operators.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "import torch\n", + "import onnxruntime as ort\n", + "from Examples.common import image_net_config\n", + "from Examples.onnx.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(sess: ort.InferenceSession) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param sess: the model to evaluate\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(sess, iterations=None)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "## 2. Convert an FP32 PyTorch model to ONNX and evaluate the model's baseline FP32 accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead or convert a model trained in a different framework altogether." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "import onnx\n", + "\n", + "input_shape = (1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "dummy_input = torch.randn(input_shape)\n", + "filename = \"./resnet18.onnx\"\n", + "\n", + "# Load a pretrained ResNet-18 model in torch\n", + "pt_model = resnet18(pretrained=True)\n", + "\n", + "# Export the torch model to onnx\n", + "torch.onnx.export(pt_model.eval(),\n", + " dummy_input,\n", + " filename,\n", + " training=torch.onnx.TrainingMode.PRESERVE,\n", + " export_params=True,\n", + " do_constant_folding=False,\n", + " input_names=['input'],\n", + " output_names=['output'],\n", + " dynamic_axes={\n", + " 'input' : {0 : 'batch_size'},\n", + " 'output' : {0 : 'batch_size'},\n", + " }\n", + " )\n", + "\n", + "model = onnx.load_model(filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "We should decide whether to run the model on a CPU or CUDA device. This example code will use CUDA if available in your onnxruntime environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "# cudnn_conv_algo_search is fixing it to default to avoid changing in accuracies/outputs at every inference\n", + "if 'CUDAExecutionProvider' in ort.get_available_providers():\n", + " providers = [('CUDAExecutionProvider', {'cudnn_conv_algo_search': 'DEFAULT'}), 'CPUExecutionProvider']\n", + " use_cuda = True\n", + "else:\n", + " providers = ['CPUExecutionProvider']\n", + " use_cuda = False" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "Let's create an onnxruntime session and determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sess = ort.InferenceSession(filename, providers=providers)\n", + "accuracy = ImageNetDataPipeline.evaluate(sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_onnx.batch_norm_fold import fold_all_batch_norms_to_weight\n", + "\n", + "_ = fold_all_batch_norms_to_weight(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_activation_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "In case the ONNX model has **custom ops**, we need to specify the paths of compiled custom ops via **user_onnx_libs** parameter.\n", + "For example, user_onnx_libs=['path/to/custom_op1.so', 'path/to/custom_op2.so']\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_onnx.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_activation_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization node, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "def pass_calibration_data(session, samples):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + " input_name = sess.get_inputs()[0].name\n", + "\n", + " batch_cntr = 0\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.numpy()\n", + " session.run(None, {input_name : inputs_batch})\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QuantizationSimulation.\n", + "\n", + "Additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/tensorflow/compression/channel_pruning.html b/releases/1.32.2/Examples/tensorflow/compression/channel_pruning.html new file mode 100644 index 0000000..20cf059 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/compression/channel_pruning.html @@ -0,0 +1,1469 @@ + + + + + + Model Compression Using Channel Pruning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Model Compression Using Channel Pruning

+

This notebook shows a working code example of how to use AIMET to perform model compression. The Channel Pruning technique is used in this notebook to achieve model compression.

+

Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.

+
    +
  1. Spatial SVD: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate +convolutional layers.

  2. +
  3. Channel Pruning: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer +output of the original model.

  4. +
+

Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.

+

This notebook shows working code example of how the technique #2 can be used to compress the model. You can find a separate notebook for #1, and #1 followed by #2 in the same folder.

+
+

Overall flow

+
+
This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the model and evaluate it to find the baseline accuracy 3. Compress the model and fine-tune:
+
3.1 Compress model using Channel Pruning and evaluate it to find post-compression accuracy
+
3.2 Fine-tune the model
+
+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/tfrecords/dir/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' ##TODO
+
+import tensorflow.compat.v1 as tf ## TODO Abhijit
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
[ ]:
+
+
+
from typing import List
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session, iterations: int = None, use_cuda: bool = False) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess, iterations)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate it to find the baseline accuracy

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
input_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+starting_op_names = input_op_names
+starting_op_names.append('labels')
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+

3. Compress the model and fine-tune

+
+

3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy

+

Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here

+
    +
  • target_comp_ratio: The desired compession ratio using Channel Pruning. This value denotes the desired compression % of the original model. To compress the model to 20% of its original size, use 0.2. This would compress the model by 80%. The pre-specified value that is given is 50%. The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.

  • +
  • num_comp_ratio_candidates: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.

  • +
  • modules_to_ignore: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.

  • +
  • mode: We are chossing Auto mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is Manual.

  • +
  • data_loader: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.

  • +
  • num_reconstruction_samples: During the last stage of Channel Pruning, the Compression API tries to map the outputs of the pruned model with that of the original model through linear regression, and uses this attempt to change the weights in the pruned layer. The regression is done with this many random samples. The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A +typical setting here would ~1000 samples.

  • +
  • allow_custom_downsample_ops: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.

  • +
  • eval_callback: The model evaluation function. The expected signature of the evaluate function should be <function_name>(model, eval_iterations, use_cuda) and it is expected to return an accuracy metric.

  • +
  • eval_iterations: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.

  • +
  • compress_scheme: We choose the ‘channel pruning’ compression scheme.

  • +
  • cost_metric: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing ‘mac’ here.

  • +
+

The next cell defines the actual Channel Pruning Parameters. There are two methods for which you can choose parameters - Auto and Manual. For Auto, the only option is a greedy selection scheme, where the optimal compression ratio is selected for each layer among a set list of candidates to reach the target ratio (which was specified in the previous cell). For Manual, you have to specify the compression ratios for each layer; a general rule of thumb, if one is to use Manual, is to start with the +ratios found by Auto Mode and use it as a starting point.

+
+
[ ]:
+
+
+
from aimet_common.defs import CompressionScheme, CostMetric
+from aimet_tensorflow.defs import GreedySelectionParameters, ChannelPruningParameters
+from decimal import Decimal
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),
+                                          num_comp_ratio_candidates=3)
+
+modules_to_ignore = [sess.graph.get_operation_by_name('conv1_conv/Conv2D')]
+auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                      modules_to_ignore=modules_to_ignore)
+
+data_loader = ImageNetDataPipeline.get_val_dataloader()
+params = ChannelPruningParameters(input_op_names=starting_op_names,
+                                  output_op_names=output_op_names,
+                                  data_set=data_loader.dataset,
+                                  batch_size=data_loader.batch_size,
+                                  num_reconstruction_samples=10,
+                                  allow_custom_downsample_ops=False,
+                                  mode=ChannelPruningParameters.Mode.auto,
+                                  params=auto_params)
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme = CompressionScheme.channel_pruning
+cost_metric = CostMetric.mac
+
+
+
+
+

We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.

+

Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline. This returns both the new model, which is saved, as well as relevant statistics. Finally, the compressed model is evaluated on the dataset.

+
+
[ ]:
+
+
+
from aimet_tensorflow.compress import ModelCompressor
+
+os.makedirs('./output/', exist_ok=True)
+
+#TODO: makedirs should be at top??
+compressed_sess, comp_stats = ModelCompressor.compress_model(sess=sess,
+                                                             working_dir="output",
+                                                             eval_callback=eval_callback,
+                                                             eval_iterations=eval_iterations,
+                                                             input_shape=(1, 3, 224, 224),
+                                                             compress_scheme=compress_scheme,
+                                                             cost_metric=cost_metric,
+                                                             parameters=params)
+
+print(comp_stats)
+
+
+
+
+

Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_sess, iterations=1)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.2. Fine-tune the model

+

After the model is compressed using Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+

Note: Since Channel Pruning replaces few BNs by different BNs with ‘reduced_’ added in their original name, update_ops_name list should be updated accordingly

+
+
[ ]:
+
+
+
compr_graph_all_ops_name = [op.name for op in compressed_sess.graph.get_operations()]
+update_ops_name_after_CP = []
+for op_name in update_ops_name:
+    if 'reduced_'+op_name in compr_graph_all_ops_name:
+        update_ops_name_after_CP.append('reduced_'+op_name)
+    else:
+        update_ops_name_after_CP.append(op_name)
+
+ImageNetDataPipeline.finetune(compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_sess)
+print(accuracy)
+
+
+
+
+

Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using Channel Pruning. Optionally, this model now can be saved like a regular tensorflow model.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph_saver import save_model_to_meta
+
+save_model_to_meta(compressed_sess, meta_path='./output/finetuned_model')
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing compression with Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/compression/channel_pruning.ipynb b/releases/1.32.2/Examples/tensorflow/compression/channel_pruning.ipynb new file mode 100644 index 0000000..292a9b0 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/compression/channel_pruning.ipynb @@ -0,0 +1,509 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model Compression Using Channel Pruning \n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform model compression. The Channel Pruning technique is used in this notebook to achieve model compression.\n", + "\n", + "Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.\n", + "\n", + "1. **Spatial SVD**: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate convolutional layers.\n", + "2. **Channel Pruning**: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer output of the original model.\n", + "\n", + "Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.\n", + "\n", + "This notebook shows working code example of how the technique #2 can be used to compress the model. You can find a separate notebook for #1, and #1 followed by #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the model and evaluate it to find the baseline accuracy\n", + "3. Compress the model and fine-tune: \n", + " 3.1 Compress model using Channel Pruning and evaluate it to find post-compression accuracy \n", + " 3.2 Fine-tune the model\n", + "\n", + "\n", + "#### What this notebook is not \n", + "* This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' ##TODO\n", + "\n", + "import tensorflow.compat.v1 as tf ## TODO Abhijit\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session, iterations: int = None, use_cuda: bool = False) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess, iterations)\n", + "\n", + " \n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate it to find the baseline accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]\n", + "starting_op_names = input_op_names\n", + "starting_op_names.append('labels')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compress the model and fine-tune\n", + "\n", + "### 3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy\n", + "Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here\n", + "\n", + "- **target_comp_ratio**: The desired compession ratio using Channel Pruning. This value denotes the desired compression % of the original model. To compress the model to 20% of its original size, use 0.2. This would compress the model by 80%. The pre-specified value that is given is 50%. The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.\n", + "\n", + "- **num_comp_ratio_candidates**: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.\n", + "\n", + "- **modules_to_ignore**: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.\n", + "\n", + "- **mode**: We are chossing **Auto** mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is **Manual**.\n", + "\n", + "- **data_loader**: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.\n", + "\n", + "- **num_reconstruction_samples**: During the last stage of Channel Pruning, the Compression API tries to map the outputs of the pruned model with that of the original model through linear regression, and uses this attempt to change the weights in the pruned layer. The regression is done with this many random samples. The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.\n", + "\n", + "- **allow_custom_downsample_ops**: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.\n", + "\n", + "- **eval_callback**: The model evaluation function. The expected signature of the evaluate function should be `(model, eval_iterations, use_cuda)` and it is expected to return an accuracy metric.\n", + "\n", + "- **eval_iterations**: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.\n", + "\n", + "- **compress_scheme**: We choose the 'channel pruning' compression scheme.\n", + "\n", + "- **cost_metric**: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing 'mac' here." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell defines the actual Channel Pruning Parameters. There are two methods for which you can choose parameters - Auto and Manual. For Auto, the only option is a greedy selection scheme, where the optimal compression ratio is selected for each layer among a set list of candidates to reach the target ratio (which was specified in the previous cell). For Manual, you have to specify the compression ratios for each layer; a general rule of thumb, if one is to use Manual, is to start with the ratios found by Auto Mode and use it as a starting point.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import CompressionScheme, CostMetric\n", + "from aimet_tensorflow.defs import GreedySelectionParameters, ChannelPruningParameters\n", + "from decimal import Decimal\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),\n", + " num_comp_ratio_candidates=3)\n", + "\n", + "modules_to_ignore = [sess.graph.get_operation_by_name('conv1_conv/Conv2D')]\n", + "auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params, \n", + " modules_to_ignore=modules_to_ignore)\n", + "\n", + "data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + "params = ChannelPruningParameters(input_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " data_set=data_loader.dataset,\n", + " batch_size=data_loader.batch_size,\n", + " num_reconstruction_samples=10,\n", + " allow_custom_downsample_ops=False,\n", + " mode=ChannelPruningParameters.Mode.auto,\n", + " params=auto_params)\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.channel_pruning\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "\n", + "\n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline. This returns both the new model, which is saved, as well as relevant statistics. Finally, the compressed model is evaluated on the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.compress import ModelCompressor\n", + "\n", + "os.makedirs('./output/', exist_ok=True)\n", + "\n", + "#TODO: makedirs should be at top??\n", + "compressed_sess, comp_stats = ModelCompressor.compress_model(sess=sess,\n", + " working_dir=\"output\",\n", + " eval_callback=eval_callback,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_sess, iterations=1)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. Fine-tune the model\n", + "\n", + "After the model is compressed using Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.\n", + "\n", + "**Note:** Since Channel Pruning replaces few BNs by different BNs with 'reduced_' added in their original name, update_ops_name list should be updated accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "compr_graph_all_ops_name = [op.name for op in compressed_sess.graph.get_operations()]\n", + "update_ops_name_after_CP = []\n", + "for op_name in update_ops_name:\n", + " if 'reduced_'+op_name in compr_graph_all_ops_name:\n", + " update_ops_name_after_CP.append('reduced_'+op_name)\n", + " else:\n", + " update_ops_name_after_CP.append(op_name)\n", + " \n", + "ImageNetDataPipeline.finetune(compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using Channel Pruning. Optionally, this model now can be saved like a regular tensorflow model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph_saver import save_model_to_meta\n", + "\n", + "save_model_to_meta(compressed_sess, meta_path='./output/finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing compression with Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/compression/spatial_svd.html b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd.html new file mode 100644 index 0000000..453b03a --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd.html @@ -0,0 +1,1476 @@ + + + + + + Model compression Using Spatial SVD — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Model compression Using Spatial SVD

+

This notebook shows a working code example of how to use AIMET to perform model compression. The Spatial SVD technique is used in this notebook to achieve model compression.

+

Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.

+
    +
  1. Spatial SVD: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate +convolutional layers.

  2. +
  3. Channel Pruning: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer +output of the original model.

  4. +
+

Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.

+

This notebook shows working code example of how the technique #1 can be used to compress the model. You can find a separate notebook for #2, and #1 followed by #2 in the same folder.

+
+

Overall flow

+
+
This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the model and evaluate it to find the baseline accuracy 3. Compress the model and fine-tune:
+
3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy
+
3.2 Fine-tune the model
+
+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/tfrecords/dir/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  ##TODO
+
+import tensorflow.compat.v1 as tf        ## TODO Abhijit
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import List
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session, iterations: int = None, use_cuda: bool = False) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess, iterations)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate it to find the baseline accuracy

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
input_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+starting_op_names = input_op_names.copy()
+starting_op_names.append('labels')
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+

3. Compress the model and fine-tune

+
+

3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy

+

Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here

+
    +
  • target_comp_ratio: The desired compession ratio using Channel Pruning. This value denotes the desired compression % of the original model. To compress the model to 20% of its original size, use 0.2. This would compress the model by 80%. The pre-specified value that is given is 50%. The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.

  • +
  • num_comp_ratio_candidates: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.

  • +
  • modules_to_ignore: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.

  • +
  • mode: We are chossing Auto mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is Manual.

  • +
  • data_loader: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.

  • +
  • num_reconstruction_samples: During the last stage of Channel Pruning, the Compression API tries to map the outputs of the pruned model with that of the original model through linear regression, and uses this attempt to change the weights in the pruned layer. The regression is done with this many random samples. The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A +typical setting here would ~1000 samples.

  • +
  • allow_custom_downsample_ops: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.

  • +
  • eval_callback: The model evaluation function. The expected signature of the evaluate function should be <function_name>(model, eval_iterations, use_cuda) and it is expected to return an accuracy metric.

  • +
  • eval_iterations: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.

  • +
  • compress_scheme: We choose the ‘channel pruning’ compression scheme.

  • +
  • cost_metric: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing ‘mac’ here.

  • +
+

The next cell creates the actual parameters for Spatial SVD. There are two methods for which you can choose parameters - Auto and Manual. For Auto, the only option is a greedy selection scheme, where the optimal compression ratio is selected for each layer among a set list of candidates to reach the target ratio (which was specified in the previous cell). For Manual, you have to specify the compression ratios for each layer; a general rule of thumb, if one is to use Manual, is to start with the +ratios found by Auto Mode and use it as a starting point.

+
+
[ ]:
+
+
+
from decimal import Decimal
+from aimet_common.defs import CompressionScheme, CostMetric, GreedySelectionParameters
+from aimet_tensorflow.defs import SpatialSvdParameters
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.5),
+                                          num_comp_ratio_candidates=2)
+
+modules_to_ignore = [sess.graph.get_operation_by_name('conv1_conv/Conv2D')]
+auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                  modules_to_ignore=modules_to_ignore)
+
+params = SpatialSvdParameters(input_op_names=starting_op_names,
+                              output_op_names=output_op_names,
+                              mode=SpatialSvdParameters.Mode.auto,
+                              params=auto_params)
+
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme =  CompressionScheme.spatial_svd
+cost_metric = CostMetric.mac
+
+
+
+
+
+
We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.
+
Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.
+
+
+
[ ]:
+
+
+
from aimet_tensorflow.compress import ModelCompressor
+
+os.makedirs('./output/', exist_ok=True)
+#TODO: makedirs should be at top??
+
+compressed_sess, comp_stats = ModelCompressor.compress_model(sess=sess,
+                                                             working_dir="output",
+                                                             eval_callback=ImageNetDataPipeline.evaluate,
+                                                             eval_iterations=eval_iterations,
+                                                             input_shape=(1, 3, 224, 224),
+                                                             compress_scheme=compress_scheme,
+                                                             cost_metric=cost_metric,
+                                                             parameters=params)
+
+print(comp_stats)
+
+
+
+
+

Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
comp_accuracy = ImageNetDataPipeline.evaluate(compressed_sess)
+print(comp_accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.2. Fine-tune the model

+

After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+

Add this: Since Channel Pruning replaces few BNs by different BNs with ‘reduced_’ added in their original name, update_ops_name list should be updated accordingly

+
+
[ ]:
+
+
+
compr_graph_all_ops_name = [op.name for op in compressed_sess.graph.get_operations()]
+update_ops_name_after_CP = []
+for op_name in update_ops_name:
+    if 'reduced_'+op_name in compr_graph_all_ops_name:
+        update_ops_name_after_CP.append('reduced_'+ op_name)
+    else:
+        update_ops_name_after_CP.append(op_name)
+
+ImageNetDataPipeline.finetune(compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_sess)
+print(accuracy)
+
+
+
+
+

Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular tensorflow model.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph_saver import save_model_to_meta
+
+save_model_to_meta(compressed_sess, meta_path='./output/finetuned_model')
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD. As indicated above, some parameters have been chosen in a way to run the example faster.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/compression/spatial_svd.ipynb b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd.ipynb new file mode 100644 index 0000000..e2fdb7c --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd.ipynb @@ -0,0 +1,519 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model compression Using Spatial SVD \n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform model compression. The Spatial SVD technique is used in this notebook to achieve model compression.\n", + "\n", + "Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.\n", + "\n", + "1. **Spatial SVD**: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate convolutional layers.\n", + "2. **Channel Pruning**: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer output of the original model.\n", + "\n", + "Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.\n", + "\n", + "This notebook shows working code example of how the technique #1 can be used to compress the model. You can find a separate notebook for #2, and #1 followed by #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the model and evaluate it to find the baseline accuracy\n", + "3. Compress the model and fine-tune: \n", + " 3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy \n", + " 3.2 Fine-tune the model\n", + "\n", + "\n", + "#### What this notebook is not \n", + "* This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' ##TODO\n", + "\n", + "import tensorflow.compat.v1 as tf ## TODO Abhijit\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session, iterations: int = None, use_cuda: bool = False) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess, iterations)\n", + "\n", + " \n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate it to find the baseline accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]\n", + "starting_op_names = input_op_names.copy()\n", + "starting_op_names.append('labels')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compress the model and fine-tune\n", + "\n", + "### 3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy\n", + "Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here\n", + "\n", + "- **target_comp_ratio**: The desired compession ratio using Channel Pruning. This value denotes the desired compression % of the original model. To compress the model to 20% of its original size, use 0.2. This would compress the model by 80%. The pre-specified value that is given is 50%. The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.\n", + "\n", + "- **num_comp_ratio_candidates**: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.\n", + "\n", + "- **modules_to_ignore**: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.\n", + "\n", + "- **mode**: We are chossing **Auto** mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is **Manual**.\n", + "\n", + "- **data_loader**: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.\n", + "\n", + "- **num_reconstruction_samples**: During the last stage of Channel Pruning, the Compression API tries to map the outputs of the pruned model with that of the original model through linear regression, and uses this attempt to change the weights in the pruned layer. The regression is done with this many random samples. The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.\n", + "\n", + "- **allow_custom_downsample_ops**: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.\n", + "\n", + "- **eval_callback**: The model evaluation function. The expected signature of the evaluate function should be `(model, eval_iterations, use_cuda)` and it is expected to return an accuracy metric.\n", + "\n", + "- **eval_iterations**: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.\n", + "\n", + "- **compress_scheme**: We choose the 'channel pruning' compression scheme.\n", + "\n", + "- **cost_metric**: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing 'mac' here." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell creates the actual parameters for Spatial SVD. There are two methods for which you can choose parameters - Auto and Manual. For Auto, the only option is a greedy selection scheme, where the optimal compression ratio is selected for each layer among a set list of candidates to reach the target ratio (which was specified in the previous cell). For Manual, you have to specify the compression ratios for each layer; a general rule of thumb, if one is to use Manual, is to start with the ratios found by Auto Mode and use it as a starting point." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "from aimet_common.defs import CompressionScheme, CostMetric, GreedySelectionParameters\n", + "from aimet_tensorflow.defs import SpatialSvdParameters\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.5),\n", + " num_comp_ratio_candidates=2)\n", + "\n", + "modules_to_ignore = [sess.graph.get_operation_by_name('conv1_conv/Conv2D')] \n", + "auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,\n", + " modules_to_ignore=modules_to_ignore)\n", + "\n", + "params = SpatialSvdParameters(input_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " mode=SpatialSvdParameters.Mode.auto,\n", + " params=auto_params)\n", + "\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.spatial_svd\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.compress import ModelCompressor\n", + "\n", + "os.makedirs('./output/', exist_ok=True)\n", + "#TODO: makedirs should be at top??\n", + "\n", + "compressed_sess, comp_stats = ModelCompressor.compress_model(sess=sess,\n", + " working_dir=\"output\",\n", + " eval_callback=ImageNetDataPipeline.evaluate,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "comp_accuracy = ImageNetDataPipeline.evaluate(compressed_sess)\n", + "print(comp_accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. Fine-tune the model\n", + "\n", + "After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.\n", + "\n", + "Add this: Since Channel Pruning replaces few BNs by different BNs with 'reduced_' added in their original name, update_ops_name list should be updated accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "compr_graph_all_ops_name = [op.name for op in compressed_sess.graph.get_operations()]\n", + "update_ops_name_after_CP = []\n", + "for op_name in update_ops_name:\n", + " if 'reduced_'+op_name in compr_graph_all_ops_name:\n", + " update_ops_name_after_CP.append('reduced_'+ op_name)\n", + " else:\n", + " update_ops_name_after_CP.append(op_name)\n", + " \n", + "ImageNetDataPipeline.finetune(compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular tensorflow model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph_saver import save_model_to_meta\n", + "\n", + "save_model_to_meta(compressed_sess, meta_path='./output/finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD. As indicated above, some parameters have been chosen in a way to run the example faster.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.html b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.html new file mode 100644 index 0000000..d349a32 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.html @@ -0,0 +1,1622 @@ + + + + + + Model Compression Using Spatial SVD Followed by Channel Pruning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Model Compression Using Spatial SVD Followed by Channel Pruning

+

This notebook shows a working code example of how to use AIMET to perform model compression. Two model-compression techniques are applied back-to-back: Spatial SVD followed by Channel Pruning.

+

Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.

+
    +
  1. Spatial SVD: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate +convolutional layers.

  2. +
  3. Channel Pruning: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer +output of the original model.

  4. +
+

Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.

+

This notebook shows working code example of how both the techniques (#1 and #2) can be used to compress the model. You can find a separate notebook for only #1 or #2 in the same folder.

+
+

Overall flow

+
+
This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the model and evaluate it to find the baseline accuracy 3. Compress the model and fine-tune:
+
3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy
+
3.2 Fine-tune the model after Spatial SVD
+
3.3 Compress model using Channel Pruning and evaluate it to find post-compression accuracy
+
3.4 Fine-tune the model after Channel Pruning
+
+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/tfrecords/dir/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import List
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session, iterations: int = None, use_cuda: bool = False) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess, iterations)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate it to find the baseline accuracy

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
input_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+starting_op_names = input_op_names.copy()
+starting_op_names.append('labels')
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+

3. Compress the model and fine-tune

+
+

3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy

+

Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here

+
    +
  • target_comp_ratio: The desired compession ratio using Channel Pruning. This value denotes the desired compression % of the original model. To compress the model to 20% of its original size, use 0.2. This would compress the model by 80%. The pre-specified value that is given is 50%. The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.

  • +
  • num_comp_ratio_candidates: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.

  • +
  • modules_to_ignore: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.

  • +
  • mode: We are chossing Auto mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is Manual.

  • +
  • data_loader: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.

  • +
  • num_reconstruction_samples: During the last stage of Channel Pruning, the Compression API tries to map the outputs of the pruned model with that of the original model through linear regression, and uses this attempt to change the weights in the pruned layer. The regression is done with this many random samples. The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A +typical setting here would ~1000 samples.

  • +
  • allow_custom_downsample_ops: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.

  • +
  • eval_callback: The model evaluation function. The expected signature of the evaluate function should be <function_name>(model, eval_iterations, use_cuda) and it is expected to return an accuracy metric.

  • +
  • eval_iterations: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.

  • +
  • compress_scheme: We choose the ‘channel pruning’ compression scheme.

  • +
  • cost_metric: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing ‘mac’ here.

  • +
+

The next cell creates the actual parameters for Spatial SVD. There are two methods for which you can choose parameters - Auto and Manual. For Auto, the only option is a greedy selection scheme, where the optimal compression ratio is selected for each layer among a set list of candidates to reach the target ratio (which was specified in the previous cell). For Manual, you have to specify the compression ratios for each layer; a general rule of thumb, if one is to use Manual, is to start with the +ratios found by Auto Mode and use it as a starting point.

+
+
[ ]:
+
+
+
from decimal import Decimal
+from aimet_common.defs import CompressionScheme, CostMetric, GreedySelectionParameters
+from aimet_tensorflow.defs import SpatialSvdParameters
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.5),
+                                          num_comp_ratio_candidates=2)
+
+modules_to_ignore = [sess.graph.get_operation_by_name('conv1_conv/Conv2D')]
+auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                  modules_to_ignore=modules_to_ignore)
+
+params = SpatialSvdParameters(input_op_names=input_op_names,
+                              output_op_names=output_op_names,
+                              mode=SpatialSvdParameters.Mode.auto,
+                              params=auto_params)
+
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme =  CompressionScheme.spatial_svd
+cost_metric = CostMetric.mac
+
+
+
+
+
+
We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.
+
Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.
+
+
+
[ ]:
+
+
+
from aimet_tensorflow.compress import ModelCompressor
+
+os.makedirs('./output/', exist_ok=True)
+#TODO: makedirs should be at top??
+
+ssvd_compressed_sess, ssvd_comp_stats = ModelCompressor.compress_model(sess=sess,
+                                                             working_dir="output",
+                                                             eval_callback=ImageNetDataPipeline.evaluate,
+                                                             eval_iterations=eval_iterations,
+                                                             input_shape=(1, 3, 224, 224),
+                                                             compress_scheme=compress_scheme,
+                                                             cost_metric=cost_metric,
+                                                             parameters=params)
+
+print(ssvd_comp_stats)
+
+
+
+
+

Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_sess)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.2. Fine-tune the model after Spatial SVD

+

After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+

Add this: Since Channel Pruning replaces few BNs by different BNs with ‘reduced_’ added in their original name, update_ops_name list should be updated accordingly

+
+
[ ]:
+
+
+
# compr_graph_all_ops_name = [op.name for op in ssvd_compressed_sess.graph.get_operations()]
+# update_ops_name_after_CP = []
+# for op_name in update_ops_name:
+#     if 'reduced_'+op_name in compr_graph_all_ops_name:
+#         update_ops_name_after_CP.append('reduced_'+op_name)
+#     else:
+#         update_ops_name_after_CP.append(op_name)
+
+# ImageNetDataPipeline.finetune(ssvd_compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_sess)
+print(accuracy)
+
+
+
+
+

Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular tensorflow model.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph_saver import save_model_to_meta
+
+save_model_to_meta(ssvd_compressed_sess, meta_path='./output/ssvd_finetuned_model')
+
+
+
+
+
+

3.3. Compress model using Channel Pruning and evaluate it to find post-compression accuracy

+
+
The fine-tuned model, compressed with Spatial SVD, can be further compressed using Channel Pruning method.
+
Similar to Spatial SVD, we will first define the parameters for Channel Pruning compression, out of which mostly are same as of Spatial SVD. The other parameters for Channel Pruning are as follows:
+
+
    +
  • data_loader: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.

  • +
  • num_reconstruction_samples: The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.

  • +
  • allow_custom_downsample_ops: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.

  • +
+
+
[ ]:
+
+
+
starting_op_names
+
+
+
+
+
[ ]:
+
+
+
from aimet_common.defs import CompressionScheme, CostMetric
+from aimet_tensorflow.defs import GreedySelectionParameters, ChannelPruningParameters
+from decimal import Decimal
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),
+                                          num_comp_ratio_candidates=3)
+
+modules_to_ignore = [ssvd_compressed_sess.graph.get_operation_by_name('conv1_conv/Conv2D')]
+auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                      modules_to_ignore=modules_to_ignore)
+
+data_loader = ImageNetDataPipeline.get_val_dataloader()
+params = ChannelPruningParameters(input_op_names=starting_op_names,
+                                  output_op_names=output_op_names,
+                                  data_set=data_loader.dataset,
+                                  batch_size=data_loader.batch_size,
+                                  num_reconstruction_samples=10,
+                                  allow_custom_downsample_ops=False,
+                                  mode=ChannelPruningParameters.Mode.auto,
+                                  params=auto_params)
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme = CompressionScheme.channel_pruning
+cost_metric = CostMetric.mac
+
+
+
+
+

We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.

+

Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline. This returns both the new model, which is saved, as well as relevant statistics. Finally, the compressed model is evaluated on the dataset.

+
+
[ ]:
+
+
+
from aimet_tensorflow.compress import ModelCompressor
+
+os.makedirs('./output/', exist_ok=True)
+#TODO: makedirs should be at top??
+
+ssvd_cp_compressed_sess, cp_comp_stats = ModelCompressor.compress_model(sess=ssvd_compressed_sess,
+                                                             working_dir="output",
+                                                             eval_callback=eval_callback,
+                                                             eval_iterations=eval_iterations,
+                                                             input_shape=(1, 3, 224, 224),
+                                                             compress_scheme=compress_scheme,
+                                                             cost_metric=cost_metric,
+                                                             parameters=params)
+
+print(cp_comp_stats)
+
+
+
+
+

Ok so we have a compressed model. We can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_sess, iterations=1)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.4. Fine-tune the model after Channel Pruning

+

After the model is compressed using Spatial SVD followed by Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+

Note: Since Channel Pruning replaces few BNs by different BNs with ‘reduced_’ added in their original name, update_ops_name list should be updated accordingly

+
+
[ ]:
+
+
+
compr_graph_all_ops_name = [op.name for op in ssvd_cp_compressed_sess.graph.get_operations()]
+update_ops_name_after_CP = []
+for op_name in update_ops_name:
+    if 'reduced_'+op_name in compr_graph_all_ops_name:
+        update_ops_name_after_CP.append('reduced_'+op_name)
+    else:
+        update_ops_name_after_CP.append(op_name)
+
+ImageNetDataPipeline.finetune(ssvd_cp_compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_sess)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using spatial SVD followed by Channel Pruning. Optionally, this model now can be saved like a regular Tensorflow model.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph_saver import save_model_to_meta
+
+save_model_to_meta(ssvd_cp_compressed_sess, meta_path='./output/finetuned_model')
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD followed by Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques

+
+
[ ]:
+
+
+

+
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.ipynb b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.ipynb new file mode 100644 index 0000000..0464649 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/compression/spatial_svd_channel_pruning.ipynb @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model Compression Using Spatial SVD Followed by Channel Pruning \n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform model compression. Two model-compression techniques are applied back-to-back: Spatial SVD followed by Channel Pruning.\n", + "\n", + "Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.\n", + "\n", + "1. **Spatial SVD**: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate convolutional layers.\n", + "2. **Channel Pruning**: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer output of the original model.\n", + "\n", + "Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.\n", + "\n", + "This notebook shows working code example of how both the techniques (#1 and #2) can be used to compress the model. You can find a separate notebook for only #1 or #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the model and evaluate it to find the baseline accuracy\n", + "3. Compress the model and fine-tune: \n", + " 3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy \n", + " 3.2 Fine-tune the model after Spatial SVD \n", + " 3.3 Compress model using Channel Pruning and evaluate it to find post-compression accuracy \n", + " 3.4 Fine-tune the model after Channel Pruning \n", + "\n", + "\n", + "#### What this notebook is not \n", + "* This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session, iterations: int = None, use_cuda: bool = False) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess, iterations)\n", + "\n", + " \n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate it to find the baseline accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]\n", + "starting_op_names = input_op_names.copy()\n", + "starting_op_names.append('labels')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compress the model and fine-tune\n", + "\n", + "### 3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy\n", + "Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here\n", + "\n", + "- **target_comp_ratio**: The desired compession ratio using Channel Pruning. This value denotes the desired compression % of the original model. To compress the model to 20% of its original size, use 0.2. This would compress the model by 80%. The pre-specified value that is given is 50%. The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.\n", + "\n", + "- **num_comp_ratio_candidates**: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.\n", + "\n", + "- **modules_to_ignore**: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.\n", + "\n", + "- **mode**: We are chossing **Auto** mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is **Manual**.\n", + "\n", + "- **data_loader**: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.\n", + "\n", + "- **num_reconstruction_samples**: During the last stage of Channel Pruning, the Compression API tries to map the outputs of the pruned model with that of the original model through linear regression, and uses this attempt to change the weights in the pruned layer. The regression is done with this many random samples. The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.\n", + "\n", + "- **allow_custom_downsample_ops**: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.\n", + "\n", + "- **eval_callback**: The model evaluation function. The expected signature of the evaluate function should be `(model, eval_iterations, use_cuda)` and it is expected to return an accuracy metric.\n", + "\n", + "- **eval_iterations**: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.\n", + "\n", + "- **compress_scheme**: We choose the 'channel pruning' compression scheme.\n", + "\n", + "- **cost_metric**: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing 'mac' here." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell creates the actual parameters for Spatial SVD. There are two methods for which you can choose parameters - Auto and Manual. For Auto, the only option is a greedy selection scheme, where the optimal compression ratio is selected for each layer among a set list of candidates to reach the target ratio (which was specified in the previous cell). For Manual, you have to specify the compression ratios for each layer; a general rule of thumb, if one is to use Manual, is to start with the ratios found by Auto Mode and use it as a starting point." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "from aimet_common.defs import CompressionScheme, CostMetric, GreedySelectionParameters\n", + "from aimet_tensorflow.defs import SpatialSvdParameters\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.5),\n", + " num_comp_ratio_candidates=2)\n", + "\n", + "modules_to_ignore = [sess.graph.get_operation_by_name('conv1_conv/Conv2D')] \n", + "auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,\n", + " modules_to_ignore=modules_to_ignore)\n", + "\n", + "params = SpatialSvdParameters(input_op_names=input_op_names,\n", + " output_op_names=output_op_names,\n", + " mode=SpatialSvdParameters.Mode.auto,\n", + " params=auto_params)\n", + "\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.spatial_svd\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.compress import ModelCompressor\n", + "\n", + "os.makedirs('./output/', exist_ok=True)\n", + "#TODO: makedirs should be at top??\n", + "\n", + "ssvd_compressed_sess, ssvd_comp_stats = ModelCompressor.compress_model(sess=sess,\n", + " working_dir=\"output\",\n", + " eval_callback=ImageNetDataPipeline.evaluate,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(ssvd_comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. Fine-tune the model after Spatial SVD\n", + "\n", + "After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.\n", + "\n", + "Add this: Since Channel Pruning replaces few BNs by different BNs with 'reduced_' added in their original name, update_ops_name list should be updated accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# compr_graph_all_ops_name = [op.name for op in ssvd_compressed_sess.graph.get_operations()]\n", + "# update_ops_name_after_CP = []\n", + "# for op_name in update_ops_name:\n", + "# if 'reduced_'+op_name in compr_graph_all_ops_name:\n", + "# update_ops_name_after_CP.append('reduced_'+op_name)\n", + "# else:\n", + "# update_ops_name_after_CP.append(op_name)\n", + "\n", + "# ImageNetDataPipeline.finetune(ssvd_compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular tensorflow model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph_saver import save_model_to_meta\n", + "\n", + "save_model_to_meta(ssvd_compressed_sess, meta_path='./output/ssvd_finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.3. Compress model using Channel Pruning and evaluate it to find post-compression accuracy\n", + "\n", + "The fine-tuned model, compressed with Spatial SVD, can be further compressed using Channel Pruning method. \n", + "Similar to Spatial SVD, we will first define the parameters for Channel Pruning compression, out of which mostly are same as of Spatial SVD. The other parameters for Channel Pruning are as follows:\n", + "\n", + "- **data_loader**: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.\n", + "\n", + "- **num_reconstruction_samples**: The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.\n", + "\n", + "- **allow_custom_downsample_ops**: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "starting_op_names" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import CompressionScheme, CostMetric\n", + "from aimet_tensorflow.defs import GreedySelectionParameters, ChannelPruningParameters\n", + "from decimal import Decimal\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),\n", + " num_comp_ratio_candidates=3)\n", + "\n", + "modules_to_ignore = [ssvd_compressed_sess.graph.get_operation_by_name('conv1_conv/Conv2D')]\n", + "auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params, \n", + " modules_to_ignore=modules_to_ignore)\n", + "\n", + "data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + "params = ChannelPruningParameters(input_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " data_set=data_loader.dataset,\n", + " batch_size=data_loader.batch_size,\n", + " num_reconstruction_samples=10,\n", + " allow_custom_downsample_ops=False,\n", + " mode=ChannelPruningParameters.Mode.auto,\n", + " params=auto_params)\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.channel_pruning\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "\n", + "\n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline. This returns both the new model, which is saved, as well as relevant statistics. Finally, the compressed model is evaluated on the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.compress import ModelCompressor\n", + "\n", + "os.makedirs('./output/', exist_ok=True)\n", + "#TODO: makedirs should be at top??\n", + "\n", + "ssvd_cp_compressed_sess, cp_comp_stats = ModelCompressor.compress_model(sess=ssvd_compressed_sess,\n", + " working_dir=\"output\",\n", + " eval_callback=eval_callback,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(cp_comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Ok so we have a compressed model. We can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_sess, iterations=1)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.4. Fine-tune the model after Channel Pruning\n", + "\n", + "After the model is compressed using Spatial SVD followed by Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.\n", + "\n", + "\n", + "**Note:** Since Channel Pruning replaces few BNs by different BNs with 'reduced_' added in their original name, update_ops_name list should be updated accordingly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "compr_graph_all_ops_name = [op.name for op in ssvd_cp_compressed_sess.graph.get_operations()]\n", + "update_ops_name_after_CP = []\n", + "for op_name in update_ops_name:\n", + " if 'reduced_'+op_name in compr_graph_all_ops_name:\n", + " update_ops_name_after_CP.append('reduced_'+op_name)\n", + " else:\n", + " update_ops_name_after_CP.append(op_name)\n", + " \n", + "ImageNetDataPipeline.finetune(ssvd_cp_compressed_sess, update_ops_name_after_CP, epochs=1, learning_rate=1e-3, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using spatial SVD followed by Channel Pruning. Optionally, this model now can be saved like a regular Tensorflow model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph_saver import save_model_to_meta\n", + "\n", + "save_model_to_meta(ssvd_cp_compressed_sess, meta_path='./output/finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD followed by Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/adaround.html b/releases/1.32.2/Examples/tensorflow/quantization/adaround.html new file mode 100644 index 0000000..d807007 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/adaround.html @@ -0,0 +1,1538 @@ + + + + + + Adaptive Rounding (AdaRound) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Adaptive Rounding (AdaRound)

+

This notebook shows a working code example of how to use AIMET to perform Adaptive Rounding (AdaRound).

+

AIMET quantization features typically use the “nearest rounding” technique for achieving quantization. When using the “nearest rounding” technique, the weight value is quantized to the nearest integer value.

+

AdaRound optimizes a loss function using unlabeled training data to decide whether to quantize a specific weight to the closer integer value or the farther one. Using AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.

+
+

Overall flow

+

This notebook covers the following: 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply AdaRound and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results

  • +
  • For example, it uses a relatively quantization-friendly model like Resnet50

  • +
  • Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, use that. Otherwise, download the dataset from an appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The dataloader provided in this example notebook relies on the ImageNet tfrecords dataset having the following characteristics: - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. - Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. For the purpose of running this notebook, you could reduce the dataset to 2 samples per class and then convert it into tfrecords. This exercise is left up to the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/dataset/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERROR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example Evaluation and Training Pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written?

    +

    Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

    +
  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods?

    +

    Not really. You should be able to use your existing evaluate and train routines as-is.

    +
  • +
+
+
[ ]:
+
+
+
from typing import List
+
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
starting_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine:

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this?

+

On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so results in an inferences/sec speedup since unnecessary computation is avoided.

+

From a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers.

+

This can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). We want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers on the given model and returns a new session:

+
+
[ ]:
+
+
+
from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
+
+BN_folded_sess, _= fold_all_batch_norms(sess,
+                                        input_op_names=starting_op_names,
+                                        output_op_names=output_op_names)
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel.

+

Before we create the QuantizationSimModel, we save and load a version of the BN folded session for QuantSim to use. QuantSim will insert fake quantization ops in the session passed into it, and we want to maintain a fresh copy of the BN folded session for use in AdaRound later.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph_saver import save_and_load_graph
+BN_folded_sess_copy = save_and_load_graph("output", BN_folded_sess)
+
+
+
+

AIMET will insert fake quantization ops in the model graph and configure them. A few of the parameters are explained here: - quant_scheme: - We set this to “post_training_tf_enhanced” With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset. - default_output_bw: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision. - +default_param_bw: Setting this to 8 means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision.

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_tensorflow.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(session=BN_folded_sess_copy,
+                           starting_op_names=starting_op_names,
+                           output_op_names=output_op_names,
+                           quant_scheme= QuantScheme.post_training_tf_enhanced,
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node.

+

For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

We create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metrics, so we can just ignore the model output. A few pointers regarding the data samples:

+
    +
  • In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.

  • +
  • It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

  • +
+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session: tf.Session, _):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),
+                           session.graph.get_tensor_by_name('labels:0')]
+
+    train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]
+    train_tensors_dict = dict.fromkeys(train_tensors, False)
+
+    eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]
+
+    samples = 500
+
+    batch_cntr = 0
+    for input_label in data_loader:
+        input_label_tensors_dict = dict(zip(input_label_tensors, input_label))
+
+        feed_dict = {**input_label_tensors_dict, **train_tensors_dict}
+
+        with session.graph.as_default():
+            _ = session.run(eval_outputs, feed_dict=feed_dict)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. We can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+
+
+

4. Apply AdaRound

+

We can now apply AdaRound to this model.

+

Some of the parameters for AdaRound are described below:

+
    +
  • data_loader: AdaRound needs a dataloader to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.

  • +
  • num_batches: The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this translates to 64 batches. To speed up the execution here we are using 5 batches.

  • +
  • default_num_iterations: The number of iterations to AdaRound each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime.

  • +
  • path: The path where AdaRound parameter encodings are exported. Ensure that this folder exists prior to calling the API.

  • +
+
+
[ ]:
+
+
+
from aimet_tensorflow.adaround.adaround_weight import Adaround
+from aimet_tensorflow.adaround.adaround_weight import AdaroundParameters
+
+num_batches = 5
+num_iterations = 32
+data_set = ImageNetDataPipeline.get_val_dataloader().dataset
+params = AdaroundParameters(data_set=data_set, num_batches=num_batches, default_num_iterations=num_iterations)
+ada_model = Adaround.apply_adaround(BN_folded_sess, starting_op_names=starting_op_names,
+                                    output_op_names=output_op_names, params=params,
+                                    path="output", filename_prefix="adaround", default_param_bw=8,
+                                    default_quant_scheme=QuantScheme.post_training_tf_enhanced)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the model after applying AdaRound. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+

Note: There are two important things to understand in the following cell. - Parameter Biwidth Precision: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.

+
    +
  • Freezing the parameter encodings: After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API. While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created. For Quantization Simulation accuracy, it is important to freeze these encodings. If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the +parameters encodings and Quantization Simulation accuracy will not reflect the AdaRounded accuracy.

  • +
+
+
[ ]:
+
+
+
sim = QuantizationSimModel(session=ada_model,
+                           starting_op_names=starting_op_names,
+                           output_op_names=output_op_names,
+                           quant_scheme= QuantScheme.post_training_tf_enhanced,
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+sim.set_and_freeze_param_encodings(encoding_path=os.path.join("output", "adaround.encodings"))
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization, using the newly AdaRounded model with updated parameters.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after applying AdaRound. The settings used in this notebook are designed only to serve as code examples, designed to run quickly, but may not be optimal. Please try this workflow against the model of your choice and play with the number of samples and other parameters to get the best results.

+

The next step would be to take this model to target. We need to do two things: - export the model with the updated weights without the fake quantization ops - export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
sim.export(path="./output/", filename_prefix="resnet18_after_adaround")
+
+
+
+
+
+
+

Summary

+

This example illustrated how the AIMET AdaRound API is invoked to achieve post training quantization. To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline. As indicated above, some parameters in this example have been chosen in such a way to make this example execute faster.

+

We hope this notebook was useful for you to understand how to use AIMET for performing AdaRound.

+

A few additional resources: - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/adaround.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/adaround.ipynb new file mode 100644 index 0000000..87af0df --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/adaround.ipynb @@ -0,0 +1,803 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Adaptive Rounding (AdaRound)\n", + "This notebook shows a working code example of how to use AIMET to perform Adaptive Rounding (AdaRound).\n", + "\n", + "AIMET quantization features typically use the \"nearest rounding\" technique for achieving quantization.\n", + "When using the \"nearest rounding\" technique, the weight value is quantized to the nearest integer value.\n", + "\n", + "AdaRound optimizes a loss function using unlabeled training data to decide whether to quantize a specific weight to the closer integer value or the farther one.\n", + "Using AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following:\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply AdaRound and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results\n", + "* For example, it uses a relatively quantization-friendly model like Resnet50\n", + "* Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification.\n", + "If you already have a version of the dataset readily available, use that.\n", + "Otherwise, download the dataset from an appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The dataloader provided in this example notebook relies on the ImageNet tfrecords dataset having the following characteristics:\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files.\n", + "- Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset.\n", + "E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class.\n", + "For the purpose of running this notebook, you could reduce the dataset to 2 samples per class and then convert it into tfrecords.\n", + "This exercise is left up to the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "We disable logs at the INFO level and disable eager execution.\n", + "We set verbosity to the level as displayed (ERROR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 1. Example Evaluation and Training Pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?**\n", + "\n", + " Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model.\n", + " This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?**\n", + "\n", + " Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from typing import List\n", + "\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(sess: tf.Session) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess)\n", + "\n", + "\n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session.\n", + "Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op.\n", + "Since batchnorm ops are folded, these need to be ignored during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode.\n", + "This allows AIMET to more easily read the BN parameters from the graph.\n", + "Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "AIMET features currently support tensorflow sessions.\n", + "**add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "starting_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device.\n", + "This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model.\n", + "These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers.\n", + "Doing so results in an inferences/sec speedup since unnecessary computation is avoided.\n", + "\n", + "From a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy.\n", + "However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers.\n", + "\n", + "This can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision).\n", + "We want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers on the given model and returns a new session:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "BN_folded_sess, _= fold_all_batch_norms(sess,\n", + " input_op_names=starting_op_names,\n", + " output_op_names=output_op_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel.\n", + "\n", + "Before we create the QuantizationSimModel, we save and load a version of the BN folded session for QuantSim to use.\n", + "QuantSim will insert fake quantization ops in the session passed into it, and we want to maintain a fresh copy of the BN folded session for use in AdaRound later." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph_saver import save_and_load_graph\n", + "BN_folded_sess_copy = save_and_load_graph(\"output\", BN_folded_sess)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "AIMET will insert fake quantization ops in the model graph and configure them.\n", + "A few of the parameters are explained here:\n", + "- **quant_scheme**:\n", + " - We set this to \"post_training_tf_enhanced\"\n", + " With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset.\n", + "- **default_output_bw**: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision.\n", + "- **default_param_bw**: Setting this to 8 means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision.\n", + "\n", + "There are other parameters that are set to default values in this example.\n", + "Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(session=BN_folded_sess_copy,\n", + " starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " quant_scheme= QuantScheme.post_training_tf_enhanced,\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph, the model is not ready to be used yet.\n", + "Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node.\n", + "\n", + "For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters.\n", + "This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "We create a routine to pass unlabeled data samples through the model.\n", + "This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model.\n", + "We don't need to compute any loss metrics, so we can just ignore the model output. A few pointers regarding the data samples:\n", + "\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + " For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed.\n", + " It's not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation.\n", + " However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings.\n", + "This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def pass_calibration_data(session: tf.Session, _):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),\n", + " session.graph.get_tensor_by_name('labels:0')]\n", + "\n", + " train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]\n", + " train_tensors_dict = dict.fromkeys(train_tensors, False)\n", + "\n", + " eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]\n", + "\n", + " samples = 500\n", + "\n", + " batch_cntr = 0\n", + " for input_label in data_loader:\n", + " input_label_tensors_dict = dict(zip(input_label_tensors, input_label))\n", + "\n", + " feed_dict = {**input_label_tensors_dict, **train_tensors_dict}\n", + "\n", + " with session.graph.as_default():\n", + " _ = session.run(eval_outputs, feed_dict=feed_dict)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings.\n", + "Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training.\n", + "We can pass this model to the same evaluation routine we used before.\n", + "The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 4. Apply AdaRound\n", + "\n", + "We can now apply AdaRound to this model.\n", + "\n", + "Some of the parameters for AdaRound are described below:\n", + "\n", + "- **data_loader:** AdaRound needs a dataloader to use data samples for the layer-by-layer optimization to learn the rounding vectors.\n", + " Either a training or validation dataloader could be passed in.\n", + "- **num_batches:** The number of batches used to evaluate the model while calculating the quantization encodings.\n", + " Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this translates to 64 batches.\n", + " To speed up the execution here we are using 5 batches.\n", + "- **default_num_iterations:** The number of iterations to AdaRound each layer.\n", + " Default value is set to 10000 and we strongly recommend to not reduce this number.\n", + " But in this example we are using 32 to speed up the execution runtime.\n", + "- **path:** The path where AdaRound parameter encodings are exported. Ensure that this folder exists prior to calling the API." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.adaround.adaround_weight import Adaround\n", + "from aimet_tensorflow.adaround.adaround_weight import AdaroundParameters\n", + "\n", + "num_batches = 5\n", + "num_iterations = 32\n", + "data_set = ImageNetDataPipeline.get_val_dataloader().dataset\n", + "params = AdaroundParameters(data_set=data_set, num_batches=num_batches, default_num_iterations=num_iterations)\n", + "ada_model = Adaround.apply_adaround(BN_folded_sess, starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names, params=params,\n", + " path=\"output\", filename_prefix=\"adaround\", default_param_bw=8,\n", + " default_quant_scheme=QuantScheme.post_training_tf_enhanced)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the model after applying AdaRound.\n", + "We again create a simulation model like before and evaluate to determine simulated quantized accuracy.\n", + "\n", + "**Note:** There are two important things to understand in the following cell.\n", + " - **Parameter Biwidth Precision**: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.\n", + "\n", + " - **Freezing the parameter encodings**:\n", + "After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API.\n", + "While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created.\n", + "For Quantization Simulation accuracy, it is important to freeze these encodings.\n", + "If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the parameters encodings and Quantization Simulation accuracy will not reflect the AdaRounded accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(session=ada_model,\n", + " starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " quant_scheme= QuantScheme.post_training_tf_enhanced,\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)\n", + "\n", + "sim.set_and_freeze_param_encodings(encoding_path=os.path.join(\"output\", \"adaround.encodings\"))\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference.\n", + "First we can pass this model to the same evaluation routine we used before.\n", + "The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization, using the newly AdaRounded model with updated parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after applying AdaRound.\n", + "The settings used in this notebook are designed only to serve as code examples, designed to run quickly, but may not be optimal.\n", + "Please try this workflow against the model of your choice and play with the number of samples and other parameters to get the best results.\n", + "\n", + "The next step would be to take this model to target.\n", + "We need to do two things:\n", + "- export the model with the updated weights without the fake quantization ops\n", + "- export the encodings (scale/offset quantization parameters).\n", + "AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "sim.export(path=\"./output/\", filename_prefix=\"resnet18_after_adaround\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Summary\n", + "\n", + "This example illustrated how the AIMET AdaRound API is invoked to achieve post training quantization.\n", + "To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline.\n", + "As indicated above, some parameters in this example have been chosen in such a way to make this example execute faster.\n", + "\n", + "We hope this notebook was useful for you to understand how to use AIMET for performing AdaRound.\n", + "\n", + "A few additional resources:\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/autoquant.html b/releases/1.32.2/Examples/tensorflow/quantization/autoquant.html new file mode 100644 index 0000000..02b9972 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/autoquant.html @@ -0,0 +1,1453 @@ + + + + + + AutoQuant — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AutoQuant

+

This notebook shows a working code example of how to use AIMET AutoQuant feature.

+

AIMET offers a suite of neural network post-training quantization techniques. Often, applying these techniques in a specific sequence, results in better accuracy and performance. Without the AutoQuant feature, the AIMET user needs to manually try out various combinations of AIMET quantization features. This manual process is error-prone and often time-consuming.

+

The AutoQuant feature, analyzes the model, determines the sequence of AIMET quantization techniques and applies these techniques. In addition, the user can specify the amount of accuracy drop that can be tolerated, in the AutoQuant API. As soon as this threshold accuracy is reached, AutoQuant stops applying any additional quantization technique. In summary, the AutoQuant feature saves time and automates the quantization of the neural networks.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load a pretrained FP32 model 3. Determine the baseline FP32 accuracy 4. Define constants and helper functions 5. Apply AutoQuant

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art AutoQuant results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train’ for training files and ‘valid’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/tfrecords/dir/'       # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERROR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow as tf
+tf.compat.v1.disable_eager_execution()
+tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and fine-tuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.compat.v1.Session) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess)
+
+
+
+
+
+

2. Load a pretrained FP32 model

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+input_shape = (224, 224, 3)
+model = ResNet50(weights='imagenet', input_shape=input_shape)
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, False, load_save_path='./')
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.compat.v1.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
input_tensor_name = model.input.name
+input_op_name, _ = input_tensor_name.split(":")
+output_tensor_name = model.output.name
+output_op_name, _ = output_tensor_name.split(":")
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+
+

3. Determine the baseline FP32 accuracy

+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+

4. Define Constants and Helper functions

+

In this section the constants and helper functions needed to run this example are defined.

+
    +
  • EVAL_DATASET_SIZE A typical value is 5000. To execute this example faster this value has been set to 50

  • +
  • CALIBRATION_DATASET_SIZE A typical value is 2000. To execute this example faster this value has been set to 20

  • +
  • BATCH_SIZE User sets the batch size. As an example, set to 10

  • +
+

The helper function **_create_sampled_data_loader()** returns a DataLoader based on the dataset and the number of samples provided.

+
+
[ ]:
+
+
+
EVAL_DATASET_SIZE = 50
+CALIBRATION_DATASET_SIZE = 20
+BATCH_SIZE = 10
+
+_sampled_datasets = {}
+
+def _create_sampled_dataset(dataset: tf.compat.v1.data.Dataset,
+                            num_samples: int) -> tf.compat.v1.data.Dataset:
+    if num_samples in _sampled_datasets:
+        return _sampled_datasets[num_samples]
+
+    with dataset._graph.as_default():
+        SHUFFLE_BUFFER_SIZE = 300 # NOTE: Adjust the buffer size as necessary.
+        SHUFFLE_SEED = 22222
+        dataset = dataset.shuffle(buffer_size=SHUFFLE_BUFFER_SIZE, seed=SHUFFLE_SEED)\
+                         .take(num_samples)\
+                         .batch(BATCH_SIZE)
+        _sampled_datasets[num_samples] = dataset
+        return dataset
+
+
+
+
+
+
+

Prepare unlabeled dataset

+

The AutoQuant feature utilizes an unlabeled dataset to achieve quantization. Below cell shows how to get an unlabeled Dataset object from a labeled Dataset.

+
+
[ ]:
+
+
+
eval_dataset = ImageNetDataPipeline.get_val_dataloader().dataset
+
+with eval_dataset._graph.as_default():
+    image_dataset = eval_dataset.map(lambda images, labels: images)
+    unlabeled_dataset = image_dataset.batch(BATCH_SIZE)
+
+
+
+
+
+

Prepare the evaluation callback function

+

The eval_callback() function takes the session object to evaluate and the number of samples to use as arguments. If the num_samples argument is None, the whole evaluation dataset is used to evaluate the model.

+
+
[ ]:
+
+
+
import numpy as np
+from aimet_tensorflow.utils.common import iterate_tf_dataset
+from typing import Optional
+
+
+def eval_callback(sess: tf.compat.v1.Session,
+                  num_samples: Optional[int] = None) -> float:
+    if num_samples is None:
+        num_samples = EVAL_DATASET_SIZE
+
+    sampled_dataset = _create_sampled_dataset(eval_dataset, num_samples)
+
+    with sess.graph.as_default():
+        sess.run(tf.compat.v1.global_variables_initializer())
+        input_tensor = sess.graph.get_tensor_by_name(input_tensor_name)
+        output_tensor = sess.graph.get_tensor_by_name(output_tensor_name)
+
+        num_correct_predictions = 0
+        for images, labels in iterate_tf_dataset(sampled_dataset):
+            prob = sess.run(output_tensor, feed_dict={input_tensor: images})
+            predictions = np.argmax(prob, axis=1)
+            num_correct_predictions += np.sum(predictions == labels)
+
+        return int(num_correct_predictions) / num_samples
+
+
+
+
+
+

5. Apply AutoQuant

+

As a first step, the AutoQuant object is created.

+

The allowed_accuracy_drop parameter is set by the user to convey to the AutoQuant feature, how much accuracy drop is tolerated by the user. AutoQuant applies a series of quantization features. When the allowed accuracy is reached, AutoQuant stops applying any subsequent quantization feature. Please refer AutoQuant User Guide and API documentation for complete details.

+
+
[ ]:
+
+
+
from aimet_tensorflow.auto_quant import AutoQuant
+
+auto_quant = AutoQuant(allowed_accuracy_drop=0.01,
+                       unlabeled_dataset=unlabeled_dataset,
+                       eval_callback=eval_callback)
+
+
+
+
+
+

Optionally set AdaRound Parameters

+

The AutoQuant feature internally uses default parameters to execute the AdaRound step. If and only if necessary, the default AdaRound Parameters should be modified using the API shown below.

+

Note: To execute this example faster, the default value of the num_iterations parameter has been reduced from 10000 to 2000

+
+
[ ]:
+
+
+
from aimet_tensorflow.adaround.adaround_weight import AdaroundParameters
+
+ADAROUND_DATASET_SIZE = 2000
+adaround_dataset = _create_sampled_dataset(image_dataset, ADAROUND_DATASET_SIZE)
+adaround_params = AdaroundParameters(adaround_dataset,
+                                     num_batches=ADAROUND_DATASET_SIZE // BATCH_SIZE)
+auto_quant.set_adaround_params(adaround_params)
+
+
+
+
+
+

Run AutoQuant

+

This step applies the AutoQuant feature. The best possible quantized model, the associated eval_score and the path to the AdaRound encoding files are returned.

+
+
[ ]:
+
+
+
sess, accuracy, encoding_path =\
+    auto_quant.apply(tf.compat.v1.keras.backend.get_session(),
+                     starting_op_names=[input_op_name],
+                     output_op_names=[output_op_name])
+
+
+
+
+
[ ]:
+
+
+
print(accuracy)
+print(encoding_path)
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET AutoQuant feature.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and parameters - Refer to the other example notebooks to understand how to use AIMET CLE and AdaRound features in a standalone fashion.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/autoquant.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/autoquant.ipynb new file mode 100644 index 0000000..9357749 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/autoquant.ipynb @@ -0,0 +1,539 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# AutoQuant\n", + "\n", + "This notebook shows a working code example of how to use AIMET AutoQuant feature.\n", + "\n", + "AIMET offers a suite of neural network post-training quantization techniques. Often, applying these techniques in a specific sequence, results in better accuracy and performance. Without the AutoQuant feature, the AIMET user needs to manually try out various combinations of AIMET quantization features. This manual process is error-prone and often time-consuming.\n", + "\n", + "The AutoQuant feature, analyzes the model, determines the sequence of AIMET quantization techniques and applies these techniques. In addition, the user can specify the amount of accuracy drop that can be tolerated, in the AutoQuant API. As soon as this threshold accuracy is reached, AutoQuant stops applying any additional quantization technique. In summary, the AutoQuant feature saves time and automates the quantization of the neural networks.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load a pretrained FP32 model\n", + "3. Determine the baseline FP32 accuracy\n", + "4. Define constants and helper functions\n", + "5. Apply AutoQuant\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art AutoQuant results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. [https://image-net.org/challenges/LSVRC/2012/index.php#](https://image-net.org/challenges/LSVRC/2012/index.php#)) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train'** for training files and **'valid'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERROR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow as tf\n", + "tf.compat.v1.disable_eager_execution()\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and fine-tuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(sess: tf.compat.v1.Session) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 2. Load a pretrained FP32 model\n", + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "input_shape = (224, 224, 3)\n", + "model = ResNet50(weights='imagenet', input_shape=input_shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, False, load_save_path='./')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.compat.v1.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "input_tensor_name = model.input.name\n", + "input_op_name, _ = input_tensor_name.split(\":\")\n", + "output_tensor_name = model.output.name\n", + "output_op_name, _ = output_tensor_name.split(\":\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 3. Determine the baseline FP32 accuracy\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 4. Define Constants and Helper functions\n", + "\n", + "In this section the constants and helper functions needed to run this example are defined.\n", + "\n", + "- **EVAL_DATASET_SIZE** A typical value is 5000. To execute this example faster this value has been set to 50\n", + "- **CALIBRATION_DATASET_SIZE** A typical value is 2000. To execute this example faster this value has been set to 20\n", + "- **BATCH_SIZE** User sets the batch size. As an example, set to 10\n", + "\n", + "\n", + "The helper function **_create_sampled_data_loader()** returns a DataLoader based on the dataset and the number of samples provided." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "EVAL_DATASET_SIZE = 50\n", + "CALIBRATION_DATASET_SIZE = 20\n", + "BATCH_SIZE = 10\n", + "\n", + "_sampled_datasets = {}\n", + "\n", + "def _create_sampled_dataset(dataset: tf.compat.v1.data.Dataset,\n", + " num_samples: int) -> tf.compat.v1.data.Dataset:\n", + " if num_samples in _sampled_datasets:\n", + " return _sampled_datasets[num_samples]\n", + "\n", + " with dataset._graph.as_default():\n", + " SHUFFLE_BUFFER_SIZE = 300 # NOTE: Adjust the buffer size as necessary.\n", + " SHUFFLE_SEED = 22222\n", + " dataset = dataset.shuffle(buffer_size=SHUFFLE_BUFFER_SIZE, seed=SHUFFLE_SEED)\\\n", + " .take(num_samples)\\\n", + " .batch(BATCH_SIZE)\n", + " _sampled_datasets[num_samples] = dataset\n", + " return dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Prepare unlabeled dataset\n", + "\n", + "The AutoQuant feature utilizes an unlabeled dataset to achieve quantization. Below cell shows how to get an unlabeled Dataset object from a labeled Dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "eval_dataset = ImageNetDataPipeline.get_val_dataloader().dataset\n", + "\n", + "with eval_dataset._graph.as_default():\n", + " image_dataset = eval_dataset.map(lambda images, labels: images)\n", + " unlabeled_dataset = image_dataset.batch(BATCH_SIZE)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Prepare the evaluation callback function\n", + "\n", + "The **eval_callback()** function takes the session object to evaluate and the number of samples to use as arguments. If the **num_samples** argument is None, the whole evaluation dataset is used to evaluate the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from aimet_tensorflow.utils.common import iterate_tf_dataset\n", + "from typing import Optional\n", + "\n", + "\n", + "def eval_callback(sess: tf.compat.v1.Session,\n", + " num_samples: Optional[int] = None) -> float:\n", + " if num_samples is None:\n", + " num_samples = EVAL_DATASET_SIZE\n", + "\n", + " sampled_dataset = _create_sampled_dataset(eval_dataset, num_samples)\n", + "\n", + " with sess.graph.as_default():\n", + " sess.run(tf.compat.v1.global_variables_initializer())\n", + " input_tensor = sess.graph.get_tensor_by_name(input_tensor_name)\n", + " output_tensor = sess.graph.get_tensor_by_name(output_tensor_name)\n", + "\n", + " num_correct_predictions = 0\n", + " for images, labels in iterate_tf_dataset(sampled_dataset):\n", + " prob = sess.run(output_tensor, feed_dict={input_tensor: images})\n", + " predictions = np.argmax(prob, axis=1)\n", + " num_correct_predictions += np.sum(predictions == labels)\n", + "\n", + " return int(num_correct_predictions) / num_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 5. Apply AutoQuant\n", + "\n", + "As a first step, the AutoQuant object is created.\n", + "\n", + "The **allowed_accuracy_drop** parameter is set by the user to convey to the AutoQuant feature, how much accuracy drop is tolerated by the user. AutoQuant applies a series of quantization features. When the allowed accuracy is reached, AutoQuant stops applying any subsequent quantization feature. Please refer AutoQuant User Guide and API documentation for complete details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.auto_quant import AutoQuant\n", + "\n", + "auto_quant = AutoQuant(allowed_accuracy_drop=0.01,\n", + " unlabeled_dataset=unlabeled_dataset,\n", + " eval_callback=eval_callback)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Optionally set AdaRound Parameters\n", + "The AutoQuant feature internally uses default parameters to execute the AdaRound step.\n", + "If and only if necessary, the default AdaRound Parameters should be modified using the API shown below.\n", + "\n", + "**Note:**\n", + "To execute this example faster, the default value of the **num_iterations** parameter has been reduced from 10000 to 2000" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.adaround.adaround_weight import AdaroundParameters\n", + "\n", + "ADAROUND_DATASET_SIZE = 2000\n", + "adaround_dataset = _create_sampled_dataset(image_dataset, ADAROUND_DATASET_SIZE)\n", + "adaround_params = AdaroundParameters(adaround_dataset,\n", + " num_batches=ADAROUND_DATASET_SIZE // BATCH_SIZE)\n", + "auto_quant.set_adaround_params(adaround_params)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Run AutoQuant\n", + "\n", + "This step applies the AutoQuant feature. The best possible quantized model, the associated eval_score and the path to the AdaRound encoding files are returned." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sess, accuracy, encoding_path =\\\n", + " auto_quant.apply(tf.compat.v1.keras.backend.get_session(),\n", + " starting_op_names=[input_op_name],\n", + " output_op_names=[output_op_name])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(accuracy)\n", + "print(encoding_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET AutoQuant feature.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET CLE and AdaRound features in a standalone fashion." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.html b/releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.html new file mode 100644 index 0000000..e6e918f --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.html @@ -0,0 +1,1537 @@ + + + + + + Quantization-Aware Training with BatchNorm Re-estimation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Quantization-Aware Training with BatchNorm Re-estimation

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) with batchnorm re-estimation. Batchnorm re-estimation is a technique for countering potential instability of batchnrom statistics (i.e. running mean and variance) during QAT. More specifically, batchnorm re-estimation recalculates the batchnorm statistics based on the model after QAT. By doing so, we aim to make our model learn batchnorm statistics from from stable outputs after QAT, +rather than from likely noisy outputs during QAT.

+
+

Overall flow

+

This notebook covers the following steps: 1. Create a quantization simulation model with fake quantization ops inserted. 2. Finetune and evaluate the quantization simulation model 3. Re-estimate batchnorm statistics and compare the eval score before and after re-estimation. 4. Fold the re-estimated batchnorm layers and export the quantization simulation model

+
+
+

What this notebook is not

+

In this notebook, we will focus how to apply batchnorm re-estimation after QAT, rather than covering all the details about QAT itself. For more information about QAT, please refer to QAT notebook or QAT range learning notebook.

+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s session graph to create a QuantizationSim model which is still a Tensorflow graph. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+from typing import List
+
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load FP32 model

+

AIMET currently support BatchNorm Re-estimation on Tensorflow sessions. In this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to work with Tensorflow session. Similarly, you can load any pretrained Tensorflow model. Please refer to QAT notebook for more detail.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+sess = tf.keras.backend.get_session()
+
+# Following lines are additional steps to make keras model work with AIMET.
+from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

We need names of input and output of the model to work with AIMET.

+
+
[ ]:
+
+
+
input_op_names = [model.input.op.name]
+output_op_names = [model.output.op.name]
+
+
+
+
+

BatchNorm Rewriter

+

In the later notebook, we will make changes to parameters of BatchNorms to improve performance. However, depending on how the BatchNorm was configured, this might be difficult to achieve.

+

AIMET provides model_sess_bn_mutable that changes BatchNorm layer to make it easier to modify parameters.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.op.bn_mutable import modify_sess_bn_mutable
+modify_sess_bn_mutable(sess, input_op_names, output_op_names, training_tf_placeholder=False)
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+
+
+

3. Create a quantization simulation model and Perform QAT

+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

NOTE: Note that, unlike in other QAT example scripts, we didn’t fold batchnorm layers before QAT. This is because we aim to finetune our model with batchnorm layers present and re-estimate the batchnorm statatistics for better accuracy. The batchnorm layers will be folded after re-estimation.

+
+
[ ]:
+
+
+
import json
+from aimet_common.defs import QuantScheme
+from aimet_tensorflow.quantsim import QuantizationSimModel
+
+default_config_per_channel = {
+            "defaults":
+                {
+                    "ops":
+                        {
+                            "is_output_quantized": "True"
+                        },
+                    "params":
+                        {
+                            "is_quantized": "True",
+                            "is_symmetric": "True"
+                        },
+                    "strict_symmetric": "False",
+                    "unsigned_symmetric": "True",
+                    "per_channel_quantization": "True"
+                },
+
+            "params":
+                {
+                    "bias":
+                        {
+                            "is_quantized": "False"
+                        }
+                },
+
+            "op_type":
+                {
+                    "Squeeze":
+                        {
+                            "is_output_quantized": "False"
+                        },
+                    "Pad":
+                        {
+                            "is_output_quantized": "False"
+                        },
+                    "Mean":
+                        {
+                            "is_output_quantized": "False"
+                        }
+                },
+
+            "supergroups":
+                [
+                    {
+                        "op_list": ["Conv", "Relu"]
+                    },
+                    {
+                        "op_list": ["Conv", "Clip"]
+                    },
+                    {
+                        "op_list": ["Conv", "BatchNormalization", "Relu"]
+                    },
+                    {
+                        "op_list": ["Add", "Relu"]
+                    },
+                    {
+                        "op_list": ["Gemm", "Relu"]
+                    }
+                ],
+
+            "model_input":
+                {
+                    "is_input_quantized": "True"
+                },
+
+            "model_output":
+                {}
+        }
+
+config_file_path = "/tmp/default_config_per_channel.json"
+with open(config_file_path, "w") as f:
+    json.dump(default_config_per_channel, f)
+
+sim = QuantizationSimModel(sess, input_op_names, output_op_names, use_cuda=True,
+                                   quant_scheme=QuantScheme.training_range_learning_with_tf_init,
+                                   config_file=config_file_path)
+
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to +as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session: tf.compat.v1.Session, _):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),
+                           session.graph.get_tensor_by_name('labels:0')]
+
+    train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]
+    train_tensors_dict = dict.fromkeys(train_tensors, False)
+
+    eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]
+
+    samples = 500
+
+    batch_cntr = 0
+    for input_label in data_loader:
+        input_label_tensors_dict = dict(zip(input_label_tensors, input_label))
+
+        feed_dict = {**input_label_tensors_dict, **train_tensors_dict}
+
+        with session.graph.as_default():
+            _ = session.run(eval_outputs, feed_dict=feed_dict)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+

Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
update_ops_name = [op.name for op in model.updates] # Used for finetuning
+ImageNetDataPipeline.finetune(sim.session, update_ops_name=update_ops_name, epochs=1, learning_rate=5e-7, decay_steps=5)
+
+
+
+

After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
finetuned_accuracy  = ImageNetDataPipeline.evaluate(sim.session)
+print(finetuned_accuracy)
+
+
+
+
+
+
+
+

4. Perform BatchNorm Reestimation

+
+

Re-estimate BatchNorm Statistics

+

AIMET provides a helper function, reestimate_bn_stats, for re-estimating batchnorm statistics. Here is the full list of parameters for this function: * model: Model to re-estimate the BatchNorm statistics. * dataloader Train dataloader. * num_batches (optional): The number of batches to be used for reestimation. (Default: 100) * forward_fn (optional): Optional adapter function that performs forward pass given a model and a input batch yielded from the data loader. If not +specified, it is expected that inputs yielded from dataloader can be passed directly to the model.

+
+
[ ]:
+
+
+
from aimet_tensorflow.bn_reestimation import reestimate_bn_stats
+import numpy as np
+
+data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+arrays=[]
+for input_label in data_loader:
+    arrays.append(input_label[0])
+real_inputs = np.vstack(arrays)
+
+dataset = tf.compat.v1.data.Dataset.from_tensor_slices(real_inputs)
+bn_re_restimation_dataset = dataset.batch(32)
+
+reestimate_bn_stats(sim, start_op_names=input_op_names, output_op_names=output_op_names,
+                    bn_re_estimation_dataset=bn_re_restimation_dataset, bn_num_batches=100)
+
+finetuned_accuracy_bn_reestimated = ImageNetDataPipeline.evaluate(sim.session)
+print(finetuned_accuracy_bn_reestimated)
+
+
+
+
+
+

Fold BatchNorm Layers

+

So far, we have improved our quantization simulation model through QAT and batchnorm re-estimation. The next step would be to actually take this model to target. But first, we should fold the batchnorm layers for our model to run on target devices more efficiently.

+
+
[ ]:
+
+
+
from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms_to_scale
+
+fold_all_batch_norms_to_scale(sim, input_op_names, output_op_names)
+
+
+
+
+
+
+
+

5. Export Model

+

As the final step, we will export the model to run it on actual target devices. AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+sim.export(path='./output/', filename_prefix='resnet50_after_qat')
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use batchnorm re-estimation feature of AIMET.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters. - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT methods.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.ipynb new file mode 100644 index 0000000..0bb2da9 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/bn_reestimation.ipynb @@ -0,0 +1,565 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantization-Aware Training with BatchNorm Re-estimation\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) with batchnorm re-estimation.\n", + "Batchnorm re-estimation is a technique for countering potential instability of batchnrom statistics (i.e. running mean and variance) during QAT. More specifically, batchnorm re-estimation recalculates the batchnorm statistics based on the model after QAT. By doing so, we aim to make our model learn batchnorm statistics from from stable outputs after QAT, rather than from likely noisy outputs during QAT.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following steps:\n", + "1. Create a quantization simulation model with fake quantization ops inserted.\n", + "2. Finetune and evaluate the quantization simulation model\n", + "3. Re-estimate batchnorm statistics and compare the eval score before and after re-estimation.\n", + "4. Fold the re-estimated batchnorm layers and export the quantization simulation model\n", + "\n", + "#### What this notebook is not\n", + "In this notebook, we will focus how to apply batchnorm re-estimation after QAT, rather than covering all the details about QAT itself. For more information about QAT, please refer to [QAT notebook](https://github.com/quic/aimet/blob/develop/Examples/tensorflow/quantization/qat.ipynb) or [QAT range learning notebook](https://github.com/quic/aimet/blob/develop/Examples/tensorflow/quantization/qat_range_learning.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's session graph to create a QuantizationSim model which is still a Tensorflow graph. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)\n", + "from typing import List\n", + "\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(sess: tf.Session) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess)\n", + "\n", + "\n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load FP32 model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET currently support BatchNorm Re-estimation on Tensorflow sessions. In this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to work with Tensorflow session. Similarly, you can load any pretrained Tensorflow model. Please refer to [QAT notebook](https://github.com/quic/aimet/blob/develop/Examples/tensorflow/quantization/quantization_aware_training.ipynb) for more detail." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Following lines are additional steps to make keras model work with AIMET.\n", + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need names of input and output of the model to work with AIMET." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_op_names = [model.input.op.name]\n", + "output_op_names = [model.output.op.name]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### BatchNorm Rewriter\n", + "In the later notebook, we will make changes to parameters of BatchNorms to improve performance.\n", + "However, depending on how the BatchNorm was configured, this might be difficult to achieve.\n", + "\n", + "AIMET provides `model_sess_bn_mutable` that changes BatchNorm layer to make it easier to modify parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.op.bn_mutable import modify_sess_bn_mutable\n", + "modify_sess_bn_mutable(sess, input_op_names, output_op_names, training_tf_placeholder=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and Perform QAT\n", + "\n", + "### Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.\n", + "\n", + "**NOTE**: Note that, unlike in other QAT example scripts, we didn't fold batchnorm layers before QAT. This is because we aim to finetune our model with batchnorm layers present and re-estimate the batchnorm statatistics for better accuracy. The batchnorm layers will be folded after re-estimation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.quantsim import QuantizationSimModel\n", + "\n", + "default_config_per_channel = {\n", + " \"defaults\":\n", + " {\n", + " \"ops\":\n", + " {\n", + " \"is_output_quantized\": \"True\"\n", + " },\n", + " \"params\":\n", + " {\n", + " \"is_quantized\": \"True\",\n", + " \"is_symmetric\": \"True\"\n", + " },\n", + " \"strict_symmetric\": \"False\",\n", + " \"unsigned_symmetric\": \"True\",\n", + " \"per_channel_quantization\": \"True\"\n", + " },\n", + "\n", + " \"params\":\n", + " {\n", + " \"bias\":\n", + " {\n", + " \"is_quantized\": \"False\"\n", + " }\n", + " },\n", + "\n", + " \"op_type\":\n", + " {\n", + " \"Squeeze\":\n", + " {\n", + " \"is_output_quantized\": \"False\"\n", + " },\n", + " \"Pad\":\n", + " {\n", + " \"is_output_quantized\": \"False\"\n", + " },\n", + " \"Mean\":\n", + " {\n", + " \"is_output_quantized\": \"False\"\n", + " }\n", + " },\n", + "\n", + " \"supergroups\":\n", + " [\n", + " {\n", + " \"op_list\": [\"Conv\", \"Relu\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Conv\", \"Clip\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Conv\", \"BatchNormalization\", \"Relu\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Add\", \"Relu\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Gemm\", \"Relu\"]\n", + " }\n", + " ],\n", + "\n", + " \"model_input\":\n", + " {\n", + " \"is_input_quantized\": \"True\"\n", + " },\n", + "\n", + " \"model_output\":\n", + " {}\n", + " }\n", + "\n", + "config_file_path = \"/tmp/default_config_per_channel.json\"\n", + "with open(config_file_path, \"w\") as f:\n", + " json.dump(default_config_per_channel, f)\n", + "\n", + "sim = QuantizationSimModel(sess, input_op_names, output_op_names, use_cuda=True,\n", + " quant_scheme=QuantScheme.training_range_learning_with_tf_init,\n", + " config_file=config_file_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(session: tf.compat.v1.Session, _):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),\n", + " session.graph.get_tensor_by_name('labels:0')]\n", + "\n", + " train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]\n", + " train_tensors_dict = dict.fromkeys(train_tensors, False)\n", + "\n", + " eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]\n", + "\n", + " samples = 500\n", + "\n", + " batch_cntr = 0\n", + " for input_label in data_loader:\n", + " input_label_tensors_dict = dict(zip(input_label_tensors, input_label))\n", + "\n", + " feed_dict = {**input_label_tensors_dict, **train_tensors_dict}\n", + "\n", + " with session.graph.as_default():\n", + " _ = session.run(eval_outputs, feed_dict=feed_dict)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "update_ops_name = [op.name for op in model.updates] # Used for finetuning\n", + "ImageNetDataPipeline.finetune(sim.session, update_ops_name=update_ops_name, epochs=1, learning_rate=5e-7, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(finetuned_accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Perform BatchNorm Reestimation\n", + "\n", + "### Re-estimate BatchNorm Statistics\n", + "AIMET provides a helper function, `reestimate_bn_stats`, for re-estimating batchnorm statistics.\n", + "Here is the full list of parameters for this function:\n", + "* **model**: Model to re-estimate the BatchNorm statistics.\n", + "* **dataloader** Train dataloader.\n", + "* **num_batches** (optional): The number of batches to be used for reestimation. (Default: 100)\n", + "* **forward_fn** (optional): Optional adapter function that performs forward pass given a model and a input batch yielded from the data loader. If not specified, it is expected that inputs yielded from dataloader can be passed directly to the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.bn_reestimation import reestimate_bn_stats\n", + "import numpy as np\n", + "\n", + "data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + "arrays=[]\n", + "for input_label in data_loader:\n", + " arrays.append(input_label[0])\n", + "real_inputs = np.vstack(arrays)\n", + "\n", + "dataset = tf.compat.v1.data.Dataset.from_tensor_slices(real_inputs)\n", + "bn_re_restimation_dataset = dataset.batch(32)\n", + "\n", + "reestimate_bn_stats(sim, start_op_names=input_op_names, output_op_names=output_op_names,\n", + " bn_re_estimation_dataset=bn_re_restimation_dataset, bn_num_batches=100)\n", + "\n", + "finetuned_accuracy_bn_reestimated = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(finetuned_accuracy_bn_reestimated)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fold BatchNorm Layers\n", + "\n", + "So far, we have improved our quantization simulation model through QAT and batchnorm re-estimation. The next step would be to actually take this model to target. But first, we should fold the batchnorm layers for our model to run on target devices more efficiently." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms_to_scale\n", + "\n", + "fold_all_batch_norms_to_scale(sim, input_op_names, output_op_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Export Model\n", + "As the final step, we will export the model to run it on actual target devices. AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "sim.export(path='./output/', filename_prefix='resnet50_after_qat')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use batchnorm re-estimation feature of AIMET.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters.\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/tensorflow/quantization) to understand how to use AIMET post-training quantization techniques and QAT methods." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/cle_bc.html b/releases/1.32.2/Examples/tensorflow/quantization/cle_bc.html new file mode 100644 index 0000000..fafa854 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/cle_bc.html @@ -0,0 +1,1554 @@ + + + + + + Cross-Layer Equalization (CLE) and Bias Correction (BC) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Cross-Layer Equalization (CLE) and Bias Correction (BC)

+

This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE) and Bias Correction (BC). CLE and BC are post-training quantization techniques that aim to improve quantized accuracy of a given model. CLE does not need any data samples. BC may optionally need unlabelled data samples. These techniques help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.

+

To learn more about this techniques, please refer to the “Data-Free Quantization Through Weight Equalization and Bias Correction” paper from ICCV 2019 - https://arxiv.org/abs/1906.04721

+

Cross-Layer Equalization AIMET performs the following steps when running CLE: 1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers. 2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer. 3. High Bias Folding: Cross-layer scaling may +result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer’s parameters.

+
+
Bias Correction
+
Quantization sometimes leads to a shift in layer outputs. This techniques helps correct this shift by adjusting the bias parameters of that layer. Note that this technique is generally applied after CLE, but it is a optional step.
+
+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply CLE, BC and and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/tfrecords/dir/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import List
+
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
starting_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True):
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model

+
+
[ ]:
+
+
+
from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
+
+BN_folded_sess, _ = fold_all_batch_norms(sess,
+                                         input_op_names=starting_op_names,
+                                         output_op_names=output_op_names)
+
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision - num_batches: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the +number of images in these 5 batches should be sufficient for compute encodings - rounding_mode: The rounding mode used for quantization. There are two possible choices here - ‘nearest’ or ‘stochastic’ We will use “nearest.”

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

The next cell sets up the quantizer, and quantizes the model. The new session that contains all the changes to the graph is quantizer.session, and this is then evaluated on the dataset. Note that the quantizer uses the same evaluate function as the one defined in our data pipeline when computing the new weights.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_tensorflow.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(session=BN_folded_sess,
+                           starting_op_names=starting_op_names,
+                           output_op_names=output_op_names,
+                           quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples

+

In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples. It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario +like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results. The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session: tf.Session, _):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),
+                           session.graph.get_tensor_by_name('labels:0')]
+
+    train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]
+    train_tensors_dict = dict.fromkeys(train_tensors, False)
+
+    eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]
+
+    samples = 500
+
+    batch_cntr = 0
+    for input_label in data_loader:
+        input_label_tensors_dict = dict(zip(input_label_tensors, input_label))
+
+        feed_dict = {**input_label_tensors_dict, **train_tensors_dict}
+
+        with session.graph.as_default():
+            _ = session.run(eval_outputs, feed_dict=feed_dict)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. 1 Cross Layer Equalization

+

The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.

+

Note: Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.

+

Note: CLE equalizes the model in-place

+
+
[ ]:
+
+
+
from aimet_tensorflow import cross_layer_equalization as aimet_cle
+
+cle_applied_sess = aimet_cle.equalize_model(sess,
+                                            start_op_names=start_op_names,
+                                            output_op_names=output_op_names)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
sim = QuantizationSimModel(session=cle_applied_sess,
+                           starting_op_names=starting_op_names,
+                           output_op_names=output_op_names,
+                           quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. 2 Bias Correction

+

This section shows how we can apply AIMET Bias Correction on top of the already equalized model from the previous step. Bias correction under the hood uses a reference FP32 model and a QuantizationSimModel to perform its procedure. More details are explained in the AIMET User Guide documentation.

+

For the correct_bias API, we pass the following parameters

+
    +
  • num_quant_samples: Number of samples used for computing encodings. We are setting this to a low number here to speed up execution. A typical number would be 500-1000.

  • +
  • num_bias_correct_samples: Number of samples used for bias correction. We are setting this to a low number here to speed up execution. A typical number would be 1000-2000.

  • +
  • data_loader: BC uses unlabeled data samples from this data loader.

  • +
+
+
[ ]:
+
+
+
from aimet_tensorflow import bias_correction as aimet_bc
+
+quant_params = aimet_bc.QuantParams(quant_mode= QuantScheme.post_training_tf_enhanced, round_mode="nearest",
+                                    use_cuda=use_cuda, ops_to_ignore=[])
+bias_correction_params = aimet_bc.BiasCorrectionParams(batch_size=56,
+                                                       num_quant_samples=16,
+                                                       num_bias_correct_samples=16,
+                                                       input_op_names=start_op_names,
+                                                       output_op_names=output_op_names)
+
+after_bc_sess = aimet_bc.BiasCorrection.correct_bias(sess, bias_correct_params=bias_correction_params,
+                                                     quant_params=quant_params,
+                                                     data_set=data_loader.dataset)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the bias-corrected model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
sim = QuantizationSimModel(session=BN_folded_sess,
+                           starting_op_names=['input_1'],
+                           output_op_names=[model.output.name.split(":")[0]],
+                           quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we should have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. AIMET QuantizationSimModel provides an export API for this purpose. This API would save the model as #TODO

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+sim.export(path='./output/', filename_prefix='resnet50_after_qat_range_learning')
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE) and Bias Correction (BC).

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/cle_bc.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/cle_bc.ipynb new file mode 100644 index 0000000..47ebf52 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/cle_bc.ipynb @@ -0,0 +1,670 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "38bf01b3", + "metadata": {}, + "source": [ + "# Cross-Layer Equalization (CLE) and Bias Correction (BC)\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE) and Bias Correction (BC). CLE and BC are post-training quantization techniques that aim to improve quantized accuracy of a given model. CLE does not need any data samples. BC may optionally need unlabelled data samples. These techniques help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.\n", + "\n", + "To learn more about this techniques, please refer to the \"Data-Free Quantization Through Weight Equalization and Bias Correction\" paper from ICCV 2019 - https://arxiv.org/abs/1906.04721\n", + "\n", + "**Cross-Layer Equalization**\n", + "AIMET performs the following steps when running CLE:\n", + "1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers.\n", + "2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer.\n", + "3. High Bias Folding: Cross-layer scaling may result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer's parameters.\n", + "\n", + "**Bias Correction** \n", + "Quantization sometimes leads to a shift in layer outputs. This techniques helps correct this shift by adjusting the bias parameters of that layer. Note that this technique is generally applied after CLE, but it is a optional step.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply CLE, BC and and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "id": "71116f26", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14eaf1d4", + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "id": "e08683fa", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b45d3c7", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "id": "7b964ae2", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ff778eb", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess)\n", + "\n", + " \n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "id": "1e7b31bf", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "id": "1d5e6074", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de92a9d0", + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "id": "8c55a5be", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de9c180c", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "id": "c97b5289", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a55dee2c", + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "id": "bc385ad9", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91368424", + "metadata": {}, + "outputs": [], + "source": [ + "starting_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]" + ] + }, + { + "cell_type": "markdown", + "id": "712344c8", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12e8ae6c", + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True):" + ] + }, + { + "cell_type": "markdown", + "id": "050b6187", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1b7c11b", + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "id": "d4962c07", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3879d9fb", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "BN_folded_sess, _ = fold_all_batch_norms(sess,\n", + " input_op_names=starting_op_names,\n", + " output_op_names=output_op_names)" + ] + }, + { + "cell_type": "markdown", + "id": "7adfba8d", + "metadata": {}, + "source": [ + "---\n", + "## Create Quantization Sim Model\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "- **num_batches**: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the number of images in these 5 batches should be sufficient for compute encodings\n", + "- **rounding_mode**: The rounding mode used for quantization. There are two possible choices here - 'nearest' or 'stochastic' We will use \"nearest.\"\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "markdown", + "id": "68ad3150", + "metadata": {}, + "source": [ + "The next cell sets up the quantizer, and quantizes the model. The new session that contains all the changes to the graph is quantizer.session, and this is then evaluated on the dataset. Note that the quantizer uses the same evaluate function as the one defined in our data pipeline when computing the new weights." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a8a06c5", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.quantsim import QuantizationSimModel\n", + " \n", + "sim = QuantizationSimModel(session=BN_folded_sess,\n", + " starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)\n" + ] + }, + { + "cell_type": "markdown", + "id": "b692e06d", + "metadata": {}, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "\n", + "In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe4b6ebb", + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(session: tf.Session, _):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),\n", + " session.graph.get_tensor_by_name('labels:0')]\n", + " \n", + " train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]\n", + " train_tensors_dict = dict.fromkeys(train_tensors, False)\n", + " \n", + " eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]\n", + "\n", + " samples = 500\n", + "\n", + " batch_cntr = 0\n", + " for input_label in data_loader:\n", + " input_label_tensors_dict = dict(zip(input_label_tensors, input_label))\n", + "\n", + " feed_dict = {**input_label_tensors_dict, **train_tensors_dict}\n", + "\n", + " with session.graph.as_default():\n", + " _ = session.run(eval_outputs, feed_dict=feed_dict)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "c58b6107", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ede0ff0", + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "id": "5323ed7a", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cef1c8a2", + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "id": "9cfaa11b", + "metadata": {}, + "source": [ + "---\n", + "## 4. 1 Cross Layer Equalization\n", + "\n", + "The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.\n", + "\n", + "**Note:** Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.\n", + "\n", + "**Note:** CLE equalizes the model in-place" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd2ef6e8", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow import cross_layer_equalization as aimet_cle\n", + "\n", + "cle_applied_sess = aimet_cle.equalize_model(sess,\n", + " start_op_names=start_op_names,\n", + " output_op_names=output_op_names)" + ] + }, + { + "cell_type": "markdown", + "id": "44e9d19e", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7fa0d708", + "metadata": {}, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(session=cle_applied_sess,\n", + " starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)\n", + "\n", + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "id": "c6f8149d", + "metadata": {}, + "source": [ + "---\n", + "## 4. 2 Bias Correction\n", + "\n", + "This section shows how we can apply AIMET Bias Correction on top of the already equalized model from the previous step. Bias correction under the hood uses a reference FP32 model and a QuantizationSimModel to perform its procedure. More details are explained in the AIMET User Guide documentation.\n", + "\n", + "For the correct_bias API, we pass the following parameters\n", + "\n", + "- **num_quant_samples**: Number of samples used for computing encodings. We are setting this to a low number here to speed up execution. A typical number would be 500-1000.\n", + "- **num_bias_correct_samples**: Number of samples used for bias correction. We are setting this to a low number here to speed up execution. A typical number would be 1000-2000.\n", + "- **data_loader**: BC uses unlabeled data samples from this data loader." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5b41ae3", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow import bias_correction as aimet_bc\n", + "\n", + "quant_params = aimet_bc.QuantParams(quant_mode= QuantScheme.post_training_tf_enhanced, round_mode=\"nearest\",\n", + " use_cuda=use_cuda, ops_to_ignore=[])\n", + "bias_correction_params = aimet_bc.BiasCorrectionParams(batch_size=56,\n", + " num_quant_samples=16,\n", + " num_bias_correct_samples=16,\n", + " input_op_names=start_op_names,\n", + " output_op_names=output_op_names)\n", + "\n", + "after_bc_sess = aimet_bc.BiasCorrection.correct_bias(sess, bias_correct_params=bias_correction_params,\n", + " quant_params=quant_params,\n", + " data_set=data_loader.dataset)" + ] + }, + { + "cell_type": "markdown", + "id": "a90309ad", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the bias-corrected model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "442a2402", + "metadata": {}, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(session=BN_folded_sess,\n", + " starting_op_names=['input_1'],\n", + " output_op_names=[model.output.name.split(\":\")[0]],\n", + " quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)\n", + "\n", + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "id": "f048b779", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we should have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. AIMET QuantizationSimModel provides an export API for this purpose. This API would save the model as #TODO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "602e4e56", + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "sim.export(path='./output/', filename_prefix='resnet50_after_qat_range_learning')" + ] + }, + { + "cell_type": "markdown", + "id": "10b9cab9", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE) and Bias Correction (BC).\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.html new file mode 100644 index 0000000..c1acf44 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.html @@ -0,0 +1,1408 @@ + + + + + + Adaptive Rounding (Adaround) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Adaptive Rounding (Adaround)

+

This notebook illustrates the use of AIMET Adaround feature.

+

AIMET quantization features, by default, use the “nearest rounding” technique for achieving quantization. When using the “nearest rounding” technique, the weight value is quantized to the nearest integer value. The Adaptive Rounding (AdaRound) feature, uses a smaller subset of the unlabelled training data to adaptively round the weights. AdaRound, optimizes a loss function using the unlabelled training data to adaptively decide whether to quantize a specific weight to the integer value near it +or away from it. Using the AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply Adaround and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = "/path/to/dataset/dir/"          # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a Keras model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import tensorflow as tf
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset
+from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator
+
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataset() -> tf.data.Dataset:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        :return: A tensorflow dataset
+        """
+        data_loader = ImageNetDataset(DATASET_DIR,
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'])
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(model, iterations=None) -> float:
+        """
+        Given a Keras model, evaluates its Top-1 accuracy on the validation dataset
+        :param model: The Keras model to be evaluated.
+        :param iterations: The number of iterations to run. If None, all the data will be used
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR,
+                                      image_size=image_net_config.dataset["image_size"],
+                                      batch_size=image_net_config.evaluation["batch_size"])
+
+        return evaluator.evaluate(model=model, iterations=iterations)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained resnet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet50 import ResNet50
+
+model = ResNet50(include_top=True,
+                 weights="imagenet",
+                 input_tensor=None,
+                 input_shape=None,
+                 pooling=None,
+                 classes=1000)
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=model, iterations=10)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers of a given model. NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+from aimet_common.defs import QuantScheme
+
+_, model = fold_all_batch_norms(model)
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
from tensorflow.keras.utils import Progbar
+from tensorflow.keras.applications.resnet import preprocess_input
+
+def pass_calibration_data(sim_model, samples):
+    tf_dataset = ImageNetDataPipeline.get_val_dataset()
+    dataset = tf_dataset.dataset
+    batch_size = tf_dataset.batch_size
+
+    progbar = Progbar(samples)
+
+    batch_cntr = 0
+    for inputs, _ in dataset:
+        sim_model(preprocess_input(inputs))
+
+        batch_cntr += 1
+        progbar_stat_update = \
+            batch_cntr * batch_size if (batch_cntr * batch_size) < samples else samples
+        progbar.update(progbar_stat_update)
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=sim.model, iterations=10)
+
+
+
+
+
+
+

4. Apply Adaround

+

We can now apply AdaRound to this model.

+

Some of the parameters for AdaRound are described below

+
    +
  • data_set: AdaRound needs a dataset to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.

  • +
  • num_batches: The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.

  • +
  • default_num_iterations: The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime.

  • +
+
+
[ ]:
+
+
+
import os
+from tensorflow.keras.applications.resnet import preprocess_input
+from tensorflow.keras.preprocessing import image_dataset_from_directory
+from aimet_tensorflow.keras.adaround_weight import Adaround, AdaroundParameters
+
+ada_round_data = image_dataset_from_directory(directory=DATASET_DIR,
+                                              labels="inferred",
+                                              label_mode="categorical",
+                                              batch_size=image_net_config.evaluation["batch_size"],
+                                              shuffle=False,
+                                              image_size=(image_net_config.dataset["image_width"],
+                                                          image_net_config.dataset["image_height"]))
+ada_round_data = ada_round_data.map(lambda x, y: preprocess_input(x))
+
+params = AdaroundParameters(data_set=ada_round_data, num_batches=1, default_num_iterations=32)
+
+os.makedirs("./output/", exist_ok=True)
+ada_model = Adaround.apply_adaround(model, params, path="output", filename_prefix="adaround",
+                                    default_param_bw=8, default_quant_scheme=QuantScheme.post_training_tf)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the model after applying Adaround. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+

Note: There are two important things to understand in the following cell. - Parameter Biwidth Precision: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.

+
    +
  • Freezing the parameter encodings: After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API. While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created. Fo r Quantization Simulation accuracy, it is important to freeze these encodings. If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the +parameters encoding and Quantization Simulation accuracy will not be correct.

  • +
+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=ada_model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+sim.set_and_freeze_param_encodings(encoding_path=os.path.join("output", "adaround.encodings"))
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=sim.model, iterations=10)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after applying adaround. Of course, this was just an example. Please try this against the model of your choice and play with the number of samples to get the best results.

+

Now the next step would be to take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
sim.export(path="./output", filename_prefix="resnet50_after_adaround")
+
+
+
+
+
+
+

Summary

+

This example illustrated how AIMET AdaRound API is invoked to achieve post training quantization. To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline. This will provide you a quick starting point. As indicated above, some parameters in this example have been chosen in such a way way to make this example execute faster.

+

Hope this notebook was useful for you to understand how to use AIMET for performing Adaround.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.ipynb new file mode 100644 index 0000000..d8ba566 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/adaround.ipynb @@ -0,0 +1,481 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Adaptive Rounding (Adaround)\n", + "This notebook illustrates the use of AIMET Adaround feature.\n", + "\n", + "AIMET quantization features, by default, use the \"nearest rounding\" technique for achieving quantization. When using the \"nearest rounding\" technique, the weight value is quantized to the nearest integer value. The Adaptive Rounding (AdaRound) feature, uses a smaller subset of the unlabelled training data to adaptively round the weights. AdaRound, optimizes a loss function using the unlabelled training data to adaptively decide whether to quantize a specific weight to the integer value near it or away from it. Using the AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply Adaround and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "DATASET_DIR = \"/path/to/dataset/dir/\" # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a Keras model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset\n", + "from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataset() -> tf.data.Dataset:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " :return: A tensorflow dataset\n", + " \"\"\"\n", + " data_loader = ImageNetDataset(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'])\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model, iterations=None) -> float:\n", + " \"\"\"\n", + " Given a Keras model, evaluates its Top-1 accuracy on the validation dataset\n", + " :param model: The Keras model to be evaluated.\n", + " :param iterations: The number of iterations to run. If None, all the data will be used\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR,\n", + " image_size=image_net_config.dataset[\"image_size\"],\n", + " batch_size=image_net_config.evaluation[\"batch_size\"])\n", + "\n", + " return evaluator.evaluate(model=model, iterations=iterations)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "For this example notebook, we are going to load a pretrained resnet50 model from Keras. Similarly, you can load any pretrained Keras model instead.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + "\n", + "model = ResNet50(include_top=True,\n", + " weights=\"imagenet\",\n", + " input_tensor=None,\n", + " input_shape=None,\n", + " pooling=None,\n", + " classes=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=model, iterations=10)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers of a given model.
\n", + "**NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms\n", + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "from aimet_common.defs import QuantScheme\n", + "\n", + "_, model = fold_all_batch_norms(model)\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import Progbar\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "\n", + "def pass_calibration_data(sim_model, samples):\n", + " tf_dataset = ImageNetDataPipeline.get_val_dataset()\n", + " dataset = tf_dataset.dataset\n", + " batch_size = tf_dataset.batch_size\n", + "\n", + " progbar = Progbar(samples)\n", + "\n", + " batch_cntr = 0\n", + " for inputs, _ in dataset:\n", + " sim_model(preprocess_input(inputs))\n", + "\n", + " batch_cntr += 1\n", + " progbar_stat_update = \\\n", + " batch_cntr * batch_size if (batch_cntr * batch_size) < samples else samples\n", + " progbar.update(progbar_stat_update)\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=sim.model, iterations=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 4. Apply Adaround\n", + "\n", + "We can now apply AdaRound to this model.\n", + "\n", + "Some of the parameters for AdaRound are described below\n", + "\n", + "- **data_set:** AdaRound needs a dataset to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.\n", + "- **num_batches:** The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.\n", + "- **default_num_iterations:** The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "from tensorflow.keras.preprocessing import image_dataset_from_directory\n", + "from aimet_tensorflow.keras.adaround_weight import Adaround, AdaroundParameters\n", + "\n", + "ada_round_data = image_dataset_from_directory(directory=DATASET_DIR,\n", + " labels=\"inferred\",\n", + " label_mode=\"categorical\",\n", + " batch_size=image_net_config.evaluation[\"batch_size\"],\n", + " shuffle=False,\n", + " image_size=(image_net_config.dataset[\"image_width\"],\n", + " image_net_config.dataset[\"image_height\"]))\n", + "ada_round_data = ada_round_data.map(lambda x, y: preprocess_input(x))\n", + "\n", + "params = AdaroundParameters(data_set=ada_round_data, num_batches=1, default_num_iterations=32)\n", + "\n", + "os.makedirs(\"./output/\", exist_ok=True)\n", + "ada_model = Adaround.apply_adaround(model, params, path=\"output\", filename_prefix=\"adaround\",\n", + " default_param_bw=8, default_quant_scheme=QuantScheme.post_training_tf)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the model after applying Adaround. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.\n", + "\n", + "**Note:** There are two important things to understand in the following cell.\n", + " - **Parameter Biwidth Precision**: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.\n", + "\n", + " - **Freezing the parameter encodings**:\n", + "After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called\n", + "before calling the compute_encodings() API. While applying AdaRound, the parameter values have\n", + "been rounded up or down based on these initial encodings internally created. Fo\n", + "r Quantization Simulation accuracy, it is important to freeze these encodings.\n", + "If the parameters encodings are NOT frozen, the call to compute_encodings() will alter\n", + "the value of the parameters encoding and Quantization Simulation accuracy will not be correct." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=ada_model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8)\n", + "\n", + "sim.set_and_freeze_param_encodings(encoding_path=os.path.join(\"output\", \"adaround.encodings\"))\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=sim.model, iterations=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after applying adaround. Of course, this was just an example. Please try this against the model of your choice and play with the number of samples to get the best results.\n", + "\n", + "Now the next step would be to take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sim.export(path=\"./output\", filename_prefix=\"resnet50_after_adaround\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Summary\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "This example illustrated how AIMET AdaRound API is invoked to achieve post training quantization. To use AIMET AdaRound for your specific needs, replace the model with your model and\n", + "replace the data pipeline with your data pipeline. This will provide you a quick starting point. As indicated above, some parameters in this example have been chosen in such a way way to make this example execute faster.\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing Adaround.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8.0 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "3.8.0" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.html new file mode 100644 index 0000000..1e8e14a --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.html @@ -0,0 +1,1358 @@ + + + + + + AutoQuant — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AutoQuant

+

This notebook shows a working code example of how to use AIMET AutoQuant feature.

+

AIMET offers a suite of neural network post-training quantization techniques. Often, applying these techniques in a specific sequence, results in better accuracy and performance. Without the AutoQuant feature, the AIMET user needs to manually try out various combinations of AIMET quantization features. This manual process is error-prone and often time-consuming.

+

The AutoQuant feature, analyzes the model, determines the sequence of AIMET quantization techniques and applies these techniques. In addition, the user can specify the amount of accuracy drop that can be tolerated, in the AutoQuant API. As soon as this threshold accuracy is reached, AutoQuant stops applying any additional quantization technique. In summary, the AutoQuant feature saves time and automates the quantization of the neural networks.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load a pretrained FP32 model 3. Determine the baseline FP32 accuracy 4. Define constants and helper functions 5. Apply AutoQuant

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art AutoQuant results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#)

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dir/'       # Please replace this with a real directory
+
+
+
+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow as tf
+from aimet_tensorflow.keras.auto_quant import AutoQuant
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import Optional
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset
+from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator
+
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataset(batch_size: Optional[int] = None) -> tf.data.Dataset:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        :return: A tensorflow dataset
+        """
+        if batch_size is None:
+            batch_size = image_net_config.evaluation['batch_size']
+
+        data_loader = ImageNetDataset(DATASET_DIR,
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=batch_size)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(model, iterations=None) -> float:
+        """
+        Given a Keras model, evaluates its Top-1 accuracy on the validation dataset
+        :param model: The Keras model to be evaluated.
+        :param iterations: The number of iterations to run. If None, all the data will be used
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR,
+                                      image_size=image_net_config.dataset["image_size"],
+                                      batch_size=image_net_config.evaluation["batch_size"])
+
+        return evaluator.evaluate(model=model, iterations=iterations)
+
+
+
+
+
+

2. Load a pretrained FP32 model

+

For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet import ResNet50
+
+model = ResNet50(weights='imagenet')
+
+
+
+
+
+

3. Determine the baseline FP32 accuracy

+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=model)
+
+
+
+
+
+

4. Define Constants and Helper functions

+

In this section the constants and helper functions needed to run this example are defined.

+
    +
  • EVAL_DATASET_SIZE A typical value is 5000. To execute this example faster this value has been set to 50

  • +
  • CALIBRATION_DATASET_SIZE A typical value is 2000. To execute this example faster this value has been set to 20

  • +
  • BATCH_SIZE User sets the batch size. As an example, set to 10

  • +
+

The helper function **_create_sampled_data_loader()** returns a DataLoader based on the dataset and the number of samples provided.

+
+
[ ]:
+
+
+
EVAL_DATASET_SIZE = 50
+CALIBRATION_DATASET_SIZE = 20
+BATCH_SIZE = 10
+
+
+
+
+
[ ]:
+
+
+
eval_dataset = ImageNetDataPipeline.get_val_dataset(BATCH_SIZE).dataset
+unlabeled_dataset = eval_dataset.map(lambda images, labels: images)
+
+
+
+
+
+

Prepare the evaluation callback function

+

The eval_callback() function takes the model object to evaluate and compile option dictionary and the number of samples to use as arguments. If the num_samples argument is None, the whole evaluation dataset is used to evaluate the model.

+
+
[ ]:
+
+
+
from typing import Optional
+
+
+def eval_callback(model: tf.keras.Model,
+                  num_samples: Optional[int] = None) -> float:
+    if num_samples is None:
+        num_samples = EVAL_DATASET_SIZE
+
+    sampled_dataset = eval_dataset.take(num_samples)
+
+    # Model should be compiled before evaluation
+    model.compile(optimizer=tf.keras.optimizers.Adam(),
+                  loss=tf.keras.losses.CategoricalCrossentropy(),
+                  metrics=tf.keras.metrics.CategoricalAccuracy())
+    _, acc = model.evaluate(sampled_dataset)
+
+    return acc
+
+
+
+
+
+

5. Apply AutoQuant

+

As a first step, the AutoQuant object is created.

+

The allowed_accuracy_drop parameter is set by the user to convey to the AutoQuant feature, how much accuracy drop is tolerated by the user. AutoQuant applies a series of quantization features. When the allowed accuracy is reached, AutoQuant stops applying any subsequent quantization feature. Please refer AutoQuant User Guide and API documentation for complete details.

+
+
[ ]:
+
+
+
auto_quant = AutoQuant(allowed_accuracy_drop=0.01,
+                       unlabeled_dataset=unlabeled_dataset,
+                       eval_callback=eval_callback)
+
+
+
+
+
+

Optionally set AdaRound Parameters

+

The AutoQuant feature internally uses default parameters to execute the AdaRound step. If and only if necessary, the default AdaRound Parameters should be modified using the API shown below.

+

Note: To execute this example faster, the default value of the num_iterations parameter has been reduced from 10000 to 2000

+
+
[ ]:
+
+
+
from aimet_tensorflow.adaround.adaround_weight import AdaroundParameters
+
+ADAROUND_DATASET_SIZE = 2000
+adaround_dataset = unlabeled_dataset.take(ADAROUND_DATASET_SIZE)
+adaround_params = AdaroundParameters(adaround_dataset,
+                                     num_batches=ADAROUND_DATASET_SIZE // BATCH_SIZE)
+auto_quant.set_adaround_params(adaround_params)
+
+
+
+
+
+

Run AutoQuant

+

This step applies the AutoQuant feature. The best possible quantized model, the associated eval_score and the path to the AdaRound encoding files are returned.

+
+
[ ]:
+
+
+
model, accuracy, encoding_path = auto_quant.apply(model)
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET AutoQuant feature.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and parameters - Refer to the other example notebooks to understand how to use AIMET CLE and AdaRound features in a standalone fashion.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.ipynb new file mode 100644 index 0000000..55981b8 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/autoquant.ipynb @@ -0,0 +1,380 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# AutoQuant\n", + "\n", + "This notebook shows a working code example of how to use AIMET AutoQuant feature.\n", + "\n", + "AIMET offers a suite of neural network post-training quantization techniques. Often, applying these techniques in a specific sequence, results in better accuracy and performance. Without the AutoQuant feature, the AIMET user needs to manually try out various combinations of AIMET quantization features. This manual process is error-prone and often time-consuming.\n", + "\n", + "The AutoQuant feature, analyzes the model, determines the sequence of AIMET quantization techniques and applies these techniques. In addition, the user can specify the amount of accuracy drop that can be tolerated, in the AutoQuant API. As soon as this threshold accuracy is reached, AutoQuant stops applying any additional quantization technique. In summary, the AutoQuant feature saves time and automates the quantization of the neural networks.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load a pretrained FP32 model\n", + "3. Determine the baseline FP32 accuracy\n", + "4. Define constants and helper functions\n", + "5. Apply AutoQuant\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art AutoQuant results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. [https://image-net.org/challenges/LSVRC/2012/index.php#](https://image-net.org/challenges/LSVRC/2012/index.php#))\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow as tf\n", + "from aimet_tensorflow.keras.auto_quant import AutoQuant" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from typing import Optional\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset\n", + "from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataset(batch_size: Optional[int] = None) -> tf.data.Dataset:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " :return: A tensorflow dataset\n", + " \"\"\"\n", + " if batch_size is None:\n", + " batch_size = image_net_config.evaluation['batch_size']\n", + "\n", + " data_loader = ImageNetDataset(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=batch_size)\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model, iterations=None) -> float:\n", + " \"\"\"\n", + " Given a Keras model, evaluates its Top-1 accuracy on the validation dataset\n", + " :param model: The Keras model to be evaluated.\n", + " :param iterations: The number of iterations to run. If None, all the data will be used\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR,\n", + " image_size=image_net_config.dataset[\"image_size\"],\n", + " batch_size=image_net_config.evaluation[\"batch_size\"])\n", + "\n", + " return evaluator.evaluate(model=model, iterations=iterations)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 2. Load a pretrained FP32 model\n", + "\n", + "For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet import ResNet50\n", + "\n", + "model = ResNet50(weights='imagenet')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 3. Determine the baseline FP32 accuracy\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 4. Define Constants and Helper functions\n", + "\n", + "In this section the constants and helper functions needed to run this example are defined.\n", + "\n", + "- **EVAL_DATASET_SIZE** A typical value is 5000. To execute this example faster this value has been set to 50\n", + "- **CALIBRATION_DATASET_SIZE** A typical value is 2000. To execute this example faster this value has been set to 20\n", + "- **BATCH_SIZE** User sets the batch size. As an example, set to 10\n", + "\n", + "\n", + "The helper function **_create_sampled_data_loader()** returns a DataLoader based on the dataset and the number of samples provided." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "EVAL_DATASET_SIZE = 50\n", + "CALIBRATION_DATASET_SIZE = 20\n", + "BATCH_SIZE = 10" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "eval_dataset = ImageNetDataPipeline.get_val_dataset(BATCH_SIZE).dataset\n", + "unlabeled_dataset = eval_dataset.map(lambda images, labels: images)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Prepare the evaluation callback function\n", + "\n", + "The **eval_callback()** function takes the model object to evaluate and compile option dictionary and the number of samples to use as arguments. If the **num_samples** argument is None, the whole evaluation dataset is used to evaluate the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from typing import Optional\n", + "\n", + "\n", + "def eval_callback(model: tf.keras.Model,\n", + " num_samples: Optional[int] = None) -> float:\n", + " if num_samples is None:\n", + " num_samples = EVAL_DATASET_SIZE\n", + "\n", + " sampled_dataset = eval_dataset.take(num_samples)\n", + "\n", + " # Model should be compiled before evaluation\n", + " model.compile(optimizer=tf.keras.optimizers.Adam(),\n", + " loss=tf.keras.losses.CategoricalCrossentropy(),\n", + " metrics=tf.keras.metrics.CategoricalAccuracy())\n", + " _, acc = model.evaluate(sampled_dataset)\n", + "\n", + " return acc" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## 5. Apply AutoQuant\n", + "\n", + "As a first step, the AutoQuant object is created.\n", + "\n", + "The **allowed_accuracy_drop** parameter is set by the user to convey to the AutoQuant feature, how much accuracy drop is tolerated by the user. AutoQuant applies a series of quantization features. When the allowed accuracy is reached, AutoQuant stops applying any subsequent quantization feature. Please refer AutoQuant User Guide and API documentation for complete details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "auto_quant = AutoQuant(allowed_accuracy_drop=0.01,\n", + " unlabeled_dataset=unlabeled_dataset,\n", + " eval_callback=eval_callback)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Optionally set AdaRound Parameters\n", + "The AutoQuant feature internally uses default parameters to execute the AdaRound step.\n", + "If and only if necessary, the default AdaRound Parameters should be modified using the API shown below.\n", + "\n", + "**Note:**\n", + "To execute this example faster, the default value of the **num_iterations** parameter has been reduced from 10000 to 2000" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.adaround.adaround_weight import AdaroundParameters\n", + "\n", + "ADAROUND_DATASET_SIZE = 2000\n", + "adaround_dataset = unlabeled_dataset.take(ADAROUND_DATASET_SIZE)\n", + "adaround_params = AdaroundParameters(adaround_dataset,\n", + " num_batches=ADAROUND_DATASET_SIZE // BATCH_SIZE)\n", + "auto_quant.set_adaround_params(adaround_params)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Run AutoQuant\n", + "\n", + "This step applies the AutoQuant feature. The best possible quantized model, the associated eval_score and the path to the AdaRound encoding files are returned." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model, accuracy, encoding_path = auto_quant.apply(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET AutoQuant feature.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET CLE and AdaRound features in a standalone fashion." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.html new file mode 100644 index 0000000..cc476e5 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.html @@ -0,0 +1,1502 @@ + + + + + + Quantization-Aware Training with BatchNorm Re-estimation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Quantization-Aware Training with BatchNorm Re-estimation

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) with batchnorm re-estimation. Batchnorm re-estimation is a technique for countering potential instability of batchnorm statistics (i.e. running mean and variance) during QAT. More specifically, batchnorm re-estimation recalculates the batchnorm statistics based on the model after QAT. By doing so, we aim to make our model learn batchnorm statistics from stable outputs after QAT, rather +than from likely noisy outputs during QAT.

+
+

Overall flow

+

This notebook covers the following steps: 1. Instantiate the example evaluation and training pipeline 2. Define Constants and Datasets Prepare 3. Create the model in Keras 4. Train and evaluate the model 5. Quantize the model with QuantSim 6. Finetune and evaluate the quantization simulation model 7. Re-estimate batchnorm statistics and compare the eval score before and after re-estimation 8. Fold the re-estimated batchnorm layers and export the quantization simulation model

+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#)

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dir/'       # Please replace this with a real directory
+
+
+
+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow as tf
+
+
+
+
+
+
+

1. Instantiate the example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import Optional
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset
+from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator
+
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataset(batch_size: Optional[int] = None) -> tf.data.Dataset:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        :return: A tensorflow dataset
+        """
+        if batch_size is None:
+            batch_size = image_net_config.evaluation['batch_size']
+
+        data_loader = ImageNetDataset(DATASET_DIR,
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=batch_size)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(model, iterations=None) -> float:
+        """
+        Given a Keras model, evaluates its Top-1 accuracy on the validation dataset
+        :param model: The Keras model to be evaluated.
+        :param iterations: The number of iterations to run. If None, all the data will be used
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR,
+                                      image_size=image_net_config.dataset["image_size"],
+                                      batch_size=image_net_config.evaluation["batch_size"])
+
+        return evaluator.evaluate(model=model, iterations=iterations)
+
+
+
+
+
+

2. Define Constants and Datasets Prepare

+

In this section the constants and helper functions needed to run this example are defined.

+
    +
  • EVAL_DATASET_SIZE To execute this example faster this value has been set to 4

  • +
  • TRAIN_DATASET_SIZE To execute this example faster this value has been set to 4

  • +
  • RE_ESTIMATION_DATASET_SIZE To execute this example faster this value has been set to 4

  • +
  • BATCH_SIZE User sets the batch size. As an example, set to 16

  • +
+
+
[ ]:
+
+
+
EVAL_DATASET_SIZE = 4
+TRAIN_DATASET_SIZE = 4
+RE_ESTIMATION_DATASET_SIZE = 4
+BATCH_SIZE = 16
+
+dataset = ImageNetDataPipeline.get_val_dataset(BATCH_SIZE).dataset
+eval_dataset = dataset.take(EVAL_DATASET_SIZE)
+train_dataset = dataset.take(TRAIN_DATASET_SIZE)
+unlabeled_dataset = dataset.map(lambda images, labels: images)
+re_estimation_dataset = unlabeled_dataset.take(RE_ESTIMATION_DATASET_SIZE)
+
+
+
+
+
+

2. Create the model in Keras

+

Currently, only Keras models built using the Sequential or Functional APIs are compatible with QuantSim - models making use of subclassed layers are incompatible. Therefore, we use the Functional API to create the model used in this example

+
+
[ ]:
+
+
+
tf.keras.backend.clear_session()
+inputs = tf.keras.Input(shape=(224, 224, 3), name="inputs")
+conv = tf.keras.layers.Conv2D(16, (3, 3), name ='conv1')(inputs)
+bn = tf.keras.layers.BatchNormalization(fused=True)(conv)
+relu = tf.keras.layers.ReLU()(bn)
+pool = tf.keras.layers.MaxPooling2D()(relu)
+conv2 = tf.keras.layers.Conv2D(8, (3, 3), name ='conv2')(pool)
+flatten = tf.keras.layers.Flatten()(conv2)
+dense  = tf.keras.layers.Dense(1000)(flatten)
+functional_model = tf.keras.Model(inputs=inputs, outputs=dense)
+
+
+
+
+
+

3. Train and evaluate the model

+

Before we can quantize the model and apply QAT, the FP32 model must be trained so that we can get a baseline accuracy.

+
+
[ ]:
+
+
+
loss_fn = tf.keras.losses.CategoricalCrossentropy()
+
+functional_model.compile(optimizer='adam',
+              loss=loss_fn,
+              metrics=['accuracy'])
+
+functional_model.fit(train_dataset, epochs=5)
+
+# Evaluate the model on the test data using `evaluate`
+print("Evaluate quantized model (post QAT) on test data")
+ImageNetDataPipeline.evaluate(model=functional_model)
+
+
+
+
+
+

4. Create a QuantizationSim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.training_range_learning_with_tf_init” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that +we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
import json
+from aimet_common.defs import QuantScheme
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+
+default_config_per_channel = {
+        "defaults":
+            {
+                "ops":
+                    {
+                        "is_output_quantized": "True"
+                    },
+                "params":
+                    {
+                        "is_quantized": "True",
+                        "is_symmetric": "True"
+                    },
+                "strict_symmetric": "False",
+                "unsigned_symmetric": "True",
+                "per_channel_quantization": "True"
+            },
+
+        "params":
+            {
+                "bias":
+                    {
+                        "is_quantized": "False"
+                    }
+            },
+
+        "op_type":
+            {
+                "Squeeze":
+                    {
+                        "is_output_quantized": "False"
+                    },
+                "Pad":
+                    {
+                        "is_output_quantized": "False"
+                    },
+                "Mean":
+                    {
+                        "is_output_quantized": "False"
+                    }
+            },
+
+        "supergroups":
+            [
+                {
+                    "op_list": ["Conv", "Relu"]
+                },
+                {
+                    "op_list": ["Conv", "Clip"]
+                },
+                {
+                    "op_list": ["Conv", "BatchNormalization", "Relu"]
+                },
+                {
+                    "op_list": ["Add", "Relu"]
+                },
+                {
+                    "op_list": ["Gemm", "Relu"]
+                }
+            ],
+
+        "model_input":
+            {
+                "is_input_quantized": "True"
+            },
+
+        "model_output":
+            {}
+    }
+
+with open("/tmp/default_config_per_channel.json", "w") as f:
+    json.dump(default_config_per_channel, f)
+
+
+qsim = QuantizationSimModel(functional_model, quant_scheme=QuantScheme.training_range_learning_with_tf_init,
+                                config_file="/tmp/default_config_per_channel.json")
+
+
+
+
+
+

Prepare the evaluation callback function

+

The eval_callback() function takes the model object to evaluate and compile option dictionary and the number of samples to use as arguments. If the num_samples argument is None, the whole evaluation dataset is used to evaluate the model.

+
+
[ ]:
+
+
+
from typing import Optional
+
+
+def eval_callback(model: tf.keras.Model,
+                  num_samples: Optional[int] = None) -> float:
+    if num_samples is None:
+        num_samples = EVAL_DATASET_SIZE
+
+    sampled_dataset = eval_dataset.take(num_samples)
+
+    # Model should be compiled before evaluation
+    model.compile(optimizer=tf.keras.optimizers.Adam(),
+                  loss=tf.keras.losses.CategoricalCrossentropy(),
+                  metrics=tf.keras.metrics.CategoricalAccuracy())
+    _, acc = model.evaluate(sampled_dataset)
+
+    return acc
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. - It may be beneficial if the samples used for +computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all positive or negative samples are used.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
qsim.compute_encodings(eval_callback, forward_pass_callback_args=None)
+
+
+
+

Next, we can evaluate the performance of the quantized model

+
+
[ ]:
+
+
+
print("Evaluate quantized model on test data")
+ImageNetDataPipeline.evaluate(model=qsim.model)
+
+
+
+
+
+

5. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so. For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change +these parameters as you see fit.

+
+
[ ]:
+
+
+
quantized_callback = tf.keras.callbacks.TensorBoard(log_dir="./log/quantized")
+history = qsim.model.fit(
+    train_dataset, batch_size=4, epochs=1, validation_data=eval_dataset,
+    callbacks=[quantized_callback]
+)
+
+
+
+

Finally, let’s evaluate the validation accuracy of our model after QAT.

+
+
[ ]:
+
+
+
print("Evaluate quantized model (post QAT) on test data")
+ImageNetDataPipeline.evaluate(model=qsim.model)
+
+
+
+

6. Re-estimate BatchNorm Statistics

+

AIMET provides a helper function, reestimate_bn_stats, for re-estimating batchnorm statistics. Here is the full list of parameters for this function: * model: Model to re-estimate the BatchNorm statistics. * dataloader Train dataloader. * num_batches (optional): The number of batches to be used for reestimation. (Default: 100) * forward_fn (optional): Optional adapter function that performs forward pass given a model and a input batch yielded from the data loader. If not +specified, it is expected that inputs yielded from dataloader can be passed directly to the model.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.bn_reestimation import reestimate_bn_stats
+
+reestimate_bn_stats(qsim.model, re_estimation_dataset, 1)
+
+
+
+
+

Fold BatchNorm Layers

+

So far, we have improved our quantization simulation model through QAT and batchnorm re-estimation. The next step would be to actually take this model to target. But first, we should fold the batchnorm layers for our model to run on target devices more efficiently.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms_to_scale
+fold_all_batch_norms_to_scale(qsim)
+
+
+
+
+
+
+
+

5. Export Model

+

As the final step, we will export the model to run it on actual target devices. AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
import os
+os.makedirs('./output/', exist_ok=True)
+qsim.export(path='./output/', filename_prefix='mnist_after_bn_re_estimation_qat_range_learning')
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use batchnorm re-estimation feature of AIMET.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters. - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT methods.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.ipynb new file mode 100644 index 0000000..100d10a --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/bn_reestimation.ipynb @@ -0,0 +1,624 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Quantization-Aware Training with BatchNorm Re-estimation\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) with batchnorm re-estimation.\n", + "Batchnorm re-estimation is a technique for countering potential instability of batchnorm statistics (i.e. running\n", + "mean and variance) during QAT. More specifically, batchnorm re-estimation recalculates the batchnorm statistics based on the model after QAT. By doing so, we aim to make our model learn batchnorm statistics from stable outputs after QAT, rather than from likely noisy outputs during QAT.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following steps:\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Define Constants and Datasets Prepare\n", + "3. Create the model in Keras\n", + "4. Train and evaluate the model\n", + "5. Quantize the model with QuantSim\n", + "6. Finetune and evaluate the quantization simulation model\n", + "7. Re-estimate batchnorm statistics and compare the eval score before and after re-estimation\n", + "8. Fold the re-estimated batchnorm layers and export the quantization simulation model\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. [https://image-net.org/challenges/LSVRC/2012/index.php#](https://image-net.org/challenges/LSVRC/2012/index.php#))\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Instantiate the example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from typing import Optional\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset\n", + "from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataset(batch_size: Optional[int] = None) -> tf.data.Dataset:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " :return: A tensorflow dataset\n", + " \"\"\"\n", + " if batch_size is None:\n", + " batch_size = image_net_config.evaluation['batch_size']\n", + "\n", + " data_loader = ImageNetDataset(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=batch_size)\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model, iterations=None) -> float:\n", + " \"\"\"\n", + " Given a Keras model, evaluates its Top-1 accuracy on the validation dataset\n", + " :param model: The Keras model to be evaluated.\n", + " :param iterations: The number of iterations to run. If None, all the data will be used\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR,\n", + " image_size=image_net_config.dataset[\"image_size\"],\n", + " batch_size=image_net_config.evaluation[\"batch_size\"])\n", + "\n", + " return evaluator.evaluate(model=model, iterations=iterations)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 2. Define Constants and Datasets Prepare\n", + "\n", + "In this section the constants and helper functions needed to run this example are defined.\n", + "\n", + "- **EVAL_DATASET_SIZE** To execute this example faster this value has been set to 4\n", + "- **TRAIN_DATASET_SIZE** To execute this example faster this value has been set to 4\n", + "- **RE_ESTIMATION_DATASET_SIZE** To execute this example faster this value has been set to 4\n", + "- **BATCH_SIZE** User sets the batch size. As an example, set to 16\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "EVAL_DATASET_SIZE = 4\n", + "TRAIN_DATASET_SIZE = 4\n", + "RE_ESTIMATION_DATASET_SIZE = 4\n", + "BATCH_SIZE = 16\n", + "\n", + "dataset = ImageNetDataPipeline.get_val_dataset(BATCH_SIZE).dataset\n", + "eval_dataset = dataset.take(EVAL_DATASET_SIZE)\n", + "train_dataset = dataset.take(TRAIN_DATASET_SIZE)\n", + "unlabeled_dataset = dataset.map(lambda images, labels: images)\n", + "re_estimation_dataset = unlabeled_dataset.take(RE_ESTIMATION_DATASET_SIZE)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 2. Create the model in Keras\n", + "\n", + "Currently, only Keras models built using the Sequential or Functional APIs are compatible with QuantSim - models making use of subclassed layers are incompatible. Therefore, we use the Functional API to create the model used in this example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "tf.keras.backend.clear_session()\n", + "inputs = tf.keras.Input(shape=(224, 224, 3), name=\"inputs\")\n", + "conv = tf.keras.layers.Conv2D(16, (3, 3), name ='conv1')(inputs)\n", + "bn = tf.keras.layers.BatchNormalization(fused=True)(conv)\n", + "relu = tf.keras.layers.ReLU()(bn)\n", + "pool = tf.keras.layers.MaxPooling2D()(relu)\n", + "conv2 = tf.keras.layers.Conv2D(8, (3, 3), name ='conv2')(pool)\n", + "flatten = tf.keras.layers.Flatten()(conv2)\n", + "dense = tf.keras.layers.Dense(1000)(flatten)\n", + "functional_model = tf.keras.Model(inputs=inputs, outputs=dense)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 3. Train and evaluate the model\n", + "\n", + "Before we can quantize the model and apply QAT, the FP32 model must be trained so that we can get a baseline accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "loss_fn = tf.keras.losses.CategoricalCrossentropy()\n", + "\n", + "functional_model.compile(optimizer='adam',\n", + " loss=loss_fn,\n", + " metrics=['accuracy'])\n", + "\n", + "functional_model.fit(train_dataset, epochs=5)\n", + "\n", + "# Evaluate the model on the test data using `evaluate`\n", + "print(\"Evaluate quantized model (post QAT) on test data\")\n", + "ImageNetDataPipeline.evaluate(model=functional_model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 4. Create a QuantizationSim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.training_range_learning_with_tf_init\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import json\n", + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "\n", + "default_config_per_channel = {\n", + " \"defaults\":\n", + " {\n", + " \"ops\":\n", + " {\n", + " \"is_output_quantized\": \"True\"\n", + " },\n", + " \"params\":\n", + " {\n", + " \"is_quantized\": \"True\",\n", + " \"is_symmetric\": \"True\"\n", + " },\n", + " \"strict_symmetric\": \"False\",\n", + " \"unsigned_symmetric\": \"True\",\n", + " \"per_channel_quantization\": \"True\"\n", + " },\n", + "\n", + " \"params\":\n", + " {\n", + " \"bias\":\n", + " {\n", + " \"is_quantized\": \"False\"\n", + " }\n", + " },\n", + "\n", + " \"op_type\":\n", + " {\n", + " \"Squeeze\":\n", + " {\n", + " \"is_output_quantized\": \"False\"\n", + " },\n", + " \"Pad\":\n", + " {\n", + " \"is_output_quantized\": \"False\"\n", + " },\n", + " \"Mean\":\n", + " {\n", + " \"is_output_quantized\": \"False\"\n", + " }\n", + " },\n", + "\n", + " \"supergroups\":\n", + " [\n", + " {\n", + " \"op_list\": [\"Conv\", \"Relu\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Conv\", \"Clip\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Conv\", \"BatchNormalization\", \"Relu\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Add\", \"Relu\"]\n", + " },\n", + " {\n", + " \"op_list\": [\"Gemm\", \"Relu\"]\n", + " }\n", + " ],\n", + "\n", + " \"model_input\":\n", + " {\n", + " \"is_input_quantized\": \"True\"\n", + " },\n", + "\n", + " \"model_output\":\n", + " {}\n", + " }\n", + "\n", + "with open(\"/tmp/default_config_per_channel.json\", \"w\") as f:\n", + " json.dump(default_config_per_channel, f)\n", + "\n", + "\n", + "qsim = QuantizationSimModel(functional_model, quant_scheme=QuantScheme.training_range_learning_with_tf_init,\n", + " config_file=\"/tmp/default_config_per_channel.json\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Prepare the evaluation callback function\n", + "\n", + "The **eval_callback()** function takes the model object to evaluate and compile option dictionary and the number of samples to use as arguments. If the **num_samples** argument is None, the whole evaluation dataset is used to evaluate the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from typing import Optional\n", + "\n", + "\n", + "def eval_callback(model: tf.keras.Model,\n", + " num_samples: Optional[int] = None) -> float:\n", + " if num_samples is None:\n", + " num_samples = EVAL_DATASET_SIZE\n", + "\n", + " sampled_dataset = eval_dataset.take(num_samples)\n", + "\n", + " # Model should be compiled before evaluation\n", + " model.compile(optimizer=tf.keras.optimizers.Adam(),\n", + " loss=tf.keras.losses.CategoricalCrossentropy(),\n", + " metrics=tf.keras.metrics.CategoricalAccuracy())\n", + " _, acc = model.evaluate(sampled_dataset)\n", + "\n", + " return acc" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "**Compute Encodings**\n", + "\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all positive or negative samples are used.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "qsim.compute_encodings(eval_callback, forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Next, we can evaluate the performance of the quantized model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "print(\"Evaluate quantized model on test data\")\n", + "ImageNetDataPipeline.evaluate(model=qsim.model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 5. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "quantized_callback = tf.keras.callbacks.TensorBoard(log_dir=\"./log/quantized\")\n", + "history = qsim.model.fit(\n", + " train_dataset, batch_size=4, epochs=1, validation_data=eval_dataset,\n", + " callbacks=[quantized_callback]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, let's evaluate the validation accuracy of our model after QAT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "print(\"Evaluate quantized model (post QAT) on test data\")\n", + "ImageNetDataPipeline.evaluate(model=qsim.model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***6. Re-estimate BatchNorm Statistics***\n", + "\n", + "AIMET provides a helper function, `reestimate_bn_stats`, for re-estimating batchnorm statistics.\n", + "Here is the full list of parameters for this function:\n", + "* **model**: Model to re-estimate the BatchNorm statistics.\n", + "* **dataloader** Train dataloader.\n", + "* **num_batches** (optional): The number of batches to be used for reestimation. (Default: 100)\n", + "* **forward_fn** (optional): Optional adapter function that performs forward pass given a model and a input batch yielded from the data loader. If not specified, it is expected that inputs yielded from dataloader can be passed directly to the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.bn_reestimation import reestimate_bn_stats\n", + "\n", + "reestimate_bn_stats(qsim.model, re_estimation_dataset, 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fold BatchNorm Layers\n", + "\n", + "So far, we have improved our quantization simulation model through QAT and batchnorm re-estimation. The next step would be to actually take this model to target. But first, we should fold the batchnorm layers for our model to run on target devices more efficiently." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms_to_scale\n", + "fold_all_batch_norms_to_scale(qsim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Export Model\n", + "As the final step, we will export the model to run it on actual target devices. AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.makedirs('./output/', exist_ok=True)\n", + "qsim.export(path='./output/', filename_prefix='mnist_after_bn_re_estimation_qat_range_learning')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use batchnorm re-estimation feature of AIMET.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters.\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/tensorflow/quantization/keras) to understand how to use AIMET post-training quantization techniques and QAT methods." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.html new file mode 100644 index 0000000..8dfe1c9 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.html @@ -0,0 +1,1325 @@ + + + + + + Quantization-Aware Training with a Keras Transformer Model — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Quantization-Aware Training with a Keras Transformer Model

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) for transformer models built in Keras. QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.

+
+

Overall flow

+

This notebook covers the following 1. Load the dataset 2. Create the model in Keras 3. Train and evaluate the model 4. Quantize the model with QuantSim 5. Fine-tune the quantized model accuracy with QAT

+

1. Load the dataset

+

This notebook relies on the IMDB dataset for sentiment analysis, as provided by Keras.

+
+
[ ]:
+
+
+
from tensorflow import keras
+
+vocab_size = 20000  # Only consider the top 20k words
+maxlen = 200  # Only consider the first 200 words of each movie review
+
+(x_train, y_train), (x_val, y_val) = keras.datasets.imdb.load_data(num_words=vocab_size)
+print(len(x_train), "Training sequences")
+print(len(x_val), "Validation sequences")
+
+x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
+x_val = keras.preprocessing.sequence.pad_sequences(x_val, maxlen=maxlen)
+
+
+
+

Currently, only Keras models built using the Sequential or Functional APIs are compatible with QuantSim - models making use of subclassed layers are incompatible. Therefore, we use the Functional API to create the model used in this example.

+
+
[ ]:
+
+
+
import tensorflow as tf
+from tensorflow.keras import layers
+
+embed_dim = 32  # Embedding size for each token
+num_heads = 2  # Number of attention heads
+ff_dim = 32  # Hidden layer size in feed forward network inside transformer
+
+############## FUNCTIONAL MODEL ##############
+inputs = layers.Input(shape=(maxlen,))
+
+# Embedding Layer
+positions = tf.range(start=0, limit=maxlen, delta=1)
+positions = layers.Embedding(input_dim=maxlen, output_dim=embed_dim)(positions)
+x = layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)(inputs)
+x = x + positions
+
+# Transformer Block
+x = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)(x, x)
+x = layers.Dropout(0.1)(x)
+x = layers.LayerNormalization(epsilon=1e-6)(x)
+x = layers.Dense(ff_dim, activation="relu")(x)
+x = layers.Dense(embed_dim)(x)
+x = layers.Dropout(0.1)(x)
+x = layers.LayerNormalization(epsilon=1e-6)(x)
+
+# Output layers
+x = layers.GlobalAveragePooling1D()(x)
+x = layers.Dropout(0.1)(x)
+x = layers.Dense(20, activation="relu")(x)
+x = layers.Dropout(0.1)(x)
+outputs = layers.Dense(2, activation="softmax")(x)
+################################################
+
+functional_model = keras.Model(inputs=inputs, outputs=outputs)
+
+
+
+
+

3. Train and evaluate the model to get a baseline accuracy

+

Before we can quantize the model and apply QAT, the FP32 model must be trained so that we can get a baseline accuracy.

+
+
[ ]:
+
+
+
functional_callback = tf.keras.callbacks.TensorBoard(log_dir="./log/functional", histogram_freq=1)
+functional_model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
+history = functional_model.fit(
+    x_train, y_train, batch_size=32, epochs=1, validation_data=(x_val, y_val), callbacks=[functional_callback]
+)
+
+
+
+
+
[ ]:
+
+
+
# Evaluate the model on the test data using `evaluate`
+print("Evaluate model on test data")
+results = functional_model.evaluate(x_val, y_val, batch_size=128)
+print("test loss, test acc:", results)
+
+
+
+
+

4. Create a QuantizationSim Model and determine quantized accuracy

+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+
+model = QuantizationSimModel(model=functional_model,
+                             quant_scheme=QuantScheme.post_training_tf_enhanced,
+                             rounding_mode='nearest',
+                             default_output_bw=8,
+                             default_param_bw=8)
+
+
+
+

QuantSim works by wrapping each layer in the model with a Quantization Wrapper that simulates the effects of quantization on the inputs, outputs, and parameters of the layer (visualized below). A regular Conv2D Keras layer is displayed on the right, while a Conv2D layer after a quantization wrapper has been applied is displayed on the left. A regular Conv2d layer    A Conv2D layer after a quantization wrapper has been applied

+

If a multi-head attention layer is encountered in the model, the original layer is replaced with a custom quantizable version that gives the QuantizationSimModel access to the inputs and outputs of internal ops within the layer, so that quantization wrappers can be applied at a more granular level than the entire MHA layer. This is necessary in order to accurately simulate the effects of on-target quantization.

+

This works by making use of Keras’s built-in clone_layer function, which allows us to clone and modify the FP32 model layer by layer. A more detailed call flow diagram is displayed below. Keras QuantSim call flow

+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. - It may be beneficial if the samples used for +computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all positive or negative samples are used.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
model.compute_encodings(lambda m, _: m(x_val[0:1000]), None)
+model.export('./data', 'model', convert_to_pb=False) # Once the encodings have been computed, export them for later inspection
+
+
+
+

Next, we can evaluate the performance of the quantized model

+
+
[ ]:
+
+
+
model.model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) # must compile model before evaluating
+
+print("Evaluate quantized model on test data")
+results = model.model.evaluate(x_val, y_val, batch_size=128)
+print("test loss, test acc:", results)
+
+
+
+
+

5. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so. For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change +these parameters as you see fit.

+
+
[ ]:
+
+
+
quantized_callback = tf.keras.callbacks.TensorBoard(log_dir="./log/quantized")
+history = model.model.fit(
+    x_train[0:1024], y_train[0:1024], batch_size=32, epochs=1, validation_data=(x_val, y_val), callbacks=[quantized_callback]
+)
+
+
+
+

Now, let’s compute and export the encodings of the model after performing QAT. When comparing the encodings file generated by this step and the encodings generated before quantization, there should be some differences. These differences are an artifact of QAT.

+
+
[ ]:
+
+
+
model.compute_encodings(lambda m, _: m(x_val[0:3000]), None)
+model.export('./data', 'model_after_qat', convert_to_pb=False)
+
+
+
+

Finally, let’s evaluate the validation accuracy of our model after QAT

+
+
[ ]:
+
+
+
print("Evaluate quantized model (post QAT) on test data")
+results = model.model.evaluate(x_val, y_val, batch_size=128)
+print("test loss, test acc:", results)
+
+
+
+

We can also use tensorboard to visualize the FP32 and quantized models to see how they are different from one another. Comparing the two, we can see that most layers are now replaced with a quantization wrapped simulating the effects of quantization at the input and output nodes of the layer. In the case of more complex layers, like multi-head attention, QuantSim has custom pipelines to insert quantization wrappers around more elementary ops within the layer.

+
+
[ ]:
+
+
+
%tensorboard --logdir logs
+from tensorboard import notebook
+
+notebook.display(height=1000)
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET with Keras models. Few additional resources Refer to the AIMET API docs to know more details of the APIs and optional parameters Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and the vanilla QAT method (without range-learning)

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.ipynb new file mode 100644 index 0000000..3e6e36c --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/keras_transformer_qat.ipynb @@ -0,0 +1,461 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "# Quantization-Aware Training with a Keras Transformer Model\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) for transformer models built in Keras. QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Load the dataset\n", + "2. Create the model in Keras\n", + "3. Train and evaluate the model\n", + "4. Quantize the model with QuantSim\n", + "5. Fine-tune the quantized model accuracy with QAT\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "***1. Load the dataset***\n", + "\n", + "This notebook relies on the IMDB dataset for sentiment analysis, as provided by Keras." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "from tensorflow import keras\n", + "\n", + "vocab_size = 20000 # Only consider the top 20k words\n", + "maxlen = 200 # Only consider the first 200 words of each movie review\n", + "\n", + "(x_train, y_train), (x_val, y_val) = keras.datasets.imdb.load_data(num_words=vocab_size)\n", + "print(len(x_train), \"Training sequences\")\n", + "print(len(x_val), \"Validation sequences\")\n", + "\n", + "x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)\n", + "x_val = keras.preprocessing.sequence.pad_sequences(x_val, maxlen=maxlen)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "Currently, only Keras models built using the Sequential or Functional APIs are compatible with QuantSim - models making use of subclassed layers are incompatible. Therefore, we use the Functional API to create the model used in this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from tensorflow.keras import layers\n", + "\n", + "embed_dim = 32 # Embedding size for each token\n", + "num_heads = 2 # Number of attention heads\n", + "ff_dim = 32 # Hidden layer size in feed forward network inside transformer\n", + "\n", + "############## FUNCTIONAL MODEL ##############\n", + "inputs = layers.Input(shape=(maxlen,))\n", + "\n", + "# Embedding Layer\n", + "positions = tf.range(start=0, limit=maxlen, delta=1)\n", + "positions = layers.Embedding(input_dim=maxlen, output_dim=embed_dim)(positions)\n", + "x = layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)(inputs)\n", + "x = x + positions\n", + "\n", + "# Transformer Block\n", + "x = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)(x, x)\n", + "x = layers.Dropout(0.1)(x)\n", + "x = layers.LayerNormalization(epsilon=1e-6)(x)\n", + "x = layers.Dense(ff_dim, activation=\"relu\")(x)\n", + "x = layers.Dense(embed_dim)(x)\n", + "x = layers.Dropout(0.1)(x)\n", + "x = layers.LayerNormalization(epsilon=1e-6)(x)\n", + "\n", + "# Output layers\n", + "x = layers.GlobalAveragePooling1D()(x)\n", + "x = layers.Dropout(0.1)(x)\n", + "x = layers.Dense(20, activation=\"relu\")(x)\n", + "x = layers.Dropout(0.1)(x)\n", + "outputs = layers.Dense(2, activation=\"softmax\")(x)\n", + "################################################\n", + "\n", + "functional_model = keras.Model(inputs=inputs, outputs=outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "***3. Train and evaluate the model to get a baseline accuracy***\n", + "\n", + "Before we can quantize the model and apply QAT, the FP32 model must be trained so that we can get a baseline accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "functional_callback = tf.keras.callbacks.TensorBoard(log_dir=\"./log/functional\", histogram_freq=1)\n", + "functional_model.compile(optimizer=\"adam\", loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"])\n", + "history = functional_model.fit(\n", + " x_train, y_train, batch_size=32, epochs=1, validation_data=(x_val, y_val), callbacks=[functional_callback]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "# Evaluate the model on the test data using `evaluate`\n", + "print(\"Evaluate model on test data\")\n", + "results = functional_model.evaluate(x_val, y_val, batch_size=128)\n", + "print(\"test loss, test acc:\", results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "***4. Create a QuantizationSim Model and determine quantized accuracy***\n", + "\n", + "**Create Quantization Sim Model**\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "\n", + "model = QuantizationSimModel(model=functional_model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " rounding_mode='nearest',\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "QuantSim works by wrapping each layer in the model with a Quantization Wrapper that simulates the effects of quantization on the inputs, outputs, and parameters of the layer (visualized below). A regular Conv2D Keras layer is displayed on the right, while a Conv2D layer after a quantization wrapper has been applied is displayed on the left.\n", + "![A regular Conv2d layer](../images/keras_pre_quant_layer.png)    ![A Conv2D layer after a quantization wrapper has been applied](../images/keras_post_quant_layer.png)\n", + "\n", + "If a multi-head attention layer is encountered in the model, the original layer is replaced with a custom quantizable version that gives the QuantizationSimModel access to the inputs and outputs of internal ops within the layer, so that quantization wrappers can be applied at a more granular level than the entire MHA layer. This is necessary in order to accurately simulate the effects of on-target quantization.\n", + "\n", + "This works by making use of Keras's built-in `clone_layer` function, which allows us to clone and modify the FP32 model layer by layer. A more detailed call flow diagram is displayed below.\n", + "![Keras QuantSim call flow](../images/keras_quantsim_callflow.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "**Compute Encodings**\n", + "\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all positive or negative samples are used.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "model.compute_encodings(lambda m, _: m(x_val[0:1000]), None)\n", + "model.export('./data', 'model', convert_to_pb=False) # Once the encodings have been computed, export them for later inspection" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "Next, we can evaluate the performance of the quantized model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "model.model.compile(optimizer=\"adam\", loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"]) # must compile model before evaluating\n", + "\n", + "print(\"Evaluate quantized model on test data\")\n", + "results = model.model.evaluate(x_val, y_val, batch_size=128)\n", + "print(\"test loss, test acc:\", results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "***5. Perform QAT***\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "quantized_callback = tf.keras.callbacks.TensorBoard(log_dir=\"./log/quantized\")\n", + "history = model.model.fit(\n", + " x_train[0:1024], y_train[0:1024], batch_size=32, epochs=1, validation_data=(x_val, y_val), callbacks=[quantized_callback]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "Now, let's compute and export the encodings of the model after performing QAT. When comparing the encodings file generated by this step and the encodings generated before quantization, there should be some differences. These differences are an artifact of QAT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "model.compute_encodings(lambda m, _: m(x_val[0:3000]), None)\n", + "model.export('./data', 'model_after_qat', convert_to_pb=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "Finally, let's evaluate the validation accuracy of our model after QAT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "print(\"Evaluate quantized model (post QAT) on test data\")\n", + "results = model.model.evaluate(x_val, y_val, batch_size=128)\n", + "print(\"test loss, test acc:\", results)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "We can also use tensorboard to visualize the FP32 and quantized models to see how they are different from one another. Comparing the two, we can see that most layers are now replaced with a quantization wrapped simulating the effects of quantization at the input and output nodes of the layer. In the case of more complex layers, like multi-head attention, QuantSim has custom pipelines to insert quantization wrappers around more elementary ops within the layer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "%tensorboard --logdir logs\n", + "from tensorboard import notebook\n", + "\n", + "notebook.display(height=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "---\n", + "***Summary***\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET with Keras models.\n", + "Few additional resources\n", + "Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and the vanilla QAT method (without range-learning)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.html new file mode 100644 index 0000000..3316c55 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.html @@ -0,0 +1,1347 @@ + + + + + + Keras Model Preparer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Keras Model Preparer

+

This notebook shows how to prepare a Keras model for quantization. Specifically, this preparer converts a Keras model with subclass layers into a Keras model with functional layers. This is required for quantization because the AIMET quantization tooling only supports the Functional and Sequantial Keras model building API’s.

+

To learn more about the Keras Model Preparer, please refer to the API Docs in AIMET.

+
+

Overall flow

+

This notebook covers the following 1. Creating a Keras model with subclass layers 2. Converting the Keras model with subclass layers to a Keras model with functional layers 3. Showing similarities and differences between the original and converted models 4. Dicussing the limitations of the Keras Model Preparer

+
+
+

1. Creating a Keras model with subclass layers

+

First, we will create a Keras model with subclass layers. For this notebook example, we will use a model defined by Keras that utilizes subclass layers. This model is a text classification transformer model and can be found here. The subclass layers used in this model are - TokenAndPositionEmbedding and TransformerBlock. They are defined below.

+
+
[ ]:
+
+
+
import tensorflow as tf
+
+class TransformerBlock(tf.keras.layers.Layer):
+    def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1):
+        super(TransformerBlock, self).__init__()
+        self.att = tf.keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)
+        self.ffn = tf.keras.Sequential(
+            [tf.keras.layers.Dense(ff_dim, activation="relu"), tf.keras.layers.Dense(embed_dim),]
+        )
+        self.layernorm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6)
+        self.layernorm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6)
+        self.dropout1 = tf.keras.layers.Dropout(rate)
+        self.dropout2 = tf.keras.layers.Dropout(rate)
+
+    def call(self, inputs, training, **kwargs):
+        attn_output = self.att(inputs, inputs)
+        attn_output = self.dropout1(attn_output, training=training)
+        out1 = self.layernorm1(inputs + attn_output)
+        ffn_output = self.ffn(out1)
+        ffn_output = self.dropout2(ffn_output, training=training)
+        return self.layernorm2(out1 + ffn_output)
+
+
+
+class TokenAndPositionEmbedding(tf.keras.layers.Layer):
+    def __init__(self, maxlen, vocab_size, embed_dim):
+        super(TokenAndPositionEmbedding, self).__init__()
+        self.token_emb = tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)
+        self.pos_emb = tf.keras.layers.Embedding(input_dim=maxlen, output_dim=embed_dim)
+
+    def call(self, x, **kwargs):
+        maxlen = tf.shape(x)[-1]
+        positions = tf.range(start=0, limit=maxlen, delta=1)
+        positions = self.pos_emb(positions)
+        x = self.token_emb(x)
+        x = x + positions
+        return x
+
+
+
+

With those subclass layers defined, we can now define the model. Since we are not training the model, we will use random weights and a random input tensor to build the model.

+
+
[ ]:
+
+
+
import numpy as np
+vocab_size = 20000
+maxlen = 200
+
+random_input = np.random.random((10, 200)) # Random input to build the model
+
+embed_dim = 32  # Embedding size for each token
+num_heads = 2  # Number of attention heads
+ff_dim = 32  # Hidden layer size in feed forward network inside transformer
+
+inputs = tf.keras.layers.Input(shape=(maxlen,))
+embedding_layer = TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim)
+x = embedding_layer(inputs)
+transformer_block = TransformerBlock(embed_dim, num_heads, ff_dim)
+x = transformer_block(x)
+x = tf.keras.layers.GlobalAveragePooling1D()(x)
+x = tf.keras.layers.Dropout(0.1)(x)
+x = tf.keras.layers.Dense(20, activation="relu")(x)
+x = tf.keras.layers.Dropout(0.1)(x)
+outputs = tf.keras.layers.Dense(2, activation="softmax")(x)
+
+model = tf.keras.Model(inputs=inputs, outputs=outputs)
+_ = model(random_input)
+model.summary()
+
+
+
+

From the model.summary() output, we can see the models 2 subclass layers - token_and_position_embedding, transformer_block. Since these layers are using layer inside they’re classes, we need to extract them to create a symmetrical functional model.

+
+
+
+

2. Converting the Keras model with subclass layers to a Keras model with functional layers

+

The Keras Model Preparer can be used to convert a Keras model with subclass layers to a Keras model with functional layers. The Keras Model Preparer can be imported from aimet_tensorflow.keras.model_preparer. The Keras Model Preparer takes in a Keras model with subclass layers and returns a Keras model with functional layers. Note that the prepare_model function takes an optional input_layer parameter. This parameter is required if the model begins with a subclass layer. In this +case, the model does not begin with a subclass layer, so we do not need to provide an input_shape parameter.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.model_preparer import prepare_model
+
+functional_model = prepare_model(model)
+functional_model.summary()
+
+
+
+

We can see that the Keras Model Preparer has converted the model with subclass layers to a model with functional layers. Specifically, it has extracted the call function of each of these layers and created a functional layer from it.

+
+
+
+

3. Showing similarities and differences between the original and converted models

+

We can see that the original model and the converted model are symmetrical. The only difference is that the subclass layers are unwrapped. This means that the converted model is functionally identical to the original model. We can test this in a few ways.

+
    +
  1. We can compare the total number of parameters in the original and converted models. We can see that the total number of parameters is the same.

  2. +
  3. We can compare the weights of the original and converted models. We can see that the weights are the same.

    +
      +
    • Note that the order of the weights presented when calling get_weights() on each of these models are not the same and as is the names of the weights. We can use an internal function to get the original models weights in the same order as the converted models weights.

    • +
    +
  4. +
  5. We can compare the outputs of the original and converted models. We can see that the outputs are the same.

  6. +
+
+
[ ]:
+
+
+
from typing import Set, List
+
+# This function is a functional representation of the reordering done inside the model preparer for Keras.
+def get_original_models_weights_in_functional_model_order(
+    original_model: tf.keras.Model,
+    functional_model: tf.keras.Model,
+    class_names: Set[str]
+) -> List[np.ndarray]:
+    """Map the original model's weights to the functional model's weights.
+
+    Args:
+        original_model:
+            Original model to reference the weight order.
+        functional_model:
+            Prepared model to updates weight of.
+        class_names:
+            Names of the classes that the original model was subclassed from
+
+    Returns:
+        A list of the original model's weights in the order of the functional model's weights
+    """
+
+    # Make the original model's weights into a dictionary for quick lookup by name
+    # The original subclassed layers names are removed to match the new functional model's names
+    original_model_weights = {}
+    for weight in original_model.weights:
+        # pop out class_names of weight name
+        weight_name = weight.name
+        for class_name in class_names:
+            weight_name = weight_name.replace(class_name + '/', '')
+        original_model_weights[weight_name] = weight.numpy()
+
+    # Get the functional model's weights in order as a dictionary for quick lookup where the key is the weight name
+    # and the position of the weight's order is the value
+    functional_model_weight_order = {
+        weight.name: position
+        for position, weight in enumerate(functional_model.weights)
+    }
+
+    # Using the functional model's weights order, get the original model's weights in the same order. The lambda here
+    # uses the weight's name to get position in the functional model's weights order and the sorts the original model's
+    # weights by that position.
+    weights_in_correct_order = [
+        weight for _, weight in
+        sorted(original_model_weights.items(), key=lambda weight_info: functional_model_weight_order[weight_info[0]])
+    ]
+
+    return weights_in_correct_order
+
+
+
+
+
[ ]:
+
+
+
assert functional_model.count_params() == model.count_params()
+assert functional_model.input_shape == model.input_shape
+assert functional_model.output_shape == model.output_shape
+
+# NOTE: Since TextClassification Model has the internal layers out of order compared to the call method,
+# the weights are not in the order of what the actual architecture is (this is a Keras design).
+# Therefore, we get the original model's weights and sort them in the order of the actual
+# architecture and use those weights to compare to the functional model's weights.
+model_weights_in_correct_order = get_original_models_weights_in_functional_model_order(
+    model, functional_model, class_names=["token_and_position_embedding", "transformer_block"])
+
+for i, _ in enumerate(model_weights_in_correct_order):
+        np.testing.assert_array_equal(model_weights_in_correct_order[i], functional_model.get_weights()[i])
+
+np.testing.assert_array_equal(functional_model(random_input).numpy(), model(random_input).numpy())
+print("Models are equal")
+
+
+
+
+
+

4. Discussing the limitations of the Keras Model Preparer

+
    +
  • The AIMET Keras ModelPreparer API is able to convert subclass layers that have arthmetic experssion in their call function. However, this API and Keras, will convert these operations to TFOPLambda layers which are not currently supported by AIMET Keras Quantization API. If possible, it is recommended to have the subclass layers call function ressemble the Keras Functional API layers. For example, if a subclass layer has two convolution layers in its call function, the call function should +look like the following:

    +
    def call(self, x, **kwargs):
    +    x = self.conv_1(x)
    +    x = self.conv_2(x)
    +    return x
    +
    +
    +
  • +
  • If the model starts with a subclassed layer, the AIMET Keras ModelPreparer API will need an Keras Input Layer as input. This is becuase the Keras Functional API requires an Input Layer as the first layer in the model. The AIMET Keras ModelPreparer API will raise an exception if the model starts with a subclassed layer and an Input Layer is not provided as input.

  • +
+
+
+
+

Summary

+

Hopefully this notebook was useful for you to understand how to use the Keras Model Preparer.

+

Few additional resources: - AIMET API Docs

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.ipynb new file mode 100644 index 0000000..43ee42d --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/model_preparer.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Keras Model Preparer\n", + "\n", + "This notebook shows how to prepare a Keras model for quantization. Specifically, this preparer converts a Keras model with subclass layers into a Keras model with functional layers. This is required for quantization because the AIMET quantization tooling only supports the Functional and Sequantial Keras model building API's.\n", + "\n", + "To learn more about the Keras Model Preparer, please refer to the API Docs in AIMET.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Creating a Keras model with subclass layers\n", + "2. Converting the Keras model with subclass layers to a Keras model with functional layers\n", + "3. Showing similarities and differences between the original and converted models\n", + "4. Dicussing the limitations of the Keras Model Preparer" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Creating a Keras model with subclass layers\n", + "\n", + "First, we will create a Keras model with subclass layers. For this notebook example, we will use a model defined by Keras that utilizes subclass layers. This model is a text classification transformer model and can be found [here]( https://keras.io/examples/nlp/text_classification_with_transformer/). The subclass layers used in this model are - `TokenAndPositionEmbedding` and `TransformerBlock`. They are defined below. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "\n", + "class TransformerBlock(tf.keras.layers.Layer):\n", + " def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1):\n", + " super(TransformerBlock, self).__init__()\n", + " self.att = tf.keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)\n", + " self.ffn = tf.keras.Sequential(\n", + " [tf.keras.layers.Dense(ff_dim, activation=\"relu\"), tf.keras.layers.Dense(embed_dim),]\n", + " )\n", + " self.layernorm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6)\n", + " self.layernorm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6)\n", + " self.dropout1 = tf.keras.layers.Dropout(rate)\n", + " self.dropout2 = tf.keras.layers.Dropout(rate)\n", + "\n", + " def call(self, inputs, training, **kwargs):\n", + " attn_output = self.att(inputs, inputs)\n", + " attn_output = self.dropout1(attn_output, training=training)\n", + " out1 = self.layernorm1(inputs + attn_output)\n", + " ffn_output = self.ffn(out1)\n", + " ffn_output = self.dropout2(ffn_output, training=training)\n", + " return self.layernorm2(out1 + ffn_output)\n", + "\n", + "\n", + "\n", + "class TokenAndPositionEmbedding(tf.keras.layers.Layer):\n", + " def __init__(self, maxlen, vocab_size, embed_dim):\n", + " super(TokenAndPositionEmbedding, self).__init__()\n", + " self.token_emb = tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)\n", + " self.pos_emb = tf.keras.layers.Embedding(input_dim=maxlen, output_dim=embed_dim)\n", + "\n", + " def call(self, x, **kwargs):\n", + " maxlen = tf.shape(x)[-1]\n", + " positions = tf.range(start=0, limit=maxlen, delta=1)\n", + " positions = self.pos_emb(positions)\n", + " x = self.token_emb(x)\n", + " x = x + positions\n", + " return x" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With those subclass layers defined, we can now define the model. Since we are not training the model, we will use random weights and a random input tensor to build the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "vocab_size = 20000 \n", + "maxlen = 200\n", + "\n", + "random_input = np.random.random((10, 200)) # Random input to build the model\n", + "\n", + "embed_dim = 32 # Embedding size for each token\n", + "num_heads = 2 # Number of attention heads\n", + "ff_dim = 32 # Hidden layer size in feed forward network inside transformer\n", + "\n", + "inputs = tf.keras.layers.Input(shape=(maxlen,))\n", + "embedding_layer = TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim)\n", + "x = embedding_layer(inputs)\n", + "transformer_block = TransformerBlock(embed_dim, num_heads, ff_dim)\n", + "x = transformer_block(x)\n", + "x = tf.keras.layers.GlobalAveragePooling1D()(x)\n", + "x = tf.keras.layers.Dropout(0.1)(x)\n", + "x = tf.keras.layers.Dense(20, activation=\"relu\")(x)\n", + "x = tf.keras.layers.Dropout(0.1)(x)\n", + "outputs = tf.keras.layers.Dense(2, activation=\"softmax\")(x)\n", + "\n", + "model = tf.keras.Model(inputs=inputs, outputs=outputs)\n", + "_ = model(random_input)\n", + "model.summary()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the `model.summary()` output, we can see the models 2 subclass layers - `token_and_position_embedding`, `transformer_block`. Since these layers are using layer inside they're classes, we need to extract them to create a symmetrical functional model. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Converting the Keras model with subclass layers to a Keras model with functional layers\n", + "\n", + "The Keras Model Preparer can be used to convert a Keras model with subclass layers to a Keras model with functional layers. The Keras Model Preparer can be imported from `aimet_tensorflow.keras.model_preparer`. The Keras Model Preparer takes in a Keras model with subclass layers and returns a Keras model with functional layers. Note that the `prepare_model` function takes an optional `input_layer` parameter. This parameter is required if the model begins with a subclass layer. In this case, the model does not begin with a subclass layer, so we do not need to provide an `input_shape` parameter." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.model_preparer import prepare_model\n", + "\n", + "functional_model = prepare_model(model) \n", + "functional_model.summary()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the Keras Model Preparer has converted the model with subclass layers to a model with functional layers. Specifically, it has extracted the call function of each of these layers and created a functional layer from it." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Showing similarities and differences between the original and converted models\n", + "\n", + "We can see that the original model and the converted model are symmetrical. The only difference is that the subclass layers are unwrapped. This means that the converted model is functionally identical to the original model. We can test this in a few ways.\n", + "\n", + "1) We can compare the total number of parameters in the original and converted models. We can see that the total number of parameters is the same.\n", + "\n", + "2) We can compare the weights of the original and converted models. We can see that the weights are the same.\n", + " * Note that the order of the weights presented when calling `get_weights()` on each of these models are not the same and as is the names of the weights. We can use an internal function to get the original models weights in the same order as the converted models weights.\n", + "\n", + "3) We can compare the outputs of the original and converted models. We can see that the outputs are the same." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Set, List\n", + "\n", + "# This function is a functional representation of the reordering done inside the model preparer for Keras.\n", + "def get_original_models_weights_in_functional_model_order(\n", + " original_model: tf.keras.Model,\n", + " functional_model: tf.keras.Model,\n", + " class_names: Set[str]\n", + ") -> List[np.ndarray]:\n", + " \"\"\"Map the original model's weights to the functional model's weights.\n", + "\n", + " Args:\n", + " original_model:\n", + " Original model to reference the weight order.\n", + " functional_model: \n", + " Prepared model to updates weight of.\n", + " class_names: \n", + " Names of the classes that the original model was subclassed from\n", + "\n", + " Returns:\n", + " A list of the original model's weights in the order of the functional model's weights\n", + " \"\"\"\n", + "\n", + " # Make the original model's weights into a dictionary for quick lookup by name\n", + " # The original subclassed layers names are removed to match the new functional model's names\n", + " original_model_weights = {}\n", + " for weight in original_model.weights:\n", + " # pop out class_names of weight name\n", + " weight_name = weight.name\n", + " for class_name in class_names:\n", + " weight_name = weight_name.replace(class_name + '/', '')\n", + " original_model_weights[weight_name] = weight.numpy()\n", + "\n", + " # Get the functional model's weights in order as a dictionary for quick lookup where the key is the weight name\n", + " # and the position of the weight's order is the value\n", + " functional_model_weight_order = {\n", + " weight.name: position\n", + " for position, weight in enumerate(functional_model.weights)\n", + " }\n", + "\n", + " # Using the functional model's weights order, get the original model's weights in the same order. The lambda here\n", + " # uses the weight's name to get position in the functional model's weights order and the sorts the original model's\n", + " # weights by that position.\n", + " weights_in_correct_order = [\n", + " weight for _, weight in\n", + " sorted(original_model_weights.items(), key=lambda weight_info: functional_model_weight_order[weight_info[0]])\n", + " ]\n", + "\n", + " return weights_in_correct_order\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert functional_model.count_params() == model.count_params()\n", + "assert functional_model.input_shape == model.input_shape\n", + "assert functional_model.output_shape == model.output_shape\n", + "\n", + "# NOTE: Since TextClassification Model has the internal layers out of order compared to the call method,\n", + "# the weights are not in the order of what the actual architecture is (this is a Keras design).\n", + "# Therefore, we get the original model's weights and sort them in the order of the actual\n", + "# architecture and use those weights to compare to the functional model's weights.\n", + "model_weights_in_correct_order = get_original_models_weights_in_functional_model_order(\n", + " model, functional_model, class_names=[\"token_and_position_embedding\", \"transformer_block\"])\n", + "\n", + "for i, _ in enumerate(model_weights_in_correct_order):\n", + " np.testing.assert_array_equal(model_weights_in_correct_order[i], functional_model.get_weights()[i])\n", + "\n", + "np.testing.assert_array_equal(functional_model(random_input).numpy(), model(random_input).numpy())\n", + "print(\"Models are equal\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Discussing the limitations of the Keras Model Preparer\n", + "\n", + "- The AIMET Keras ModelPreparer API is able to convert subclass layers that have arthmetic experssion in their call function.\n", + "However, this API and Keras, will convert these operations to TFOPLambda layers which are not currently supported by AIMET Keras Quantization API. \n", + "If possible, it is recommended to have the subclass layers call function ressemble the Keras Functional API layers.\n", + "For example, if a subclass layer has two convolution layers in its call function, the call function should look like\n", + "the following:\n", + "\n", + " ```python\n", + " def call(self, x, **kwargs):\n", + " x = self.conv_1(x)\n", + " x = self.conv_2(x)\n", + " return x\n", + " ```\n", + "\n", + "- If the model starts with a subclassed layer, the AIMET Keras ModelPreparer API will need an Keras Input Layer as input.\n", + "This is becuase the Keras Functional API requires an Input Layer as the first layer in the model. The AIMET Keras ModelPreparer API\n", + "will raise an exception if the model starts with a subclassed layer and an Input Layer is not provided as input." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hopefully this notebook was useful for you to understand how to use the Keras Model Preparer.\n", + "\n", + "Few additional resources:\n", + "- [AIMET API Docs](https://quic.github.io/aimet-pages/releases/latest/user_guide/index.html)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/qat.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat.html new file mode 100644 index 0000000..fcae8c0 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat.html @@ -0,0 +1,1382 @@ + + + + + + Quantization-Aware Training — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization-Aware Training

+

This notebook shows a working code example of how to use AIMET to perform Quantization Aware Training(QAT). QAT is an AIMET feature adding quantization simulation ops to a pre-trained model and using a standard training pipeline to fine-tune the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.

+

The quantization parameters(like encoding min/max/scale/offset) for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load a pretrained FP32 model and determine the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simulation model to get a quantized accuracy score 4. Fine-tune the quantization simulation model using QAT and evaluate the simulation model to get a post fine-tuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+

Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline for QAT is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#)

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/imagenet_dir'        # Please replace this with a real directory
+BATCH_SIZE = 128
+IMAGE_SIZE = (224, 224)
+
+
+
+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow as tf
+
+
+
+
+
+

1. Load the dataset

+

We defined a few utility functions and assign the training and validation dataset to dataset_train and dataset_valid respectively

+
+
[ ]:
+
+
+
dataset_train = dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(
+    directory=os.path.join(DATASET_DIR, "train"),
+    labels="inferred",
+    label_mode="categorical",
+    batch_size=BATCH_SIZE,
+    shuffle=True,
+    image_size=IMAGE_SIZE
+)
+dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(
+    directory=os.path.join(DATASET_DIR, "val"),
+    labels="inferred",
+    label_mode="categorical",
+    batch_size=BATCH_SIZE,
+    shuffle=False,
+    image_size=IMAGE_SIZE
+)
+
+
+
+
+
+

2. Load a pretrained FP32 model

+

For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet import ResNet50
+
+model = ResNet50(weights="imagenet")
+model.compile(optimizer="adam", loss="categorical_crossentropy")
+
+
+
+
+
+

3. Determine the baseline FP32 accuracy

+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine

+
+
[ ]:
+
+
+
model.evaluate(dataset_valid)
+
+
+
+
+
+

4. Create a QuantizationSim Model and determine quantized accuracy

+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers of a given model. NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+
+_, model = fold_all_batch_norms(model)
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf” - Other Supported options for QAT are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+from aimet_common.defs import QuantScheme
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has wrapped the layers to act as being ‘quantized’ but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ layer. For activation quantization layers, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes +referred to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples

+

In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples. It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario +like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results. The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways, this is just an example.

+
+
[ ]:
+
+
+
from tensorflow.keras.utils import Progbar
+from tensorflow.keras.applications.resnet import preprocess_input
+
+def pass_calibration_data(sim_model, samples):
+    dataset = dataset_valid
+
+    progbar = Progbar(samples)
+
+    batch_cntr = 0
+    for inputs, _ in dataset:
+        sim_model(preprocess_input(inputs))
+
+        batch_cntr += 1
+        progbar_stat_update = \
+            batch_cntr * BATCH_SIZE if (batch_cntr * BATCH_SIZE) < samples else samples
+        progbar.update(progbar_stat_update)
+        if (batch_cntr * BATCH_SIZE) > samples:
+            break
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+
+

Compile the model

+

Configure the model for training and evaluation. The model must be compiled before evaluation

+
+
[ ]:
+
+
+
sim.model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
+
+
+
+
+
+

Evaluate the performance of the quantized model

+

Next, we can evaluate the performance of the quantized model

+
+
[ ]:
+
+
+
sim.model.evaluate(dataset_valid)
+
+
+
+
+
+
+

5. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyperparameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so. For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change +these parameters as you see fit.

+
+
[ ]:
+
+
+
quantized_callback = tf.keras.callbacks.TensorBoard(log_dir="./log/quantized")
+history = sim.model.fit(dataset_train, epochs=1, validation_data=dataset_valid, callbacks=[quantized_callback])
+
+
+
+
+
+

6. Evaluate validation accuracy after QAT

+

Next, let’s evaluate the validation accuracy of our model after QAT

+
+
[ ]:
+
+
+
sim.model.evaluate(dataset_valid)
+
+
+
+
+
+

7. Export the encodings

+

Finally, let’s compute and export the encodings of the model after performing QAT. When comparing the encodings file generated by this step and the encodings generated before quantization, there should be some differences. These differences are an artifact of QAT.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+sim.export('./data', 'model_after_qat')
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QAT.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT with range-learning

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/qat.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat.ipynb new file mode 100644 index 0000000..2040a13 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat.ipynb @@ -0,0 +1,549 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "# Quantization-Aware Training\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform Quantization Aware Training(QAT). QAT is an AIMET feature adding quantization simulation ops to a pre-trained model and using a standard training pipeline to fine-tune the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "The quantization parameters(like encoding min/max/scale/offset) for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant.\n", + "\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load a pretrained FP32 model and determine the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simulation model to get a quantized accuracy score\n", + "4. Fine-tune the quantization simulation model using QAT and evaluate the simulation model to get a post fine-tuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline for QAT is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. [https://image-net.org/challenges/LSVRC/2012/index.php#](https://image-net.org/challenges/LSVRC/2012/index.php#))\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/imagenet_dir' # Please replace this with a real directory\n", + "BATCH_SIZE = 128\n", + "IMAGE_SIZE = (224, 224)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 1. Load the dataset\n", + "\n", + "We defined a few utility functions and assign the training and validation dataset to `dataset_train` and `dataset_valid` respectively" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "dataset_train = dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(\n", + " directory=os.path.join(DATASET_DIR, \"train\"),\n", + " labels=\"inferred\",\n", + " label_mode=\"categorical\",\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=True,\n", + " image_size=IMAGE_SIZE\n", + ")\n", + "dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(\n", + " directory=os.path.join(DATASET_DIR, \"val\"),\n", + " labels=\"inferred\",\n", + " label_mode=\"categorical\",\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=False,\n", + " image_size=IMAGE_SIZE\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 2. Load a pretrained FP32 model\n", + "\n", + "For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet import ResNet50\n", + "\n", + "model = ResNet50(weights=\"imagenet\")\n", + "model.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 3. Determine the baseline FP32 accuracy\n", + "\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "model.evaluate(dataset_valid)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 4. Create a QuantizationSim Model and determine quantized accuracy\n", + "\n", + "### Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers of a given model.
\n", + "**NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_, model = fold_all_batch_norms(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "\n", + "### Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf\"\n", + " - Other Supported options for QAT are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "from aimet_common.defs import QuantScheme\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "### Compute Encodings\n", + "Even though AIMET has wrapped the layers to act as being 'quantized' but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' layer. For activation quantization layers, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "\n", + "In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import Progbar\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "\n", + "def pass_calibration_data(sim_model, samples):\n", + " dataset = dataset_valid\n", + "\n", + " progbar = Progbar(samples)\n", + "\n", + " batch_cntr = 0\n", + " for inputs, _ in dataset:\n", + " sim_model(preprocess_input(inputs))\n", + "\n", + " batch_cntr += 1\n", + " progbar_stat_update = \\\n", + " batch_cntr * BATCH_SIZE if (batch_cntr * BATCH_SIZE) < samples else samples\n", + " progbar.update(progbar_stat_update)\n", + " if (batch_cntr * BATCH_SIZE) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "### Compile the model\n", + "\n", + "Configure the model for training and evaluation. The model must be compiled before evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.model.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "### Evaluate the performance of the quantized model\n", + "\n", + "Next, we can evaluate the performance of the quantized model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.model.evaluate(dataset_valid)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 5. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyperparameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "quantized_callback = tf.keras.callbacks.TensorBoard(log_dir=\"./log/quantized\")\n", + "history = sim.model.fit(dataset_train, epochs=1, validation_data=dataset_valid, callbacks=[quantized_callback])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 6. Evaluate validation accuracy after QAT\n", + "\n", + "Next, let's evaluate the validation accuracy of our model after QAT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.model.evaluate(dataset_valid)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 7. Export the encodings\n", + "\n", + "Finally, let's compute and export the encodings of the model after performing QAT. When comparing the encodings file generated by this step and the encodings generated before quantization, there should be some differences. These differences are an artifact of QAT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)\n", + "sim.export('./data', 'model_after_qat')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Summary\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QAT.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/tensorflow/quantization/keras) to understand how to use AIMET post-training quantization techniques and QAT with range-learning" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.html new file mode 100644 index 0000000..f62d5e4 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.html @@ -0,0 +1,1388 @@ + + + + + + Quantization-Aware Training with Range Learning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization-Aware Training with Range Learning

+

This notebook shows a working code example of how to use AIMET to perform Quantization-Aware Training(QAT) with range-learning. QAT with range-learning is an AIMET feature adding quantization simulation ops to a pre-trained model and using a standard training pipeline to fine-tune both the model and quantization parameters for a few epochs. While QAT fine-tunes only the model parameters, QAT with range-learning also learns encoding min/max of parameter quantizers(hence the name range-learning). +The resulting model should show improved accuracy on quantized ML accelerators.

+

The quantization parameters(like encoding min/max/scale/offset) for activations are computed once initially. During QAT, both the model weights and quantization parameters are jointly updated to minimize the effects of quantization in the forward pass.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load a pretrained FP32 model and determine the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simulation model to get a quantized accuracy score 4. Fine-tune the quantization simulation model using QAT with range-learning and evaluate the simulation model to get a post fine-tuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+

Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline for QAT with range-learning is written? Yes, there is limitation only on the training pipeline due to restrictions of keras for range-learning. You cannot use a custom training loop to do QAT with range-learning. Doing so would prevent the encoding min/max from updating during training. Instead, the only way to achieve range-learning is to:

    +
      +
    1. Compile the quantization simulation model directly with sim.compile

    2. +
    3. Run QAT directly on the simulation model with sim.fit

    4. +
    +
  • +
  • Does AIMET put any limitation on the interface of evaluate() or train() methods for QAT with range-learning? Only on the train method. You should be able to use your existing evaluation routine as-is, but there is a restriction on training as mentioned above

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#)

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dir'        # Please replace this with a real directory
+BATCH_SIZE = 128
+IMAGE_SIZE = (224, 224)
+
+
+
+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow as tf
+
+
+
+
+
+

1. Load the dataset

+

We defined a few utility functions and assign the training and validation dataset to dataset_train and dataset_valid respectively

+
+
[ ]:
+
+
+
dataset_train = dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(
+    directory=os.path.join(DATASET_DIR, "train"),
+    labels="inferred",
+    label_mode="categorical",
+    batch_size=BATCH_SIZE,
+    shuffle=True,
+    image_size=IMAGE_SIZE
+)
+dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(
+    directory=os.path.join(DATASET_DIR, "val"),
+    labels="inferred",
+    label_mode="categorical",
+    batch_size=BATCH_SIZE,
+    shuffle=False,
+    image_size=IMAGE_SIZE
+)
+
+
+
+
+
+

2. Load a pretrained FP32 model

+

For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet import ResNet50
+
+model = ResNet50(weights='imagenet')
+model.compile(optimizer="adam", loss="categorical_crossentropy")
+
+
+
+
+
+

3. Determine the baseline FP32 accuracy

+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine

+
+
[ ]:
+
+
+
model.evaluate(dataset_valid)
+
+
+
+
+
+

4. Create a QuantizationSim Model and determine quantized accuracy

+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers of a given model. NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+
+_, model = fold_all_batch_norms(model)
+
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “training_range_learning_with_tf_init” - This is the key setting that enables “range learning”. With this choice of quant scheme, AIMET will use the TF quant scheme to initialize the quantization parameters like scale/offset. And then those parameters are set +to be trainable so they can continue to be updated during fine-tuning. - Another choice for quant_scheme is “training_range_learning_with_tf_enhanced_init”. Similar to the above, but the initialization for scale/offset is doing using the TF Enhanced scheme. Since in both schemes the quantization parameters are set to be trainable, there is not much benefit to using this choice instead of “training_range_learning_with_tf_init. - default_output_bw: Setting this to 8, essentially means that we +are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+from aimet_common.defs import QuantScheme
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.training_range_learning_with_tf_init,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+

Compute Encodings

+

Even though AIMET has wrapped the layers to act as being ‘quantized’ but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ layer. For activation quantization layers, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes +referred to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples

+

In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples. It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario +like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results. The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways, this is just an example.

+
+
[ ]:
+
+
+
from tensorflow.keras.utils import Progbar
+from tensorflow.keras.applications.resnet import preprocess_input
+
+def pass_calibration_data(sim_model, samples):
+    dataset = dataset_valid
+    progbar = Progbar(samples)
+
+    batch_cntr = 0
+    for inputs, _ in dataset:
+        sim_model(preprocess_input(inputs))
+
+        batch_cntr += 1
+        progbar_stat_update = \
+            batch_cntr * BATCH_SIZE if (batch_cntr * BATCH_SIZE) < samples else samples
+        progbar.update(progbar_stat_update)
+        if (batch_cntr * BATCH_SIZE) > samples:
+            break
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+
+

Compile the model

+

Configure the model for training and evaluation. The model must be compiled before evaluation.

+
+
[ ]:
+
+
+
sim.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
+
+
+
+
+
+

Evaluate the performance of the quantized model

+

Next, we can evaluate the performance of the quantized model

+
+
[ ]:
+
+
+
sim.evaluate(dataset_valid)
+
+
+
+
+
+
+

5. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyperparameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so. For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change +these parameters as you see fit.

+
+
[ ]:
+
+
+
quantized_callback = tf.keras.callbacks.TensorBoard(log_dir="./log/quantized")
+history = sim.fit(dataset_train, epochs=1, validation_data=dataset_valid, callbacks=[quantized_callback])
+
+
+
+
+
+

6. Evaluate validation accuracy after QAT

+

Next, let’s evaluate the validation accuracy of our model after QAT

+
+
[ ]:
+
+
+
sim.evaluate(dataset_valid)
+
+
+
+
+
+

7. Export the encodings

+

Finally, let’s compute and export the encodings of the model after performing QAT. When comparing the encodings file generated by this step and the encodings generated before quantization, there should be some differences. These differences are an artifact of QAT.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+sim.export('./data', 'model_after_qat')
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QAT with range-learning.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and vanilla QAT(without range-learning)

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.ipynb new file mode 100644 index 0000000..064f7d8 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/qat_range_learning.ipynb @@ -0,0 +1,551 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "# Quantization-Aware Training with Range Learning\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform Quantization-Aware Training(QAT) with range-learning. QAT with range-learning is an AIMET feature adding quantization simulation ops to a pre-trained model and using a standard training pipeline to fine-tune both the model and quantization parameters for a few epochs. While QAT fine-tunes only the model parameters, QAT with range-learning also learns encoding min/max of parameter quantizers(hence the name range-learning). The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "The quantization parameters(like encoding min/max/scale/offset) for activations are computed once initially. During QAT, both the model weights and quantization parameters are jointly updated to minimize the effects of quantization in the forward pass.\n", + "\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load a pretrained FP32 model and determine the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simulation model to get a quantized accuracy score\n", + "4. Fine-tune the quantization simulation model using QAT with range-learning and evaluate the simulation model to get a post fine-tuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline for QAT with range-learning is written?** **_Yes_**, there is limitation only on the training pipeline due to restrictions of keras for range-learning. You cannot use a custom training loop to do QAT with range-learning. Doing so would prevent the encoding min/max from updating during training. Instead, the only way to achieve range-learning is to:\n", + " 1. Compile the quantization simulation model directly with `sim.compile`\n", + " 2. Run QAT directly on the simulation model with `sim.fit`\n", + "\n", + "- **Does AIMET put any limitation on the interface of evaluate() or train() methods for QAT with range-learning?** Only on the train method. You should be able to use your existing evaluation routine as-is, but there is a restriction on training as mentioned above\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. [https://image-net.org/challenges/LSVRC/2012/index.php#](https://image-net.org/challenges/LSVRC/2012/index.php#))\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dir' # Please replace this with a real directory\n", + "BATCH_SIZE = 128\n", + "IMAGE_SIZE = (224, 224)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 1. Load the dataset\n", + "\n", + "We defined a few utility functions and assign the training and validation dataset to `dataset_train` and `dataset_valid` respectively" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "dataset_train = dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(\n", + " directory=os.path.join(DATASET_DIR, \"train\"),\n", + " labels=\"inferred\",\n", + " label_mode=\"categorical\",\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=True,\n", + " image_size=IMAGE_SIZE\n", + ")\n", + "dataset_valid = tf.keras.preprocessing.image_dataset_from_directory(\n", + " directory=os.path.join(DATASET_DIR, \"val\"),\n", + " labels=\"inferred\",\n", + " label_mode=\"categorical\",\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=False,\n", + " image_size=IMAGE_SIZE\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 2. Load a pretrained FP32 model\n", + "\n", + "For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet import ResNet50\n", + "\n", + "model = ResNet50(weights='imagenet')\n", + "model.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 3. Determine the baseline FP32 accuracy\n", + "\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "model.evaluate(dataset_valid)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 4. Create a QuantizationSim Model and determine quantized accuracy\n", + "\n", + "### Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers of a given model.
\n", + "**NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_, model = fold_all_batch_norms(model)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"training_range_learning_with_tf_init\"\n", + " - This is the key setting that enables \"range learning\". With this choice of quant scheme, AIMET will use the TF quant scheme to initialize the quantization parameters like scale/offset. And then those parameters are set to be trainable so they can continue to be updated during fine-tuning.\n", + " - Another choice for quant_scheme is \"training_range_learning_with_tf_enhanced_init\". Similar to the above, but the initialization for scale/offset is doing using the TF Enhanced scheme. Since in both schemes the quantization parameters are set to be trainable, there is not much benefit to using this choice instead of \"training_range_learning_with_tf_init.\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "from aimet_common.defs import QuantScheme\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.training_range_learning_with_tf_init,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "### Compute Encodings\n", + "Even though AIMET has wrapped the layers to act as being 'quantized' but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' layer. For activation quantization layers, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "\n", + "In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import Progbar\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "\n", + "def pass_calibration_data(sim_model, samples):\n", + " dataset = dataset_valid\n", + " progbar = Progbar(samples)\n", + "\n", + " batch_cntr = 0\n", + " for inputs, _ in dataset:\n", + " sim_model(preprocess_input(inputs))\n", + "\n", + " batch_cntr += 1\n", + " progbar_stat_update = \\\n", + " batch_cntr * BATCH_SIZE if (batch_cntr * BATCH_SIZE) < samples else samples\n", + " progbar.update(progbar_stat_update)\n", + " if (batch_cntr * BATCH_SIZE) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "### Compile the model\n", + "\n", + "Configure the model for training and evaluation. The model must be compiled before evaluation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.compile(optimizer=\"adam\", loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "### Evaluate the performance of the quantized model\n", + "\n", + "Next, we can evaluate the performance of the quantized model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.evaluate(dataset_valid)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 5. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyperparameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "quantized_callback = tf.keras.callbacks.TensorBoard(log_dir=\"./log/quantized\")\n", + "history = sim.fit(dataset_train, epochs=1, validation_data=dataset_valid, callbacks=[quantized_callback])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 6. Evaluate validation accuracy after QAT\n", + "\n", + "Next, let's evaluate the validation accuracy of our model after QAT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.evaluate(dataset_valid)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## 7. Export the encodings\n", + "\n", + "Finally, let's compute and export the encodings of the model after performing QAT. When comparing the encodings file generated by this step and the encodings generated before quantization, there should be some differences. These differences are an artifact of QAT." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)\n", + "sim.export('./data', 'model_after_qat')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## Summary\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QAT with range-learning.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/tensorflow/quantization/keras) to understand how to use AIMET post-training quantization techniques and vanilla QAT(without range-learning)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.html new file mode 100644 index 0000000..cf2d131 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.html @@ -0,0 +1,1408 @@ + + + + + + Quant Analyzer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quant Analyzer

+

This notebook showcases a working code example of how to use AIMET to apply Quant Analyzer. Quant Analyzer is a feature which performs various analyses on a model to understand how each layer in the model responds to quantization.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation pipeline 2. Load the FP32 model 3. Apply QuantAnalyzer to the model

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results.

  • +
  • For example, it uses a relatively quantization-friendly model like Resnet50.

  • +
  • Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#)

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dir/'       # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written?

    +

    Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

    +
  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods?

    +

    Not really. You should be able to use your existing evaluate and train routines as-is.

    +
  • +
+
+
[ ]:
+
+
+
import tensorflow as tf
+
+from typing import Optional
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset
+
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for getting ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataset(batch_size: Optional[int] = None) -> tf.data.Dataset:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        :return: A tensorflow dataset
+        """
+        if batch_size is None:
+            batch_size = image_net_config.evaluation['batch_size']
+
+        dataset = ImageNetDataset(DATASET_DIR,
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=batch_size)
+
+        return dataset
+
+
+
+
+
+
+

2. Load a pretrained FP32 model

+

For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet import ResNet50
+
+model = ResNet50(weights='imagenet')
+
+
+
+
+
+
+

3. Apply QuantAnalyzer to the model

+

QuantAnalyzer requires two functions to be defined by the user for passing data through the model:

+

Forward pass callback

+

One function will be used to pass representative data through a quantized version of the model to calibrate quantization parameters. This function should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metrics, so we can just ignore the model output.

+

The function must take two arguments, the first of which will be the model to run the forward pass on. The second argument can be anything additional which the function requires to run, and can be in the form of a single item or a tuple of items.

+

If no additional argument is needed, the user can specify a dummy “_” parameter for the function.

+

A few pointers regarding the forward pass data samples:

+
    +
  • In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.

  • +
  • It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

  • +
+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways; this is just an example. This function only requires unlabeled data as no loss or other evaluation metric is needed.

+
+
[ ]:
+
+
+
val_dataset = ImageNetDataPipeline.get_val_dataset()
+unlabeled_dataset = val_dataset.dataset
+
+def pass_calibration_data(sim_model: tf.keras.Model, _) -> None:
+    batch_size = val_dataset.batch_size
+    samples = 1000
+
+    sampled_dataset = unlabeled_dataset.take(samples // batch_size)
+    _ = sim_model.predict(sampled_dataset)
+
+
+
+

In order to pass this function to QuantAnalyzer, we need to wrap it in a CallbackFunc object, as shown below. The CallbackFunc takes two arguments: the callback function itself, and the inputs to pass into the callback function.

+
+
[ ]:
+
+
+
from aimet_common.utils import CallbackFunc
+
+forward_pass_callback = CallbackFunc(pass_calibration_data)
+
+
+
+
+

Evaluation callback

+

The second function will be used to evaluate the model, and needs to return an accuracy metric. In here, the user should pass any amount of data through the model which they would like when evaluating their model for accuracy.

+

Like the forward pass callback, this function also must take exactly two arguments: the model to evaluate, and any additional argument needed for the function to work. The second argument can be a tuple of items in case multiple items are needed.

+

Like the forward pass callback, we need to wrap the evaluation callback in a CallbackFunc object as well.

+
+
[ ]:
+
+
+
def eval_func(model: tf.keras.Model, _) -> float:
+    model.compile(optimizer=tf.keras.optimizers.Adam(),
+                  loss=tf.keras.losses.CategoricalCrossentropy(),
+                  metrics=tf.keras.metrics.CategoricalAccuracy())
+
+    _, acc = model.evaluate(val_dataset.dataset)
+    return acc
+
+eval_callback = CallbackFunc(eval_func)
+
+
+
+
+

Enabling MSE loss per layer analysis

+

An optional analysis step in QuantAnalyzer calculates the MSE loss per layer in the model, comparing the layer outputs from the original FP32 model vs. a quantized model. To perform this step, the user needs to also provide an unlabeled Dataset to QuantAnalyzer.

+

We will demonstrate this step by using the ImageNetDataLoader imported above.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.quant_analyzer import QuantAnalyzer
+
+quant_analyzer = QuantAnalyzer(model, forward_pass_callback, eval_callback)
+
+
+
+

To enable the MSE loss analysis, we set the following:

+
+
[ ]:
+
+
+
quant_analyzer.enable_per_layer_mse_loss(unlabeled_dataset=unlabeled_dataset, num_batches=4)
+
+
+
+

Finally, to start the analyzer, we call .analyze().

+

A few of the parameters are explained here: - quant_scheme: - We set this to “post_training_tf_enhanced” With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset. - default_output_bw: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision. - default_param_bw: Setting this to 8 means that we are asking AIMET to perform all +parameter quantizations in the model using integer 8-bit precision.

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

When you call the analyze method, the following analyses are run:

+
    +
  • Compare fp32 accuracy, accuracy with only parameters quantized, and accuracy with only activations quantized

  • +
  • For each layer, track the model accuracy when quantization for all other layers is disabled (enabling quantization for only one layer in the model at a time)

  • +
  • For each layer, track the model accuracy when quantization for all other layers is enabled (disabling quantization for only one layer in the model at a time)

  • +
  • Track the minimum and maximum encoding parameters calculated by each quantizer in the model as a result of forward passes through the model with representative data

  • +
  • When the TF Enhanced quantization scheme is used, track the histogram of tensor ranges seen by each quantizer in the model as a result of forward passes through the model with representative data

  • +
  • If enabled, track the MSE loss seen at each layer by comparing layer outputs of the original fp32 model vs. a quantized model

  • +
+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+
+quant_analyzer.analyze(quant_scheme=QuantScheme.post_training_tf_enhanced,
+                       default_param_bw=8,
+                       default_output_bw=8,
+                       config_file=None,
+                       results_dir="./tmp/")
+
+
+
+

AIMET will also output .html plots and json files where appropriate for each analysis to help visualize the data.

+

The following output files will be produced, in a folder specified by the user: Output directory structure will be like below

+
results_dir
+|-- per_layer_quant_enabled.html
+|-- per_layer_quant_enabled.json
+|-- per_layer_quant_disabled.html
+|-- per_layer_quant_disabled.json
+|-- min_max_ranges
+|   |-- activations.html
+|   |-- activations.json
+|   |-- weights.html
+|   +-- weights.json
+|-- activations_pdf
+|   |-- name_{input/output}_{index_0}.html
+|   |-- name_{input/output}_{index_1}.html
+|   |-- ...
+|   +-- name_{input/output}_{index_N}.html
+|-- weights_pdf
+|   |-- layer1
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   |   +-- param_name_{channel_index_N}.html
+|   |-- layer2
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   |   +-- param_name_{channel_index_N}.html
+|   |-- ...
+|   |-- layerN
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   +-- +-- param_name_{channel_index_N}.html
+|-- per_layer_mse_loss.html
++-- per_layer_mse_loss.json
+
+
+
+
+
+

Per-layer analysis by enabling/disabling quantization wrappers

+
    +
  • per_layer_quant_enabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer’s accuracy represents the model accuracy when all quantizers in the model are disabled except for that layer’s parameter and activation quantizers.

  • +
  • per_layer_quant_enabled.json: A json file containing the data shown in per_layer_quant_enabled.html, associating layer names with model accuracy.

  • +
  • per_layer_quant_disabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer’s accuracy represents the model accuracy when all quantizers in the model are enabled except for that layer’s parameter and activation quantizers.

  • +
  • per_layer_quant_disabled.json: A json file containing the data shown in per_layer_quant_disabled.html, associating layer names with model accuracy.

  • +
+

per_layer_quant_enabled.html

+
+
+

Encoding min/max ranges

+
    +
  • min_max_ranges: A folder containing the following sets of files:

    +
      +
    • activations.html: A plot with output activations on the x-axis and min-max values on the y-axis, where each output activation’s range represents the encoding min and max parameters computed during forward pass calibration (explained below).

    • +
    • activations.json: A json file containing the data shown in activations.html, associating layer names with min and max encoding values.

    • +
    • weights.html: A plot with parameter names on the x-axis and min-max values on the y-axis, where each parameter’s range represents the encoding min and max parameters computed during forward pass calibration.

    • +
    • weights.json: A json file containing the data shown in weights.html, associating parameter names with min and max encoding values.

    • +
    +
  • +
+

min_max_ranges.html

+
+
+

PDF of statistics

+
    +
  • (If TF Enhanced quant scheme is used) activations_pdf: A folder containing html files for each layer, plotting the histogram of tensor values seen for that layer’s output activation seen during forward pass calibration.

  • +
  • (If TF Enhanced quant scheme is used) weights_pdf: A folder containing sub folders for each layer with weights. Each layer’s folder contains html files for each parameter of that layer, with a histogram plot of tensor values seen for that parameter seen during forward pass calibration.

  • +
+

weights_pdf.html

+
+
+

Per-layer MSE loss

+
    +
  • (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.html: A plot with layers on the x-axis and MSE loss on the y-axis, where each layer’s MSE loss represents the MSE seen comparing that layer’s outputs in the FP32 model vs. the quantized model.

  • +
  • (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.json: A json file containing the data shown in per_layer_mse_loss.html, associating layer names with MSE loss.

  • +
+

per_layer_mse_loss.html

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.ipynb new file mode 100644 index 0000000..c543984 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/quant_analyzer.ipynb @@ -0,0 +1,459 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Quant Analyzer\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Quant Analyzer.\n", + "Quant Analyzer is a feature which performs various analyses on a model to understand how each layer in the model responds to quantization.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation pipeline\n", + "2. Load the FP32 model\n", + "3. Apply QuantAnalyzer to the model\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results.\n", + "* For example, it uses a relatively quantization-friendly model like Resnet50.\n", + "* Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. [https://image-net.org/challenges/LSVRC/2012/index.php#](https://image-net.org/challenges/LSVRC/2012/index.php#))\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?**\n", + "\n", + " Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model.\n", + " This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?**\n", + "\n", + " Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "\n", + "from typing import Optional\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset\n", + "\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for getting ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataset(batch_size: Optional[int] = None) -> tf.data.Dataset:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " :return: A tensorflow dataset\n", + " \"\"\"\n", + " if batch_size is None:\n", + " batch_size = image_net_config.evaluation['batch_size']\n", + "\n", + " dataset = ImageNetDataset(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=batch_size)\n", + "\n", + " return dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 2. Load a pretrained FP32 model\n", + "\n", + "For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet import ResNet50\n", + "\n", + "model = ResNet50(weights='imagenet')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 3. Apply QuantAnalyzer to the model\n", + "\n", + "QuantAnalyzer requires two functions to be defined by the user for passing data through the model:\n", + "\n", + "**Forward pass callback**\n", + "\n", + "One function will be used to pass representative data through a quantized version of the model to calibrate quantization parameters.\n", + "This function should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model.\n", + "We don't need to compute any loss metrics, so we can just ignore the model output.\n", + "\n", + "The function **must** take two arguments, the first of which will be the model to run the forward pass on.\n", + "The second argument can be anything additional which the function requires to run, and can be in the form of a single item or a tuple of items.\n", + "\n", + "If no additional argument is needed, the user can specify a dummy \"_\" parameter for the function.\n", + "\n", + "A few pointers regarding the forward pass data samples:\n", + "\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + " For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed.\n", + " It's not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation.\n", + " However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings.\n", + "This routine can be written in many ways; this is just an example.\n", + "This function only requires unlabeled data as no loss or other evaluation metric is needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "val_dataset = ImageNetDataPipeline.get_val_dataset()\n", + "unlabeled_dataset = val_dataset.dataset\n", + "\n", + "def pass_calibration_data(sim_model: tf.keras.Model, _) -> None:\n", + " batch_size = val_dataset.batch_size\n", + " samples = 1000\n", + "\n", + " sampled_dataset = unlabeled_dataset.take(samples // batch_size)\n", + " _ = sim_model.predict(sampled_dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "In order to pass this function to QuantAnalyzer, we need to wrap it in a CallbackFunc object, as shown below.\n", + "The CallbackFunc takes two arguments: the callback function itself, and the inputs to pass into the callback function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_common.utils import CallbackFunc\n", + "\n", + "forward_pass_callback = CallbackFunc(pass_calibration_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "**Evaluation callback**\n", + "\n", + "The second function will be used to evaluate the model, and needs to return an accuracy metric.\n", + "In here, the user should pass any amount of data through the model which they would like when evaluating their model for accuracy.\n", + "\n", + "Like the forward pass callback, this function also must take exactly two arguments: the model to evaluate, and any additional argument needed for the function to work.\n", + "The second argument can be a tuple of items in case multiple items are needed.\n", + "\n", + "Like the forward pass callback, we need to wrap the evaluation callback in a CallbackFunc object as well." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def eval_func(model: tf.keras.Model, _) -> float:\n", + " model.compile(optimizer=tf.keras.optimizers.Adam(),\n", + " loss=tf.keras.losses.CategoricalCrossentropy(),\n", + " metrics=tf.keras.metrics.CategoricalAccuracy())\n", + "\n", + " _, acc = model.evaluate(val_dataset.dataset)\n", + " return acc\n", + "\n", + "eval_callback = CallbackFunc(eval_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "**Enabling MSE loss per layer analysis**\n", + "\n", + "An optional analysis step in QuantAnalyzer calculates the MSE loss per layer in the model, comparing the layer outputs from the original FP32 model vs. a quantized model.\n", + "To perform this step, the user needs to also provide an unlabeled Dataset to QuantAnalyzer.\n", + "\n", + "We will demonstrate this step by using the ImageNetDataLoader imported above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.quant_analyzer import QuantAnalyzer\n", + "\n", + "quant_analyzer = QuantAnalyzer(model, forward_pass_callback, eval_callback)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "To enable the MSE loss analysis, we set the following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "quant_analyzer.enable_per_layer_mse_loss(unlabeled_dataset=unlabeled_dataset, num_batches=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Finally, to start the analyzer, we call .analyze().\n", + "\n", + "A few of the parameters are explained here:\n", + "- **quant_scheme**:\n", + " - We set this to \"post_training_tf_enhanced\"\n", + " With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset.\n", + "- **default_output_bw**: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision.\n", + "- **default_param_bw**: Setting this to 8 means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision.\n", + "\n", + "There are other parameters that are set to default values in this example.\n", + "Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "When you call the analyze method, the following analyses are run:\n", + "\n", + "- Compare fp32 accuracy, accuracy with only parameters quantized, and accuracy with only activations quantized\n", + "- For each layer, track the model accuracy when quantization for all other layers is disabled (enabling quantization for only one layer in the model at a time)\n", + "- For each layer, track the model accuracy when quantization for all other layers is enabled (disabling quantization for only one layer in the model at a time)\n", + "- Track the minimum and maximum encoding parameters calculated by each quantizer in the model as a result of forward passes through the model with representative data\n", + "- When the TF Enhanced quantization scheme is used, track the histogram of tensor ranges seen by each quantizer in the model as a result of forward passes through the model with representative data\n", + "- If enabled, track the MSE loss seen at each layer by comparing layer outputs of the original fp32 model vs. a quantized model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "\n", + "quant_analyzer.analyze(quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_param_bw=8,\n", + " default_output_bw=8,\n", + " config_file=None,\n", + " results_dir=\"./tmp/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "AIMET will also output .html plots and json files where appropriate for each analysis to help visualize the data.\n", + "\n", + "The following output files will be produced, in a folder specified by the user:\n", + "Output directory structure will be like below\n", + "\n", + "```\n", + "results_dir\n", + "|-- per_layer_quant_enabled.html\n", + "|-- per_layer_quant_enabled.json\n", + "|-- per_layer_quant_disabled.html\n", + "|-- per_layer_quant_disabled.json\n", + "|-- min_max_ranges\n", + "| |-- activations.html\n", + "| |-- activations.json\n", + "| |-- weights.html\n", + "| +-- weights.json\n", + "|-- activations_pdf\n", + "| |-- name_{input/output}_{index_0}.html\n", + "| |-- name_{input/output}_{index_1}.html\n", + "| |-- ...\n", + "| +-- name_{input/output}_{index_N}.html\n", + "|-- weights_pdf\n", + "| |-- layer1\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| | +-- param_name_{channel_index_N}.html\n", + "| |-- layer2\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| | +-- param_name_{channel_index_N}.html\n", + "| |-- ...\n", + "| |-- layerN\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| +-- +-- param_name_{channel_index_N}.html\n", + "|-- per_layer_mse_loss.html\n", + "+-- per_layer_mse_loss.json\n", + "```\n", + "\n", + "#### Per-layer analysis by enabling/disabling quantization wrappers\n", + "\n", + "- per_layer_quant_enabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer's accuracy represents the model accuracy when all quantizers in the model are disabled except for that layer's parameter and activation quantizers.\n", + "- per_layer_quant_enabled.json: A json file containing the data shown in per_layer_quant_enabled.html, associating layer names with model accuracy.\n", + "- per_layer_quant_disabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer's accuracy represents the model accuracy when all quantizers in the model are enabled except for that layer's parameter and activation quantizers.\n", + "- per_layer_quant_disabled.json: A json file containing the data shown in per_layer_quant_disabled.html, associating layer names with model accuracy.\n", + "\n", + "![per_layer_quant_enabled.html](../images/keras_per_layer_quant_enabled.PNG)\n", + "\n", + "#### Encoding min/max ranges\n", + "\n", + "- min_max_ranges: A folder containing the following sets of files:\n", + " - activations.html: A plot with output activations on the x-axis and min-max values on the y-axis, where each output activation's range represents the encoding min and max parameters computed during forward pass calibration (explained below).\n", + " - activations.json: A json file containing the data shown in activations.html, associating layer names with min and max encoding values.\n", + " - weights.html: A plot with parameter names on the x-axis and min-max values on the y-axis, where each parameter's range represents the encoding min and max parameters computed during forward pass calibration.\n", + " - weights.json: A json file containing the data shown in weights.html, associating parameter names with min and max encoding values.\n", + "\n", + "![min_max_ranges.html](../images/keras_min_max_ranges.PNG)\n", + "\n", + "#### PDF of statistics\n", + "\n", + "- (If TF Enhanced quant scheme is used) activations_pdf: A folder containing html files for each layer, plotting the histogram of tensor values seen for that layer's output activation seen during forward pass calibration.\n", + "- (If TF Enhanced quant scheme is used) weights_pdf: A folder containing sub folders for each layer with weights.\n", + " Each layer's folder contains html files for each parameter of that layer, with a histogram plot of tensor values seen for that parameter seen during forward pass calibration.\n", + "\n", + "![weights_pdf.html](../images/keras_weights_pdf.PNG)\n", + "\n", + "#### Per-layer MSE loss\n", + "- (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.html: A plot with layers on the x-axis and MSE loss on the y-axis, where each layer's MSE loss represents the MSE seen comparing that layer's outputs in the FP32 model vs. the quantized model.\n", + "- (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.json: A json file containing the data shown in per_layer_mse_loss.html, associating layer names with MSE loss.\n", + "\n", + "![per_layer_mse_loss.html](../images/keras_per_layer_mse_loss.PNG)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.html new file mode 100644 index 0000000..b200ed8 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.html @@ -0,0 +1,1417 @@ + + + + + + Quantsim and Adaround - Per Channel Quantization (PCQ) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Quantsim and Adaround - Per Channel Quantization (PCQ)

+

This notebook illustrates the use of AIMET Adaround feature.

+

AIMET quantization features, by default, use the “nearest rounding” technique for achieving quantization. When using the “nearest rounding” technique, the weight value is quantized to the nearest integer value. The Adaptive Rounding (AdaRound) feature, uses a smaller subset of the unlabelled training data to adaptively round the weights. AdaRound, optimizes a loss function using the unlabelled training data to adaptively decide whether to quantize a specific weight to the integer value near it +or away from it. Using the AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.

+

Per Channel Quantization AIMET by default performs quantization on a per tensor basis. However, for better quantization performance (specifically networks with many convolutions) quantization can be done on a per channel quantization basis.

+

The difference between per tensor and per channel quantization can be illustrated with a single 2D convolution layer in Keras. Imagine that we have a 2D convolution layer with 64 filters, a kernel size of 3, and input of shape of (28, 28, 1). If we were to per tensor quantize this layer, we would look at the entirety of the convolutions weight matrix (convolution kernel). From here, we would take its overall max, overall min, and compute the encoding to quantize the entire matrix. In contrast, +on a per channel basis, we would repeat the process of finding a min, max, and computing an encoding. However, we would repeat this for every output channel in the convolution. In this example, that would mean we would have 64 encodings that are unique to each channel. This more detailed calculation is what attributes to better performance in quantization.

+

Example Keras Conv2D Layer

+
from tensorflow.keras import layers
+conv2d_layer = layers.Conv2D(filters=64, kernel_size=3)
+
+
+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Apply PCQ Adaround and get corresponding model 4. Create a PCQ quantization simulation model (with fake quantization ops inserted) from the Adaround model and evaluate this simuation model to get a quantized accuracy score 5. Exporting the simulation models encodings and how to take them to SNPE/QNN

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = "/path/to/dataset/dir/"          # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a Keras model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import tensorflow as tf
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset
+from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator
+
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataset() -> tf.data.Dataset:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        :return: A tensorflow dataset
+        """
+        data_loader = ImageNetDataset(DATASET_DIR,
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'])
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(model, iterations=None) -> float:
+        """
+        Given a Keras model, evaluates its Top-1 accuracy on the validation dataset
+        :param model: The Keras model to be evaluated.
+        :param iterations: The number of iterations to run. If None, all the data will be used
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR,
+                                      image_size=image_net_config.dataset["image_size"],
+                                      batch_size=image_net_config.evaluation["batch_size"])
+
+        return evaluator.evaluate(model=model, iterations=iterations)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet50 import ResNet50
+
+model = ResNet50(include_top=True,
+                 weights="imagenet",
+                 input_tensor=None,
+                 input_shape=None,
+                 pooling=None,
+                 classes=1000)
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=model, iterations=10)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Note: For per channel to be enabled, we pass a config file in which the config file has per_channel_quantization set to True. This config file will be used later on with Adaround as well. Having one place describing the quantization style ensures that we don’t mismatch when applying QuantSim and Adaround together.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers of a given model. NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+from aimet_common.defs import QuantScheme
+
+_, model = fold_all_batch_norms(model)
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           config_file="Examples/tensorflow/utils/keras/pcq_quantsim_config")  # NOTE: We tell QuantSim to run per channel quantization through the config file defined here.
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
from tensorflow.keras.utils import Progbar
+from tensorflow.keras.applications.resnet import preprocess_input
+
+def pass_calibration_data(sim_model, samples):
+    tf_dataset = ImageNetDataPipeline.get_val_dataset()
+    dataset = tf_dataset.dataset
+    batch_size = tf_dataset.batch_size
+
+    progbar = Progbar(samples)
+
+    batch_cntr = 0
+    for inputs, _ in dataset:
+        sim_model(preprocess_input(inputs))
+
+        batch_cntr += 1
+        progbar_stat_update = \
+            batch_cntr * batch_size if (batch_cntr * batch_size) < samples else samples
+        progbar.update(progbar_stat_update)
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
+
+

4. Apply Adaround

+

We can now apply AdaRound to this model in a per channel quantization fashion.

+

Note: For per channel to be enabled, we pass a config file to apply_adaround in which the config file has per_channel_quantization set to True just as we did with QuantSim.

+

Some of the parameters for AdaRound are described below

+
    +
  • data_set: AdaRound needs a dataset to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.

  • +
  • num_batches: The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.

  • +
  • default_num_iterations: The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime.

  • +
+
+
[ ]:
+
+
+
import os
+from tensorflow.keras.applications.resnet import preprocess_input
+from tensorflow.keras.preprocessing import image_dataset_from_directory
+from aimet_tensorflow.keras.adaround_weight import Adaround, AdaroundParameters
+from aimet_common.defs import QuantScheme
+
+ada_round_data = image_dataset_from_directory(directory=DATASET_DIR,
+                                              labels="inferred",
+                                              label_mode="categorical",
+                                              batch_size=image_net_config.evaluation["batch_size"],
+                                              shuffle=False,
+                                              image_size=(image_net_config.dataset["image_width"],
+                                                          image_net_config.dataset["image_height"]))
+ada_round_data = ada_round_data.map(lambda x, y: preprocess_input(x))
+
+params = AdaroundParameters(data_set=ada_round_data,
+                            num_batches=1, default_num_iterations=32)
+
+os.makedirs("./output/", exist_ok=True)
+ada_model = Adaround.apply_adaround(model, params, path="output", filename_prefix="adaround",
+                                    default_param_bw=8, default_quant_scheme=QuantScheme.post_training_tf,
+                                    config_file="Examples/tensorflow/utils/keras/pcq_quantsim_config")  # NOTE: The same config file used in QuantSim is used here as well. Again, telling Adaround to enable PCQ.
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the model after applying Adaround. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+

Note: There are two important things to understand in the following cell. - Parameter Biwidth Precision: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.

+
    +
  • Freezing the parameter encodings: After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API. While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created. Fo r Quantization Simulation accuracy, it is important to freeze these encodings. If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the +parameters encoding and Quantization Simulation accuracy will not be correct.

  • +
+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(model=ada_model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           config_file="Examples/tensorflow/utils/keras/pcq_quantsim_config")  # NOTE: The same config file used in the first QuantSim.
+
+sim.set_and_freeze_param_encodings(encoding_path=os.path.join("output", 'adaround.encodings'))
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=sim.model, iterations=10)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after applying adaround. Of course, this was just an example. Please try this against the model of your choice and play with the number of samples to get the best results.

+

Now the next step would be to take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
sim.export(path='./output', filename_prefix='resnet50_pcq_adaround')
+
+
+
+
+
+
+

Summary

+

This example illustrated how AIMET AdaRound and QuantSim API is invoked to achieve post training quantization on a per channel basis. To use AIMET for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline. This will provide you a quick starting point. As indicated above, some parameters in this example have been chosen in such a way way to make this example execute faster.

+

Hope this notebook was useful for you to understand how to use AIMET for performing Adaround and QuantSim on a per channel basis.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.ipynb new file mode 100644 index 0000000..8b649a2 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_adaround_pcq.ipynb @@ -0,0 +1,498 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Quantsim and Adaround - Per Channel Quantization (PCQ)\n", + "\n", + "This notebook illustrates the use of AIMET Adaround feature.\n", + "\n", + "AIMET quantization features, by default, use the \"nearest rounding\" technique for achieving quantization. When using the \"nearest rounding\" technique, the weight value is quantized to the nearest integer value. The Adaptive Rounding (AdaRound) feature, uses a smaller subset of the unlabelled training data to adaptively round the weights. AdaRound, optimizes a loss function using the unlabelled training data to adaptively decide whether to quantize a specific weight to the integer value near it or away from it. Using the AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.\n", + "\n", + "\n", + "**Per Channel Quantization**\n", + "AIMET by default performs quantization on a per tensor basis. However, for better quantization performance (specifically networks with many convolutions) quantization can be done on a per channel quantization basis.\n", + "\n", + "The difference between per tensor and per channel quantization can be illustrated with a single 2D convolution layer in Keras. Imagine that we have a 2D convolution layer with 64 filters, a kernel size of 3, and input of shape of (28, 28, 1). If we were to per tensor quantize this layer, we would look at the entirety of the convolutions weight matrix (convolution kernel). From here, we would take its overall max, overall min, and compute the encoding to quantize the entire matrix. In contrast, on a per channel basis, we would repeat the process of finding a min, max, and computing an encoding. However, we would repeat this for every output channel in the convolution. In this example, that would mean we would have 64 encodings that are unique to each channel. This more detailed calculation is what attributes to better performance in quantization.\n", + "\n", + "*Example Keras Conv2D Layer*\n", + "```python\n", + "from tensorflow.keras import layers\n", + "conv2d_layer = layers.Conv2D(filters=64, kernel_size=3)\n", + "```\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Apply PCQ Adaround and get corresponding model\n", + "4. Create a PCQ quantization simulation model (with fake quantization ops inserted) from the Adaround model and evaluate this simuation model to get a quantized accuracy score\n", + "5. Exporting the simulation models encodings and how to take them to SNPE/QNN\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "DATASET_DIR = \"/path/to/dataset/dir/\" # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a Keras model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset\n", + "from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataset() -> tf.data.Dataset:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " :return: A tensorflow dataset\n", + " \"\"\"\n", + " data_loader = ImageNetDataset(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'])\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model, iterations=None) -> float:\n", + " \"\"\"\n", + " Given a Keras model, evaluates its Top-1 accuracy on the validation dataset\n", + " :param model: The Keras model to be evaluated.\n", + " :param iterations: The number of iterations to run. If None, all the data will be used\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR,\n", + " image_size=image_net_config.dataset[\"image_size\"],\n", + " batch_size=image_net_config.evaluation[\"batch_size\"])\n", + "\n", + " return evaluator.evaluate(model=model, iterations=iterations)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + "\n", + "model = ResNet50(include_top=True,\n", + " weights=\"imagenet\",\n", + " input_tensor=None,\n", + " input_shape=None,\n", + " pooling=None,\n", + " classes=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=model, iterations=10)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Note**: For per channel to be enabled, we pass a config file in which the config file has *per_channel_quantization* set to *True*. This config file will be used later on with Adaround as well. Having one place describing the quantization style ensures that we don't mismatch when applying QuantSim and Adaround together.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers of a given model.
\n", + "**NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms\n", + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "from aimet_common.defs import QuantScheme\n", + "\n", + "_, model = fold_all_batch_norms(model)\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " config_file=\"Examples/tensorflow/utils/keras/pcq_quantsim_config\") # NOTE: We tell QuantSim to run per channel quantization through the config file defined here." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import Progbar\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "\n", + "def pass_calibration_data(sim_model, samples):\n", + " tf_dataset = ImageNetDataPipeline.get_val_dataset()\n", + " dataset = tf_dataset.dataset\n", + " batch_size = tf_dataset.batch_size\n", + "\n", + " progbar = Progbar(samples)\n", + "\n", + " batch_cntr = 0\n", + " for inputs, _ in dataset:\n", + " sim_model(preprocess_input(inputs))\n", + "\n", + " batch_cntr += 1\n", + " progbar_stat_update = \\\n", + " batch_cntr * batch_size if (batch_cntr * batch_size) < samples else samples\n", + " progbar.update(progbar_stat_update)\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## 4. Apply Adaround\n", + "\n", + "We can now apply AdaRound to this model in a per channel quantization fashion.\n", + "\n", + "**Note**: For per channel to be enabled, we pass a config file to `apply_adaround` in which the config file has *per_channel_quantization* set to *True* just as we did with QuantSim.\n", + "\n", + "Some of the parameters for AdaRound are described below\n", + "\n", + "- **data_set:** AdaRound needs a dataset to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.\n", + "- **num_batches:** The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.\n", + "- **default_num_iterations:** The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import os\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "from tensorflow.keras.preprocessing import image_dataset_from_directory\n", + "from aimet_tensorflow.keras.adaround_weight import Adaround, AdaroundParameters\n", + "from aimet_common.defs import QuantScheme\n", + "\n", + "ada_round_data = image_dataset_from_directory(directory=DATASET_DIR,\n", + " labels=\"inferred\",\n", + " label_mode=\"categorical\",\n", + " batch_size=image_net_config.evaluation[\"batch_size\"],\n", + " shuffle=False,\n", + " image_size=(image_net_config.dataset[\"image_width\"],\n", + " image_net_config.dataset[\"image_height\"]))\n", + "ada_round_data = ada_round_data.map(lambda x, y: preprocess_input(x))\n", + "\n", + "params = AdaroundParameters(data_set=ada_round_data,\n", + " num_batches=1, default_num_iterations=32)\n", + "\n", + "os.makedirs(\"./output/\", exist_ok=True)\n", + "ada_model = Adaround.apply_adaround(model, params, path=\"output\", filename_prefix=\"adaround\",\n", + " default_param_bw=8, default_quant_scheme=QuantScheme.post_training_tf,\n", + " config_file=\"Examples/tensorflow/utils/keras/pcq_quantsim_config\") # NOTE: The same config file used in QuantSim is used here as well. Again, telling Adaround to enable PCQ.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the model after applying Adaround. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.\n", + "\n", + "**Note:** There are two important things to understand in the following cell.\n", + " - **Parameter Biwidth Precision**: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.\n", + "\n", + " - **Freezing the parameter encodings**:\n", + "After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called\n", + "before calling the compute_encodings() API. While applying AdaRound, the parameter values have\n", + "been rounded up or down based on these initial encodings internally created. Fo\n", + "r Quantization Simulation accuracy, it is important to freeze these encodings.\n", + "If the parameters encodings are NOT frozen, the call to compute_encodings() will alter\n", + "the value of the parameters encoding and Quantization Simulation accuracy will not be correct." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(model=ada_model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " config_file=\"Examples/tensorflow/utils/keras/pcq_quantsim_config\") # NOTE: The same config file used in the first QuantSim.\n", + "\n", + "sim.set_and_freeze_param_encodings(encoding_path=os.path.join(\"output\", 'adaround.encodings'))\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=sim.model, iterations=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after applying adaround. Of course, this was just an example. Please try this against the model of your choice and play with the number of samples to get the best results.\n", + "\n", + "Now the next step would be to take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sim.export(path='./output', filename_prefix='resnet50_pcq_adaround')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Summary" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "This example illustrated how AIMET AdaRound and QuantSim API is invoked to achieve post training quantization on a per channel basis. To use AIMET for your specific needs, replace the model with your model and\n", + "replace the data pipeline with your data pipeline. This will provide you a quick starting point. As indicated above, some parameters in this example have been chosen in such a way way to make this example execute faster.\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing Adaround and QuantSim on a per channel basis.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "3.8.0" + }, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.html b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.html new file mode 100644 index 0000000..e379db0 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.html @@ -0,0 +1,1398 @@ + + + + + + Cross-Layer Equalization (CLE) with QuantSim — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Cross-Layer Equalization (CLE) with QuantSim

+

This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE) and use QuantSim. CLE is post-training quantization techniques that aims to improve quantized accuracy of a given model. CLE does not need any data samples. This technique help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.

+

To learn more about this techniques, please refer to the “Data-Free Quantization Through Weight Equalization and Bias Correction” paper from ICCV 2019 - https://arxiv.org/abs/1906.04721

+

Cross-Layer Equalization AIMET performs the following steps when running CLE: 1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers. 2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer. 3. High Bias Folding: Cross-layer scaling may +result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer’s parameters.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply CLE, and evaluate the simulation model to get a post-finetuned quantized accuracy score 5. Exporting the simulation models encodings and how to take them to SNPE/QNN

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = "/path/to/dataset/dir/"  # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user”s model to create a QuantizationSim model which is still a Keras model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import tensorflow as tf
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset
+from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator
+
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataset() -> tf.data.Dataset:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        :return: A tensorflow dataset
+        """
+        data_loader = ImageNetDataset(DATASET_DIR,
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'])
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(model, iterations=None) -> float:
+        """
+        Given a Keras model, evaluates its Top-1 accuracy on the validation dataset
+        :param model: The Keras model to be evaluated.
+        :param iterations: The number of iterations to run. If None, all the data will be used
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR,
+                                      image_size=image_net_config.dataset["image_size"],
+                                      batch_size=image_net_config.evaluation["batch_size"])
+
+        return evaluator.evaluate(model=model, iterations=iterations)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead.

+
+
[ ]:
+
+
+
from tensorflow.keras.applications.resnet50 import ResNet50
+
+model = ResNet50(include_top=True,
+                 weights="imagenet",
+                 input_tensor=None,
+                 input_shape=None,
+                 pooling=None,
+                 classes=1000)
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(model=model, iterations=10)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers of a given model. NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+
+_, model = fold_all_batch_norms(model)
+
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will wrap the Keras layers to mimic a layer as quantized. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are asking AIMET to perform all +activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision - num_batches: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the number of images in these 5 +batches should be sufficient for compute encodings - rounding_mode: The rounding mode used for quantization. There are two possible choices here - ‘nearest’ or ‘stochastic’ We will use “nearest.”

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

The next cell sets up the quantizer, and quantizes the model. Note that the quantizer uses the same evaluate function as the one defined in our data pipeline when computing the new weights.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has wrapped the layers to act as being ‘quantized’ but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ layer. For activation quantization layers, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes +referred to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples

+

In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples. It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario +like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results. The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
from tensorflow.keras.utils import Progbar
+from tensorflow.keras.applications.resnet import preprocess_input
+
+def pass_calibration_data(sim_model, samples):
+    tf_dataset = ImageNetDataPipeline.get_val_dataset()
+    dataset = tf_dataset.dataset
+    batch_size = tf_dataset.batch_size
+
+    progbar = Progbar(samples)
+
+    batch_cntr = 0
+    for inputs, _ in dataset:
+        sim_model(preprocess_input(inputs))
+
+        batch_cntr += 1
+        progbar_stat_update = \
+            batch_cntr * batch_size if (batch_cntr * batch_size) < samples else samples
+        progbar.update(progbar_stat_update)
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.evaluate(sim.model)
+
+
+
+
+
+
+

4 Cross Layer Equalization

+

The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.

+

Note: Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.

+
+
[ ]:
+
+
+
from aimet_tensorflow.keras import cross_layer_equalization as aimet_cle
+
+cle_applied_model = aimet_cle.equalize_model(model)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=cle_applied_model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           rounding_mode="nearest",
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=1000)
+
+ImageNetDataPipeline.evaluate(sim.model)
+
+
+
+
+
+
+

5 Exporting

+

Now the encodings for the QuantizationSimModel have been computed, they can be exported. Exporting can be done with the export function. This function will export the encodings in both a JSON and YAML file, a h5 model without wrappers, a Tensorflow 2 SavedModel, and a converted protobuff model from the h5 model. The converted protobuff model and the encodings exported can be then consumed by either SNPE/QNN.

+

Note: export() takes a path to safe to, and a filename_prefix

+
+
[ ]:
+
+
+
import os
+
+os.makedirs("./output/", exist_ok=True)
+sim.export(path="./output", filename_prefix="resnet50_after_cle")
+
+
+
+
+
+
+

Summary

+

Hopefully this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE).

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.ipynb new file mode 100644 index 0000000..99aa1ba --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/keras/quantsim_cle.ipynb @@ -0,0 +1,467 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "22208c45", + "metadata": {}, + "source": [ + "# Cross-Layer Equalization (CLE) with QuantSim\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE) and use QuantSim. CLE is post-training quantization techniques that aims to improve quantized accuracy of a given model. CLE does not need any data samples. This technique help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.\n", + "\n", + "To learn more about this techniques, please refer to the \"Data-Free Quantization Through Weight Equalization and Bias Correction\" paper from ICCV 2019 - https://arxiv.org/abs/1906.04721\n", + "\n", + "**Cross-Layer Equalization**\n", + "AIMET performs the following steps when running CLE:\n", + "1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers.\n", + "2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer.\n", + "3. High Bias Folding: Cross-layer scaling may result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer's parameters.\n", + "\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply CLE, and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "5. Exporting the simulation models encodings and how to take them to SNPE/QNN\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "id": "447958a2", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c37b55bc", + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = \"/path/to/dataset/dir/\" # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "id": "e348e923", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user\"s model to create a QuantizationSim model which is still a Keras model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e21aca42", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.keras.image_net_dataset import ImageNetDataset\n", + "from Examples.tensorflow.utils.keras.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + "\n", + " @staticmethod\n", + " def get_val_dataset() -> tf.data.Dataset:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " :return: A tensorflow dataset\n", + " \"\"\"\n", + " data_loader = ImageNetDataset(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'])\n", + "\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model, iterations=None) -> float:\n", + " \"\"\"\n", + " Given a Keras model, evaluates its Top-1 accuracy on the validation dataset\n", + " :param model: The Keras model to be evaluated.\n", + " :param iterations: The number of iterations to run. If None, all the data will be used\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR,\n", + " image_size=image_net_config.dataset[\"image_size\"],\n", + " batch_size=image_net_config.evaluation[\"batch_size\"])\n", + "\n", + " return evaluator.evaluate(model=model, iterations=iterations)\n" + ] + }, + { + "cell_type": "markdown", + "id": "52ed096a", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "id": "0ed81fba", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from Keras. Similarly, you can load any pretrained Keras model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9879523", + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.applications.resnet50 import ResNet50\n", + "\n", + "model = ResNet50(include_top=True,\n", + " weights=\"imagenet\",\n", + " input_tensor=None,\n", + " input_shape=None,\n", + " pooling=None,\n", + " classes=1000)" + ] + }, + { + "cell_type": "markdown", + "id": "5d7183d3", + "metadata": { + "collapsed": false + }, + "source": [ + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "247f8b8b", + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(model=model, iterations=10)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "e71a4de7", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers of a given model.
\n", + "**NOTE: During folding, a new model is returned. Please use the returned model for the rest of the pipeline.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdb8cbca", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_, model = fold_all_batch_norms(model)" + ] + }, + { + "cell_type": "markdown", + "id": "72457743", + "metadata": {}, + "source": [ + "---\n", + "## Create Quantization Sim Model\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will wrap the Keras layers to mimic a layer as quantized.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "- **num_batches**: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the number of images in these 5 batches should be sufficient for compute encodings\n", + "- **rounding_mode**: The rounding mode used for quantization. There are two possible choices here - 'nearest' or 'stochastic' We will use \"nearest.\"\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "markdown", + "id": "05e6ce14", + "metadata": {}, + "source": [ + "The next cell sets up the quantizer, and quantizes the model. Note that the quantizer uses the same evaluate function as the one defined in our data pipeline when computing the new weights." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b3770e74", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.keras.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "id": "8da84201", + "metadata": {}, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has wrapped the layers to act as being 'quantized' but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' layer. For activation quantization layers, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "\n", + "In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f3346fa", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import Progbar\n", + "from tensorflow.keras.applications.resnet import preprocess_input\n", + "\n", + "def pass_calibration_data(sim_model, samples):\n", + " tf_dataset = ImageNetDataPipeline.get_val_dataset()\n", + " dataset = tf_dataset.dataset\n", + " batch_size = tf_dataset.batch_size\n", + "\n", + " progbar = Progbar(samples)\n", + "\n", + " batch_cntr = 0\n", + " for inputs, _ in dataset:\n", + " sim_model(preprocess_input(inputs))\n", + "\n", + " batch_cntr += 1\n", + " progbar_stat_update = \\\n", + " batch_cntr * batch_size if (batch_cntr * batch_size) < samples else samples\n", + " progbar.update(progbar_stat_update)\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "id": "c0ddbed9", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48b9ed98", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)" + ] + }, + { + "cell_type": "markdown", + "id": "5337b23b", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a78a26e", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ImageNetDataPipeline.evaluate(sim.model)" + ] + }, + { + "cell_type": "markdown", + "id": "f8e0a345", + "metadata": {}, + "source": [ + "---\n", + "## 4 Cross Layer Equalization\n", + "\n", + "The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.\n", + "\n", + "**Note:** Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca3365e6", + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.keras import cross_layer_equalization as aimet_cle\n", + "\n", + "cle_applied_model = aimet_cle.equalize_model(model)" + ] + }, + { + "cell_type": "markdown", + "id": "7c769dee", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99c228e0", + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=cle_applied_model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " rounding_mode=\"nearest\",\n", + " default_output_bw=8,\n", + " default_param_bw=8)\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=1000)\n", + "\n", + "ImageNetDataPipeline.evaluate(sim.model)" + ] + }, + { + "cell_type": "markdown", + "id": "4beeb700", + "metadata": {}, + "source": [ + "---\n", + "## 5 Exporting\n", + "\n", + "Now the encodings for the QuantizationSimModel have been computed, they can be exported. Exporting can be done with the export function. This function will export the encodings in both a JSON and YAML file, a h5 model without wrappers, a Tensorflow 2 SavedModel, and a converted protobuff model from the h5 model. The converted protobuff model and the encodings exported can be then consumed by either SNPE/QNN.\n", + "\n", + "**Note:** `export()` takes a path to safe to, and a filename_prefix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a8bb414", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.makedirs(\"./output/\", exist_ok=True)\n", + "sim.export(path=\"./output\", filename_prefix=\"resnet50_after_cle\")" + ] + }, + { + "cell_type": "markdown", + "id": "f071a78c", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hopefully this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE).\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + }, + "vscode": { + "interpreter": { + "hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/qat.html b/releases/1.32.2/Examples/tensorflow/quantization/qat.html new file mode 100644 index 0000000..eaf92f6 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/qat.html @@ -0,0 +1,1474 @@ + + + + + + Quantization-Aware Training — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization-Aware Training

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.

+

AIMET supports two different types of QAT 1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant. 2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and +the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.

+

This notebook specifically shows working code example for #1 above. You can find a separate notebook for #2 in the same folder.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/tfrecords/dir/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import List
+
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
starting_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers on the given model and returns a new session

+
+
[ ]:
+
+
+
from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
+
+bn_folded_sess, _= fold_all_batch_norms(sess,
+                                        input_op_names=starting_op_names,
+                                        output_op_names=output_op_names)
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

The next cell sets up the quantizer, and quantizes the model. The new session that contains all the changes to the graph is quantizer.session, and this is then evaluated on the dataset. Note that the quantizer uses the same evaluate function as the one defined in our data pipeline when computing the new weights.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_tensorflow.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(session=bn_folded_sess,
+                           starting_op_names=starting_op_names,
+                           output_op_names=output_op_names,
+                           quant_scheme= QuantScheme.post_training_tf_enhanced,
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session: tf.compat.v1.Session, _):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),
+                           session.graph.get_tensor_by_name('labels:0')]
+
+    train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]
+    train_tensors_dict = dict.fromkeys(train_tensors, False)
+
+    eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]
+
+    samples = 500
+
+    batch_cntr = 0
+    for input_label in data_loader:
+        input_label_tensors_dict = dict(zip(input_label_tensors, input_label))
+
+        feed_dict = {**input_label_tensors_dict, **train_tensors_dict}
+
+        with session.graph.as_default():
+            _ = session.run(eval_outputs, feed_dict=feed_dict)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+
+
+

4. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(sim.session, update_ops_name=update_ops_name, epochs=1, learning_rate=1e-3, decay_steps=5)
+
+
+
+
+

After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we should have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. AIMET QuantizationSimModel provides an export API for this purpose. This API would save the model as .encodings .meta etc. TODO

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+sim.export(path='./output/', filename_prefix='resnet50_after_qat')
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QAT.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT with range-learning

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/qat.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/qat.ipynb new file mode 100644 index 0000000..0904e94 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/qat.ipynb @@ -0,0 +1,536 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantization-Aware Training\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "AIMET supports two different types of QAT\n", + "1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant.\n", + "2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.\n", + "\n", + "This notebook specifically shows working code example for #1 above. You can find a separate notebook for #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess)\n", + "\n", + " \n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "starting_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers on the given model and returns a new session" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "bn_folded_sess, _= fold_all_batch_norms(sess,\n", + " input_op_names=starting_op_names,\n", + " output_op_names=output_op_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell sets up the quantizer, and quantizes the model. The new session that contains all the changes to the graph is quantizer.session, and this is then evaluated on the dataset. Note that the quantizer uses the same evaluate function as the one defined in our data pipeline when computing the new weights." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(session=bn_folded_sess,\n", + " starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " quant_scheme= QuantScheme.post_training_tf_enhanced,\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(session: tf.compat.v1.Session, _):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),\n", + " session.graph.get_tensor_by_name('labels:0')]\n", + " \n", + " train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]\n", + " train_tensors_dict = dict.fromkeys(train_tensors, False)\n", + " \n", + " eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]\n", + "\n", + " samples = 500\n", + "\n", + " batch_cntr = 0\n", + " for input_label in data_loader:\n", + " input_label_tensors_dict = dict(zip(input_label_tensors, input_label))\n", + "\n", + " feed_dict = {**input_label_tensors_dict, **train_tensors_dict}\n", + "\n", + " with session.graph.as_default():\n", + " _ = session.run(eval_outputs, feed_dict=feed_dict)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(sim.session, update_ops_name=update_ops_name, epochs=1, learning_rate=1e-3, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we should have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. AIMET QuantizationSimModel provides an export API for this purpose. This API would save the model as .encodings .meta etc. TODO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "sim.export(path='./output/', filename_prefix='resnet50_after_qat')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QAT.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT with range-learning" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.html b/releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.html new file mode 100644 index 0000000..e24b2e7 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.html @@ -0,0 +1,1476 @@ + + + + + + Quantization-Aware Training with Range Learning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization-Aware Training with Range Learning

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.

+

AIMET supports two different types of QAT 1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant. 2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and +the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.

+

This notebook specifically shows working code example for #2 above. You can find a separate notebook for #1 in the same folder.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/tfrecords/dir/'        # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example Evaluation and Training Pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
from typing import List
+
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess)
+
+
+    @staticmethod
+    def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):
+        """
+        Given a TF session, finetunes it to improve its accuracy
+        :param sess: The sess graph to fine-tune.
+        :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).
+                                tf.GraphKeys.UPDATE_OPS collections is always used
+                                in addition to this list
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.
+        """
+        trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                  data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_epochs=epochs, format_bgr=True)
+
+        trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+update_ops_name = [op.name for op in model.updates] # Used for finetuning
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+
+# Creates the computation graph of ResNet within the tensorflow session.
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
starting_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sess=sess)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers on the given model and returns a new session

+
+
[ ]:
+
+
+
from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
+
+BN_folded_sess, _= fold_all_batch_norms(sess,
+                                        input_op_names=starting_op_names,
+                                        output_op_names=output_op_names)
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “training_range_learning_with_tf_init” - This is the key setting that enables “range learning”. With this choice of quant scheme, AIMET will use the TF quant scheme to initialize the quantization parameters like scale/offset. And then those parameters are set +to be trainable so they can continue to be updated during fine-tuning. - Another choice for quant_scheme is “training_range_learning_with_tf_enhanced_init”. Similar to the above, but the initialization for scale/offset is doing using the TF Enhanced scheme. Since in both schemes the quantization parameters are set to be trainable, there is not much benefit to using this choice instead of “training_range_learning_with_tf_init. - default_output_bw: Setting this to 8, essentially means that we +are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_tensorflow.quantsim import QuantizationSimModel
+
+sim = QuantizationSimModel(session=BN_folded_sess,
+                           starting_op_names=starting_op_names,
+                           output_op_names=output_op_names,
+                           quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,
+                           default_output_bw=8,
+                           default_param_bw=8,
+                           use_cuda=use_cuda)
+
+
+
+
+
+
+

Compute Encodings

+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(session: tf.compat.v1.Session, _):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),
+                           session.graph.get_tensor_by_name('labels:0')]
+
+    train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]
+    train_tensors_dict = dict.fromkeys(train_tensors, False)
+
+    eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]
+
+    samples = 500
+
+    batch_cntr = 0
+    for input_label in data_loader:
+        input_label_tensors_dict = dict(zip(input_label_tensors, input_label))
+
+        feed_dict = {**input_label_tensors_dict, **train_tensors_dict}
+
+        with session.graph.as_default():
+            _ = session.run(eval_outputs, feed_dict=feed_dict)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=None)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+
+
+

4. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(sim.session, update_ops_name=update_ops_name, epochs=1, learning_rate=1e-3, decay_steps=5)
+
+
+
+
+

After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.session)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we should have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. AIMET QuantizationSimModel provides an export API for this purpose. This API would save the model as #TODO

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+sim.export(path='./output/', filename_prefix='resnet50_after_qat_range_learning')
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QAT with range-learning.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and the vanilla QAT method (without range-learning)

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.ipynb new file mode 100644 index 0000000..4121e17 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/qat_range_learning.ipynb @@ -0,0 +1,528 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantization-Aware Training with Range Learning\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "AIMET supports two different types of QAT\n", + "1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant.\n", + "2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.\n", + "\n", + "This notebook specifically shows working code example for #2 above. You can find a separate notebook for #1 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet50. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/tfrecords/dir/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERORR), so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example Evaluation and Training Pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List\n", + "\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.tensorflow.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess)\n", + "\n", + " \n", + " @staticmethod\n", + " def finetune(sess: tf.Session, update_ops_name: List[str], epochs: int, learning_rate: float, decay_steps: int):\n", + " \"\"\"\n", + " Given a TF session, finetunes it to improve its accuracy\n", + " :param sess: The sess graph to fine-tune.\n", + " :param update_ops_name: list of name of update ops (mostly BatchNorms' moving averages).\n", + " tf.GraphKeys.UPDATE_OPS collections is always used\n", + " in addition to this list\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param decay_steps: A number used to adjust(decay) the learning rate after every decay_steps epochs in training.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_epochs=epochs, format_bgr=True)\n", + "\n", + " trainer.train(sess, update_ops_name=update_ops_name, learning_rate=learning_rate, decay_steps=decay_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. Since batchnorm ops are folded, these need to be ignored during training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))\n", + "update_ops_name = [op.name for op in model.updates] # Used for finetuning" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "\n", + "# Creates the computation graph of ResNet within the tensorflow session.\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "starting_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sess=sess)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers on the given model and returns a new session" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "BN_folded_sess, _= fold_all_batch_norms(sess,\n", + " input_op_names=starting_op_names,\n", + " output_op_names=output_op_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"training_range_learning_with_tf_init\"\n", + " - This is the key setting that enables \"range learning\". With this choice of quant scheme, AIMET will use the TF quant scheme to initialize the quantization parameters like scale/offset. And then those parameters are set to be trainable so they can continue to be updated during fine-tuning.\n", + " - Another choice for quant_scheme is \"training_range_learning_with_tf_enhanced_init\". Similar to the above, but the initialization for scale/offset is doing using the TF Enhanced scheme. Since in both schemes the quantization parameters are set to be trainable, there is not much benefit to using this choice instead of \"training_range_learning_with_tf_init.\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_tensorflow.quantsim import QuantizationSimModel\n", + "\n", + "sim = QuantizationSimModel(session=BN_folded_sess,\n", + " starting_op_names=starting_op_names,\n", + " output_op_names=output_op_names,\n", + " quant_scheme= QuantScheme.training_range_learning_with_tf_enhanced_init,\n", + " default_output_bw=8,\n", + " default_param_bw=8,\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Compute Encodings\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(session: tf.compat.v1.Session, _):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),\n", + " session.graph.get_tensor_by_name('labels:0')]\n", + " \n", + " train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]\n", + " train_tensors_dict = dict.fromkeys(train_tensors, False)\n", + " \n", + " eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]\n", + "\n", + " samples = 500\n", + "\n", + " batch_cntr = 0\n", + " for input_label in data_loader:\n", + " input_label_tensors_dict = dict(zip(input_label_tensors, input_label))\n", + "\n", + " feed_dict = {**input_label_tensors_dict, **train_tensors_dict}\n", + "\n", + " with session.graph.as_default():\n", + " _ = session.run(eval_outputs, feed_dict=feed_dict)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(sim.session, update_ops_name=update_ops_name, epochs=1, learning_rate=1e-3, decay_steps=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.session)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we should have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. AIMET QuantizationSimModel provides an export API for this purpose. This API would save the model as #TODO" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "sim.export(path='./output/', filename_prefix='resnet50_after_qat_range_learning')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QAT with range-learning.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and the vanilla QAT method (without range-learning)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.html b/releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.html new file mode 100644 index 0000000..0b50146 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.html @@ -0,0 +1,1491 @@ + + + + + + Quant Analyzer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quant Analyzer

+

This notebook showcases a working code example of how to use AIMET to apply Quant Analyzer. Quant Analyzer is a feature which performs various analyses on a model to understand how each op in the model responds to quantization.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation pipeline 2. Load the FP32 model 3. Apply QuantAnalyzer to the model

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results.

  • +
  • For example, it uses a relatively quantization-friendly model like Resnet50.

  • +
  • Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.

+

Note1: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - A folder containing tfrecords files starting with ‘train*’ for training files and ‘valid*’ for validation files. Each tfrecord file should have features: ‘image/encoded’ for image data and ‘image/class/label’ for its corresponding class.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
TFRECORDS_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+

We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERROR), so TensorFlow will display all messages that have the label ERROR (or more critical).

+
+
[ ]:
+
+
+
import os
+os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
+
+import tensorflow.compat.v1 as tf
+tf.disable_eager_execution()
+tf.logging.set_verbosity(tf.logging.ERROR)
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written?

    +

    Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

    +
  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods?

    +

    Not really. You should be able to use your existing evaluate and train routines as-is.

    +
  • +
+
+
[ ]:
+
+
+
from typing import List
+
+from Examples.common import image_net_config
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader
+from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator
+
+class ImageNetDataPipeline:
+    """
+    Provides APIs for model evaluation and finetuning using ImageNet Dataset.
+    """
+
+    @staticmethod
+    def get_val_dataloader():
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(TFRECORDS_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         format_bgr=True)
+
+        return data_loader
+
+    @staticmethod
+    def evaluate(sess: tf.Session, iterations: int = None) -> float:
+        """
+        Given a TF session, evaluates its Top-1 accuracy on the validation dataset
+        :param sess: The sess graph to be evaluated.
+        :param iterations: No of batches to use. Default is complete dataset
+        :return: The accuracy for the sample with the maximum accuracy.
+        """
+        evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],
+                                      data_inputs=['input_1:0'], validation_inputs=['labels:0'],
+                                      image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      format_bgr=True)
+
+        return evaluator.evaluate(sess, iterations)
+
+
+
+
+
+
+

2. Load the model

+

For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.

+

Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.

+

By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op.

+
+
[ ]:
+
+
+
from tensorflow.compat.v1.keras.applications.resnet import ResNet50
+
+tf.keras.backend.clear_session()
+
+model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))
+
+
+
+

The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers.

+
+
[ ]:
+
+
+
from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag
+
+model = update_keras_bn_ops_trainable_flag(model, load_save_path="./", trainable=False)
+
+
+
+

AIMET features currently support tensorflow sessions. add_image_net_computational_nodes_in_graph adds an output layer, softmax and loss functions to the Resnet50 model graph.

+
+
[ ]:
+
+
+
from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph
+
+sess = tf.keras.backend.get_session()
+add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])
+
+
+
+

Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here.

+
+
[ ]:
+
+
+
starting_op_names = [model.input.name.split(":")[0]]
+output_op_names = [model.output.name.split(":")[0]]
+
+
+
+

We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment.

+
+
[ ]:
+
+
+
use_cuda = tf.test.is_gpu_available(cuda_only=True)
+
+
+
+
+
+
+

3. Apply QuantAnalyzer to the model

+

QuantAnalyzer requires two functions to be defined by the user for passing data through the model:

+

Forward pass callback

+

One function will be used to pass representative data through a quantized version of the model to calibrate quantization parameters. This function should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metrics, so we can just ignore the model output.

+

The function must take two arguments, the first of which will be the session to run the forward pass on. The second argument can be anything additional which the function requires to run, and can be in the form of a single item or a tuple of items.

+

If no additional argument is needed, the user can specify a dummy “_” parameter for the function.

+

A few pointers regarding the forward pass data samples:

+
    +
  • In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.

  • +
  • It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered since we are only looking at the range of values at every op activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

  • +
+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways; this is just an example. This function only requires unlabeled data as no loss or other evaluation metric is needed.

+
+
[ ]:
+
+
+
def pass_calibration_data(session: tf.compat.v1.Session, _):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),
+                           session.graph.get_tensor_by_name('labels:0')]
+
+    train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]
+    train_tensors_dict = dict.fromkeys(train_tensors, False)
+
+    eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]
+
+    samples = 500
+
+    batch_cntr = 0
+    for input_label in data_loader:
+        input_label_tensors_dict = dict(zip(input_label_tensors, input_label))
+
+        feed_dict = {**input_label_tensors_dict, **train_tensors_dict}
+
+        with session.graph.as_default():
+            _ = session.run(eval_outputs, feed_dict=feed_dict)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+
+
+

In order to pass this function to QuantAnalyzer, we need to wrap it in a CallbackFunc object, as shown below. The CallbackFunc takes two arguments: the callback function itself, and the inputs to pass into the callback function.

+
+
[ ]:
+
+
+
from aimet_common.utils import CallbackFunc
+
+forward_pass_callback = CallbackFunc(func=pass_calibration_data, func_callback_args=None)
+
+
+
+
+

Evaluation callback

+

The second function will be used to evaluate the model, and needs to return an accuracy metric. In here, the user should pass any amount of data through the model which they would like when evaluating their model for accuracy.

+

Like the forward pass callback, this function also must take exactly two arguments: the session to evaluate, and any additional argument needed for the function to work. The second argument can be a tuple of items in case multiple items are needed.

+

We will be using the ImageNetDataPipeline’s evaluate defined above for this purpose. Like the forward pass callback, we need to wrap the evaluation callback in a CallbackFunc object as well.

+
+
[ ]:
+
+
+
data_pipeline = ImageNetDataPipeline()
+eval_callback = CallbackFunc(func=ImageNetDataPipeline.evaluate)
+
+
+
+
+

Creating unlabeled dataset and defining number of batches for MSE loss per op analysis

+

An optional analysis step in QuantAnalyzer calculates the MSE loss per op in the model, comparing the op outputs from the original FP32 model vs. a quantized model. To perform this step, the user needs to also provide an unlabeled Dataset to QuantAnalyzer.

+

We will demonstrate this step by using the ImageNetDataLoader imported above.

+
+
[ ]:
+
+
+
dataset = data_pipeline.get_val_dataloader().dataset
+
+with dataset._graph.as_default():
+    unlabeled_dataset = dataset.map(lambda x,y: x)
+num_batches = 4
+
+
+
+
+

We are now ready to apply QuantAnalyzer.

+
+
[ ]:
+
+
+
from aimet_tensorflow.quant_analyzer import QuantAnalyzer
+
+quant_analyzer = QuantAnalyzer(sess, start_op_names=starting_op_names, output_op_names=output_op_names,
+                               forward_pass_callback=forward_pass_callback, eval_callback=eval_callback, use_cuda= use_cuda)
+
+
+
+

Finally, to start the analyzer, we call analyze()

+

A few of the parameters are explained here: - quant_scheme: - We set this to “post_training_tf_enhanced” With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset. - default_output_bw: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision. - default_param_bw: Setting this to 8 means that we are asking AIMET to perform all +parameter quantizations in the model using integer 8-bit precision.

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

When analyze method is called, the following analyses are run: - Compare fp32 accuracy, accuracy with only parameters quantized and accuracy with only activations quantized - For each op, track the model accuracy when quantization for all other ops is disabled (enabling quantization for only one op in the model at a time) - For each op, track the model accuracy when quantization for all other ops is enabled (disabling quantization for only one op in the model at a time) - Track the minimum and +maximum encoding parameters calculated by each quantizer in the model as a result of forward passes through the model with representative data - When the TF Enhanced quantization scheme is used, track the histogram of tensor ranges seen by each quantizer in the model as a result of forward passes through the model with representative data - Track the MSE loss seen at each op by comparing op outputs of the original fp32 model vs. a quantized model when user has provided unlabeled dataset and +number of batches

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+
+quant_analyzer.analyze(default_param_bw=8, default_output_bw=8,
+                       quant_scheme=QuantScheme.post_training_tf_enhanced,
+                       config_file=None,
+                       unlabeled_dataset=unlabeled_dataset, num_batches=num_batches,
+                       results_dir='./tmp/')
+
+
+
+

AIMET will also output .html plots and json files where appropriate for each analysis to help visualize the data.

+

The following output files will be produced, in a folder specified by the user:

+
results_dir
+|-- per_op_quant_enabled.html
+|-- per_op_quant_enabled.json
+|-- per_op_quant_disabled.html
+|-- per_op_quant_disabled.json
+|-- min_max_ranges
+|   |-- activations.html
+|   |-- activations.json
+|   |-- weights.html
+|   +-- weights.json
+|-- activations_pdf
+|   |-- quant_op_name0.html
+|   |-- quant_op_name1.html
+|   |-- ...
+|   +-- quant_op_nameN.html
+|-- weights_pdf
+|   |-- op1
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   |   +-- param_name_{channel_index_x}.html
+|   |-- op2
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   |   +-- param_name_{channel_index_y}.html
+|   |-- ...
+|   |-- opn
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   +-- +-- param_name_{channel_index_z}.html
+|-- per_op_mse_loss.html
++-- per_op_mse_loss.json
+
+
+
+
+
+

Per op analysis by enabling/disabling quantization ops

+
    +
  • per_op_quant_enabled.html: A plot with ops on the x-axis and model accuracy on the y-axis, where each op’s accuracy represents the model accuracy when all quantizers in the model are disabled except for that op’s parameter and activation quantizers.

  • +
  • per_op_quant_enabled.json: A json file containing the data shown in per_op_quant_enabled.html, associating op names with model accuracy.

  • +
  • per_op_quant_disabled.html: A plot with ops on the x-axis and model accuracy on the y-axis, where each op’s accuracy represents the model accuracy when all quantizers in the model are enabled except for that op’s parameter and activation quantizers.

  • +
  • per_op_quant_disabled.json: A json file containing the data shown in per_op_quant_disabled.html, associating op names with model accuracy.

  • +
+

per_op_quant_enabled.html

+
+
+

Encoding min/max ranges

+
    +
  • min_max_ranges: A folder containing the following sets of files:

    +
      +
    • activations.html: A plot with output activations on the x-axis and min-max values on the y-axis, where each output activation’s range represents the encoding min and max parameters computed during forward pass calibration.

    • +
    • activations.json: A json file containing the data shown in activations.html, associating op names with min and max encoding values.

    • +
    • weights.html: A plot with parameter names on the x-axis and min-max values on the y-axis, where each parameter’s range represents the encoding min and max parameters computed during forward pass calibration.

    • +
    • weights.json: A json file containing the data shown in weights.html, associating parameter names with min and max encoding values.

    • +
    +
  • +
+

min_max_ranges.html

+
+
+

PDF of statistics

+
    +
  • (If TF Enhanced quant scheme is used) activations_pdf: A folder containing html files for each op, plotting the histogram of tensor values seen for that op’s output activation seen during forward pass calibration.

  • +
  • (If TF Enhanced quant scheme is used) weights_pdf: A folder containing sub folders for each op with weights. Each op’s folder contains html files for each parameter of that op, with a histogram plot of tensor values seen for that parameter seen during forward pass calibration.

  • +
+

weights_pdf.html

+
+
+

Per op MSE loss

+
    +
  • (Optional, only enabled when user has provided unlabeled dataset and number of batches) per_op_mse_loss.html: A plot with ops on the x-axis and MSE loss on the y-axis, where each op’s MSE loss represents the MSE seen comparing that op’s outputs in the FP32 model vs. the quantized model.

  • +
  • (Optional, only enabled when user has provided unlabeled dataset and number of batches) per_op_mse_loss.json: A json file containing the data shown in per_op_mse_loss.html, associating op names with MSE loss.

  • +
+

per_op_mse_loss.html

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.ipynb b/releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.ipynb new file mode 100644 index 0000000..3c68ad1 --- /dev/null +++ b/releases/1.32.2/Examples/tensorflow/quantization/quant_analyzer.ipynb @@ -0,0 +1,618 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Quant Analyzer\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Quant Analyzer.\n", + "Quant Analyzer is a feature which performs various analyses on a model to understand how each op in the model responds to quantization.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation pipeline\n", + "2. Load the FP32 model\n", + "3. Apply QuantAnalyzer to the model\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results.\n", + "* For example, it uses a relatively quantization-friendly model like Resnet50.\n", + "* Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#) and convert them into tfrecords.\n", + "\n", + "**Note1**: The ImageNet tfrecords dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- A folder containing tfrecords files starting with **'train\\*'** for training files and **'valid\\*'** for validation files. Each tfrecord file should have features: **'image/encoded'** for image data and **'image/class/label'** for its corresponding class.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class and then convert it into tfrecords. This exercise is left upto the reader and is not necessary.\n", + "\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "TFRECORDS_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We disable logs at the INFO level and disable eager execution. We set verbosity to the level as displayed (ERROR),\n", + "so TensorFlow will display all messages that have the label ERROR (or more critical)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", + "\n", + "import tensorflow.compat.v1 as tf\n", + "tf.disable_eager_execution()\n", + "tf.logging.set_verbosity(tf.logging.ERROR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?**\n", + "\n", + " Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model.\n", + " This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?**\n", + "\n", + " Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from typing import List\n", + "\n", + "from Examples.common import image_net_config\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetDataLoader\n", + "from Examples.tensorflow.utils.image_net_evaluator import ImageNetEvaluator\n", + "\n", + "class ImageNetDataPipeline:\n", + " \"\"\"\n", + " Provides APIs for model evaluation and finetuning using ImageNet Dataset.\n", + " \"\"\"\n", + " \n", + " @staticmethod\n", + " def get_val_dataloader():\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(TFRECORDS_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return data_loader\n", + " \n", + " @staticmethod\n", + " def evaluate(sess: tf.Session, iterations: int = None) -> float:\n", + " \"\"\"\n", + " Given a TF session, evaluates its Top-1 accuracy on the validation dataset\n", + " :param sess: The sess graph to be evaluated.\n", + " :param iterations: No of batches to use. Default is complete dataset\n", + " :return: The accuracy for the sample with the maximum accuracy.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(TFRECORDS_DIR, training_inputs=['keras_learning_phase:0'],\n", + " data_inputs=['input_1:0'], validation_inputs=['labels:0'],\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " format_bgr=True)\n", + "\n", + " return evaluator.evaluate(sess, iterations)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. Load the model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained ResNet50 model from keras and covert it to a tensorflow session. Similarly, you can load any pretrained tensorflow model instead.\n", + "\n", + "\n", + "Calling clear_session() releases the global state: this helps avoid clutter from old models and layers, especially when memory is limited.\n", + "\n", + "\n", + "By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from tensorflow.compat.v1.keras.applications.resnet import ResNet50\n", + "\n", + "tf.keras.backend.clear_session()\n", + "\n", + "model = ResNet50(weights='imagenet', input_shape=(224, 224, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following utility method in AIMET sets BN layers in the model to eval mode. This allows AIMET to more easily read the BN parameters from the graph. Eventually we will fold BN layers into adjacent conv layers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.utils.graph import update_keras_bn_ops_trainable_flag\n", + "\n", + "model = update_keras_bn_ops_trainable_flag(model, load_save_path=\"./\", trainable=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET features currently support tensorflow sessions. **add_image_net_computational_nodes_in_graph** adds an output layer, softmax and loss functions to the Resnet50 model graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from Examples.tensorflow.utils.add_computational_nodes_in_graph import add_image_net_computational_nodes_in_graph\n", + "\n", + "sess = tf.keras.backend.get_session()\n", + "add_image_net_computational_nodes_in_graph(sess, model.output.name, image_net_config.dataset['images_classes'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since all tensorflow input and output tensors have names, we identify the tensors needed by AIMET APIs here. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "starting_op_names = [model.input.name.split(\":\")[0]]\n", + "output_op_names = [model.output.name.split(\":\")[0]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are checking if TensorFlow is using CPU or CUDA device. This example code will use CUDA if available in your current execution environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = tf.test.is_gpu_available(cuda_only=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "\n", + "## 3. Apply QuantAnalyzer to the model\n", + "\n", + "QuantAnalyzer requires two functions to be defined by the user for passing data through the model:\n", + "\n", + "**Forward pass callback**\n", + "\n", + "One function will be used to pass representative data through a quantized version of the model to calibrate quantization parameters.\n", + "This function should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model.\n", + "We don't need to compute any loss metrics, so we can just ignore the model output.\n", + "\n", + "The function **must** take two arguments, the first of which will be the session to run the forward pass on.\n", + "The second argument can be anything additional which the function requires to run, and can be in the form of a single item or a tuple of items.\n", + "\n", + "If no additional argument is needed, the user can specify a dummy \"_\" parameter for the function.\n", + "\n", + "A few pointers regarding the forward pass data samples:\n", + "\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + " For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed.\n", + " It's not necessary that all classes need to be covered since we are only looking at the range of values at every op activation.\n", + " However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings.\n", + "This routine can be written in many different ways; this is just an example.\n", + "This function only requires unlabeled data as no loss or other evaluation metric is needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def pass_calibration_data(session: tf.compat.v1.Session, _):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " input_label_tensors = [session.graph.get_tensor_by_name('input_1:0'),\n", + " session.graph.get_tensor_by_name('labels:0')]\n", + " \n", + " train_tensors = [session.graph.get_tensor_by_name('keras_learning_phase:0')]\n", + " train_tensors_dict = dict.fromkeys(train_tensors, False)\n", + " \n", + " eval_outputs = [session.graph.get_operation_by_name('top1-acc').outputs[0]]\n", + "\n", + " samples = 500\n", + "\n", + " batch_cntr = 0\n", + " for input_label in data_loader:\n", + " input_label_tensors_dict = dict(zip(input_label_tensors, input_label))\n", + "\n", + " feed_dict = {**input_label_tensors_dict, **train_tensors_dict}\n", + "\n", + " with session.graph.as_default():\n", + " _ = session.run(eval_outputs, feed_dict=feed_dict)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "In order to pass this function to QuantAnalyzer, we need to wrap it in a CallbackFunc object, as shown below.\n", + "The CallbackFunc takes two arguments: the callback function itself, and the inputs to pass into the callback function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_common.utils import CallbackFunc\n", + "\n", + "forward_pass_callback = CallbackFunc(func=pass_calibration_data, func_callback_args=None)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "\n", + "**Evaluation callback**\n", + "\n", + "The second function will be used to evaluate the model, and needs to return an accuracy metric.\n", + "In here, the user should pass any amount of data through the model which they would like when evaluating their model for accuracy.\n", + "\n", + "Like the forward pass callback, this function also must take exactly two arguments: the session to evaluate, and any additional argument needed for the function to work.\n", + "The second argument can be a tuple of items in case multiple items are needed.\n", + "\n", + "We will be using the ImageNetDataPipeline's evaluate defined above for this purpose.\n", + "Like the forward pass callback, we need to wrap the evaluation callback in a CallbackFunc object as well." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "data_pipeline = ImageNetDataPipeline()\n", + "eval_callback = CallbackFunc(func=ImageNetDataPipeline.evaluate)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "\n", + "**Creating unlabeled dataset and defining number of batches for MSE loss per op analysis**\n", + "\n", + "An optional analysis step in QuantAnalyzer calculates the MSE loss per op in the model, comparing the op outputs from the original FP32 model vs. a quantized model.\n", + "To perform this step, the user needs to also provide an unlabeled Dataset to QuantAnalyzer.\n", + "\n", + "We will demonstrate this step by using the ImageNetDataLoader imported above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "dataset = data_pipeline.get_val_dataloader().dataset\n", + " \n", + "with dataset._graph.as_default():\n", + " unlabeled_dataset = dataset.map(lambda x,y: x)\n", + "num_batches = 4 " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "We are now ready to apply QuantAnalyzer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_tensorflow.quant_analyzer import QuantAnalyzer\n", + "\n", + "quant_analyzer = QuantAnalyzer(sess, start_op_names=starting_op_names, output_op_names=output_op_names,\n", + " forward_pass_callback=forward_pass_callback, eval_callback=eval_callback, use_cuda= use_cuda)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Finally, to start the analyzer, we call analyze()\n", + "\n", + "A few of the parameters are explained here:\n", + "- **quant_scheme**:\n", + " - We set this to \"post_training_tf_enhanced\"\n", + " With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset.\n", + "- **default_output_bw**: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision.\n", + "- **default_param_bw**: Setting this to 8 means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision.\n", + "\n", + "There are other parameters that are set to default values in this example.\n", + "Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.\n", + "\n", + "When analyze method is called, the following analyses are run:\n", + "- Compare fp32 accuracy, accuracy with only parameters quantized and accuracy with only activations quantized\n", + "- For each op, track the model accuracy when quantization for all other ops is disabled (enabling quantization for only one op in the model at a time)\n", + "- For each op, track the model accuracy when quantization for all other ops is enabled (disabling quantization for only one op in the model at a time)\n", + "- Track the minimum and maximum encoding parameters calculated by each quantizer in the model as a result of forward passes through the model with representative data\n", + "- When the TF Enhanced quantization scheme is used, track the histogram of tensor ranges seen by each quantizer in the model as a result of forward passes through the model with representative data\n", + "- Track the MSE loss seen at each op by comparing op outputs of the original fp32 model vs. a quantized model when user has provided unlabeled dataset and number of batches" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "\n", + "quant_analyzer.analyze(default_param_bw=8, default_output_bw=8,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " config_file=None,\n", + " unlabeled_dataset=unlabeled_dataset, num_batches=num_batches,\n", + " results_dir='./tmp/')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET will also output .html plots and json files where appropriate for each analysis to help visualize the data.\n", + "\n", + "The following output files will be produced, in a folder specified by the user:\n", + "\n", + "```\n", + "results_dir\n", + "|-- per_op_quant_enabled.html\n", + "|-- per_op_quant_enabled.json\n", + "|-- per_op_quant_disabled.html\n", + "|-- per_op_quant_disabled.json\n", + "|-- min_max_ranges\n", + "| |-- activations.html\n", + "| |-- activations.json\n", + "| |-- weights.html\n", + "| +-- weights.json\n", + "|-- activations_pdf\n", + "| |-- quant_op_name0.html\n", + "| |-- quant_op_name1.html\n", + "| |-- ...\n", + "| +-- quant_op_nameN.html\n", + "|-- weights_pdf\n", + "| |-- op1\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| | +-- param_name_{channel_index_x}.html\n", + "| |-- op2\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| | +-- param_name_{channel_index_y}.html\n", + "| |-- ...\n", + "| |-- opn\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| +-- +-- param_name_{channel_index_z}.html\n", + "|-- per_op_mse_loss.html\n", + "+-- per_op_mse_loss.json\n", + "```\n", + "\n", + "#### Per op analysis by enabling/disabling quantization ops\n", + "\n", + "- per_op_quant_enabled.html: A plot with ops on the x-axis and model accuracy on the y-axis, where each op's accuracy represents the model accuracy when all quantizers in the model are disabled except for that op's parameter and activation quantizers.\n", + "- per_op_quant_enabled.json: A json file containing the data shown in per_op_quant_enabled.html, associating op names with model accuracy.\n", + "- per_op_quant_disabled.html: A plot with ops on the x-axis and model accuracy on the y-axis, where each op's accuracy represents the model accuracy when all quantizers in the model are enabled except for that op's parameter and activation quantizers.\n", + "- per_op_quant_disabled.json: A json file containing the data shown in per_op_quant_disabled.html, associating op names with model accuracy.\n", + "\n", + "![per_op_quant_enabled.html](images/tf_quant_analyzer_per_op_quant_enabled.png)\n", + "\n", + "#### Encoding min/max ranges\n", + "\n", + "- min_max_ranges: A folder containing the following sets of files:\n", + " - activations.html: A plot with output activations on the x-axis and min-max values on the y-axis, where each output activation's range represents the encoding min and max parameters computed during forward pass calibration.\n", + " - activations.json: A json file containing the data shown in activations.html, associating op names with min and max encoding values.\n", + " - weights.html: A plot with parameter names on the x-axis and min-max values on the y-axis, where each parameter's range represents the encoding min and max parameters computed during forward pass calibration.\n", + " - weights.json: A json file containing the data shown in weights.html, associating parameter names with min and max encoding values.\n", + "\n", + "![min_max_ranges.html](images/tf_quant_analyzer_min_max_range_weights.png)\n", + "\n", + "#### PDF of statistics\n", + "\n", + "- (If TF Enhanced quant scheme is used) activations_pdf: A folder containing html files for each op, plotting the histogram of tensor values seen for that op's output activation seen during forward pass calibration.\n", + "- (If TF Enhanced quant scheme is used) weights_pdf: A folder containing sub folders for each op with weights.\n", + " Each op's folder contains html files for each parameter of that op, with a histogram plot of tensor values seen for that parameter seen during forward pass calibration.\n", + "\n", + "![weights_pdf.html](images/tf_quant_analyzer_pdf.png)\n", + "\n", + "#### Per op MSE loss\n", + "- (Optional, only enabled when user has provided unlabeled dataset and number of batches) per_op_mse_loss.html: A plot with ops on the x-axis and MSE loss on the y-axis, where each op's MSE loss represents the MSE seen comparing that op's outputs in the FP32 model vs. the quantized model.\n", + "- (Optional, only enabled when user has provided unlabeled dataset and number of batches) per_op_mse_loss.json: A json file containing the data shown in per_op_mse_loss.html, associating op names with MSE loss.\n", + "\n", + "![per_op_mse_loss.html](images/tf_quant_analyzer_mse_loss.png)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/releases/1.32.2/Examples/torch/compression/channel_pruning.html b/releases/1.32.2/Examples/torch/compression/channel_pruning.html new file mode 100644 index 0000000..0608889 --- /dev/null +++ b/releases/1.32.2/Examples/torch/compression/channel_pruning.html @@ -0,0 +1,1401 @@ + + + + + + Model compression using Channel Pruning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Model compression using Channel Pruning

+

This notebook shows a working code example of how to use AIMET to perform model compression. The Channel Pruning technique is used in this notebook to achieve model compression.

+

Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.

+
    +
  1. Spatial SVD: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate +convolutional layers.

  2. +
  3. Channel Pruning: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer +output of the original model.

  4. +
+

Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.

+

This notebook shows working code example of how the technique #2 can be used to compress the model. You can find a separate notebook for #1, and #1 followed by #2 in the same folder.

+
+

Overall flow

+
+
This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the model and evaluate it to find the baseline accuracy 3. Compress the model and fine-tune:
+
3.1 Compress model using Channel Pruning and evaluate it to find post-compression accuracy
+
3.2 Fine-tune the model
+
+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from typing import List
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, iterations: int, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be
+                           evaluated on the entire dataset once.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=iterations, use_cuda=use_cuda)
+
+    @staticmethod
+    def finetune(model: torch.nn.Module, epochs: int, learning_rate: float, learning_rate_schedule: List, use_cuda: bool):
+        """
+        Given a torch model, finetunes the model to improve its accuracy
+        :param model: the model to finetune
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param learning_rate_schedule: The learning rate schedule used during the finetuning step.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_workers=image_net_config.train['num_workers'])
+
+        trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,
+                      learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate it to find the baseline accuracy

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+
+

3. Compress the model and fine-tune

+
+

3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy

+

Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here

+
    +
  • target_comp_ratio: The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.

  • +
  • num_comp_ratio_candidates: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.

  • +
  • modules_to_ignore: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.

  • +
  • mode: We are chossing Auto mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is Manual.

  • +
  • data_loader: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.

  • +
  • num_reconstruction_samples: The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.

  • +
  • allow_custom_downsample_ops: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.

  • +
  • eval_callback: The model evaluation function. The expected signature of the evaluate function should be <function_name>(model, eval_iterations, use_cuda) and it is expected to return an accuracy metric.

  • +
  • eval_iterations: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.

  • +
  • compress_scheme: We choose the ‘channel pruning’ compression scheme.

  • +
  • cost_metric: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing ‘mac’ here.

  • +
+
+
[ ]:
+
+
+
from decimal import Decimal
+from aimet_torch.defs import GreedySelectionParameters, ChannelPruningParameters
+from aimet_common.defs import CompressionScheme, CostMetric
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),
+                                          num_comp_ratio_candidates=3)
+modules_to_ignore = [model.conv1]
+auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                      modules_to_ignore=modules_to_ignore)
+data_loader = ImageNetDataPipeline.get_val_dataloader()
+params = ChannelPruningParameters(data_loader=data_loader,
+                                  num_reconstruction_samples=10,
+                                  allow_custom_downsample_ops=False,
+                                  mode=ChannelPruningParameters.Mode.auto,
+                                  params=auto_params)
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme = CompressionScheme.channel_pruning
+cost_metric = CostMetric.mac
+
+
+
+
+
+
We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.
+
Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.
+
+
+
[ ]:
+
+
+
from aimet_torch.compress import ModelCompressor
+compressed_model, comp_stats = ModelCompressor.compress_model(model=model,
+                                                              eval_callback=eval_callback,
+                                                              eval_iterations=eval_iterations,
+                                                              input_shape=(1, 3, 224, 224),
+                                                              compress_scheme=compress_scheme,
+                                                              cost_metric=cost_metric,
+                                                              parameters=params)
+
+print(comp_stats)
+
+
+
+
+

Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.2. Fine-tune the model

+

After the model is compressed using Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(compressed_model, epochs=2, learning_rate=15e-4, learning_rate_schedule=[5, 10],
+                              use_cuda=use_cuda)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using Channel Pruning. Optionally, this model now can be saved like a regular PyTorch model.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+torch.save(compressed_model, './output/finetuned_model')
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing compression with Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/compression/channel_pruning.ipynb b/releases/1.32.2/Examples/torch/compression/channel_pruning.ipynb new file mode 100644 index 0000000..e19e360 --- /dev/null +++ b/releases/1.32.2/Examples/torch/compression/channel_pruning.ipynb @@ -0,0 +1,408 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model compression using Channel Pruning \n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform model compression. The Channel Pruning technique is used in this notebook to achieve model compression.\n", + "\n", + "Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.\n", + "\n", + "1. **Spatial SVD**: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate convolutional layers.\n", + "2. **Channel Pruning**: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer output of the original model.\n", + "\n", + "Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.\n", + "\n", + "This notebook shows working code example of how the technique #2 can be used to compress the model. You can find a separate notebook for #1, and #1 followed by #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the model and evaluate it to find the baseline accuracy\n", + "3. Compress the model and fine-tune: \n", + " 3.1 Compress model using Channel Pruning and evaluate it to find post-compression accuracy \n", + " 3.2 Fine-tune the model\n", + "\n", + "\n", + "#### What this notebook is not \n", + "* This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from typing import List\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, iterations: int, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be\n", + " evaluated on the entire dataset once.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=iterations, use_cuda=use_cuda)\n", + "\n", + " @staticmethod\n", + " def finetune(model: torch.nn.Module, epochs: int, learning_rate: float, learning_rate_schedule: List, use_cuda: bool):\n", + " \"\"\"\n", + " Given a torch model, finetunes the model to improve its accuracy\n", + " :param model: the model to finetune\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param learning_rate_schedule: The learning rate schedule used during the finetuning step.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_workers=image_net_config.train['num_workers'])\n", + "\n", + " trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,\n", + " learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate it to find the baseline accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compress the model and fine-tune\n", + "\n", + "### 3.1. Compress model using Channel Pruning and evaluate it to find post-compression accuracy\n", + "Now we use AIMET to define compression parameters for Channel Pruning, few of which are explained here\n", + "\n", + "- **target_comp_ratio**: The desired compression ratio for Channel Pruning. We are using 0.9 to compress the model by 10%.\n", + "\n", + "- **num_comp_ratio_candidates**: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.\n", + "\n", + "- **modules_to_ignore**: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.\n", + "\n", + "- **mode**: We are chossing **Auto** mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is **Manual**.\n", + "\n", + "- **data_loader**: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.\n", + "\n", + "- **num_reconstruction_samples**: The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.\n", + "\n", + "- **allow_custom_downsample_ops**: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.\n", + "\n", + "- **eval_callback**: The model evaluation function. The expected signature of the evaluate function should be `(model, eval_iterations, use_cuda)` and it is expected to return an accuracy metric.\n", + "\n", + "- **eval_iterations**: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.\n", + "\n", + "- **compress_scheme**: We choose the 'channel pruning' compression scheme.\n", + "\n", + "- **cost_metric**: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing 'mac' here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "from aimet_torch.defs import GreedySelectionParameters, ChannelPruningParameters\n", + "from aimet_common.defs import CompressionScheme, CostMetric\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),\n", + " num_comp_ratio_candidates=3)\n", + "modules_to_ignore = [model.conv1]\n", + "auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params,\n", + " modules_to_ignore=modules_to_ignore)\n", + "data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + "params = ChannelPruningParameters(data_loader=data_loader,\n", + " num_reconstruction_samples=10,\n", + " allow_custom_downsample_ops=False,\n", + " mode=ChannelPruningParameters.Mode.auto,\n", + " params=auto_params)\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.channel_pruning\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_torch.compress import ModelCompressor\n", + "compressed_model, comp_stats = ModelCompressor.compress_model(model=model,\n", + " eval_callback=eval_callback,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. Fine-tune the model\n", + "\n", + "After the model is compressed using Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(compressed_model, epochs=2, learning_rate=15e-4, learning_rate_schedule=[5, 10],\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using Channel Pruning. Optionally, this model now can be saved like a regular PyTorch model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "torch.save(compressed_model, './output/finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing compression with Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/compression/spatial_svd.html b/releases/1.32.2/Examples/torch/compression/spatial_svd.html new file mode 100644 index 0000000..8876ec5 --- /dev/null +++ b/releases/1.32.2/Examples/torch/compression/spatial_svd.html @@ -0,0 +1,1380 @@ + + + + + + Model compression using Spatial SVD — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Model compression using Spatial SVD

+

This notebook shows a working code example of how to use AIMET to perform model compression. The Spatial SVD technique is used in this notebook to achieve model compression.

+

Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.

+
    +
  1. Spatial SVD: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate +convolutional layers.

  2. +
  3. Channel Pruning: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer +output of the original model.

  4. +
+

Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.

+

This notebook shows working code example of how the technique #1 can be used to compress the model. You can find a separate notebook for #2, and #1 followed by #2 in the same folder.

+
+

Overall flow

+
+
This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the model and evaluate it to find the baseline accuracy 3. Compress the model and fine-tune:
+
3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy
+
3.2 Fine-tune the model
+
+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from typing import List
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, iterations: int, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be
+                           evaluated on the entire dataset once.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=iterations, use_cuda=use_cuda)
+
+    @staticmethod
+    def finetune(model: torch.nn.Module, epochs: int, learning_rate: float, learning_rate_schedule: List, use_cuda: bool):
+        """
+        Given a torch model, finetunes the model to improve its accuracy
+        :param model: the model to finetune
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param learning_rate_schedule: The learning rate schedule used during the finetuning step.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_workers=image_net_config.train['num_workers'])
+
+        trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,
+                      learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate it to find the baseline accuracy

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+
+

3. Compress the model and fine-tune

+
+

3.1. Compress model using Spatial SVD and evaluate it to find post-compression accuracy

+

Now we use AIMET to define compression parameters for Spatial SVD, few of which are explained here

+
    +
  • target_comp_ratio: The desired compression ratio for Spatial SVD. We are using 0.8 to compress the model by 20%.

  • +
  • num_comp_ratio_candidates: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.

  • +
  • modules_to_ignore: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.

  • +
  • mode: We are chossing Auto mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is Manual.

  • +
  • eval_callback: The model evaluation function. The expected signature of the evaluate function should be <function_name>(model, eval_iterations, use_cuda) and it is expected to return an accuracy metric.

  • +
  • eval_iterations: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.

  • +
  • compress_scheme: We choose the ‘spatial svd’ compression scheme.

  • +
  • cost_metric: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing ‘mac’ here.

  • +
+
+
[ ]:
+
+
+
from decimal import Decimal
+from aimet_torch.defs import GreedySelectionParameters, SpatialSvdParameters
+from aimet_common.defs import CompressionScheme, CostMetric
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.8),
+                                          num_comp_ratio_candidates=3)
+modules_to_ignore = [model.conv1]
+auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                  modules_to_ignore=modules_to_ignore)
+params = SpatialSvdParameters(mode=SpatialSvdParameters.Mode.auto, params=auto_params)
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme = CompressionScheme.spatial_svd
+cost_metric = CostMetric.mac
+
+
+
+
+
+
We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.
+
Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.
+
+
+
[ ]:
+
+
+
from aimet_torch.compress import ModelCompressor
+compressed_model, comp_stats = ModelCompressor.compress_model(model=model,
+                                                              eval_callback=eval_callback,
+                                                              eval_iterations=eval_iterations,
+                                                              input_shape=(1, 3, 224, 224),
+                                                              compress_scheme=compress_scheme,
+                                                              cost_metric=cost_metric,
+                                                              parameters=params)
+
+print(comp_stats)
+
+
+
+
+

Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.2. Fine-tune the model

+

After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(compressed_model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10],
+                              use_cuda=use_cuda)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular PyTorch model.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+torch.save(compressed_model, './output/finetuned_model')
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD. As indicated above, some parameters have been chosen in a way to run the example faster.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/compression/spatial_svd.ipynb b/releases/1.32.2/Examples/torch/compression/spatial_svd.ipynb new file mode 100644 index 0000000..2d16573 --- /dev/null +++ b/releases/1.32.2/Examples/torch/compression/spatial_svd.ipynb @@ -0,0 +1,384 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model compression using Spatial SVD \n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform model compression. The Spatial SVD technique is used in this notebook to achieve model compression.\n", + "\n", + "Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.\n", + "\n", + "1. **Spatial SVD**: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate convolutional layers.\n", + "2. **Channel Pruning**: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer output of the original model.\n", + "\n", + "Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.\n", + "\n", + "This notebook shows working code example of how the technique #1 can be used to compress the model. You can find a separate notebook for #2, and #1 followed by #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the model and evaluate it to find the baseline accuracy\n", + "3. Compress the model and fine-tune: \n", + " 3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy \n", + " 3.2 Fine-tune the model\n", + "\n", + "\n", + "#### What this notebook is not \n", + "* This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from typing import List\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, iterations: int, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be\n", + " evaluated on the entire dataset once.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=iterations, use_cuda=use_cuda)\n", + "\n", + " @staticmethod\n", + " def finetune(model: torch.nn.Module, epochs: int, learning_rate: float, learning_rate_schedule: List, use_cuda: bool):\n", + " \"\"\"\n", + " Given a torch model, finetunes the model to improve its accuracy\n", + " :param model: the model to finetune\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param learning_rate_schedule: The learning rate schedule used during the finetuning step.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_workers=image_net_config.train['num_workers'])\n", + "\n", + " trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,\n", + " learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate it to find the baseline accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compress the model and fine-tune\n", + "\n", + "### 3.1. Compress model using Spatial SVD and evaluate it to find post-compression accuracy\n", + "Now we use AIMET to define compression parameters for Spatial SVD, few of which are explained here\n", + "\n", + "- **target_comp_ratio**: The desired compression ratio for Spatial SVD. We are using 0.8 to compress the model by 20%.\n", + "\n", + "- **num_comp_ratio_candidates**: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.\n", + "\n", + "- **modules_to_ignore**: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.\n", + "\n", + "- **mode**: We are chossing **Auto** mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is **Manual**.\n", + "\n", + "- **eval_callback**: The model evaluation function. The expected signature of the evaluate function should be `(model, eval_iterations, use_cuda)` and it is expected to return an accuracy metric.\n", + "\n", + "- **eval_iterations**: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.\n", + "\n", + "- **compress_scheme**: We choose the 'spatial svd' compression scheme.\n", + "\n", + "- **cost_metric**: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing 'mac' here.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "from aimet_torch.defs import GreedySelectionParameters, SpatialSvdParameters\n", + "from aimet_common.defs import CompressionScheme, CostMetric\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.8),\n", + " num_comp_ratio_candidates=3)\n", + "modules_to_ignore = [model.conv1]\n", + "auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,\n", + " modules_to_ignore=modules_to_ignore)\n", + "params = SpatialSvdParameters(mode=SpatialSvdParameters.Mode.auto, params=auto_params)\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.spatial_svd\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_torch.compress import ModelCompressor\n", + "compressed_model, comp_stats = ModelCompressor.compress_model(model=model,\n", + " eval_callback=eval_callback,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. Fine-tune the model\n", + "\n", + "After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(compressed_model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10],\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular PyTorch model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "torch.save(compressed_model, './output/finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD. As indicated above, some parameters have been chosen in a way to run the example faster.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.html b/releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.html new file mode 100644 index 0000000..f55bf92 --- /dev/null +++ b/releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.html @@ -0,0 +1,1504 @@ + + + + + + Model compression using Spatial SVD followed by Channel Pruning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Model compression using Spatial SVD followed by Channel Pruning

+

This notebook shows a working code example of how to use AIMET to perform model compression. Two model-compression techniques are applied back-to-back: Spatial SVD followed by Channel Pruning.

+

Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.

+
    +
  1. Spatial SVD: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate +convolutional layers.

  2. +
  3. Channel Pruning: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer +output of the original model.

  4. +
+

Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.

+

This notebook shows working code example of how both the techniques (#1 and #2) can be used to compress the model. You can find a separate notebook for only #1 or #2 in the same folder.

+
+

Overall flow

+
+
This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the model and evaluate it to find the baseline accuracy 3. Compress the model and fine-tune:
+
3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy
+
3.2 Fine-tune the model after Spatial SVD
+
3.3 Compress model using Channel Pruning and evaluate it to find post-compression accuracy
+
3.4 Fine-tune the model after Channel Pruning
+
+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from typing import List
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, iterations: int, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be
+                           evaluated on the entire dataset once.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=iterations, use_cuda=use_cuda)
+
+    @staticmethod
+    def finetune(model: torch.nn.Module, epochs: int, learning_rate: float, learning_rate_schedule: List, use_cuda: bool):
+        """
+        Given a torch model, finetunes the model to improve its accuracy
+        :param model: the model to finetune
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param learning_rate_schedule: The learning rate schedule used during the finetuning step.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_workers=image_net_config.train['num_workers'])
+
+        trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,
+                      learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate it to find the baseline accuracy

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+
+

3. Compress the model and fine-tune

+
+

3.1. Compress model using Spatial SVD and evaluate it to find post-compression accuracy

+

Now we use AIMET to define compression parameters for Spatial SVD, few of which are explained here

+
    +
  • target_comp_ratio: The desired compression ratio for Spatial SVD. We are using 0.8 to compress the model by 20%.

  • +
  • num_comp_ratio_candidates: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.

  • +
  • modules_to_ignore: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.

  • +
  • mode: We are chossing Auto mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is Manual.

  • +
  • eval_callback: The model evaluation function. The expected signature of the evaluate function should be <function_name>(model, eval_iterations, use_cuda) and it is expected to return an accuracy metric.

  • +
  • eval_iterations: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.

  • +
  • compress_scheme: We choose the ‘spatial svd’ compression scheme.

  • +
  • cost_metric: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing ‘mac’ here.

  • +
+
+
[ ]:
+
+
+
from decimal import Decimal
+from aimet_torch.defs import GreedySelectionParameters, SpatialSvdParameters
+from aimet_common.defs import CompressionScheme, CostMetric
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.8),
+                                          num_comp_ratio_candidates=3)
+modules_to_ignore = [model.conv1]
+auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                  modules_to_ignore=modules_to_ignore)
+params = SpatialSvdParameters(mode=SpatialSvdParameters.Mode.auto, params=auto_params)
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme = CompressionScheme.spatial_svd
+cost_metric = CostMetric.mac
+
+
+
+
+
+
We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.
+
Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.
+
+
+
[ ]:
+
+
+
from aimet_torch.compress import ModelCompressor
+ssvd_compressed_model, ssvd_comp_stats = ModelCompressor.compress_model(model=model,
+                                                                        eval_callback=eval_callback,
+                                                                        eval_iterations=eval_iterations,
+                                                                        input_shape=(1, 3, 224, 224),
+                                                                        compress_scheme=compress_scheme,
+                                                                        cost_metric=cost_metric,
+                                                                        parameters=params)
+
+print(ssvd_comp_stats)
+
+
+
+
+

Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.2. Fine-tune the model after Spatial SVD

+

After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(ssvd_compressed_model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10],
+                              use_cuda=use_cuda)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular PyTorch model.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+torch.save(ssvd_compressed_model, './output/ssvd_finetuned_model')
+
+
+
+
+
+

3.3. Compress model using Channel Pruning and evaluate it to find post-compression accuracy

+
+
The fine-tuned model, compressed with Spatial SVD, can be further compressed using Channel Pruning method.
+
Similar to Spatial SVD, we will first define the parameters for Channel Pruning compression, out of which mostly are same as of Spatial SVD. The other parameters for Channel Pruning are as follows:
+
+
    +
  • data_loader: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.

  • +
  • num_reconstruction_samples: The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.

  • +
  • allow_custom_downsample_ops: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default.

  • +
+
+
[ ]:
+
+
+
from aimet_torch.defs import ChannelPruningParameters
+
+greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),
+                                          num_comp_ratio_candidates=3)
+modules_to_ignore = [ssvd_compressed_model.conv1]
+auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params,
+                                                      modules_to_ignore=modules_to_ignore)
+
+data_loader = ImageNetDataPipeline.get_val_dataloader()
+params = ChannelPruningParameters(data_loader=data_loader,
+                                  num_reconstruction_samples=10,
+                                  allow_custom_downsample_ops=False,
+                                  mode=ChannelPruningParameters.Mode.auto,
+                                  params=auto_params)
+
+eval_callback = ImageNetDataPipeline.evaluate
+eval_iterations = 1
+compress_scheme = CompressionScheme.channel_pruning
+cost_metric = CostMetric.mac
+
+
+
+
+
+
We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics.
+
Note: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.
+
+
+
[ ]:
+
+
+
ssvd_cp_compressed_model, cp_comp_stats = ModelCompressor.compress_model(model=ssvd_compressed_model,
+                                                                         eval_callback=eval_callback,
+                                                                         eval_iterations=eval_iterations,
+                                                                         input_shape=(1, 3, 224, 224),
+                                                                         compress_scheme=compress_scheme,
+                                                                         cost_metric=cost_metric,
+                                                                         parameters=params)
+
+print(cp_comp_stats)
+
+
+
+
+

Ok so we have a compressed model. We can pass this model to the same evaluation routine we used before to calculated compressed model accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back.

+
+
+

3.4. Fine-tune the model after Channel Pruning

+

After the model is compressed using Spatial SVD followed by Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(ssvd_cp_compressed_model, epochs=2, learning_rate=15e-4, learning_rate_schedule=[1],
+                              use_cuda=use_cuda)
+
+
+
+
+

After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_model, iterations=None, use_cuda=use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after compression using spatial SVD followed by Channel Pruning. Optionally, this model now can be saved like a regular PyTorch model.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+torch.save(ssvd_cp_compressed_model, './output/ssvd_cp_finetuned_model')
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD followed by Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.ipynb b/releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.ipynb new file mode 100644 index 0000000..336803f --- /dev/null +++ b/releases/1.32.2/Examples/torch/compression/spatial_svd_channel_pruning.ipynb @@ -0,0 +1,555 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model compression using Spatial SVD followed by Channel Pruning \n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform model compression. Two model-compression techniques are applied back-to-back: Spatial SVD followed by Channel Pruning.\n", + "\n", + "Here is a brief introduction to the techniques. Please refer to the AIMET user guide for more details.\n", + "\n", + "1. **Spatial SVD**: This is a tensor-decomposition technique generally applied to convolutional layers (Conv2D). Applying this technique will decompose a single convolutional layer into two. The weight tensor of the layer to be split is flattended to a 2D matrix and singular value decomposition (SVD) is applied to this matrix. Compression is achieved by discarding the least significant singular values in the diagonal matrix. The decomposed matrices are combined back into two separate convolutional layers.\n", + "2. **Channel Pruning**: In this technique AIMET will discard least significant (using a magnitude metric) input channels of a given convolutional (Conv2D) layer. The layers of the model feeding into this convolutional layer also have the channels dimension modified to get back to a working graph. This technique also uses a layer-by-layer reconstruction procedure that modifies the weights of the compressed layers to minimize the distance of the compressed layer output to the corresponding layer output of the original model.\n", + "\n", + "Both of the above techniques are structured pruning techniques that aim to reduce computational macs or memory requirements of the model. Subsequent to applying either of these techniques, the compressed model needs to be fine-tuned (meaning trained again for a few epochs) to recover accuracy close to the original model.\n", + "\n", + "This notebook shows working code example of how both the techniques (#1 and #2) can be used to compress the model. You can find a separate notebook for only #1 or #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the model and evaluate it to find the baseline accuracy\n", + "3. Compress the model and fine-tune: \n", + " 3.1 Compress model using Spatial SVD and evaluate it to find post-compression accuracy \n", + " 3.2 Fine-tune the model after Spatial SVD \n", + " 3.3 Compress model using Channel Pruning and evaluate it to find post-compression accuracy \n", + " 3.4 Fine-tune the model after Channel Pruning \n", + "\n", + "\n", + "#### What this notebook is not \n", + "* This notebook is not designed to show state-of-the-art compression results. For example, some optimization parameters such as num_comp_ratio_candidates, num_eval_iterations and epochs are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to compress it and the resultant model is still a PyTorch model. This compressed model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really, but evaluate() method should return a single number representing the accuracy of the model. Ideally, You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from typing import List\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, iterations: int, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be\n", + " evaluated on the entire dataset once.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=iterations, use_cuda=use_cuda)\n", + "\n", + " @staticmethod\n", + " def finetune(model: torch.nn.Module, epochs: int, learning_rate: float, learning_rate_schedule: List, use_cuda: bool):\n", + " \"\"\"\n", + " Given a torch model, finetunes the model to improve its accuracy\n", + " :param model: the model to finetune\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param learning_rate_schedule: The learning rate schedule used during the finetuning step.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_workers=image_net_config.train['num_workers'])\n", + "\n", + " trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,\n", + " learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate it to find the baseline accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compress the model and fine-tune\n", + "\n", + "### 3.1. Compress model using Spatial SVD and evaluate it to find post-compression accuracy\n", + "Now we use AIMET to define compression parameters for Spatial SVD, few of which are explained here\n", + "\n", + "- **target_comp_ratio**: The desired compression ratio for Spatial SVD. We are using 0.8 to compress the model by 20%.\n", + "\n", + "- **num_comp_ratio_candidates**: As part of determining how compressible each layer is, AIMET performs various measurements. This number denotes the different compression ratios tried by the AIMET for each layer. We are using 3 here which translates to 0.33, 0.66 and 1.00 compression ratios at each layer. Optimal value is 10. The higher the number of candidates the more granular the measurements for each layer, but also the higher the time taken to complete these measurements.\n", + "\n", + "- **modules_to_ignore**: This list can contain the references of model-layers that should be ignored during compression. We have added the first layer to be ignored to preserve the way the input interacts with the model; other layers can be added too if desired.\n", + "\n", + "- **mode**: We are chossing **Auto** mode which means AIMET performs per-layer compressibility analysis and determines how much to compress each layer. The alternate choice is **Manual**.\n", + "\n", + "- **eval_callback**: The model evaluation function. The expected signature of the evaluate function should be `(model, eval_iterations, use_cuda)` and it is expected to return an accuracy metric.\n", + "\n", + "- **eval_iterations**: The number of batches of data to use for evaluating the model while the model is compressing. We are using 1 to speed up the notebook execution. But please choose a high enough number of samples so that we can trust the accuracy of the model given those samples. It is expected that the eval callback would use the same samples for every invocation of the callback.\n", + "\n", + "- **compress_scheme**: We choose the 'spatial svd' compression scheme.\n", + "\n", + "- **cost_metric**: Determines whether we want to target either to reduce MACs or memory by the desired compression ratio. We are chossing 'mac' here.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal\n", + "from aimet_torch.defs import GreedySelectionParameters, SpatialSvdParameters\n", + "from aimet_common.defs import CompressionScheme, CostMetric\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.8),\n", + " num_comp_ratio_candidates=3)\n", + "modules_to_ignore = [model.conv1]\n", + "auto_params = SpatialSvdParameters.AutoModeParams(greedy_select_params=greedy_params,\n", + " modules_to_ignore=modules_to_ignore)\n", + "params = SpatialSvdParameters(mode=SpatialSvdParameters.Mode.auto, params=auto_params)\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.spatial_svd\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_torch.compress import ModelCompressor\n", + "ssvd_compressed_model, ssvd_comp_stats = ModelCompressor.compress_model(model=model,\n", + " eval_callback=eval_callback,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(ssvd_comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the compressed model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2. Fine-tune the model after Spatial SVD\n", + "\n", + "After the model is compressed using Spatial SVD, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(ssvd_compressed_model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10],\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you should have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using spatial SVD. Optionally, this model now can be saved like a regular PyTorch model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "torch.save(ssvd_compressed_model, './output/ssvd_finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.3. Compress model using Channel Pruning and evaluate it to find post-compression accuracy\n", + "\n", + "The fine-tuned model, compressed with Spatial SVD, can be further compressed using Channel Pruning method. \n", + "Similar to Spatial SVD, we will first define the parameters for Channel Pruning compression, out of which mostly are same as of Spatial SVD. The other parameters for Channel Pruning are as follows:\n", + "\n", + "- **data_loader**: Channel Pruning uses unlabelled data samples for the layer-by-layer reconstruction procedure explained at the start. This provided data loader is used to retrieve those samples. You can just pass your existing data loader - say for the validation or training dataset.\n", + "\n", + "- **num_reconstruction_samples**: The number of samples used in the layer-by-layer reconstruction procedure. We are using 10 here which is a ridiculously low number but enables this notebook to execute quickly. A typical setting here would ~1000 samples.\n", + "\n", + "- **allow_custom_downsample_ops**: If this flag is enabled, AIMET Channel Pruning will insert downsample ops into the model graph if needed. Enabling this can enable more convolutional layers to be considered for pruning, but it may increase memory bandwidth overhead for the additional downsample layers. So there is a trade-off to be considered. We suggest disabling this by default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.defs import ChannelPruningParameters\n", + "\n", + "greedy_params = GreedySelectionParameters(target_comp_ratio=Decimal(0.9),\n", + " num_comp_ratio_candidates=3)\n", + "modules_to_ignore = [ssvd_compressed_model.conv1]\n", + "auto_params = ChannelPruningParameters.AutoModeParams(greedy_select_params=greedy_params,\n", + " modules_to_ignore=modules_to_ignore)\n", + "\n", + "data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + "params = ChannelPruningParameters(data_loader=data_loader,\n", + " num_reconstruction_samples=10,\n", + " allow_custom_downsample_ops=False,\n", + " mode=ChannelPruningParameters.Mode.auto,\n", + " params=auto_params)\n", + "\n", + "eval_callback = ImageNetDataPipeline.evaluate\n", + "eval_iterations = 1\n", + "compress_scheme = CompressionScheme.channel_pruning\n", + "cost_metric = CostMetric.mac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We call the AIMET ModelCompressor.compress_model API using the above parameters. This call returns a compressed model as well as relevant statistics. \n", + "**Note**: the ModelCompressor evaluates the model while compressing using the same evaluate function that is in our data pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "ssvd_cp_compressed_model, cp_comp_stats = ModelCompressor.compress_model(model=ssvd_compressed_model,\n", + " eval_callback=eval_callback,\n", + " eval_iterations=eval_iterations,\n", + " input_shape=(1, 3, 224, 224),\n", + " compress_scheme=compress_scheme,\n", + " cost_metric=cost_metric,\n", + " parameters=params)\n", + "\n", + "print(cp_comp_stats)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Ok so we have a compressed model. We can pass this model to the same evaluation routine we used before to calculated compressed model accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "As you can see the model accuracy fell sharply after compression. This is expected. We will use model fine-tuning to recover this accuracy back." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.4. Fine-tune the model after Channel Pruning\n", + "\n", + "After the model is compressed using Spatial SVD followed by Channel Pruning, we can simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(ssvd_cp_compressed_model, epochs=2, learning_rate=15e-4, learning_rate_schedule=[1],\n", + " use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with finetuing the compressed model, we can check the floating point accuracy against the same validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(ssvd_cp_compressed_model, iterations=None, use_cuda=use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after compression using spatial SVD followed by Channel Pruning. Optionally, this model now can be saved like a regular PyTorch model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "torch.save(ssvd_cp_compressed_model, './output/ssvd_cp_finetuned_model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing compression with Spatial SVD followed by Channel Pruning. As indicated above, some parameters have been chosen in a way to run the example faster.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET compression and quantization techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/quantization/adaround.html b/releases/1.32.2/Examples/torch/quantization/adaround.html new file mode 100644 index 0000000..b428636 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/adaround.html @@ -0,0 +1,1467 @@ + + + + + + Adaptive Rounding (AdaRound) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Adaptive Rounding (AdaRound)

+

This notebook shows a working code example of how to use AIMET to perform Adaptive Rounding (AdaRound).

+

AIMET quantization features typically use the “nearest rounding” technique for achieving quantization. When using the “nearest rounding” technique, the weight value is quantized to the nearest integer value.

+

AdaRound optimizes a loss function using unlabeled training data to decide whether to quantize a specific weight to the closer integer value or the farther one. Using AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.

+
+

Overall flow

+

This notebook covers the following: 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply AdaRound and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results

  • +
  • For example, it uses a relatively quantization-friendly model like Resnet18

  • +
  • Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, use that. Otherwise, download the dataset from an appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The dataloader provided in this example notebook relies on the ImageNet tfrecords dataset having the following characteristics: - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample.

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could reduce the dataset to 2 samples per class. This exercise is left up to the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+

AIMET quantization simulation requires the user’s model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module. AIMET user guide lists all these guidelines. The following ModelPreparer API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines.

+
+
[ ]:
+
+
+
from aimet_torch.model_preparer import prepare_model
+
+model = prepare_model(model)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this?

+

On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so results in an inferences/sec speedup since unnecessary computation is avoided.

+

From a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers.

+

This can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). We want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model:

+
+
[ ]:
+
+
+
from aimet_torch.batch_norm_fold import fold_all_batch_norms
+
+_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))
+
+
+
+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_torch.quantsim import QuantizationSimModel
+
+dummy_input = torch.rand(1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+if use_cuda:
+    dummy_input = dummy_input.cuda()
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+

We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers.

+

Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior.

+
+
[ ]:
+
+
+
print(sim.model)
+
+
+
+
+

We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as ‘quantizers’. You can see this by printing the sim object.

+
+
[ ]:
+
+
+
print(sim)
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph, the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node.

+

For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

We create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metrics, so we can just ignore the model output. A few pointers regarding the data samples:

+
    +
  • In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.

  • +
  • It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

  • +
+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(sim_model, use_cuda):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    if use_cuda:
+        device = torch.device('cuda')
+    else:
+        device = torch.device('cpu')
+
+    sim_model.eval()
+    samples = 1000
+
+    batch_cntr = 0
+    with torch.no_grad():
+        for input_data, target_data in data_loader:
+
+            inputs_batch = input_data.to(device)
+            sim_model(inputs_batch)
+
+            batch_cntr += 1
+            if (batch_cntr * batch_size) > samples:
+                break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. Apply Adaround

+

We can now apply AdaRound to this model.

+

Some of the parameters for AdaRound are described below

+
    +
  • dataloader: AdaRound needs a dataloader to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.

  • +
  • num_batches: The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.

  • +
  • default_num_iterations: The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime.

  • +
+
+
[ ]:
+
+
+
from aimet_torch.adaround.adaround_weight import Adaround, AdaroundParameters
+
+data_loader = ImageNetDataPipeline.get_val_dataloader()
+params = AdaroundParameters(data_loader=data_loader, num_batches=1, default_num_iterations=32)
+
+dummy_input = torch.rand(1, 3, 224, 224)
+if use_cuda:
+    dummy_input = dummy_input.cuda()
+
+os.makedirs('./output/', exist_ok=True)
+ada_model = Adaround.apply_adaround(model, dummy_input, params,
+                                    path="output",
+                                    filename_prefix='adaround',
+                                    default_param_bw=8,
+                                    default_quant_scheme=QuantScheme.post_training_tf_enhanced)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the model after applying Adaround. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+

Note: There are two important things to understand in the following cell. - Parameter Biwidth Precision: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.

+
    +
  • Freezing the parameter encodings: After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API. While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created. For Quantization Simulation accuracy, it is important to freeze these encodings. If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the +parameters encodings and Quantization Simulation accuracy will not reflect the AdaRounded accuracy.

  • +
+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=ada_model,
+                           dummy_input=dummy_input,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+sim.set_and_freeze_param_encodings(encoding_path=os.path.join("output", 'adaround.encodings'))
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization, using the newly AdaRounded model with updated parameters.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after applying AdaRound. The settings used in this notebook are designed only to serve as code examples, designed to run quickly, but may not be optimal. Please try this workflow against the model of your choice and play with the number of samples and other parameters to get the best results.

+

The next step would be to take this model to target. We need to do two things: - export the model with the updated weights without the fake quantization ops - export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
dummy_input = dummy_input.cpu()
+sim.export(path='./output/', filename_prefix='resnet18_after_adaround', dummy_input=dummy_input)
+
+
+
+
+
+
+

Summary

+

This example illustrated how the AIMET AdaRound API is invoked to achieve post training quantization. To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline. As indicated above, some parameters in this example have been chosen in such a way to make this example execute faster.

+

We hope this notebook was useful for you to understand how to use AIMET for performing AdaRound.

+

A few additional resources: - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/adaround.ipynb b/releases/1.32.2/Examples/torch/quantization/adaround.ipynb new file mode 100644 index 0000000..de91ea3 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/adaround.ipynb @@ -0,0 +1,571 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Adaptive Rounding (AdaRound)\n", + "This notebook shows a working code example of how to use AIMET to perform Adaptive Rounding (AdaRound).\n", + "\n", + "AIMET quantization features typically use the \"nearest rounding\" technique for achieving quantization.\n", + "When using the \"nearest rounding\" technique, the weight value is quantized to the nearest integer value.\n", + "\n", + "AdaRound optimizes a loss function using unlabeled training data to decide whether to quantize a specific weight to the closer integer value or the farther one.\n", + "Using AdaRound quantization, a model is able to achieve an accuracy closer to the FP32 model, while using low bit-width integer quantization.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following:\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply AdaRound and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results\n", + "* For example, it uses a relatively quantization-friendly model like Resnet18\n", + "* Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification.\n", + "If you already have a version of the dataset readily available, use that.\n", + "Otherwise, download the dataset from an appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The dataloader provided in this example notebook relies on the ImageNet tfrecords dataset having the following characteristics:\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples.\n", + "Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample.\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset.\n", + "E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class.\n", + "But for the purpose of running this notebook, you could reduce the dataset to 2 samples per class.\n", + "This exercise is left up to the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision.\n", + "Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET quantization simulation requires the user's model definition to follow certain guidelines.\n", + "For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module.\n", + "AIMET user guide lists all these guidelines.\n", + "The following **ModelPreparer** API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.model_preparer import prepare_model\n", + "\n", + "model = prepare_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device.\n", + "This example code will use CUDA if available in your current execution environment.\n", + "You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model.\n", + "These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers.\n", + "Doing so results in an inferences/sec speedup since unnecessary computation is avoided.\n", + "\n", + "From a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy.\n", + "However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers.\n", + "\n", + "This can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision).\n", + "We want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_torch.quantsim import QuantizationSimModel\n", + "\n", + "dummy_input = torch.rand(1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "if use_cuda:\n", + " dummy_input = dummy_input.cuda()\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can check the modifications AIMET has made to the model graph.\n", + "One way is to print the model, and we can see that AIMET has added quantization wrapper layers.\n", + "\n", + "**Note**: use sim.model to access the modified PyTorch model.\n", + "By default, AIMET creates a copy of the original model prior to modifying it.\n", + "There is a parameter to override this behavior." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(sim.model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as 'quantizers'.\n", + "You can see this by printing the sim object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph, the model is not ready to be used yet.\n", + "Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node.\n", + "\n", + "For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters.\n", + "This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "We create a routine to pass unlabeled data samples through the model.\n", + "This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model.\n", + "We don't need to compute any loss metrics, so we can just ignore the model output. A few pointers regarding the data samples:\n", + "\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + " For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed.\n", + " It's not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation.\n", + " However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings.\n", + "This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(sim_model, use_cuda):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " if use_cuda:\n", + " device = torch.device('cuda')\n", + " else:\n", + " device = torch.device('cpu')\n", + "\n", + " sim_model.eval()\n", + " samples = 1000\n", + "\n", + " batch_cntr = 0\n", + " with torch.no_grad():\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.to(device)\n", + " sim_model(inputs_batch)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings.\n", + "Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference.\n", + "First we can pass this model to the same evaluation routine we used before.\n", + "The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Apply Adaround\n", + "\n", + "We can now apply AdaRound to this model.\n", + "\n", + "Some of the parameters for AdaRound are described below\n", + "\n", + "- **dataloader:** AdaRound needs a dataloader to use data samples for the layer-by-layer optimization to learn the rounding vectors. Either a training or validation dataloader could be passed in.\n", + "- **num_batches:** The number of batches used to evaluate the model while calculating the quantization encodings. Typically we want AdaRound to use around 2000 samples. So with a batch size of 32, this may translate to 64 batches. To speed up the execution here we are using a batch size of 1.\n", + "- **default_num_iterations:** The number of iterations to adaround each layer. Default value is set to 10000 and we strongly recommend to not reduce this number. But in this example we are using 32 to speed up the execution runtime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from aimet_torch.adaround.adaround_weight import Adaround, AdaroundParameters\n", + "\n", + "data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + "params = AdaroundParameters(data_loader=data_loader, num_batches=1, default_num_iterations=32)\n", + "\n", + "dummy_input = torch.rand(1, 3, 224, 224)\n", + "if use_cuda:\n", + " dummy_input = dummy_input.cuda()\n", + "\n", + "os.makedirs('./output/', exist_ok=True)\n", + "ada_model = Adaround.apply_adaround(model, dummy_input, params,\n", + " path=\"output\", \n", + " filename_prefix='adaround', \n", + " default_param_bw=8,\n", + " default_quant_scheme=QuantScheme.post_training_tf_enhanced)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the model after applying Adaround.\n", + "We again create a simulation model like before and evaluate to determine simulated quantized accuracy.\n", + "\n", + "**Note:** There are two important things to understand in the following cell.\n", + " - **Parameter Biwidth Precision**: The QuantizationSimModel must be created with the same parameter bitwidth precision that was used in the apply_adaround() created.\n", + " \n", + " - **Freezing the parameter encodings**:\n", + "After creating the QuantizationSimModel, the set_and_freeze_param_encodings() API must be called before calling the compute_encodings() API.\n", + "While applying AdaRound, the parameter values have been rounded up or down based on these initial encodings internally created.\n", + "For Quantization Simulation accuracy, it is important to freeze these encodings.\n", + "If the parameters encodings are NOT frozen, the call to compute_encodings() will alter the value of the parameters encodings and Quantization Simulation accuracy will not reflect the AdaRounded accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=ada_model,\n", + " dummy_input=dummy_input,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_output_bw=8, \n", + " default_param_bw=8)\n", + "\n", + "sim.set_and_freeze_param_encodings(encoding_path=os.path.join(\"output\", 'adaround.encodings'))\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference.\n", + "First we can pass this model to the same evaluation routine we used before.\n", + "The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization, using the newly AdaRounded model with updated parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after applying AdaRound.\n", + "The settings used in this notebook are designed only to serve as code examples, designed to run quickly, but may not be optimal.\n", + "Please try this workflow against the model of your choice and play with the number of samples and other parameters to get the best results.\n", + "\n", + "The next step would be to take this model to target.\n", + "We need to do two things:\n", + "- export the model with the updated weights without the fake quantization ops\n", + "- export the encodings (scale/offset quantization parameters).\n", + "AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "dummy_input = dummy_input.cpu()\n", + "sim.export(path='./output/', filename_prefix='resnet18_after_adaround', dummy_input=dummy_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This example illustrated how the AIMET AdaRound API is invoked to achieve post training quantization.\n", + "To use AIMET AdaRound for your specific needs, replace the model with your model and replace the data pipeline with your data pipeline.\n", + "As indicated above, some parameters in this example have been chosen in such a way to make this example execute faster.\n", + "\n", + "We hope this notebook was useful for you to understand how to use AIMET for performing AdaRound.\n", + "\n", + "A few additional resources:\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/quantization/autoquant.html b/releases/1.32.2/Examples/torch/quantization/autoquant.html new file mode 100644 index 0000000..aae8abd --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/autoquant.html @@ -0,0 +1,1326 @@ + + + + + + AutoQuant — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AutoQuant

+

This notebook shows a working code example of how to use AIMET AutoQuant feature.

+

AIMET offers a suite of neural network post-training quantization (PTQ) techniques that can be applied in succession. However, the process of finding the right combination and sequence of techniques to apply is time-consuming and requires careful analysis, which can be challenging especially for non-expert users. We instead recommend AutoQuant to save time and effort.

+

AutoQuant is an API that applies various PTQ techniques in AIMET automatically based on analyzing the model and best-known heuristics. In AutoQuant, users specify the amount of tolerable accuracy drop, and AutoQuant will apply PTQ techniques cumulatively until the target accuracy is satisfied.

+
+

Overall flow

+

This notebook covers the following 1. Define constants and helper functions 2. Load a pretrained FP32 model 3. Run AutoQuant

+
+
+

What this notebook is not

+

This notebook is not designed to show state-of-the-art AutoQuant results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
import os
+from torchvision import transforms, datasets
+
+DATASET_DIR = '/path/to/dataset'   # Please replace this with a real directory
+
+val_transforms = transforms.Compose([
+    transforms.CenterCrop(224),
+    transforms.ToTensor(),
+    transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
+])
+
+imagenet_dataset = datasets.ImageFolder(root=os.path.join(DATASET_DIR, 'val'), transform=val_transforms)
+
+
+
+
+
+

1. Define Constants and Helper functions

+

In this section the constants and helper functions needed to run this eaxmple are defined.

+
    +
  • EVAL_DATASET_SIZE A typical value is 5000. In this notebook, this value has been set to 500 for faster execution.

  • +
  • CALIBRATION_DATASET_SIZE A typical value is 2000. In this notebook, this value has been set to 200 for faster execution.

  • +
+

The helper function **_create_sampled_data_loader()** returns a DataLoader based on the dataset and the number of samples provided.

+
+
[ ]:
+
+
+
import random
+from typing import Optional
+from tqdm import tqdm
+import torch
+from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler, Subset
+from aimet_torch.utils import in_eval_mode, get_device
+
+EVAL_DATASET_SIZE = 500
+CALIBRATION_DATASET_SIZE = 200
+
+_datasets = {}
+
+def _create_sampled_data_loader(dataset, num_samples):
+    if num_samples not in _datasets:
+        indices = random.sample(range(len(dataset)), num_samples)
+        _datasets[num_samples] = Subset(dataset, indices)
+    return DataLoader(_datasets[num_samples], batch_size=32)
+
+
+def eval_callback(model: torch.nn.Module, num_samples: Optional[int] = None) -> float:
+    if num_samples is None:
+        num_samples = EVAL_DATASET_SIZE
+
+    data_loader = _create_sampled_data_loader(imagenet_dataset, num_samples)
+    device = get_device(model)
+
+    correct = 0
+    with in_eval_mode(model), torch.no_grad():
+        for image, label in tqdm(data_loader):
+            image = image.to(device)
+            label = label.to(device)
+            logits = model(image)
+            top1 = logits.topk(k=1).indices
+            correct += (top1 == label.view_as(top1)).sum()
+
+    return int(correct) / num_samples
+
+
+
+
+
+

2. Load a pretrained FP32 model

+

For this example, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True).eval()
+
+if torch.cuda.is_available():
+    model.to(torch.device('cuda'))
+
+accuracy = eval_callback(model)
+print(f'- FP32 accuracy: {accuracy}')
+
+
+
+
+
+

3. Run AutoQuant

+
+

Create AutoQuant Object

+

The AutoQuant feature utilizes an unlabeled dataset to achieve quantization. The class UnlabeledDatasetWrapper creates an unlabeled Dataset object from a labeled Dataset.

+
+
[ ]:
+
+
+
from aimet_torch.auto_quant import AutoQuant
+
+class UnlabeledDatasetWrapper(Dataset):
+    def __init__(self, dataset):
+        self._dataset = dataset
+
+    def __len__(self):
+        return len(self._dataset)
+
+    def __getitem__(self, index):
+        images, _ = self._dataset[index]
+        return images
+
+
+unlabeled_imagenet_dataset = UnlabeledDatasetWrapper(imagenet_dataset)
+unlabeled_imagenet_data_loader = _create_sampled_data_loader(unlabeled_imagenet_dataset,
+                                                             CALIBRATION_DATASET_SIZE)
+
+dummy_input = torch.randn((1, 3, 224, 224)).to(get_device(model))
+
+auto_quant = AutoQuant(model,
+                       dummy_input=dummy_input,
+                       data_loader=unlabeled_imagenet_data_loader,
+                       eval_callback=eval_callback)
+
+
+
+
+
+

Run AutoQuant Inference

+

This step runs AutoQuant inference. AutoQuant inference will run evaluation using the eval_callback with the vanilla quantized model without applying PTQ techniques. This will be useful for measuring the baseline evaluation score before running AutoQuant optimization.

+
+
[ ]:
+
+
+
sim, initial_accuracy = auto_quant.run_inference()
+print(f"- Quantized Accuracy (before optimization): {initial_accuracy}")
+
+
+
+
+
+

Set AdaRound Parameters (optional)

+

AutoQuant uses a set of predefined default parameters for AdaRound. These values were determined empirically and work well with the common models. However, if necessary, you can also use your custom parameters for Adaround. In this notebook, we will use very small AdaRound parameters for faster execution.

+
+
[ ]:
+
+
+
from aimet_torch.adaround.adaround_weight import AdaroundParameters
+
+ADAROUND_DATASET_SIZE = 200
+adaround_data_loader = _create_sampled_data_loader(unlabeled_imagenet_dataset, ADAROUND_DATASET_SIZE)
+adaround_params = AdaroundParameters(adaround_data_loader, num_batches=len(adaround_data_loader), default_num_iterations=2000)
+auto_quant.set_adaround_params(adaround_params)
+
+
+
+
+
+

Run AutoQuant Optimization

+

This step runs AutoQuant optimization, which returns the best possible quantized model, corresponding evaluation score and the path to the encoding file. The allowed_accuracy_drop parameter indicates the tolerable amount of accuracy drop. AutoQuant applies a series of quantization features until the target accuracy (FP32 accuracy - allowed accuracy drop) is satisfied. When the target accuracy is reached, AutoQuant will return immediately without applying furhter PTQ techniques. Please refer +AutoQuant User Guide and API documentation for complete details.

+
+
[ ]:
+
+
+
model, optimized_accuracy, encoding_path = auto_quant.optimize(allowed_accuracy_drop=0.01)
+print(f"- Quantized Accuracy (after optimization):  {optimized_accuracy}")
+
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET AutoQuant feature.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and parameters - Refer to the other example notebooks to understand how to use AIMET CLE and AdaRound features in a standalone fashion.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/autoquant.ipynb b/releases/1.32.2/Examples/torch/quantization/autoquant.ipynb new file mode 100644 index 0000000..e936943 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/autoquant.ipynb @@ -0,0 +1,318 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# AutoQuant\n", + "\n", + "This notebook shows a working code example of how to use AIMET AutoQuant feature.\n", + "\n", + "AIMET offers a suite of neural network post-training quantization (PTQ) techniques that can be applied in succession. However, the process of finding the right combination and sequence of techniques to apply is time-consuming and requires careful analysis, which can be challenging especially for non-expert users. We instead recommend AutoQuant to save time and effort.\n", + "\n", + "AutoQuant is an API that applies various PTQ techniques in AIMET automatically based on analyzing the model and best-known heuristics. In AutoQuant, users specify the amount of tolerable accuracy drop, and AutoQuant will apply PTQ techniques cumulatively until the target accuracy is satisfied.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Define constants and helper functions\n", + "2. Load a pretrained FP32 model\n", + "3. Run AutoQuant\n", + "\n", + "#### What this notebook is not\n", + "This notebook is not designed to show state-of-the-art AutoQuant results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "import os\n", + "from torchvision import transforms, datasets\n", + "\n", + "DATASET_DIR = '/path/to/dataset' # Please replace this with a real directory\n", + "\n", + "val_transforms = transforms.Compose([\n", + " transforms.CenterCrop(224),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),\n", + "])\n", + "\n", + "imagenet_dataset = datasets.ImageFolder(root=os.path.join(DATASET_DIR, 'val'), transform=val_transforms)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Define Constants and Helper functions\n", + "\n", + "In this section the constants and helper functions needed to run this eaxmple are defined.\n", + "\n", + "- **EVAL_DATASET_SIZE** A typical value is 5000. In this notebook, this value has been set to 500 for faster execution.\n", + "- **CALIBRATION_DATASET_SIZE** A typical value is 2000. In this notebook, this value has been set to 200 for faster execution.\n", + "\n", + "\n", + "The helper function **_create_sampled_data_loader()** returns a DataLoader based on the dataset and the number of samples provided." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import random\n", + "from typing import Optional\n", + "from tqdm import tqdm\n", + "import torch\n", + "from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler, Subset\n", + "from aimet_torch.utils import in_eval_mode, get_device\n", + "\n", + "EVAL_DATASET_SIZE = 500\n", + "CALIBRATION_DATASET_SIZE = 200\n", + "\n", + "_datasets = {}\n", + "\n", + "def _create_sampled_data_loader(dataset, num_samples):\n", + " if num_samples not in _datasets:\n", + " indices = random.sample(range(len(dataset)), num_samples)\n", + " _datasets[num_samples] = Subset(dataset, indices)\n", + " return DataLoader(_datasets[num_samples], batch_size=32)\n", + "\n", + "\n", + "def eval_callback(model: torch.nn.Module, num_samples: Optional[int] = None) -> float:\n", + " if num_samples is None:\n", + " num_samples = EVAL_DATASET_SIZE\n", + "\n", + " data_loader = _create_sampled_data_loader(imagenet_dataset, num_samples)\n", + " device = get_device(model)\n", + " \n", + " correct = 0\n", + " with in_eval_mode(model), torch.no_grad():\n", + " for image, label in tqdm(data_loader):\n", + " image = image.to(device)\n", + " label = label.to(device)\n", + " logits = model(image)\n", + " top1 = logits.topk(k=1).indices\n", + " correct += (top1 == label.view_as(top1)).sum()\n", + "\n", + " return int(correct) / num_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Load a pretrained FP32 model\n", + "For this example, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True).eval()\n", + "\n", + "if torch.cuda.is_available():\n", + " model.to(torch.device('cuda'))\n", + "\n", + "accuracy = eval_callback(model)\n", + "print(f'- FP32 accuracy: {accuracy}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Run AutoQuant\n", + "### Create AutoQuant Object\n", + "\n", + "The AutoQuant feature utilizes an unlabeled dataset to achieve quantization. The class **UnlabeledDatasetWrapper** creates an unlabeled Dataset object from a labeled Dataset. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_torch.auto_quant import AutoQuant\n", + "\n", + "class UnlabeledDatasetWrapper(Dataset):\n", + " def __init__(self, dataset):\n", + " self._dataset = dataset\n", + "\n", + " def __len__(self):\n", + " return len(self._dataset)\n", + "\n", + " def __getitem__(self, index):\n", + " images, _ = self._dataset[index]\n", + " return images\n", + "\n", + "\n", + "unlabeled_imagenet_dataset = UnlabeledDatasetWrapper(imagenet_dataset)\n", + "unlabeled_imagenet_data_loader = _create_sampled_data_loader(unlabeled_imagenet_dataset,\n", + " CALIBRATION_DATASET_SIZE)\n", + "\n", + "dummy_input = torch.randn((1, 3, 224, 224)).to(get_device(model))\n", + "\n", + "auto_quant = AutoQuant(model,\n", + " dummy_input=dummy_input,\n", + " data_loader=unlabeled_imagenet_data_loader,\n", + " eval_callback=eval_callback)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run AutoQuant Inference\n", + "This step runs AutoQuant inference. AutoQuant inference will run evaluation using the **eval_callback** with the vanilla quantized model without applying PTQ techniques. This will be useful for measuring the baseline evaluation score before running AutoQuant optimization." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim, initial_accuracy = auto_quant.run_inference()\n", + "print(f\"- Quantized Accuracy (before optimization): {initial_accuracy}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set AdaRound Parameters (optional)\n", + "AutoQuant uses a set of predefined default parameters for AdaRound.\n", + "These values were determined empirically and work well with the common models.\n", + "However, if necessary, you can also use your custom parameters for Adaround.\n", + "In this notebook, we will use very small AdaRound parameters for faster execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_torch.adaround.adaround_weight import AdaroundParameters\n", + "\n", + "ADAROUND_DATASET_SIZE = 200\n", + "adaround_data_loader = _create_sampled_data_loader(unlabeled_imagenet_dataset, ADAROUND_DATASET_SIZE)\n", + "adaround_params = AdaroundParameters(adaround_data_loader, num_batches=len(adaround_data_loader), default_num_iterations=2000)\n", + "auto_quant.set_adaround_params(adaround_params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run AutoQuant Optimization\n", + "This step runs AutoQuant optimization, which returns the best possible quantized model, corresponding evaluation score and the path to the encoding file.\n", + "The **allowed_accuracy_drop** parameter indicates the tolerable amount of accuracy drop. AutoQuant applies a series of quantization features until the target accuracy (FP32 accuracy - allowed accuracy drop) is satisfied. When the target accuracy is reached, AutoQuant will return immediately without applying furhter PTQ techniques. Please refer AutoQuant User Guide and API documentation for complete details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "model, optimized_accuracy, encoding_path = auto_quant.optimize(allowed_accuracy_drop=0.01)\n", + "print(f\"- Quantized Accuracy (after optimization): {optimized_accuracy}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET AutoQuant feature.\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET CLE and AdaRound features in a standalone fashion." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/quantization/bn_reestimation.html b/releases/1.32.2/Examples/torch/quantization/bn_reestimation.html new file mode 100644 index 0000000..ea0a5cf --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/bn_reestimation.html @@ -0,0 +1,1382 @@ + + + + + + Quantization-Aware Training with BatchNorm Re-estimation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Quantization-Aware Training with BatchNorm Re-estimation

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) with batchnorm re-estimation. Batchnorm re-estimation is a technique for countering potential instability of batchnrom statistics (i.e. running mean and variance) during QAT. More specifically, batchnorm re-estimation recalculates the batchnorm statistics based on the model after QAT. By doing so, we aim to make our model learn batchnorm statistics from from stable outputs after QAT, +rather than from likely noisy outputs during QAT.

+
+

Overall flow

+

This notebook covers the following steps: 1. Create a quantization simulation model with fake quantization ops inserted. 2. Finetune and evaluate the quantization simulation model 3. Re-estimate batchnorm statistics and compare the eval score before and after re-estimation. 4. Fold the re-estimated batchnorm layers and export the quantization simulation model

+
+
+

What this notebook is not

+

In this notebook, we will focus how to apply batchnorm re-estimation after QAT, rather than covering all the details about QAT itself. For more information about QAT, please refer to QAT notebook or QAT range learning notebook.

+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)
+
+    @staticmethod
+    def finetune(model: torch.nn.Module, epochs, learning_rate, learning_rate_schedule, use_cuda):
+        """
+        Given a torch model, finetunes the model to improve its accuracy
+        :param model: the model to finetune
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param learning_rate_schedule: The learning rate schedule used during the finetuning step.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_workers=image_net_config.train['num_workers'])
+
+        trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,
+                      learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load FP32 model

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+from aimet_torch.model_preparer import prepare_model
+
+use_cuda = torch.cuda.is_available()
+if use_cuda:
+    device = torch.device("cuda")
+else:
+    device = torch.device("cpu")
+
+model = resnet18(pretrained=True).to(device)
+model = prepare_model(model)
+
+
+
+
+
+
+

3. Create a quantization simulation model and Perform QAT

+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

NOTE: Note that, unlike in other QAT example scripts, we didn’t fold batchnorm layers before QAT. This is because we aim to finetune our model with batchnorm layers present and re-estimate the batchnorm statatistics for better accuracy. The batchnorm layers will be folded after re-estimation.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_torch.quantsim import QuantizationSimModel
+
+dummy_input = torch.rand(1, 3, 224, 224, device=device)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.training_range_learning_with_tf_init,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+def pass_calibration_data(sim_model, use_cuda):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    if use_cuda:
+        device = torch.device('cuda')
+    else:
+        device = torch.device('cpu')
+
+    samples = 1000
+    batch_cntr = 0
+
+    for input_data, target_data in data_loader:
+        inputs_batch = input_data.to(device)
+        sim_model(inputs_batch)
+
+        batch_cntr += 1
+        if (batch_cntr * batch_size) > samples:
+            break
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+
+
+
+
+

Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)
+
+
+
+

After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(finetuned_accuracy)
+
+
+
+
+
+
+
+

4. Perform BatchNorm Reestimation

+
+

Re-estimate BatchNorm Statistics

+

AIMET provides a helper function, reestimate_bn_stats, for re-estimating batchnorm statistics. Here is the full list of parameters for this function: * model: Model to re-estimate the BatchNorm statistics. * dataloader Train dataloader. * num_batches (optional): The number of batches to be used for reestimation. (Default: 100) * forward_fn (optional): Optional adapter function that performs forward pass given a model and a input batch yielded from the data loader. If not +specified, it is expected that inputs yielded from dataloader can be passed directly to the model.

+
+
[ ]:
+
+
+
from aimet_torch.bn_reestimation import reestimate_bn_stats
+
+train_loader = ImageNetDataLoader(images_dir=DATASET_DIR,
+                                  image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  is_training=True,
+                                  num_workers=image_net_config.train['num_workers']).data_loader
+def forward_fn(model, inputs):
+    input_data, target_data = inputs
+    model(input_data)
+
+reestimate_bn_stats(sim.model, train_loader, forward_fn=forward_fn)
+
+finetuned_accuracy_bn_reestimated = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(finetuned_accuracy_bn_reestimated)
+
+
+
+
+
+

Fold BatchNorm Layers

+

So far, we have improved our quantization simulation model through QAT and batchnorm re-estimation. The next step would be to actually take this model to target. But first, we should fold the batchnorm layers for our model to run on target devices more efficiently.

+
+
[ ]:
+
+
+
from aimet_torch.batch_norm_fold import fold_all_batch_norms_to_scale
+
+fold_all_batch_norms_to_scale(sim)
+
+
+
+
+
+
+
+

5. Export Model

+

As the final step, we will export the model to run it on actual target devices. AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+dummy_input = dummy_input.cpu()
+sim.export(path='./output/', filename_prefix='resnet18_after_qat', dummy_input=dummy_input)
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use batchnorm re-estimation feature of AIMET.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters. - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT methods.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/bn_reestimation.ipynb b/releases/1.32.2/Examples/torch/quantization/bn_reestimation.ipynb new file mode 100644 index 0000000..b468ec4 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/bn_reestimation.ipynb @@ -0,0 +1,409 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Quantization-Aware Training with BatchNorm Re-estimation\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training) with batchnorm re-estimation.\n", + "Batchnorm re-estimation is a technique for countering potential instability of batchnrom statistics (i.e. running mean and variance) during QAT. More specifically, batchnorm re-estimation recalculates the batchnorm statistics based on the model after QAT. By doing so, we aim to make our model learn batchnorm statistics from from stable outputs after QAT, rather than from likely noisy outputs during QAT.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following steps:\n", + "1. Create a quantization simulation model with fake quantization ops inserted.\n", + "2. Finetune and evaluate the quantization simulation model\n", + "3. Re-estimate batchnorm statistics and compare the eval score before and after re-estimation.\n", + "4. Fold the re-estimated batchnorm layers and export the quantization simulation model\n", + "\n", + "#### What this notebook is not\n", + "In this notebook, we will focus how to apply batchnorm re-estimation after QAT, rather than covering all the details about QAT itself. For more information about QAT, please refer to [QAT notebook](https://github.com/quic/aimet/blob/develop/Examples/torch/quantization/quantization_aware_training.ipynb) or [QAT range learning notebook](https://github.com/quic/aimet/blob/develop/Examples/torch/quantization/qat_range_learning.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true, + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)\n", + "\n", + " @staticmethod\n", + " def finetune(model: torch.nn.Module, epochs, learning_rate, learning_rate_schedule, use_cuda):\n", + " \"\"\"\n", + " Given a torch model, finetunes the model to improve its accuracy\n", + " :param model: the model to finetune\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param learning_rate_schedule: The learning rate schedule used during the finetuning step.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_workers=image_net_config.train['num_workers'])\n", + "\n", + " trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,\n", + " learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 2. Load FP32 model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "from aimet_torch.model_preparer import prepare_model\n", + "\n", + "use_cuda = torch.cuda.is_available()\n", + "if use_cuda:\n", + " device = torch.device(\"cuda\")\n", + "else:\n", + " device = torch.device(\"cpu\")\n", + "\n", + "model = resnet18(pretrained=True).to(device)\n", + "model = prepare_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and Perform QAT\n", + "\n", + "### Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.\n", + "\n", + "**NOTE**: Note that, unlike in other QAT example scripts, we didn't fold batchnorm layers before QAT. This is because we aim to finetune our model with batchnorm layers present and re-estimate the batchnorm statatistics for better accuracy. The batchnorm layers will be folded after re-estimation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_torch.quantsim import QuantizationSimModel\n", + "\n", + "dummy_input = torch.rand(1, 3, 224, 224, device=device) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.training_range_learning_with_tf_init,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)\n", + "\n", + "def pass_calibration_data(sim_model, use_cuda):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " if use_cuda:\n", + " device = torch.device('cuda')\n", + " else:\n", + " device = torch.device('cpu')\n", + "\n", + " samples = 1000\n", + " batch_cntr = 0\n", + "\n", + " for input_data, target_data in data_loader:\n", + " inputs_batch = input_data.to(device)\n", + " sim_model(inputs_batch)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break\n", + " \n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(finetuned_accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Perform BatchNorm Reestimation\n", + "\n", + "### Re-estimate BatchNorm Statistics\n", + "AIMET provides a helper function, `reestimate_bn_stats`, for re-estimating batchnorm statistics.\n", + "Here is the full list of parameters for this function:\n", + "* **model**: Model to re-estimate the BatchNorm statistics.\n", + "* **dataloader** Train dataloader.\n", + "* **num_batches** (optional): The number of batches to be used for reestimation. (Default: 100)\n", + "* **forward_fn** (optional): Optional adapter function that performs forward pass given a model and a input batch yielded from the data loader. If not specified, it is expected that inputs yielded from dataloader can be passed directly to the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.bn_reestimation import reestimate_bn_stats\n", + "\n", + "train_loader = ImageNetDataLoader(images_dir=DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " is_training=True,\n", + " num_workers=image_net_config.train['num_workers']).data_loader\n", + "def forward_fn(model, inputs):\n", + " input_data, target_data = inputs\n", + " model(input_data)\n", + "\n", + "reestimate_bn_stats(sim.model, train_loader, forward_fn=forward_fn)\n", + "\n", + "finetuned_accuracy_bn_reestimated = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(finetuned_accuracy_bn_reestimated)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fold BatchNorm Layers\n", + "\n", + "So far, we have improved our quantization simulation model through QAT and batchnorm re-estimation. The next step would be to actually take this model to target. But first, we should fold the batchnorm layers for our model to run on target devices more efficiently." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.batch_norm_fold import fold_all_batch_norms_to_scale\n", + "\n", + "fold_all_batch_norms_to_scale(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 5. Export Model\n", + "As the final step, we will export the model to run it on actual target devices. AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "dummy_input = dummy_input.cpu()\n", + "sim.export(path='./output/', filename_prefix='resnet18_after_qat', dummy_input=dummy_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use batchnorm re-estimation feature of AIMET.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters.\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/torch/quantization) to understand how to use AIMET post-training quantization techniques and QAT methods." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/releases/1.32.2/Examples/torch/quantization/cle_bc.html b/releases/1.32.2/Examples/torch/quantization/cle_bc.html new file mode 100644 index 0000000..fe20076 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/cle_bc.html @@ -0,0 +1,1506 @@ + + + + + + Cross-Layer Equalization (CLE) and Bias Correction (BC) — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Cross-Layer Equalization (CLE) and Bias Correction (BC)

+

This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE) and Bias Correction (BC). CLE and BC are post-training quantization techniques that aim to improve quantized accuracy of a given model. CLE does not need any data samples. BC may optionally need unlabelled data samples. These techniques help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.

+

To learn more about this techniques, please refer to the “Data-Free Quantization Through Weight Equalization and Bias Correction” paper from ICCV 2019 - https://arxiv.org/abs/1906.04721

+

Cross-Layer Equalization AIMET performs the following steps when running CLE: 1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers. 2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer. 3. High Bias Folding: Cross-layer scaling may +result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer’s parameters.

+
+
Bias Correction
+
Quantization sometimes leads to a shift in layer outputs. This techniques helps correct this shift by adjusting the bias parameters of that layer. Note that this technique is generally applied after CLE, but it is a optional step.
+
+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Apply CLE, BC and and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be
+                           evaluated on the entire dataset once.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+

AIMET quantization simulation requires the user’s model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module. AIMET user guide lists all these guidelines. The following ModelPreparer API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines.

+
+
[ ]:
+
+
+
from aimet_torch.model_preparer import prepare_model
+
+model = prepare_model(model)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model

+
+
[ ]:
+
+
+
from aimet_torch.batch_norm_fold import fold_all_batch_norms
+
+_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))
+
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision - num_batches: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the +number of images in these 5 batches should be sufficient for compute encodings - rounding_mode: The rounding mode used for quantization. There are two possible choices here - ‘nearest’ or ‘stochastic’ We will use “nearest.”

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_torch.quantsim import QuantizationSimModel
+
+dummy_input = torch.rand(1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+if use_cuda:
+    dummy_input = dummy_input.cuda()
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+

We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers. Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior.

+
+
[ ]:
+
+
+
print(sim.model)
+
+
+
+
+

We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as ‘quantizers’. You can see this by printing the sim object.

+
+
[ ]:
+
+
+
print(sim)
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples

+

In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples. It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario +like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results. The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(sim_model, use_cuda):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    if use_cuda:
+        device = torch.device('cuda')
+    else:
+        device = torch.device('cpu')
+
+    sim_model.eval()
+    samples = 1000
+
+    batch_cntr = 0
+    with torch.no_grad():
+        for input_data, target_data in data_loader:
+
+            inputs_batch = input_data.to(device)
+            sim_model(inputs_batch)
+
+            batch_cntr += 1
+            if (batch_cntr * batch_size) > samples:
+                break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. 1 Cross Layer Equalization

+

The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.

+

Note: Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.

+

Note: CLE equalizes the model in-place

+
+
[ ]:
+
+
+
model = resnet18(pretrained=True)
+model = prepare_model(model)
+
+use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+
[ ]:
+
+
+
from aimet_torch.cross_layer_equalization import equalize_model
+
+equalize_model(model, input_shapes=(1, 3, 224, 224))
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. 2 Bias Correction

+

This section shows how we can apply AIMET Bias Correction on top of the already equalized model from the previous step. Bias correction under the hood uses a reference FP32 model and a QuantizationSimModel to perform its procedure. More details are explained in the AIMET User Guide documentation.

+

For the correct_bias API, we pass the following parameters

+
    +
  • num_quant_samples: Number of samples used for computing encodings. We are setting this to a low number here to speed up execution. A typical number would be 500-1000.

  • +
  • num_bias_correct_samples: Number of samples used for bias correction. We are setting this to a low number here to speed up execution. A typical number would be 1000-2000.

  • +
  • data_loader: BC uses unlabeled data samples from this data loader.

  • +
+
+
[ ]:
+
+
+
from aimet_torch.quantsim import QuantParams
+from aimet_torch.bias_correction import correct_bias
+
+data_loader = ImageNetDataPipeline.get_val_dataloader()
+
+bc_params = QuantParams(weight_bw=8, act_bw=8, round_mode="nearest",
+                        quant_scheme=QuantScheme.post_training_tf_enhanced)
+
+correct_bias(model, bc_params, num_quant_samples=16,
+             data_loader=data_loader, num_bias_correct_samples=16)
+
+
+
+
+

Now, we can determine the simulated quantized accuracy of the bias-corrected model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy.

+
+
[ ]:
+
+
+
sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after applying CLE ad BC. Ofcourse, this was just an example. Please try this against the model of your choice and play with the number of samples to get the best results.

+

Now the next step would be to take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+dummy_input = dummy_input.cpu()
+sim.export(path='./output/', filename_prefix='resnet18_after_cle_bc', dummy_input=dummy_input)
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE) and Bias Correction (BC).

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/cle_bc.ipynb b/releases/1.32.2/Examples/torch/quantization/cle_bc.ipynb new file mode 100644 index 0000000..fc31b76 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/cle_bc.ipynb @@ -0,0 +1,574 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Cross-Layer Equalization (CLE) and Bias Correction (BC)\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Cross-Layer Equalization (CLE) and Bias Correction (BC). CLE and BC are post-training quantization techniques that aim to improve quantized accuracy of a given model. CLE does not need any data samples. BC may optionally need unlabelled data samples. These techniques help recover quantized accuracy when the model quantization is sensitive to parameter quantization as opposed to activation quantization.\n", + "\n", + "To learn more about this techniques, please refer to the \"Data-Free Quantization Through Weight Equalization and Bias Correction\" paper from ICCV 2019 - https://arxiv.org/abs/1906.04721\n", + "\n", + "**Cross-Layer Equalization**\n", + "AIMET performs the following steps when running CLE:\n", + "1. Batch Norm Folding: Folds BN layers into Conv layers immediate before or after the Conv layers.\n", + "2. Cross-Layer Scaling: Given a set of consecutive Conv layers, equalizes the range of tensor values per-channel by scaling up/down per-channel weight tensor values of a layer and corresponding scaling down/up per-channel weight tensor values of the subsequent layer.\n", + "3. High Bias Folding: Cross-layer scaling may result in high bias parameter values for some layers. This technique folds some of the bias of a layer into the subsequent layer's parameters.\n", + "\n", + "**Bias Correction** \n", + "Quantization sometimes leads to a shift in layer outputs. This techniques helps correct this shift by adjusting the bias parameters of that layer. Note that this technique is generally applied after CLE, but it is a optional step.\n", + "\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Apply CLE, BC and and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param iterations: the number of batches to be used to evaluate the model. A value of 'None' means the model will be\n", + " evaluated on the entire dataset once.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET quantization simulation requires the user's model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module.\n", + "AIMET user guide lists all these guidelines.\n", + "The following **ModelPreparer** API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.model_preparer import prepare_model\n", + "\n", + "model = prepare_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Create Quantization Sim Model\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "- **num_batches**: The number of batches used to evaluate the model while calculating the quantization encodings.Number of batches to use for computing encodings. Only 5 batches are used here to speed up the process. In addition, the number of images in these 5 batches should be sufficient for compute encodings\n", + "- **rounding_mode**: The rounding mode used for quantization. There are two possible choices here - 'nearest' or 'stochastic' We will use \"nearest.\"\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_torch.quantsim import QuantizationSimModel\n", + "\n", + "dummy_input = torch.rand(1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "if use_cuda:\n", + " dummy_input = dummy_input.cuda()\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers. Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(sim.model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as 'quantizers'. You can see this by printing the sim object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "\n", + "In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(sim_model, use_cuda):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " if use_cuda:\n", + " device = torch.device('cuda')\n", + " else:\n", + " device = torch.device('cpu')\n", + "\n", + " sim_model.eval()\n", + " samples = 1000\n", + "\n", + " batch_cntr = 0\n", + " with torch.no_grad():\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.to(device)\n", + " sim_model(inputs_batch)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. 1 Cross Layer Equalization\n", + "\n", + "The next cell performs cross-layer equalization on the model. As noted before, the function folds batch norms, applies cross-layer scaling, and then folds high biases.\n", + "\n", + "**Note:** Interestingly, CLE needs BN statistics for its procedure. If a BN folded model is provided, CLE will run the CLS (cross-layer scaling) optimization step but will skip the HBA (high-bias absorption) step. To avoid this, we simply load the original model again before running CLE.\n", + "\n", + "**Note:** CLE equalizes the model in-place" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = resnet18(pretrained=True)\n", + "model = prepare_model(model)\n", + "\n", + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.cross_layer_equalization import equalize_model\n", + "\n", + "equalize_model(model, input_shapes=(1, 3, 224, 224))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the equalized model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)\n", + "\n", + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. 2 Bias Correction\n", + "\n", + "This section shows how we can apply AIMET Bias Correction on top of the already equalized model from the previous step. Bias correction under the hood uses a reference FP32 model and a QuantizationSimModel to perform its procedure. More details are explained in the AIMET User Guide documentation.\n", + "\n", + "For the correct_bias API, we pass the following parameters\n", + "\n", + "- **num_quant_samples**: Number of samples used for computing encodings. We are setting this to a low number here to speed up execution. A typical number would be 500-1000.\n", + "- **num_bias_correct_samples**: Number of samples used for bias correction. We are setting this to a low number here to speed up execution. A typical number would be 1000-2000.\n", + "- **data_loader**: BC uses unlabeled data samples from this data loader." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.quantsim import QuantParams\n", + "from aimet_torch.bias_correction import correct_bias\n", + "\n", + "data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + "\n", + "bc_params = QuantParams(weight_bw=8, act_bw=8, round_mode=\"nearest\",\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced)\n", + "\n", + "correct_bias(model, bc_params, num_quant_samples=16,\n", + " data_loader=data_loader, num_bias_correct_samples=16)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now, we can determine the simulated quantized accuracy of the bias-corrected model. We again create a simulation model like before and evaluate to determine simulated quantized accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)\n", + "\n", + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)\n", + "\n", + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after applying CLE ad BC. Ofcourse, this was just an example. Please try this against the model of your choice and play with the number of samples to get the best results.\n", + "\n", + "Now the next step would be to take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters). AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "dummy_input = dummy_input.cpu()\n", + "sim.export(path='./output/', filename_prefix='resnet18_after_cle_bc', dummy_input=dummy_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing Cross Layer Equalization (CLE) and Bias Correction (BC).\n", + "\n", + "Few additional resources\n", + "- Refer to the AIMET API docs to know more details of the APIs and optional parameters\n", + "- Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT techniques" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/quantization/qat.html b/releases/1.32.2/Examples/torch/quantization/qat.html new file mode 100644 index 0000000..e3fb3e8 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/qat.html @@ -0,0 +1,1440 @@ + + + + + + Quantization-Aware Training — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization-Aware Training

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.

+

AIMET supports two different types of QAT 1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant. 2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and +the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.

+

This notebook specifically shows working code example for #1 above. You can find a separate notebook for #2 in the same folder.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)
+
+    @staticmethod
+    def finetune(model: torch.nn.Module, epochs, learning_rate, learning_rate_schedule, use_cuda):
+        """
+        Given a torch model, finetunes the model to improve its accuracy
+        :param model: the model to finetune
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param learning_rate_schedule: The learning rate schedule used during the finetuning step.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_workers=image_net_config.train['num_workers'])
+
+        trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,
+                      learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+

AIMET quantization simulation requires the user’s model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module. AIMET user guide lists all these guidelines. The following ModelPreparer API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines.

+
+
[ ]:
+
+
+
from aimet_torch.model_preparer import prepare_model
+
+model = prepare_model(model)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model

+
+
[ ]:
+
+
+
from aimet_torch.batch_norm_fold import fold_all_batch_norms
+
+_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “QuantScheme.post_training_tf_enhanced” - Supported options are ‘tf_enhanced’ or ‘tf’ or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced - default_output_bw: Setting this to 8, essentially means that we are +asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_torch.quantsim import QuantizationSimModel
+
+dummy_input = torch.rand(1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+if use_cuda:
+    dummy_input = dummy_input.cuda()
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.post_training_tf_enhanced,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+

We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers. Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior.

+
+
[ ]:
+
+
+
print(sim.model)
+
+
+
+
+

We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as ‘quantizers’. You can see this by printing the sim object.

+
+
[ ]:
+
+
+
print(sim)
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(sim_model, use_cuda):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    if use_cuda:
+        device = torch.device('cuda')
+    else:
+        device = torch.device('cpu')
+
+    sim_model.eval()
+    samples = 1000
+
+    batch_cntr = 0
+    with torch.no_grad():
+        for input_data, target_data in data_loader:
+
+            inputs_batch = input_data.to(device)
+            sim_model(inputs_batch)
+
+            batch_cntr += 1
+            if (batch_cntr * batch_size) > samples:
+                break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)
+
+
+
+
+

After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(finetuned_accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters) that were updated during training since we employed QAT with range-learning. AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+dummy_input = dummy_input.cpu()
+sim.export(path='./output/', filename_prefix='resnet18_after_qat', dummy_input=dummy_input)
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QAT.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters. - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and QAT with range-learning.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/qat.ipynb b/releases/1.32.2/Examples/torch/quantization/qat.ipynb new file mode 100644 index 0000000..78ad8a5 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/qat.ipynb @@ -0,0 +1,490 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantization-Aware Training\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is an AIMET feature adding quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and using a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "AIMET supports two different types of QAT\n", + "1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant.\n", + "2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.\n", + "\n", + "This notebook specifically shows working code example for #1 above. You can find a separate notebook for #2 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)\n", + "\n", + " @staticmethod\n", + " def finetune(model: torch.nn.Module, epochs, learning_rate, learning_rate_schedule, use_cuda):\n", + " \"\"\"\n", + " Given a torch model, finetunes the model to improve its accuracy\n", + " :param model: the model to finetune\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param learning_rate_schedule: The learning rate schedule used during the finetuning step.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_workers=image_net_config.train['num_workers'])\n", + "\n", + " trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,\n", + " learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET quantization simulation requires the user's model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module.\n", + "AIMET user guide lists all these guidelines.\n", + "The following **ModelPreparer** API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.model_preparer import prepare_model\n", + "\n", + "model = prepare_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"QuantScheme.post_training_tf_enhanced\"\n", + " - Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_torch.quantsim import QuantizationSimModel\n", + "\n", + "dummy_input = torch.rand(1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "if use_cuda:\n", + " dummy_input = dummy_input.cuda()\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers. Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(sim.model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as 'quantizers'. You can see this by printing the sim object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def pass_calibration_data(sim_model, use_cuda):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " if use_cuda:\n", + " device = torch.device('cuda')\n", + " else:\n", + " device = torch.device('cpu')\n", + "\n", + " sim_model.eval()\n", + " samples = 1000\n", + "\n", + " batch_cntr = 0\n", + " with torch.no_grad():\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.to(device)\n", + " sim_model(inputs_batch)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(finetuned_accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters) that were updated during training since we employed QAT with range-learning. AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "dummy_input = dummy_input.cpu()\n", + "sim.export(path='./output/', filename_prefix='resnet18_after_qat', dummy_input=dummy_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QAT.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters.\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/torch/quantization) to understand how to use AIMET post-training quantization techniques and QAT with range-learning." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/quantization/qat_range_learning.html b/releases/1.32.2/Examples/torch/quantization/qat_range_learning.html new file mode 100644 index 0000000..2b5330a --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/qat_range_learning.html @@ -0,0 +1,1442 @@ + + + + + + Quantization-Aware Training with Range Learning — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quantization-Aware Training with Range Learning

+

This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is a technique where AIMET adds quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and use a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.

+

AIMET supports two different types of QAT 1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant. 2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and +the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.

+

This notebook specifically shows working code example for #2 above. You can find a separate notebook for #1 in the same folder.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation and training pipeline 2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy 3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score 4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written? Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.

  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods? Not really. You should be able to use your existing evaluate and train routines as-is.

  • +
+
+
[ ]:
+
+
+
import os
+import torch
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_trainer import ImageNetTrainer
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)
+
+    @staticmethod
+    def finetune(model: torch.nn.Module, epochs, learning_rate, learning_rate_schedule, use_cuda):
+        """
+        Given a torch model, finetunes the model to improve its accuracy
+        :param model: the model to finetune
+        :param epochs: The number of epochs used during the finetuning step.
+        :param learning_rate: The learning rate used during the finetuning step.
+        :param learning_rate_schedule: The learning rate schedule used during the finetuning step.
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                  batch_size=image_net_config.train['batch_size'],
+                                  num_workers=image_net_config.train['num_workers'])
+
+        trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,
+                      learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model and evaluate to get a baseline FP32 accuracy score

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+

AIMET quantization simulation requires the user’s model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module. AIMET user guide lists all these guidelines. The following ModelPreparer API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines.

+
+
[ ]:
+
+
+
from aimet_torch.model_preparer import prepare_model
+
+model = prepare_model(model)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+

Let’s determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

3. Create a quantization simulation model and determine quantized accuracy

+
+
+

Fold Batch Normalization layers

+

Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.

+

Why do we need to this? On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values +for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.

+

The following code calls AIMET to fold the BN layers in-place on the given model

+
+
[ ]:
+
+
+
from aimet_torch.batch_norm_fold import fold_all_batch_norms
+
+_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))
+
+
+
+
+
+

Create Quantization Sim Model

+

Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them. A few of the parameters are explained here - quant_scheme: We set this to “training_range_learning_with_tf_init” - This is the key setting that enables “range learning”. With this choice of quant scheme, AIMET will use the TF quant scheme to initialize the quantization parameters like scale/offset. And then those parameters are set +to be trainable so they can continue to be updated during fine-tuning. - Another choice for quant_scheme is “training_range_learning_with_tf_enhanced_init”. Similar to the above, but the initialization for scale/offset is doing using the TF Enhanced scheme. Since in both schemes the quantization parameters are set to be trainable, there is not much benefit to using this choice instead of “training_range_learning_with_tf_init. - default_output_bw: Setting this to 8, essentially means that we +are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision - default_param_bw: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+from aimet_torch.quantsim import QuantizationSimModel
+
+dummy_input = torch.rand(1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+if use_cuda:
+    dummy_input = dummy_input.cuda()
+
+sim = QuantizationSimModel(model=model,
+                           quant_scheme=QuantScheme.training_range_learning_with_tf_init,
+                           dummy_input=dummy_input,
+                           default_output_bw=8,
+                           default_param_bw=8)
+
+
+
+
+

We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers. Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior.

+
+
[ ]:
+
+
+
print(sim.model)
+
+
+
+
+

We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as ‘quantizers’. You can see this by printing the sim object.

+
+
[ ]:
+
+
+
print(sim)
+
+
+
+
+

Even though AIMET has added ‘quantizer’ nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each ‘quantizer’ node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred +to as calibration. AIMET simply refers to it as ‘computing encodings’.

+

So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples - In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has +1M samples. For computing encodings we only need 500 or 1000 samples. - It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example.

+
+
[ ]:
+
+
+
def pass_calibration_data(sim_model, use_cuda):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    if use_cuda:
+        device = torch.device('cuda')
+    else:
+        device = torch.device('cpu')
+
+    sim_model.eval()
+    samples = 1000
+
+    batch_cntr = 0
+    with torch.no_grad():
+        for input_data, target_data in data_loader:
+
+            inputs_batch = input_data.to(device)
+            sim_model(inputs_batch)
+
+            batch_cntr += 1
+            if (batch_cntr * batch_size) > samples:
+                break
+
+
+
+
+

Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters.

+
+
[ ]:
+
+
+
sim.compute_encodings(forward_pass_callback=pass_calibration_data,
+                      forward_pass_callback_args=use_cuda)
+
+
+
+
+

Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before.

+
+
[ ]:
+
+
+
accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(accuracy)
+
+
+
+
+
+
+

4. Perform QAT

+

To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.

+

For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit.

+
+
[ ]:
+
+
+
ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)
+
+
+
+
+

After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy.

+
+
[ ]:
+
+
+
finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)
+print(finetuned_accuracy)
+
+
+
+
+

Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.

+

So we have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters) that were updated during training since we employed QAT with range-learning. AIMET QuantizationSimModel provides an export API for this purpose.

+
+
[ ]:
+
+
+
os.makedirs('./output/', exist_ok=True)
+dummy_input = dummy_input.cpu()
+sim.export(path='./output/', filename_prefix='resnet18_after_qat', dummy_input=dummy_input)
+
+
+
+
+
+
+

Summary

+

Hope this notebook was useful for you to understand how to use AIMET for performing QAT with range-learning.

+

Few additional resources - Refer to the AIMET API docs to know more details of the APIs and optional parameters. - Refer to the other example notebooks to understand how to use AIMET post-training quantization techniques and the vanilla QAT method (without range-learning).

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/qat_range_learning.ipynb b/releases/1.32.2/Examples/torch/quantization/qat_range_learning.ipynb new file mode 100644 index 0000000..e15c9c9 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/qat_range_learning.ipynb @@ -0,0 +1,561 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Quantization-Aware Training with Range Learning\n", + "\n", + "This notebook shows a working code example of how to use AIMET to perform QAT (Quantization-aware training). QAT is a technique where AIMET adds quantization simulation ops (also called fake quantization ops sometimes) to a trained ML model and use a standard training pipeline to fine-tune or train the model for a few epochs. The resulting model should show improved accuracy on quantized ML accelerators.\n", + "\n", + "AIMET supports two different types of QAT\n", + "1. Simply referred to as QAT - quantization parameters like per-tensor scale/offsets for activations are computed once. During fine-tuning, the model weights are updated to minimize the effects of quantization in the forward pass, keeping the quantization parameters constant.\n", + "2. Referred to as QAT with range-learning - quantization parameters like per-tensor scale/offsets for activations are computed initially. Then both the quantization parameters and the model weights are jointly updated during fine-tuning to minimize the effects of quantization in the forward pass.\n", + "\n", + "This notebook specifically shows working code example for #2 above. You can find a separate notebook for #1 in the same folder.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation and training pipeline\n", + "2. Load the FP32 model and evaluate the model to find the baseline FP32 accuracy\n", + "3. Create a quantization simulation model (with fake quantization ops inserted) and evaluate this simuation model to get a quantized accuracy score\n", + "4. Fine-tune the quantization simulation model and evaluate the simulation model to get a post-finetuned quantized accuracy score\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art QAT results. For example, it uses a relatively quantization-friendly model like Resnet18. Also, some optimization parameters like number of epochs to fine-tune are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?** Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a PyTorch model. This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?** Not really. You should be able to use your existing evaluate and train routines as-is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true, + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_trainer import ImageNetTrainer\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)\n", + "\n", + " @staticmethod\n", + " def finetune(model: torch.nn.Module, epochs, learning_rate, learning_rate_schedule, use_cuda):\n", + " \"\"\"\n", + " Given a torch model, finetunes the model to improve its accuracy\n", + " :param model: the model to finetune\n", + " :param epochs: The number of epochs used during the finetuning step.\n", + " :param learning_rate: The learning rate used during the finetuning step.\n", + " :param learning_rate_schedule: The learning rate schedule used during the finetuning step.\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " trainer = ImageNetTrainer(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.train['batch_size'],\n", + " num_workers=image_net_config.train['num_workers'])\n", + "\n", + " trainer.train(model, max_epochs=epochs, learning_rate=learning_rate,\n", + " learning_rate_schedule=learning_rate_schedule, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## 2. Load the model and evaluate to get a baseline FP32 accuracy score" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "AIMET quantization simulation requires the user's model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module.\n", + "AIMET user guide lists all these guidelines.\n", + "The following **ModelPreparer** API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_torch.model_preparer import prepare_model\n", + "\n", + "model = prepare_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Let's determine the FP32 (floating point 32-bit) accuracy of this model using the evaluate() routine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 3. Create a quantization simulation model and determine quantized accuracy\n", + "\n", + "## Fold Batch Normalization layers\n", + "Before we determine the simulated quantized accuracy using QuantizationSimModel, we will fold the BatchNormalization (BN) layers in the model. These layers get folded into adjacent Convolutional layers. The BN layers that cannot be folded are left as they are.\n", + "\n", + "**Why do we need to this?**\n", + "On quantized runtimes (like TFLite, SnapDragon Neural Processing SDK, etc.), it is a common practice to fold the BN layers. Doing so, results in an inferences/sec speedup since unnecessary computation is avoided. Now from a floating point compute perspective, a BN-folded model is mathematically equivalent to a model with BN layers from an inference perspective, and produces the same accuracy. However, folding the BN layers can increase the range of the tensor values for the weight parameters of the adjacent layers. And this can have a negative impact on the quantized accuracy of the model (especially when using INT8 or lower precision). So, we want to simulate that on-target behavior by doing BN folding here.\n", + "\n", + "The following code calls AIMET to fold the BN layers in-place on the given model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from aimet_torch.batch_norm_fold import fold_all_batch_norms\n", + "\n", + "_ = fold_all_batch_norms(model, input_shapes=(1, 3, 224, 224))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Create Quantization Sim Model\n", + "\n", + "Now we use AIMET to create a QuantizationSimModel. This basically means that AIMET will insert fake quantization ops in the model graph and will configure them.\n", + "A few of the parameters are explained here\n", + "- **quant_scheme**: We set this to \"training_range_learning_with_tf_init\"\n", + " - This is the key setting that enables \"range learning\". With this choice of quant scheme, AIMET will use the TF quant scheme to initialize the quantization parameters like scale/offset. And then those parameters are set to be trainable so they can continue to be updated during fine-tuning.\n", + " - Another choice for quant_scheme is \"training_range_learning_with_tf_enhanced_init\". Similar to the above, but the initialization for scale/offset is doing using the TF Enhanced scheme. Since in both schemes the quantization parameters are set to be trainable, there is not much benefit to using this choice instead of \"training_range_learning_with_tf_init.\n", + "- **default_output_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision\n", + "- **default_param_bw**: Setting this to 8, essentially means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision\n", + "\n", + "There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "from aimet_torch.quantsim import QuantizationSimModel\n", + "\n", + "dummy_input = torch.rand(1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "if use_cuda:\n", + " dummy_input = dummy_input.cuda()\n", + "\n", + "sim = QuantizationSimModel(model=model,\n", + " quant_scheme=QuantScheme.training_range_learning_with_tf_init,\n", + " dummy_input=dummy_input,\n", + " default_output_bw=8,\n", + " default_param_bw=8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can check the modifications AIMET has made to the model graph. One way is to print the model, and we can see that AIMET has added quantization wrapper layers. Note: use sim.model to access the modified PyTorch model. By default, AIMET creates a copy of the original model prior to modifying it. There is a parameter to override this behavior." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "print(sim.model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "We can also check how AIMET has configured the added fake quantization nodes, which AIMET refers to as 'quantizers'. You can see this by printing the sim object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "print(sim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Even though AIMET has added 'quantizer' nodes to the model graph but the model is not ready to be used yet. Before we can use the sim model for inference or training, we need to find appropriate scale/offset quantization parameters for each 'quantizer' node. For activation quantization nodes, we need to pass unlabeled data samples through the model to collect range statistics which will then let AIMET calculate appropriate scale/offset quantization parameters. This process is sometimes referred to as calibration. AIMET simply refers to it as 'computing encodings'.\n", + "\n", + "So we create a routine to pass unlabeled data samples through the model. This should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don't need to compute any loss metric etc. So we can just ignore the model output for this purpose. A few pointers regarding the data samples\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 or 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed. It's not necessary that all classes need to be covered etc. since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many different ways, this is just an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def pass_calibration_data(sim_model, use_cuda):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " if use_cuda:\n", + " device = torch.device('cuda')\n", + " else:\n", + " device = torch.device('cpu')\n", + "\n", + " sim_model.eval()\n", + " samples = 1000\n", + "\n", + " batch_cntr = 0\n", + " with torch.no_grad():\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.to(device)\n", + " sim_model(inputs_batch)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now we call AIMET to use the above routine to pass data through the model and then subsequently compute the quantization encodings. Encodings here refer to scale/offset quantization parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "sim.compute_encodings(forward_pass_callback=pass_calibration_data,\n", + " forward_pass_callback_args=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Now the QuantizationSim model is ready to be used for inference or training. First we can pass this model to the same evaluation routine we used before. The evaluation routine will now give us a simulated quantized accuracy score for INT8 quantization instead of the FP32 accuracy score we saw before." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## 4. Perform QAT\n", + "\n", + "To perform quantization aware training (QAT), we simply train the model for a few more epochs (typically 15-20). As with any training job, hyper-parameters need to be searched for optimal results. Good starting points are to use a learning rate on the same order as the ending learning rate when training the original model, and to drop the learning rate by a factor of 10 every 5 epochs or so.\n", + "\n", + "For the purpose of this example notebook, we are going to train only for 1 epoch. But feel free to change these parameters as you see fit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "After we are done with QAT, we can run quantization simulation inference against the validation dataset at the end to observe any improvements in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "finetuned_accuracy = ImageNetDataPipeline.evaluate(sim.model, use_cuda)\n", + "print(finetuned_accuracy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "Depending on your settings you may have observed a slight gain in accuracy after one epoch of training. Ofcourse, this was just an example. Please try this against the model of your choice and play with the hyper-parameters to get the best results.\n", + "\n", + "So we have an improved model after QAT. Now the next step would be to actually take this model to target. For this purpose, we need to export the model with the updated weights without the fake quant ops. And also to export the encodings (scale/offset quantization parameters) that were updated during training since we employed QAT with range-learning. AIMET QuantizationSimModel provides an export API for this purpose." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "os.makedirs('./output/', exist_ok=True)\n", + "dummy_input = dummy_input.cpu()\n", + "sim.export(path='./output/', filename_prefix='resnet18_after_qat', dummy_input=dummy_input)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "---\n", + "## Summary\n", + "\n", + "Hope this notebook was useful for you to understand how to use AIMET for performing QAT with range-learning.\n", + "\n", + "Few additional resources\n", + "- Refer to the [AIMET API docs](https://quic.github.io/aimet-pages/AimetDocs/api_docs/index.html) to know more details of the APIs and optional parameters.\n", + "- Refer to the [other example notebooks](https://github.com/quic/aimet/tree/develop/Examples/torch/quantization) to understand how to use AIMET post-training quantization techniques and the vanilla QAT method (without range-learning)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/releases/1.32.2/Examples/torch/quantization/quant_analyzer.html b/releases/1.32.2/Examples/torch/quantization/quant_analyzer.html new file mode 100644 index 0000000..2766763 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/quant_analyzer.html @@ -0,0 +1,1466 @@ + + + + + + Quant Analyzer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quant Analyzer

+

This notebook showcases a working code example of how to use AIMET to apply Quant Analyzer. Quant Analyzer is a feature which performs various analyses on a model to understand how each layer in the model responds to quantization.

+
+

Overall flow

+

This notebook covers the following 1. Instantiate the example evaluation pipeline 2. Load the FP32 model 3. Apply QuantAnalyzer to the model

+
+
+

What this notebook is not

+
    +
  • This notebook is not designed to show state-of-the-art results.

  • +
  • For example, it uses a relatively quantization-friendly model like Resnet18.

  • +
  • Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly.

  • +
+
+
+

Dataset

+

This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).

+

Note1: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these - Subfolders ‘train’ for the training samples and ‘val’ for the validation samples. Please see the pytorch dataset description for more details. - A subdirectory per class, and a file per each image sample

+

Note2: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.

+

Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved.

+
+
[ ]:
+
+
+
DATASET_DIR = '/path/to/dataset/'         # Please replace this with a real directory
+
+
+
+
+
+
+

1. Example evaluation and training pipeline

+

The following is an example training and validation loop for this image classification task.

+
    +
  • Does AIMET have any limitations on how the training, validation pipeline is written?

    +

    Not really. We will see later that AIMET will modify the user’s model to create a QuantizationSim model which is still a TensorFlow model. This QuantizationSim model can be used in place of the original model when doing inference or training.

    +
  • +
  • Does AIMET put any limitation on the interface of the evaluate() or train() methods?

    +

    Not really. You should be able to use your existing evaluate and train routines as-is.

    +
  • +
+
+
[ ]:
+
+
+
import torch
+from Examples.common import image_net_config
+from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator
+from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader
+
+class ImageNetDataPipeline:
+
+    @staticmethod
+    def get_val_dataloader() -> torch.utils.data.DataLoader:
+        """
+        Instantiates a validation dataloader for ImageNet dataset and returns it
+        """
+        data_loader = ImageNetDataLoader(DATASET_DIR,
+                                         image_size=image_net_config.dataset['image_size'],
+                                         batch_size=image_net_config.evaluation['batch_size'],
+                                         is_training=False,
+                                         num_workers=image_net_config.evaluation['num_workers']).data_loader
+        return data_loader
+
+    @staticmethod
+    def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:
+        """
+        Given a torch model, evaluates its Top-1 accuracy on the dataset
+        :param model: the model to evaluate
+        :param use_cuda: whether or not the GPU should be used.
+        """
+        evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],
+                                      batch_size=image_net_config.evaluation['batch_size'],
+                                      num_workers=image_net_config.evaluation['num_workers'])
+
+        return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)
+
+
+
+
+
+
+

2. Load the model

+

For this example notebook, we are going to load a pretrained resnet18 model from torchvision. Similarly, you can load any pretrained PyTorch model instead.

+
+
[ ]:
+
+
+
from torchvision.models import resnet18
+
+model = resnet18(pretrained=True)
+
+
+
+

AIMET quantization simulation requires the user’s model definition to follow certain guidelines. For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module. AIMET user guide lists all these guidelines.

+

The following ModelPreparer API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines.

+
+
[ ]:
+
+
+
from aimet_torch.model_preparer import prepare_model
+
+model = prepare_model(model)
+
+
+
+
+

We should decide whether to place the model on a CPU or CUDA device. This example code will use CUDA if available in your current execution environment. You can change this logic and force a device placement if needed.

+
+
[ ]:
+
+
+
use_cuda = False
+if torch.cuda.is_available():
+    use_cuda = True
+    model.to(torch.device('cuda'))
+
+
+
+
+
+
+

3. Apply QuantAnalyzer to the model

+

QuantAnalyzer requires two functions to be defined by the user for passing data through the model:

+

Forward pass callback

+

One function will be used to pass representative data through a quantized version of the model to calibrate quantization parameters. This function should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model. We don’t need to compute any loss metrics, so we can just ignore the model output.

+

The function must take two arguments, the first of which will be the model to run the forward pass on. The second argument can be anything additional which the function requires to run, and can be in the form of a single item or a tuple of items.

+

If no additional argument is needed, the user can specify a dummy “_” parameter for the function.

+

A few pointers regarding the forward pass data samples:

+
    +
  • In practice, we need a very small percentage of the overall data samples for computing encodings. For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.

  • +
  • It may be beneficial if the samples used for computing encoding are well distributed. It’s not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation. However, we definitely want to avoid an extreme scenario like all ‘dark’ or ‘light’ samples are used - e.g. only using pictures captured at night might not give ideal results.

  • +
+

The following shows an example of a routine that passes unlabeled samples through the model for computing encodings. This routine can be written in many ways; this is just an example. This function only requires unlabeled data as no loss or other evaluation metric is needed.

+
+
[ ]:
+
+
+
def pass_calibration_data(sim_model, use_cuda):
+    data_loader = ImageNetDataPipeline.get_val_dataloader()
+    batch_size = data_loader.batch_size
+
+    if use_cuda:
+        device = torch.device('cuda')
+    else:
+        device = torch.device('cpu')
+
+    sim_model.eval()
+    samples = 1000
+
+    batch_cntr = 0
+    with torch.no_grad():
+        for input_data, target_data in data_loader:
+
+            inputs_batch = input_data.to(device)
+            sim_model(inputs_batch)
+
+            batch_cntr += 1
+            if (batch_cntr * batch_size) > samples:
+                break
+
+
+
+

In order to pass this function to QuantAnalyzer, we need to wrap it in a CallbackFunc object, as shown below. The CallbackFunc takes two arguments: the callback function itself, and the inputs to pass into the callback function.

+
+
[ ]:
+
+
+
from aimet_torch.quant_analyzer import CallbackFunc
+
+forward_pass_callback = CallbackFunc(pass_calibration_data, use_cuda)
+
+
+
+
+

Evaluation callback

+

The second function will be used to evaluate the model, and needs to return an accuracy metric. In here, the user should pass any amount of data through the model which they would like when evaluating their model for accuracy.

+

Like the forward pass callback, this function also must take exactly two arguments: the model to evaluate, and any additional argument needed for the function to work. The second argument can be a tuple of items in case multiple items are needed.

+

We will be using the ImageNetDataPipeline’s evaluate defined above for this purpose. Like the forward pass callback, we need to wrap the evaluation callback in a CallbackFunc object as well.

+
+
[ ]:
+
+
+
eval_callback = CallbackFunc(ImageNetDataPipeline.evaluate, use_cuda)
+
+
+
+
+

Enabling MSE loss per layer analysis

+

An optional analysis step in QuantAnalyzer calculates the MSE loss per layer in the model, comparing the layer outputs from the original FP32 model vs. a quantized model. To perform this step, the user needs to also provide an unlabeled DataLoader to QuantAnalyzer.

+

We will demonstrate this step by using the ImageNetDataLoader imported above.

+
+
[ ]:
+
+
+
data_loader = ImageNetDataPipeline.get_val_dataloader()
+
+
+
+
+

QuantAnalyzer also requires a dummy input to the model. This dummy input does not need to be representative of the dataset. All that matters is that the input shape is correct for the model to run on.

+
+
[ ]:
+
+
+
dummy_input = torch.rand(1, 3, 224, 224)    # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)
+if use_cuda:
+    dummy_input = dummy_input.cuda()
+
+
+
+
+

We are now ready to apply QuantAnalyzer.

+
+
[ ]:
+
+
+
from aimet_torch.quant_analyzer import QuantAnalyzer
+
+quant_analyzer = QuantAnalyzer(model, dummy_input, forward_pass_callback, eval_callback)
+
+
+
+

To enable the MSE loss analysis, we set the following:

+
+
[ ]:
+
+
+
quant_analyzer.enable_per_layer_mse_loss(data_loader, num_batches=4)
+
+
+
+

Finally, to start the analyzer, we call .analyze().

+

A few of the parameters are explained here: - quant_scheme: - We set this to “post_training_tf_enhanced” With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset. - default_output_bw: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision. - default_param_bw: Setting this to 8 means that we are asking AIMET to perform all +parameter quantizations in the model using integer 8-bit precision.

+

There are other parameters that are set to default values in this example. Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.

+

When you call the analyze method, the following analyses are run:

+
    +
  • Compare fp32 accuracy, accuracy with only parameters quantized, and accuracy with only activations quantized

  • +
  • For each layer, track the model accuracy when quantization for all other layers is disabled (enabling quantization for only one layer in the model at a time)

  • +
  • For each layer, track the model accuracy when quantization for all other layers is enabled (disabling quantization for only one layer in the model at a time)

  • +
  • Track the minimum and maximum encoding parameters calculated by each quantizer in the model as a result of forward passes through the model with representative data

  • +
  • When the TF Enhanced quantization scheme is used, track the histogram of tensor ranges seen by each quantizer in the model as a result of forward passes through the model with representative data

  • +
  • If enabled, track the MSE loss seen at each layer by comparing layer outputs of the original fp32 model vs. a quantized model

  • +
+
+
[ ]:
+
+
+
from aimet_common.defs import QuantScheme
+
+quant_analyzer.analyze(quant_scheme=QuantScheme.post_training_tf_enhanced,
+                       default_param_bw=8,
+                       default_output_bw=8,
+                       config_file=None,
+                       results_dir="./tmp/")
+
+
+
+

AIMET will also output .html plots and json files where appropriate for each analysis to help visualize the data.

+

The following output files will be produced, in a folder specified by the user: Output directory structure will be like below

+
results_dir
+|-- per_layer_quant_enabled.html
+|-- per_layer_quant_enabled.json
+|-- per_layer_quant_disabled.html
+|-- per_layer_quant_disabled.json
+|-- min_max_ranges
+|   |-- activations.html
+|   |-- activations.json
+|   |-- weights.html
+|   +-- weights.json
+|-- activations_pdf
+|   |-- name_{input/output}_{index_0}.html
+|   |-- name_{input/output}_{index_1}.html
+|   |-- ...
+|   +-- name_{input/output}_{index_N}.html
+|-- weights_pdf
+|   |-- layer1
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   |   +-- param_name_{channel_index_N}.html
+|   |-- layer2
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   |   +-- param_name_{channel_index_N}.html
+|   |-- ...
+|   |-- layerN
+|   |   |-- param_name_{channel_index_0}.html
+|   |   |-- param_name_{channel_index_1}.html
+|   |   |-- ...
+|   +-- +-- param_name_{channel_index_N}.html
+|-- per_layer_mse_loss.html
++-- per_layer_mse_loss.json
+
+
+
+
+
+

Per-layer analysis by enabling/disabling quantization wrappers

+
    +
  • per_layer_quant_enabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer’s accuracy represents the model accuracy when all quantizers in the model are disabled except for that layer’s parameter and activation quantizers.

  • +
  • per_layer_quant_enabled.json: A json file containing the data shown in per_layer_quant_enabled.html, associating layer names with model accuracy.

  • +
  • per_layer_quant_disabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer’s accuracy represents the model accuracy when all quantizers in the model are enabled except for that layer’s parameter and activation quantizers.

  • +
  • per_layer_quant_disabled.json: A json file containing the data shown in per_layer_quant_disabled.html, associating layer names with model accuracy.

  • +
+

per_layer_quant_enabled.html

+
+
+

Encoding min/max ranges

+
    +
  • min_max_ranges: A folder containing the following sets of files:

    +
      +
    • activations.html: A plot with output activations on the x-axis and min-max values on the y-axis, where each output activation’s range represents the encoding min and max parameters computed during forward pass calibration (explained below).

    • +
    • activations.json: A json file containing the data shown in activations.html, associating layer names with min and max encoding values.

    • +
    • weights.html: A plot with parameter names on the x-axis and min-max values on the y-axis, where each parameter’s range represents the encoding min and max parameters computed during forward pass calibration.

    • +
    • weights.json: A json file containing the data shown in weights.html, associating parameter names with min and max encoding values.

    • +
    +
  • +
+

min_max_ranges.html

+
+
+

PDF of statistics

+
    +
  • (If TF Enhanced quant scheme is used) activations_pdf: A folder containing html files for each layer, plotting the histogram of tensor values seen for that layer’s output activation seen during forward pass calibration.

  • +
  • (If TF Enhanced quant scheme is used) weights_pdf: A folder containing sub folders for each layer with weights. Each layer’s folder contains html files for each parameter of that layer, with a histogram plot of tensor values seen for that parameter seen during forward pass calibration.

  • +
+

weights_pdf.html

+
+
+

Per-layer MSE loss

+
    +
  • (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.html: A plot with layers on the x-axis and MSE loss on the y-axis, where each layer’s MSE loss represents the MSE seen comparing that layer’s outputs in the FP32 model vs. the quantized model.

  • +
  • (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.json: A json file containing the data shown in per_layer_mse_loss.html, associating layer names with MSE loss.

  • +
+

per_layer_mse_loss.html

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/Examples/torch/quantization/quant_analyzer.ipynb b/releases/1.32.2/Examples/torch/quantization/quant_analyzer.ipynb new file mode 100644 index 0000000..69cd7f8 --- /dev/null +++ b/releases/1.32.2/Examples/torch/quantization/quant_analyzer.ipynb @@ -0,0 +1,574 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Quant Analyzer\n", + "\n", + "This notebook showcases a working code example of how to use AIMET to apply Quant Analyzer.\n", + "Quant Analyzer is a feature which performs various analyses on a model to understand how each layer in the model responds to quantization.\n", + "\n", + "#### Overall flow\n", + "This notebook covers the following\n", + "1. Instantiate the example evaluation pipeline\n", + "2. Load the FP32 model\n", + "3. Apply QuantAnalyzer to the model\n", + "\n", + "\n", + "#### What this notebook is not\n", + "* This notebook is not designed to show state-of-the-art results.\n", + "* For example, it uses a relatively quantization-friendly model like Resnet18.\n", + "* Also, some optimization parameters are deliberately chosen to have the notebook execute more quickly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "## Dataset\n", + "\n", + "This notebook relies on the ImageNet dataset for the task of image classification. If you already have a version of the dataset readily available, please use that. Else, please download the dataset from appropriate location (e.g. https://image-net.org/challenges/LSVRC/2012/index.php#).\n", + "\n", + "**Note1**: The ImageNet dataset typically has the following characteristics and the dataloader provided in this example notebook rely on these\n", + "- Subfolders 'train' for the training samples and 'val' for the validation samples. Please see the [pytorch dataset description](https://pytorch.org/vision/0.8/_modules/torchvision/datasets/imagenet.html) for more details.\n", + "- A subdirectory per class, and a file per each image sample\n", + "\n", + "**Note2**: To speed up the execution of this notebook, you may use a reduced subset of the ImageNet dataset. E.g. the entire ILSVRC2012 dataset has 1000 classes, 1000 training samples per class and 50 validation samples per class. But for the purpose of running this notebook, you could perhaps reduce the dataset to say 2 samples per class. This exercise is left upto the reader and is not necessary.\n", + "\n", + "Edit the cell below and specify the directory where the downloaded ImageNet dataset is saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "DATASET_DIR = '/path/to/dataset/' # Please replace this with a real directory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 1. Example evaluation and training pipeline\n", + "\n", + "The following is an example training and validation loop for this image classification task.\n", + "\n", + "- **Does AIMET have any limitations on how the training, validation pipeline is written?**\n", + "\n", + " Not really. We will see later that AIMET will modify the user's model to create a QuantizationSim model which is still a TensorFlow model.\n", + " This QuantizationSim model can be used in place of the original model when doing inference or training.\n", + "\n", + "- **Does AIMET put any limitation on the interface of the evaluate() or train() methods?**\n", + "\n", + " Not really. You should be able to use your existing evaluate and train routines as-is." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import torch\n", + "from Examples.common import image_net_config\n", + "from Examples.torch.utils.image_net_evaluator import ImageNetEvaluator\n", + "from Examples.torch.utils.image_net_data_loader import ImageNetDataLoader\n", + "\n", + "class ImageNetDataPipeline:\n", + "\n", + " @staticmethod\n", + " def get_val_dataloader() -> torch.utils.data.DataLoader:\n", + " \"\"\"\n", + " Instantiates a validation dataloader for ImageNet dataset and returns it\n", + " \"\"\"\n", + " data_loader = ImageNetDataLoader(DATASET_DIR,\n", + " image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " is_training=False,\n", + " num_workers=image_net_config.evaluation['num_workers']).data_loader\n", + " return data_loader\n", + "\n", + " @staticmethod\n", + " def evaluate(model: torch.nn.Module, use_cuda: bool) -> float:\n", + " \"\"\"\n", + " Given a torch model, evaluates its Top-1 accuracy on the dataset\n", + " :param model: the model to evaluate\n", + " :param use_cuda: whether or not the GPU should be used.\n", + " \"\"\"\n", + " evaluator = ImageNetEvaluator(DATASET_DIR, image_size=image_net_config.dataset['image_size'],\n", + " batch_size=image_net_config.evaluation['batch_size'],\n", + " num_workers=image_net_config.evaluation['num_workers'])\n", + "\n", + " return evaluator.evaluate(model, iterations=None, use_cuda=use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 2. Load the model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "For this example notebook, we are going to load a pretrained resnet18 model from torchvision.\n", + "Similarly, you can load any pretrained PyTorch model instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from torchvision.models import resnet18\n", + "\n", + "model = resnet18(pretrained=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "AIMET quantization simulation requires the user's model definition to follow certain guidelines.\n", + "For example, functionals defined in forward pass should be changed to equivalent torch.nn.Module.\n", + "AIMET user guide lists all these guidelines.\n", + "\n", + "The following **ModelPreparer** API uses new graph transformation feature available in PyTorch 1.9+ version and automates model definition changes required to comply with the above guidelines." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_torch.model_preparer import prepare_model\n", + "\n", + "model = prepare_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "We should decide whether to place the model on a CPU or CUDA device.\n", + "This example code will use CUDA if available in your current execution environment.\n", + "You can change this logic and force a device placement if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "use_cuda = False\n", + "if torch.cuda.is_available():\n", + " use_cuda = True\n", + " model.to(torch.device('cuda'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "## 3. Apply QuantAnalyzer to the model\n", + "\n", + "QuantAnalyzer requires two functions to be defined by the user for passing data through the model:\n", + "\n", + "**Forward pass callback**\n", + "\n", + "One function will be used to pass representative data through a quantized version of the model to calibrate quantization parameters.\n", + "This function should be fairly simple - use the existing train or validation data loader to extract some samples and pass them to the model.\n", + "We don't need to compute any loss metrics, so we can just ignore the model output.\n", + "\n", + "The function **must** take two arguments, the first of which will be the model to run the forward pass on.\n", + "The second argument can be anything additional which the function requires to run, and can be in the form of a single item or a tuple of items.\n", + "\n", + "If no additional argument is needed, the user can specify a dummy \"_\" parameter for the function.\n", + "\n", + "A few pointers regarding the forward pass data samples:\n", + "\n", + "- In practice, we need a very small percentage of the overall data samples for computing encodings.\n", + " For example, the training dataset for ImageNet has 1M samples. For computing encodings we only need 500 to 1000 samples.\n", + "- It may be beneficial if the samples used for computing encoding are well distributed.\n", + " It's not necessary that all classes need to be covered since we are only looking at the range of values at every layer activation.\n", + " However, we definitely want to avoid an extreme scenario like all 'dark' or 'light' samples are used - e.g. only using pictures captured at night might not give ideal results.\n", + "\n", + "The following shows an example of a routine that passes unlabeled samples through the model for computing encodings.\n", + "This routine can be written in many ways; this is just an example.\n", + "This function only requires unlabeled data as no loss or other evaluation metric is needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def pass_calibration_data(sim_model, use_cuda):\n", + " data_loader = ImageNetDataPipeline.get_val_dataloader()\n", + " batch_size = data_loader.batch_size\n", + "\n", + " if use_cuda:\n", + " device = torch.device('cuda')\n", + " else:\n", + " device = torch.device('cpu')\n", + "\n", + " sim_model.eval()\n", + " samples = 1000\n", + "\n", + " batch_cntr = 0\n", + " with torch.no_grad():\n", + " for input_data, target_data in data_loader:\n", + "\n", + " inputs_batch = input_data.to(device)\n", + " sim_model(inputs_batch)\n", + "\n", + " batch_cntr += 1\n", + " if (batch_cntr * batch_size) > samples:\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "In order to pass this function to QuantAnalyzer, we need to wrap it in a CallbackFunc object, as shown below.\n", + "The CallbackFunc takes two arguments: the callback function itself, and the inputs to pass into the callback function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_torch.quant_analyzer import CallbackFunc\n", + "\n", + "forward_pass_callback = CallbackFunc(pass_calibration_data, use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "**Evaluation callback**\n", + "\n", + "The second function will be used to evaluate the model, and needs to return an accuracy metric.\n", + "In here, the user should pass any amount of data through the model which they would like when evaluating their model for accuracy.\n", + "\n", + "Like the forward pass callback, this function also must take exactly two arguments: the model to evaluate, and any additional argument needed for the function to work.\n", + "The second argument can be a tuple of items in case multiple items are needed.\n", + "\n", + "We will be using the ImageNetDataPipeline's evaluate defined above for this purpose.\n", + "Like the forward pass callback, we need to wrap the evaluation callback in a CallbackFunc object as well." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "eval_callback = CallbackFunc(ImageNetDataPipeline.evaluate, use_cuda)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "**Enabling MSE loss per layer analysis**\n", + "\n", + "An optional analysis step in QuantAnalyzer calculates the MSE loss per layer in the model, comparing the layer outputs from the original FP32 model vs. a quantized model.\n", + "To perform this step, the user needs to also provide an unlabeled DataLoader to QuantAnalyzer.\n", + "\n", + "We will demonstrate this step by using the ImageNetDataLoader imported above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "data_loader = ImageNetDataPipeline.get_val_dataloader()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "\n", + "QuantAnalyzer also requires a dummy input to the model.\n", + "This dummy input does not need to be representative of the dataset.\n", + "All that matters is that the input shape is correct for the model to run on." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "dummy_input = torch.rand(1, 3, 224, 224) # Shape for each ImageNet sample is (3 channels) x (224 height) x (224 width)\n", + "if use_cuda:\n", + " dummy_input = dummy_input.cuda()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "---\n", + "We are now ready to apply QuantAnalyzer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_torch.quant_analyzer import QuantAnalyzer\n", + "\n", + "quant_analyzer = QuantAnalyzer(model, dummy_input, forward_pass_callback, eval_callback)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "To enable the MSE loss analysis, we set the following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "quant_analyzer.enable_per_layer_mse_loss(data_loader, num_batches=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Finally, to start the analyzer, we call .analyze().\n", + "\n", + "A few of the parameters are explained here:\n", + "- **quant_scheme**:\n", + " - We set this to \"post_training_tf_enhanced\"\n", + " With this choice of quant scheme, AIMET will use the TF Enhanced quant scheme to initialize the quantization parameters like scale/offset.\n", + "- **default_output_bw**: Setting this to 8 means that we are asking AIMET to perform all activation quantizations in the model using integer 8-bit precision.\n", + "- **default_param_bw**: Setting this to 8 means that we are asking AIMET to perform all parameter quantizations in the model using integer 8-bit precision.\n", + "\n", + "There are other parameters that are set to default values in this example.\n", + "Please check the AIMET API documentation of QuantizationSimModel to see reference documentation for all the parameters.\n", + "\n", + "When you call the analyze method, the following analyses are run:\n", + "\n", + "- Compare fp32 accuracy, accuracy with only parameters quantized, and accuracy with only activations quantized\n", + "- For each layer, track the model accuracy when quantization for all other layers is disabled (enabling quantization for only one layer in the model at a time)\n", + "- For each layer, track the model accuracy when quantization for all other layers is enabled (disabling quantization for only one layer in the model at a time)\n", + "- Track the minimum and maximum encoding parameters calculated by each quantizer in the model as a result of forward passes through the model with representative data\n", + "- When the TF Enhanced quantization scheme is used, track the histogram of tensor ranges seen by each quantizer in the model as a result of forward passes through the model with representative data\n", + "- If enabled, track the MSE loss seen at each layer by comparing layer outputs of the original fp32 model vs. a quantized model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from aimet_common.defs import QuantScheme\n", + "\n", + "quant_analyzer.analyze(quant_scheme=QuantScheme.post_training_tf_enhanced,\n", + " default_param_bw=8,\n", + " default_output_bw=8,\n", + " config_file=None,\n", + " results_dir=\"./tmp/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "AIMET will also output .html plots and json files where appropriate for each analysis to help visualize the data.\n", + "\n", + "The following output files will be produced, in a folder specified by the user:\n", + "Output directory structure will be like below\n", + "\n", + "```\n", + "results_dir\n", + "|-- per_layer_quant_enabled.html\n", + "|-- per_layer_quant_enabled.json\n", + "|-- per_layer_quant_disabled.html\n", + "|-- per_layer_quant_disabled.json\n", + "|-- min_max_ranges\n", + "| |-- activations.html\n", + "| |-- activations.json\n", + "| |-- weights.html\n", + "| +-- weights.json\n", + "|-- activations_pdf\n", + "| |-- name_{input/output}_{index_0}.html\n", + "| |-- name_{input/output}_{index_1}.html\n", + "| |-- ...\n", + "| +-- name_{input/output}_{index_N}.html\n", + "|-- weights_pdf\n", + "| |-- layer1\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| | +-- param_name_{channel_index_N}.html\n", + "| |-- layer2\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| | +-- param_name_{channel_index_N}.html\n", + "| |-- ...\n", + "| |-- layerN\n", + "| | |-- param_name_{channel_index_0}.html\n", + "| | |-- param_name_{channel_index_1}.html\n", + "| | |-- ...\n", + "| +-- +-- param_name_{channel_index_N}.html\n", + "|-- per_layer_mse_loss.html\n", + "+-- per_layer_mse_loss.json\n", + "```\n", + "\n", + "#### Per-layer analysis by enabling/disabling quantization wrappers\n", + "\n", + "- per_layer_quant_enabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer's accuracy represents the model accuracy when all quantizers in the model are disabled except for that layer's parameter and activation quantizers.\n", + "- per_layer_quant_enabled.json: A json file containing the data shown in per_layer_quant_enabled.html, associating layer names with model accuracy.\n", + "- per_layer_quant_disabled.html: A plot with layers on the x-axis and model accuracy on the y-axis, where each layer's accuracy represents the model accuracy when all quantizers in the model are enabled except for that layer's parameter and activation quantizers.\n", + "- per_layer_quant_disabled.json: A json file containing the data shown in per_layer_quant_disabled.html, associating layer names with model accuracy.\n", + "\n", + "![per_layer_quant_enabled.html](./images/quant_analyzer_per_layer_quant_enabled.PNG)\n", + "\n", + "#### Encoding min/max ranges\n", + "\n", + "- min_max_ranges: A folder containing the following sets of files:\n", + " - activations.html: A plot with output activations on the x-axis and min-max values on the y-axis, where each output activation's range represents the encoding min and max parameters computed during forward pass calibration (explained below).\n", + " - activations.json: A json file containing the data shown in activations.html, associating layer names with min and max encoding values.\n", + " - weights.html: A plot with parameter names on the x-axis and min-max values on the y-axis, where each parameter's range represents the encoding min and max parameters computed during forward pass calibration.\n", + " - weights.json: A json file containing the data shown in weights.html, associating parameter names with min and max encoding values.\n", + "\n", + "![min_max_ranges.html](./images/quant_analyzer_min_max_ranges.PNG)\n", + "\n", + "#### PDF of statistics\n", + "\n", + "- (If TF Enhanced quant scheme is used) activations_pdf: A folder containing html files for each layer, plotting the histogram of tensor values seen for that layer's output activation seen during forward pass calibration.\n", + "- (If TF Enhanced quant scheme is used) weights_pdf: A folder containing sub folders for each layer with weights.\n", + " Each layer's folder contains html files for each parameter of that layer, with a histogram plot of tensor values seen for that parameter seen during forward pass calibration.\n", + "\n", + "![weights_pdf.html](./images/quant_analyzer_weights_pdf.PNG)\n", + "\n", + "#### Per-layer MSE loss\n", + "- (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.html: A plot with layers on the x-axis and MSE loss on the y-axis, where each layer's MSE loss represents the MSE seen comparing that layer's outputs in the FP32 model vs. the quantized model.\n", + "- (Optional, if per layer MSE loss is enabled) per_layer_mse_loss.json: A json file containing the data shown in per_layer_mse_loss.html, associating layer names with MSE loss.\n", + "\n", + "![per_layer_mse_loss.html](./images/quant_analyzer_per_layer_mse_loss.PNG)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/releases/1.32.2/_images/AIMET_index_no_fine_tune.png b/releases/1.32.2/_images/AIMET_index_no_fine_tune.png new file mode 100644 index 0000000000000000000000000000000000000000..59803a20d8b2f8e19df635a2bd44659ecfdb9cd9 GIT binary patch literal 36982 zcmeFYX*65yy9bh^}Bx8katD~I$WFroFEX0 z>*0gDk3pbABoOF8)3GDKH^=Ku4g!Y*{*QIEK&5>bh`@(Ku6OkBfIt;-Cw83R>8so_9CCVna*6~*li@g_uMSf0 zn_QQa*Pz{E)AbK0(xd*Wo7kP zaMCgnfPwfJz{*@|gB6XulA22of*zTue39TCIyHR&^ilE+1SG@3%lT*CsR9#2s(3Pd z02J@}{bV0W;Dc!p(GLWYQ3gcsC?LUG>z=a8WsIgZKrjMAQg4dsrmY0t? z_kNXkn&c8xu=Mow%;x}A7G-AsSn5sXU#VZi6pfCJMZRc0aCCyjr1(Z%c=1*!`1i}q zU>OU0dv&9@m@T7u!1j}a*{>4&Gc|x`(G*i(PfmlaRcNr*;{wO+f+pdN8GbEgP;<{? z6O*SMLP6hl}Xs14;rlCqOvlcAIPYnY_4?>sQD)V8{zIPiUi>Sc|}E>Zx~gu zesju`yjD*^B_<}yh=4$Of7jleF({|@srE}X{MGXG@TiQAj(+*K)abeBn?Mjq?*afv zVorXVqIPz6fxz=7;=*WGm@||x9nGVlbMl9S2;cla*ggMoIB?9$HNx+3P+N=YrD_h4 zuIVOD01|E8{j^%yEw!1( zXy}k?+I`{a<#pj0dH(l@0d7$EyE~RgLDwFn`Xr!G3iUfHMdTufy_M#Bm!c=1#(`Tx zqCY4vom1Ue&h}=^1fd%n8)f=~4!4p|yS+W2>3*YH-=W4M0lfA5_2z&!&m;$r+R65) z?18mtiPB@4$gqKe;^GUZr%z2C0Le50I+5{a>$=S)Tt9;4&-|sM{zSsO_}DP#q&IqI z6;cMXQ!0Mwg!Hj+tD=$Sy91KXJI1J?ImQUvGMqeQ|cd>Xf1>gOT_ zTa=AX825Y8m(=IqUeR(R{6HQJTn{@00(ptBxBbABDXAeKeP<+ZRd9AIl1`&t^+y>$ z$dlN{lD&PaCaYX|Za05Z%$m19NyI2thMrTb<&Hv#yG)AFCy-o)@&Mf2EgWI1z2KpNA6kAZ$k%?AC{ z<|7M+E;BiKh_ovod9aPn-DlYvuRYi%J~RSjYOoeGy!ye6f0&nf$f4=;%u|~}zyrD1 z5B#E7Dh#I$KF2HD^-7b!m>5*>z?ZcZ5UkyS+6{e-zy1#2$VK!>b+Xwm?)(2ST!QV%UBUsdQGRa|o=c7m*?*M$wKm7!@0l=RU z3`T{Q{4^A?z&yQq16b&L0RLpK`rL&t$)#8Hhiz6lspaAW99SDk+RIC^5)|yoqy8RZ ze4NDj$atO@`7Afn1DeE`rZpHCKbybSS{r4jQa)@H)$TDHKq^5;;{G)}=0u0O3l|sH zrDp2h$4zFtZUg{l3c(^EB601s*F%8J zym63myQm9ii}v1AUV}iIegI~EJkWS!EaYV$m|+Xsnu}_!HHkZ92cguI!M)wYwm0yg zjU&bvh6;XyiSr+&e8dLb4u+>l_;BX0UE?MN%v)*hVWo304$%_sCLB7q*xe|hYXzhnBlWFUAGB5qW6Q+{M!M`$E}^(N<74o zbJ49Tz9+fHqp>_M?Ewk+Ch3DaLlFe-8OwcU&_QwXNg-lzOe2I}% zgJUZo(9=05WKwMsQsgWta|QsG)*Aw8!SnC_jD?7%1!wJzBleQy6%?%P>}Hx9yBH>i z0Bq+qUnhS1&J9X_hCepccD1x|XXTj(zM@0ebAMfA|CE4o*xE&TAKqU#GT3hA9@j;l z)%n)<4TOW>bHMW!nOw7R!S4|NY-GU)i|py*FaU(K{W#YH?nK8MsJIVc<{>dW2SA#_ zV8Crg2OBW}4V{vz{r&2hM;dfwZ>vLt`$sBNCiwM(m){t$XIJNAq`5Vua$plV3>$zXvxW6W zF&HpnW7X|H@g+Gq*HYp&bY|qoZJ*Y!R_eO_LmarG@zX5!0^RW~Y^WeOS?9q~Q1XMu z{b-&Ty7m)D<~u?<0*~KnSL9ZSLT)-?UaTG${pJX$Hiw3i`##@MKxP-?fX7@ zwG-?kR0R-+o*A$T%Vzgk4DzolaTkm7LFiub0_r2JcdH|K;3qpKhINYjyS%|({ZT=}<#jv4Eb{PIw zz=kFNv(D0CUgewhbw@y0+k~j+Qn^KKVe}#gt~-DZtGqGSaCD#5aXboaZPbs0%~yx6 zTZrP-SMsy97JedMblupbmm$En%}sY-ol-#?PG=i%UE<@09R@vnsd()+4W6u}lrT0n zc5;I4_MFZe=QCPGSTeTj(+oe(t$+t!p_x}fAQxHa*n#G&#@hFzb{YUX6yzNt*Haod z7o`!(Jr?WQ4t#wfHv;TM1mr;B1xw7!Ts4Rd;lL?h_kDUoS!f%#%5p~ed$FEjbwmE_ zw>(jFJS6PFO%O=#JX;J0dFI0a$ix92I#I6|w$Gdufu0Et&x`yZpuC=0hF{R6vQ5fr zo_URjRNb^uZor?owd$&odNU`A$F)U;Yj@lG6$h#mZj{;|S=)9;t~{ zBrh)?u{|_2^h5)2s7L6f)V<8j6nkL0ckJn26;xy%d0QIJU%#9c;{{M29_+CO{#S|~ zYWc&rdreNYs9da{55Hu`d8694;@}rfa$dvFmoxS-vU8GMpjD-5ngLg4jFDJA;O1cC z>y1Z2J=AuhPg&EF6-R%sE+jKh=5f7Rc%k^XC4gE`~29 zl%VQ8R&3Sz_$+kX4zWkS^qtx)1T52 z?al9Xx3zH`O$ZLFfHs6y%rh3_eu!v%yeB+X5X@7L48l(W9CPE@y9SZ{t&X{GrG69@ zL=%;D1k_{tuOvnWY8O7Jdacj5b$sr?E#g%=BC1fjWM@)CVlH}@V7>82g99EYwHd(3p@E`R;U$)uc&nb>t@>>6cF$xGm*N8<;B=x z+*rN{Chkt$6>d4x@Zur$o2;G&k{v~0q~3r(Wx#BRu1x>TYB&gz89oUZ+o8u-7IZXr zjAavp*6Ik{L^A?cFqeF3WNZ{f^TrTtf6BA0Mn6^In#qQOFaAQG$>ODCfhCVGd9SON zmX_{ZVtl@)d*qd(Z_hrk9mj@;SpdLK+05>Yo&4O!FwW2Gdv*APR{uC{ftS8Ds50M7 zQEb}QmkkO~@R~R&{QBTKp>+U0|Jjvn-2-bTZmHkoUS)?((4-E4tSn0B()D63Wd+*~J(7p|?jXRF*1dW2LgEd!+dtjn=!XSA%vRa-Q1e9o6M zb3X0%PUx2F)iFF?IFWJEpqrn{j^fzt=OuH%n-{bkHV^vks=>5+5tCV6+*gnTS#E@+ zV|pz|Mn@xXW8>qZCaC^TI>O3cTS{XchxN{qyG`ds^6FNqEP<159xrKwn&48L zmJvH7sBb6`;bV=5)#tQg0NynEP?GZ1v-Ehn2G5}drjb=s7}gF>AMG4+k%kV&e6~(I z$ic(6=eH90FJavT$WbqwUci38JgQ~9Hy0&>(h-4=;QvM{zUhGdILtp$)vxZ^ohW%i zn=W8m?e>WsKz4rJz%%iTDJ%mo_^O>rY0@Y*Bx&saZ9N(RAr74SRT<#O0Je34TXnVk zS!qQ7Vyq(m9Ddx-k&tfouQf*gYmEYDRsNCL#EfHoGAbxhheC|UZ9;l_Pv`Kq z9esPFS&CJ>fd|0qHrqt|8jLgB+X3z*v|=FI$Y^g=v{cJC8N5w-3HovwyFXrH<2vqu zfXiN+T_8_9jni-62oPH>G%Gq1;p=BfNRPL?@FYa+>@e9-m0bO-N2^Q;S&Qd+tse!M z1@=GwS}(wUL~sC$kFQXZOycGp&U`sWh?8Im4s~x6RQ9%|s?}$bW*wmLh_M6DkWCKq zG?Bugxh)_XJ=+4o63l4ZF|8Py>tRqhkxl!qhYRqj95oC*wkix;Jr%vwb_W>+!7qg0 zS9+A7n7{uwO5>`@1`xz1Kj*WghsF@)vNXG3-$OXCMnF3Ce2jjcRV;V#7m5QAO`bDjD_oksDhu+bCU1D1vQO@D*7@x1`ZeSz! zuYIlc2k#?~UN%{n(O71hrLFZybq5S*b>uohin|D)2{+iDvf7)=bae`Oou^bQvs{XhJ?gnTJl&P^BqM_zk6$8z;)uad_({-D;$UL0kiBMz zjk#?X%jfIH&q;C%$mR{vw&wS)Rfin&diwNfa#^!V?nQ6vQtzc>)RX%678)CqbK7!G z!ovX14CG82?=Ujwq!HWQ&wN;qih$3|k1|qwRyPBi)O$6WSlb^o7R2!q1}{@v6uH1& z{_EsDh4l?UcNlpGznn&-=e4TP1L@(@=)>Xw`wma}*JQ#4csY+f0Sq+Y9P~;aB1vRDS|$-`_D1_R)8fSpfl>T zG1C0}2tE7o#|xAhAk?}MYX7ufV?T7O$4&Kjn}#;AUk!LUJ~p2V7flb9Em$nLHSZLz z*fOf!F1R3YFh?(T8AuiVQ|IhT zg#P`}`AyB6hh}BGp27C?Aes09l|$iv-`n3rb1%MQ^VNrvvqtOT2HL*0!3Q42Hc@=B z^s#4;()x@EvEGABo2a)d&nG6>pxbhj4mEk_D`(ECd&Kz7&RMiV`EOb}+Ms>(bA9T| z-v}disCny3S0(-kQG%mpLaDuTMmBbbEeM4pv(&$>Jh&Tq-(*j!pXIy|T{4_Q8Sl`+ z2pMtG)W-;`+&_SWxfyD(E4Pp?C=CMj9AaalLBpxcITJ%L--=H=EJ~QvJ|oRr;Qn(oa*-PZrASKhKb_NryaKRzAaQ+GjSM^aydx%M@6~wQ4+- z4*qe1omSDy{aRvKaXC~9U>&p90ek{)PMpjou9E`Yv-d)w`M-aBiwbCarQ&#f*tM%W zGfMcYUayIzD64Lc%JE-J_25nW2Bm_ z^+DJ9@>Xu$c6L63A0;6kaZpuD^}q4qm*DC3wrk%rGcV~GD$XxNsu>m1@Qth;QhWtD z8xLWVz;K1LEai>j`c+%$V#VXEKd!dQXWx0sk*_r@p)Xk(WuFnrkRCtA{P z9jKG(1+lf@0Kl>1M>ZP#=D5ztPc7IhXx8XaY9Fv3F#)*4 zmIy1}AwH6o;?#W%qLlX|623XvIr76ENI_e{;qc)1S`VJet zago{%x!~A_?KJ??O@Y)jXLl{mw+TFLaK|pQT#B{IyYtU>wUQDH2u+baLVEo54>ay4 zRBtt!4wYh7#8s(1a%2ER%Yke}C)-sHWcxPlZB_wF*;-n+^tJq(FaNGGb-h}PVX_?d zl6ZNK<>Twi(@Gcenf5*Y`A6B@$#_I*=UfNicmyHSPRoRTP(mLkTOzrTxc zRVj{XjT$ykmHY<@UC5!tdmqZJn#0estlnwJv9ZIsPDli%4mx*q>RVyQdmswP=m^k) z%Rk_?6)PT?LkNifGPV51-KO(p2Z9Bcrc-^^Lcn04O$#ef&CQ;>Km$eOj4-Lg=?C)e7 z$w;x3H=A@8#KRIS5W5)Z-tiYZg1cd0(8xfH1~-B`6tkv-rV@HZQkTPMif*cz9gB## zHSNPwJcIRgBNghyhKsy=?O1|pxyC_&F*@xC> z&SCT8i@+pjvf3ePWS|-i!++RH*em3(6)_jGmMpt1{s7 zIegHsUnRE4*x>1foL{i^Wq4Vdr#N)qQw(aD#~~JB$d=E~4SPR~-Lza^jC2vPu!BT% zzHNve-Kj3lbwAH{*d7x*o5XlSEz=Ml3K=AuRlk?c%c5_=qsIt{qFFSxBWM27x9Bz9 zw%3ipsdN1=XY+iDm{i=>Y!-0`7XCPoQHKZ|X7<#&BB7)1>BLL*>L%g_-c}i)Gn~slKmAp10F;VtmswKMAh52;J(Q8<#UIwnv4I@Cc z&NWiXpLameCgwW`Kv1m%;d4kIlN6Q>9;}rn#o2ThE(cn{|hY6`2H!1dN06N0VKfVXNvr^ETbOhGU}u8 zOpkz$d$hC<+NDZfk7lK~al5E>*UK!-d@RJF-8V05@wPq{d^09#a1VHtLy|NFVX_O5i)7G4yn!8?ipx%+dXcuUdZ zR=q4nLv+(V9M~Y(GH+9dJPpTJU-C2kc)D=ea0eW0|C1t(;TB<9Dg#9r&GNf>%o)Qa7idh>05M^{X7mz zsjAhnQk&`6Qy}7)mFkjq^Uk60ufiH4-H6sdeZA^O5vX zAR$U*=PE&7Xr%{_qAVj0=2=$YVogJ_euK9iqQ>RHjlK>(wUF%>MCak|?NC0RKl2$< z+^a*Rw<7WU4(ZaVjfRqdqK2ouWY4lH!-IUH?p>SVe!H9Z^la$>`9!b9jjL&jUl-@M z*Q@8Eb>nn1-Ag9|fEDOD02%{woDTk54ZdU&iu?5F(v{w%;FP&UA@@2hs*Xvd+}I+} z4j}^ulIi~`>z`-W>;4_j4guca-|_Jjdm8r8ybt6j{&V{O9^ES;2&U@d*aDbKBKvT5P@ACMH>a~WyPtev)&CL@>A|Le&`ZNqc z?_=OzwIR)>BogUFdPiTMfv20>gWM%a%kt)~?(UM@-0MAnD@`07ACFouEG(3XV<>_g za|c+JX!JNx;B95epa3{3Hylx~tf;ufOI9VVtQ2QuUFHRWa^+eux5PG0bMlzMYS@A5 z#5G}3H&<#sv?bWnu#CR66hzy!3UX+oUxf^kO+9tnpIYbm*gVjExtLRt^*paD@)3M{ za`PNAw*#FoCEcCyqUfevQFm|AFL-95;n<{Qf&;3eQ1(3x^hvnOZK;k{%lq|+9v`6O zp!+&ZUG|alO0h04RAAoSUc_f2NkS5gz4XSDLhj~*l@yg}9C8;3{3EbY0^Yu8Ku^g~ zI8GA~?=HFTfD!M~&bP2Jc7fDoMr&asr_0q89UOYp${&owlhdxZtpEk~m+M-eBy1iR|)_}KXkm2(2JSW|_7Bv23&y6>!Hx5kSH7>VsFisRqj7STO zO;{ZJ?qqiFoX6M3+MF2PBHaoV89W;z&IysFj{`?Buc;^qQKP@(1ee(q6zXlKV{vRj zA&9>8C{CV`TeH-tN7E;{iZi>qdse!;TQ4778fwR2B+7|tIRX z{`hp^rj$**M3MaJGN*<4;edpx5VJ*;jeY{z+9XB7%-qK6)T`6dJ1;ErYiqfG{*QGQ z|7lS{)C#maLtuH}*}@?wQawhw>B4<)ALlxtc}s#biCzQpULk3weQ!? zjBU4$7~R7X61}{uoV}5#hMIVZiYKgEGb(u! zcv_kk#)jpwIWhF?AV@D$n{i8(+Ez#5R=svc#$(FiG#gSab6ZsqZUTk0KLRbfHdEvR z$?cD&iuF7~!{OX1GuXoE&9bse_=;ySrc(BhIPtHPos9pfG5zAG#N<7XJ8K~>!#o$Y z18R20zd3Gx*8Y6_9N&NGmR`u+rC_DJtai#$pH#j7=zS)|)qJv7LUF39MCcGC`T0sw zU1fd$Ss!9G$wCqLs>a64PPeEAjgFGZEh_4ULZL1E`aJFppmPpE8a|sb8mC4M{1Wy~ z3WLQ>O7dI<%HW_tqoo$0oNqHY<)f(9)E9<%Rs%-mjAHzU!wWJ_e7U){S~KhGR)rgr z$5oa{jtvgpIyptOaN=1zMh;)k(YE)kl|FwU{5^(rs;cScqxnEl8uU-Lt^xF?A zn=Fj&JO(tD1a{p8l5O{04Gop1=@^1Jj_QrLKf)QD@V$n8LJ6^M5P79`S{FzyDN5n#T{LXTm8_B zL}k{sO-)T{xh1Km+gTom=%_UeRxS@R%Q(M!BJqS{u}0*S(bp!<|{XIrC#n(jk&3V$}R zi)-=}Q#ilmeyDuG^n^9Zqj}ey@))X_LNZXpvIpWIqbCz#2SDLMw-%jdv;|R90?-ks zuWnLh)p=8}Vt}91%Bkfa@Q~&SZ=Z+kt5Mb0fckehS;pB3$&j_~8nwUGTa1n#s4{Ru zLdSD>qOMhQ+|R267l1V14JH)-=Y1H(Hil&?dU9kwGY&9GtvEYKNG8yRn8NOCbUgC) zb9o=f2`*2G+}qNJ+U*b)uC>iTj^T9%qqqS41A#J5 z`idq&50pR6-IbY0P4X>|tbBIRXnx1WW|b9q;>WjxDm=t_d&p`7`{JME*IMK^TGT4r zC#}64GL<(dR^#y!2zzu}VJwf#BU{&~8FaxY)PFRnenmP&=jJwA}Dg(0d<*N(^N zlYYT{SJz1B(rH3Qm7>U9dB(CUqG}VbPU`G6=}7!wYp1b|zD^wqz^zSVhN`Q_Odiv!fM8pEnPk}D7aONZPQG6NTzT+A*v(1v%8 zB=vQ5J$jYm9$oGe3J@tV=QohnVb8?4Z|Im`aH5Fh<*vwx=UvV9^vC@7jd-#_yJr@@2A5%i?r&vBg z%x;EmJ+aDn6>^%P-Lq6=w@H1GZNbd3F+Zx{i_Z~&&d@LiYfEOp+d~NwoPVG@T4H(O zrIuxi?_;5q0<=9AN;XT35{Bt_J`aQ>jQ&}2$Nip7!KMi_plSg`KRpDoAJe@9yA0DgIZvY2KgS>$Z3p&kgT`uM@>N-Y>%wxOC z>)Mz)(t5-|Ky25BXgc3qAW;7cdKbQiNk+;kyls)?O@l>}AW zTW*&bka?L1y$Sv>L`bJp{2F3j1QH&&Ht6a=yLeH${P+tP;hDJ1yB7}EZO~rTqBbxu zBp(m)g40aT-Ty6!cf5-JW{mZ}_-?qX&FrAF=L=`J4!We5kDf@1^?5y%$>Hs4k%((p zd6a5n=2JgrI%!b%IE5KTo~<}>IOO#BwbE?bcMXPAX+6yoS;P1Nz?#Q^een3x&XG@M zgsw{oV3a2uX|^bUF-MUvI5pRjC{<}oC8*pQKsct>7P29?dB=#lIU+}NEfwWXj>Sp? z)FkJ9xlb_Le>$m!R4E8U-ATln1aBb}2HR~O6oAVu6@FFcUaH2Zfda&YY;EVHYGE<8 zR%15T5WLezo~?(o>BNWCjs881{>&yJ3g^|k<6{yvF|GS8^}NfXyv#S42eJa0RBcIxAoB=hXuxYS%EU+GQ-fFI zd$-4iK=KJ&+`WdV2BS4@RGEBmFW=kD7ob_^IWT}S@fR;kev`O*xCGRj@%2$rKe?yd z!-FapZoEucEk`AuwHY1s?%ru1dtI8WR7_2S2#6M^0*tkt-$^L^@qJ50H8!^>ztV8N zDD#o$8kR;I3$&RU`oy%KJr5lPwdE6L8oFNKigJel(t?UC?0QL#X-r}U`HSo@0vgL) zqtqFx=*=m^u%=FK)r@w7U}L12#R`2e3h_6S;tsEKud^6c@FLdKi+G?n`@&TB7pq<{ zk=|uNyI&34Na~W9>>IWr7<3D3WXxBw%p0X4?cmvMURs$*C-qEO`Y=C~OWY9c!D zmCAcP$|uMSeA7`kY0t$jW(E^j1g@!@w8l-f@K98m!VC=!#de&2Aim_qCUHT9SevHx zc0ttZFsgFZ>X&R%N$w+mnhKo@iseiQrH%Qj_KH{eJB&GYG?Y(;1unSQ?1t*pmL$>0 z*N3as0t0jrDPX*f`-!PupQ!NYF=Ea zn(lB0e})n;VLBA$as7$K zs8n;Wa)Px#mzONBmnb&KJcuzlV^hBxM6zy$>1NvL=#)xMj`Bf464km#m68SEb^NPo zO*K>Tx+-Lfz1+BqVxgk#dboG(<;6vpqhu3rSEQvc0^ZOn48JZi!Dk&P+xzwm7V?Ls zM{lSvtD5%lTssaf;GI&ddy-IMQ#GZc=w022I$MQL`*T)Id8g(ILm<#=+L7d6MjU=9 zlQ(W%whgWuw+9oZM7Je1_(VKFVt42I%gUhfa0XD?1wB|iny!pzg|=E0W1Y1tc`N4| zZT4qWtQ8}6KI{0P2*NEOEBdIK)J?&53r~lpnc1nQiU0-W zv#}|bB)VIOmAC#Ok;zq}>Ev?Pq@YPpL*L4;g+E??jc!tBS%(<&bk=?+P!!5q43sfr z!m!-dG>1`n889|1p;P8c3q}iA*tmr|f?QaRvw@NmxyXUTUHWq;t?4Z$Z}YUT!B9S( zjGqfeQw2#dE}HeS{Gey{_yg?Xnz?UXf?%s>u#RW?Ogc=T-|&viQIJ)2$js*fITFVA zn`hiC4C!rMuaxo>wKB;hqxQGo!WmbN;=U3@3~~0DS@!FeHvqKI`viG1!)(-K$ZNLt2NdOlVr?ow7h|KQ{qqTr`wP-+ zz#Y(1`ZrSDxM#+=R@pmyLG1k%Ni^2N>u@;H0KCK^4R=JOS+yGTl-BQ4Vmi-N{@$v> zyVh{|Ywv|$ad3t;{r+NfG(5$_N;h>T!PD8lR^ob0pVy{aP>Q6tPtDkvInZ=1qLhS; zQcG4V@y2d4Rnh+(Us1bDT3)HTCn2%QY8&086?)i=KX&dFS{$3Paks0htjQiS_bou( zD4`np$3ufof@An4c%L8FS)r;2CdgTP_6&kCOhcFPzOo zSd{}1K4IaiJj8cAT)4pHeN=SOe zYkS&?OesEqlQ^c-`i6Lr(#>pzY_{{wd%pOqaFl3vxl_ zuDaH+8EVkX&VN5C$;!buJt2v1WuhNNR<3UoAl! z;_az(chNJ)NVx+SNWIuQU0#7}`j;Vf{lU&_T&76D$Z%=Kb)yLa%|72~BIz?M)iT6K z+t^6o`|-mYFFtWac+{Z-WKsIQhK6hMy7ymT=!@bEm6cCHo0~R1r8S}&H@%3`iguhK z*Bu&OmixF|E*1oGb*lFXO3Xoi`^5Jty)$&p`c(%?4W>P$^NY7|6N7+SemOf4LfHwC zJ>2{OxFKyb=?&x@7ou$UZ;IJin&83s5?O}O{=_ETN%arz3eRdacpkRCCYeUH+RD$M&kMZyJVGDJ|B`2ax#mXzWD*lC ziEr=x*+cd*X^i-Bl+c}RRcc4^^bn+3I4uz8P2m?cIihhLyrlH=J8J?9@zDA*h^%wvRM7|5( zA<24nNYwMav-QQk@$6Pf%3lGG`tRPK8#{{NqM=D5h@D+@HGNV$X39HBc`>lrK7qqq zic7@G+SwDmV;s5dt?g4eYMM$Oahv-)7X3obP6_H?G?{2i?Cg!xu8*ERhy~A#nb!3M z`c9v=AKzu=cAYI-?w)Cy)OE1c5c^KeOnTS+V-!e@%W>l7n;(Kp+UN19O}CyHiE?6j zHTg_#9y{GD=+pR0Y)>d+I=ELg=7`5vb=$XmM(t#48Fj)DBby-|NLC@x7P0uF2t+-SLZA<%1-`upi=bTVOzdf0lSo-|ZDM;fonT*<7vY3$T z58}c&tk2yAqAif)SF5Itci$BPRjOsV{YF%E!HpwTB!|W-b(%-a%zC%s^_rFuZBlfZ z6gS$e3{@T6xKc64`mp8ao^S7K0RGF{$d}C=+$+dGn*P(Gbrb{ipVm0dh_BBUx9Wp4 zOq2PdU^}Y23M#9X*v)CnM4?VejSz>&f;*NqrCW7IN(JN9=MXH24MJ*q!*$KT10++^ z;M7ow?GD@9J>u!@QxUDs{jTj0ajjCm$Q&mrsOt3;p)PAILpXqp3XnaYsefabntl3c zs=9h&mZqdIg-EQaNrjZ|{=iOo6!mTinoR@!y~`E~vN ze&GRJSy9JWWO-?J_LVnPm}3!AKBqJS`2f)XzvlsgIMQk<{6KSGETz%s_kf;|K>@XJ z`%-b%-$KiC-!DFhdc1Ps1*W7=lwY@BW8u{gFg7~ko=VwQZVIgd=vLP!OKHE-Se;5<1e zMx#=P-?7%VDm?7U5FLh}D;g4XS)WIa#H1qzojRaCGyaCti6bD#m7lRs8F{_r&8UP_ zFKRoN`PfW?-r+za*C;ms^s&LV39p_Ht=&TnxVbq-Wzwd%{QvZ)MnkVbDL)5!C2j2R z&WnjF!tF0sCU$GL?jr;I zc?OG%hg6t?K=C2MvT0$bdKf=GIEhpRCUv}Kf zPAfc$lfB3#oe`3$!`vqnFDhl4^c^1W$sbdN_hkEg1%iUCNx9eBR zZ`_00D|nI7Hp0tjhuwnyu!@Y?u(|PT*u*uNPEyv2Q2X^w zW5Qvm=`?G6lEhx78a8W|Rhd8QQ(HF6qTsz3gBX8=yB(P1Nwd8%B<}9WX!7XzlCbMW za86TGf0u-K3A$M7!oi~X%q%HQTURox`Dl7|f z9d=g{wYA-yKkM!r++i4Xp{39ssO(`y+^6c2D-)ju~0PNXhmswy(G$c?*H(hc~_e09f7LM~guJeBX)T+(;#z~RUu(NbrG<|RG??kjLxbM#a(GhCtY?ldm3wp$!(iv95 zuKy%Qj!5(o%R9++md%@QbWEIUsg<$lZKhD_$c9r2x6^0{HNc>8E7T9u-0E8z<|(Uy za@HyOVt)m6uBbxcgX)W3+&y?gpeqnmRJ#=IdAF@Rw|okOjxJbm=i_9*7iCyH2UL0) zoXLp9Ux{OwM>2Zc^aCwTqSZ#Ap;jq$dXi0$YZ(Nx>eyM5UGKRZAe2@Jbo+{V4bPQx zF3dkhN?>+Kg|RMzU+EXA7H@M6}rf0 zYkbK#i<*-%o~;bUFrezD;Mm@;J@f5yzodhp$^7iA^(3pGU+i>-Cjo@I=1{0XR` z7Y~BR;Qj-X!XscE^E5#h0yW3cKqP3e$ ztA+}b#zZax^P>!+ey!g~W3ZaX`z>;+)-b2s*RZ$Es2Njk1JA z32KQ>Du#70J^ysz%iC$soN>J}q`fva5v|sw-hhI}iY%8-uRSmQSa8hiQ7uu?yRJ+MKV3EDoDF2F)n; z)$})EZ+`J@a3#o;`d2I4eY?nA8j!lbJ7UbyJqz%Gc;ygRd)nf61)xG3MvF*_=*V%> zA>}^%5TUKt0p+eY>1XOat|~9x3fW*9JtznXyAxZwxpeZvit=FFLaCLVW686y@h1YwatQEh@PIsFdmTGyf{Vmse;i9zxC# z4$SsjTikc|4+6`am(U}PV21gtlK+8vwXv=rj?KfaS9MM-6YHY2%ja(Q&RqFN2eVQt zoE?<{Aof+!h82hVe5*u?GQh5{J_Usj4u$k2GAyR9fD-}@T|;Vv+ayy}TI%|ItWaYt zOlXay^(P*xLW!NHBxyXtKPy7h5KKKHdO+-Mzwuh#kbf@0pntAi-cyT58H|R0@P&oh zv6O)($Dr!Xh<{`5)QWGO-0?bh?95wL?s*FVq<0X!b#kJsP?kjWL9Z>jmJ~NBz6lU_ z;oIzaQKii&>ycLK436Ree%lSi2dOP}gMD>0nD#;8!*{>th7fEwW}bPlJSvm+NZ7-^ z*)n>U24)dEtn#&Lr9Tn@_*$iBxU_BAAoS~&y`rPY;XU!yp~Dx3z@7J@dIp3nYK+GB z)<nNVHIUQfsd?I{yY-ox^-{IM1 z1O;dx^mZ>@t{d<_4Q*RYy8^a=_R*$^%DcK2A{g-KI8-{>`xRVyniFCUwkxyK|WOgwwHIATbP5{#F|qvUVjzG^}}d(-ly zJ>%=wuQG;|cRM>fGWKR>ZLq9xL;HBs@C(T7KI!I+-+E4bAD#cZeguQTTKO2&8t)}- zYh_l?)WnT2MEU-0+i1yrD4u-Y8v-s9%+x-RS*O#Lj3a4pZx5Cm_ zJHbsehd1unUCy{BZ?}MTUK~qF9iP&uQjfwnrh;Lp-V`~}f8^JG^gVl{XqDGrs9pv1 z8E&?bisB0<2ZudT6dz~Qcwe12km58mOR{o>p&>qYUNfn}RV!VM1NOe`I$8U5&o#Gd z!uaTvr$KL1AAUhfiiI)!>1o&xG<5(&_O8=JJL`pwYeHt8mF-BjA$VZu9)Eu=x++xf z9{NVL)Qrwf7~PVV>|$*cHE3*^1mT zc_z1RD=54fmK+&ZoS5o`pgiCa*xfgnJJ^+z&siGVO1N^T_>AwyrtShR*Wr7aE?U^qd2Ok_-bd0RD@++ ztap`tJA3GPa!!cH+e0`>0b!W6Mks(MNN^J%uwY}XP`QP^<#o8zyMT4NKJWi~hyUKC zHzc&UC#A50%f^%ZE=L|!m(yjBfW9Wz*^o7j2-k#$LNp1j@7R4b>=Ev+%U?iVDX1uP3()4~KOC8a5xXOn66knyH7Qc7@-0a}&%6b@eu z?24&hUF=AjT%&FfDgN-}@8VpAM=hjtxbp&g zqHq%&@k96QxhVqykI*drHu#6L|4(~w;nwv3_J0ox1p$?ml#e1Mq0%WLDn02A5u^qp z-6#S|DkumzLOKVMj+7D7F>-?;Lt=~((tW??=lcGx>v!DOe{kO%haSfE&R3r2`FuWL zs?jRGVG{~)r1%VmXKnG|MbRAJtYlh3XdW0f%1>}N$s?|fj3=M7#XWlPki zsleGrjlI>~^PR@AI95;}46bnkS?yA8D|y(pa`5}$-0N$MBjTDHl|6b!M|s#{*vKE~ z7<85%Ca~gOX|MjYcz-{N(j67kVf*dUC@F(9b*+q>{N_WJjeHk`ycVXL204$mlbok4 zSFfIb{lHTbEhm&^OYt$$V?2=-UoUBn%yyLo&&La@Vy>*imP%@vvaetJvvafR$KQIi zW~fZyfU@QO?~IUA7VyoEyJhGPhSxcUz8`e=RqpTkhatmR)9rQL(wm?0F$}jUi>!Z3 zcvt2^*(>wQ%6}^+_^RFz#e{m(_7QjYq8I&K2=%nY3&q0I_xK%))j`1}gx(%)Lq{VW z_#Wetcd~<^#OQaNU?pKmHrg8V^YYtpkvJ@Oxy+xg(EBvh9Pjj-4${2#>4F$JdAjT zHHnH-145~%I`Gwdm3QqY{ew+E*2VONLPy4*@doVqXYRmDUt}ftxcKY>i;V*6KYblv ztPbk;W0d^}^80WR?6>KYJHtEDI{~tIc`hI$O>!jZdH5gQ`D*zg?SQmZy;N$73ecQh z__7hX{Sz(nsN40pq+}n><=lT4OiYY~)99^KS#K8>$NK8(Q2{|gN{KU{E$}c?Wz;X_DWJ3XU&nv0g~kKn zuJnEuh+5YnyrS+x}Bwr(tQEN6cTh@tohc z6ITv!arJjA7w{5Ua=UHXZ>kfu5j}yWiHCUJ>ZLx@bC_U9#l~Op-X>ec6Ei{RjS&Sb zQ6E9QG4*1H0PB7_1bZ@=i4t@PEUDsWQse1l z;l2a6KE23x3$`{)nvk5NI>yH&FRIB={jSV{{$g_KpXzJ#T#qSmX4(AdMzrbo`tCOaPOgIDflQ- znQ3S#b`%b_R7*t9>Qj}NO=?A9eb~58QiTGhbCfY!j`RgI^Q4>RgB~|HoW|bFyol)9 zu5?K)9e6S0FLD7^S$mY{W9KgDrt-8!Zn{Jjq9ayJ7xvX_U|U}% zcMvD+GVtud#9Pbj9b7f3F33(36O(v;79l#k+{Y-CG?yKPwfQ-Fl&-z9WC~4q?r6l?FJ>R6OTk9m&q*7~WcFkz0T#NmfJrm7KN{89y&YEC@PFB=gW12`PLbJ{l0q~`gB#2ZyJ zaL*$yN=}>1t!3Z#q88{Q`!@MmyoCL}ukTXIDvvlOK5Gz-R<^I<_{P-3c;6`L@}t1r z>2tAzhGUMfO7Y=y(2l*14xCe(>#o^kDy*{dgWSGNI+v82qtv^lLzv=OqMWZw@09nA zszcwamBs1Z_u@$JyGze|8lN;bsKVArmA6NxzhVm(*}eDcC^9~yEgr0b%7;0|N4$)X zyJ>x^^Gc~0vq!;))R`+1a))Et5{<*TXy46xngTDw$v*Xdu2K#u6RO`H_Jz7H7KoNy zTlu=FYioiEas%f^)_(2;-x*fncu)^hH+{Kzo|Mbgf{f<#x})iNq;F^iS6%`0q`l;q zjd&=Y-l5B$E;*)GVKGbht*oz->Yn_oy~b9F@fc2F_bY&=X+GzjXtu>hAf zV?Wjx@1tU>-yqnX9JU9DB!;?A&xw_M`^Ojp3=^vF zy0dLyIpC>U*vy(VYl+~zXA~K4jt&JyamDtrVnn73b4}g1-#_=Xurhk>XJ^`ES56GS{A!4%ow1abpfhRf0lH|gb^3L-2__v!>>4>yrVJ1IrDt(sdl#5 zK2LA3So;(`*9NQlT!R?CE7Cad%N`r@tzjc->N$`t`o#|GYCXhOYt|@L3?*)EPc2VW zz<^N8dKYM@hfPe?Hy+=vQjL>ck&>PJsM|6v&WZ0QCIvl7(CCdthEq8$`TX2=FtO9r z)SU6uTMvxJJoB@-K}`aFDz@X+t1QP!uWReJALtrBgY$Wa?HJb)T~vjF>#`K~zdv*4 zgGG;+vw|gP^RVBaPF~brjh%_M>{%D8x5E-wX@tE0)C7zDjx2OoFL?9RQI}(*6DI%D ztlaB~?b4%PI+wjSrT!eHvyZe%;gv%xaEWr811$*GME+^H&J~7a~15k;5p5kXRMB9Xm5p^O?L;y6ffkpvej<- zUcw(la)lN-k2AIBxYl(zATG-Cz%HR>Ib(=lnfJw&yW7Nq4x0kq2Vi<*;fAtpNb_p> z*!%sA?oOtu7Z2HoZ=81VU?bgAODcJ>d zuL%X?771JMs5H-?kvd>0mn=^hS~QkyTr{S%!u&F{1d-;quaUqzBPzq?%Nm^eCzIch zrXmPd=5jRNI|T{(?3ZbExDIzJ+dUOTpw@%Xzk2Voj~6wvI<>rLUB+H`yD=9Jr2+Q} z$&ez6@NS5Xy9Ug%1>~jN+mFpzHQDbIPqUZ&NAQ~$%W_tnf@61*NP0ZVJZeUCd|jnq z=31zfo=w1d5l|=J#YS0de$5VF&wjrGT#ynPHsGu5I~lb1+#a#JoslQxf=&6~k3YRc zHsQNV7Q1^b7377dk;dKLctAwUr7kjkhRFJ{+=_72DDM34hu+;OcaaGt=#_I+`EH+9 z|03z(GnG;BBL1Nb<*)?L?ao_e@tfzGPJ#4XG{4g0*i|SfKzifJXFnB4O$v9nxYEUu)O0%;X~TKcmqa;QAR}tA z`}zW?mp|I24P${RSuKIyQ+A-R*Z3+XzN>_}agxd0UH?u^ZE1-q70!UIuXEsVGCtdG zwA#^E2YZ`TWOxJYT&?^s4}sHNE3&6{Q8vBA!X_+w`$wg<(C-|}gT`L@!~AE?`8;DM z<7tOKY7)v}7Cw9aB(O70jMn_JdDOJu-gKjil*iGBY{Jnm)v^13C(?2e#@dy>=xWcBa_)WQb_2-AJnVa0+So8Cc=lMa-#r z9tRAwoF<8UZ$9%-XNmL>^BVin&-6XDMszgz1zNi12gaJ|FT+%(UbBb<)(|njp&yEUj!Su;h4=*zZcew_;_+D$0KNT{VA#~pA#v9Ls z{K9hng1N@uQ@-jtY-&@f4RvluhYc;4Afn@F!Jft~whGx}yHRwi#+eY+TvESz+~+`2 zlAZP~^_!>eQNffTHcCd4@3wt=&#Lwo*X2wYFikv0eD_w;xtkh{F;=C4{5t;jbGai} z%*jFfCZw4`w;!2~OFN;UfDGAFKfTE>BGPTfFIc`ARpxR7WUkCbh(7jcQx< z=ks0jy>@VTj=K~scu7_mdujNkO0Ti0)uS&8(jK&7PvC*N$i`e8i!|5pqkgAJ#X${jwr-N8_f| z`F~r%9XM!{aLntaFXg)nC-7(*@q=H=%BCX6ShWVBpJ#7AWD2&>ZoJ{Y5SCw@X3N{~ zOVxkxwvd_CDP>Z?CP?VG9)*G+P5mx&;-H5=XK%Z459;H^nFynlXbdAc1<&hN0-_(V2TbL#gO?( zCkx1C<+XSpj@X)yj~9! zxX8Y8$t>ein8U~jqk*n&t)5|$scl=&;*ZBhl4reS36`M#CLf}%<2F8&aWW$mahL5;jr~Q_EKA5K?xaSi@feQ)ELbrg zWC)L#XxE>{?EVY|t-jjQkS@jolJf{F1Z#pce|l*OmH&gc@Q!GhO^2<_JPJd;emwO& zU z%|;KCq)X~bcnV^Qzq+jH3#29qt2)lQ8Vql-0wGgMFF9Ir5i0_5xSJz1UO7#nN^`e& z`p**nD3mS7rV5xkOaStTiK z40IYQ9%(hZKF76^n6&2&Hw$P)6excb%GSWWuT?K;2S0YiCZ?0uNQ;~5S|;T*K`7h- zZ&m&52`Tk7a}uAPN8f44_>&Tj|8q$>7$%JfS7iQ!Oo@yn^H@b`<12TS*aJwiO)b@{ zEk#G8)6+?U4Jzs@P0uC<1qF-Bx{ftR^`>nY8Ic0czI?{C%j8PP!^M`1<(s}2BPaI8 z=|MkXPJYz1G55;-l70TVlHvKtKI2QSlb(DYgUe8q|<>tLXygEMZ_q1$Iop zS87n)a01Mf0Y9ZLL#+IrVIa=>SJuUs&47JfK_~rB!Q9kN=MD|k0f;nTfGL;E#&&No zmo)d_XT~T+l41U!9BS_B`4)!Z5j{_gx@B!w?08KZ2qY@2MtBJe&X^kqYw4tmA-f`0 zs)1jraJ`eCCHFj-%;Sf9{(CAl9)CXt;!IzF`PJcBWW09qxJ>13^Ie?!Ir9&BEau#c z*{(<4=dllx_JbDH(=Tof4v1VY9henj!`K*fxlq2=)wY)U%3ZG<9Mk{Um*lU5 zbuP5BH-#`gw`Ht9=+yuOjzGLuoRia*lA5aQ08BN~=hD*BUiEvWC`KFy6z0Q!qg!1U zc9Mj{>^U4Gh*d+4tymjynbvZ+rrjeAaWMIFds4^NDXM1{tuth~Uu922%6V~Pq_{RZ zMd+NrsF))_%=i#&SjE}enJ**-X+pv%H;KR+gJ3(THk?{(Wuh>6eYl&mY zKFWob?!#{#zM7XO$>qUD)>S7dN@-HZ0aIv z$@{Oe06EL8-5{IFv(L|knJ={&>N`+mfPOP3_^V`!EI! z;r8BTEjObi9`bS&LK_NC2CGf{3zl0UI_=hF$_~Mu)@3Xgz!LW?*gM23AoeEWUH9<@3TuKcvkgVlbwd;Cxcf*TCqVQr&giZ?Dt-COaUIacfRLV8^3) z(O||7Dfwk5K+vFG(yUx(QNr!r7-DXVC0zERg!+HdNoC4%n*t2u{MU4$xoJagPeSH- zuX_d_<$2d_Mhu zl3>x)bWL*S$sg#6x?kTZynaMnelHxg0}!sly?iRqEc@X5W7NssE(#?%nhi zeYwIZ%cC38>FKjD&uvK0Q;B-;Ukrz57z%D3YnS)^|a35~t{8d=-= zibM4B_`er+r`!K7Ts}DV2(94m>~fak!c7BZ*BW@aZ!!lC?L0Cv0%mafaDh*sK7n+M z)j#CR54lPN#hzA{O;33b4zb6>m z2E`gn%dOm3mwraI6v_tey}QbIe#)EJWD4p`pq77r_HG~QQs0*sBo{4KJCN|?oEy-F z_?-Wm*>XAT29@7-X1ia3K#A9lRAxa39Uq3J@$;@qE zA`(l0)e^%9@#U&4-STjq@QU#xtB7^7V|4Sy^7*|8<$F8CBAhdjZA{%e|C_-;=x~a8 z85HQ*2RF_Lb^_C++{F8r8PDFJQe#NrlS@XA+w=ApRMd!XVx|oxuRV_DPITPxQ_^QWV!rPfnu(P_jUGWG-jOZhnlEN>+MMhaWQCvc zXq((t&5RP=T+t}SC$f#W(v4o7iG4iY2}Yk zrPdK&WtL{PQ&`9Qgx-f%u3CnVJu$hPeV~Y&(q{6vtR_3&NTL zEEz|(uC54AZ|{gBYv-AkFzfXEz-NKk$8g4L2%>KNL(ZnF|w`h8}yab*o|+E&9O;F#`< z&{P~YQNdngL^!2I)-33~SzY^l{%_bL#ecE%gq30VZ()AD_ff#LeEO08#@}^b^D35F zxxc4QI#zFpgBBDX!ObdgZT+5#;v2zM{m*PWZ&Kv_y;%GvYRda!5keL2g+QaVFF9dr z?zB8&P9)Wq_Eu|ar;2ZHz1hn0AS{*mdsdBqC?PKQlysB6YN{{SC(e19ES!`5+Ju_V z^Xo6zJ;)jGf7lkxx5hQTl@=8$)4+9MN%RQ_wrD_Bjq_rT0SMuo#5RcA;6M<@ZPB>K z#^bzwz%H>V;CaJ{c%OQE_z-upTP^d>V{{n5N29FtUKLjjy8k2~UzS6rXao1oZrBKw-pbI zFDWSabnH+b=X!|zI6NzcV_#}BTOVm7s~gS<6`?eyk3K!WZ!S;cIllH{(}z}eMl(|( zu}PD8ZNQfzVwN~MyW5%6cbqu-B9*XZRMt((q#j(L)I zeDr<{Yx&6Xxh5=O%6)chxqNbCX2;WK~&0>_1FM6cOogkl$ z^y}X{P~Ccps&NKhnW&Z=qkypC*y>)@Ugr__U` zxd-`qDlpGreE=X0&ejP~1?kKE-s05Rr)Yq#?+M6?ON<}Wh^ z7QATY!0cW8twMGb(+Ou=R)MFILROftC3#aRes#tFT)0#|yJ=P!FRk}VF* zf)60uEpYWMxUxBEf8u;wX3eBAoVc9R(Cg*nTSL+}cc~!$VSWQ$AH(^Z-|2)c-M zJI6^~6nr?NQ~u&{=GY738ps8H8@p^R^(FVa|Bb4aLSjn1iQC`e)%NWgQhi5e=SMu= zlR4|!b}-_&?o~($OYg~CO}}<~c%(8??8tnn3TXWB*6$*`sB{?eeO~0fZwr;Bdx0N# z_^2^jPp;Vb~z};7b}Uwxnoedv*M2gqQQTEX*iY-E?eR(8K`a zl$u^6$sdi~FE$@QPFhTrkM=E3IE#>6tFCv~kwOG2rk1L=Dz~h9Ep>y<8+M)Y-6J}b zgUx5h42T0VTNbL69=M{u>F39dr*EP@rdMb+SwPU8^^>#{l6dDH3M)1alY+EB=9BJK zRA#MAy}=w1&LrLXP!lvquL|QUQ3l?TUNRp?5FZ7WRBy^m>Vc*-y>XyB$X$jS%*fA6O&TN0d=2wUA} z^;a^_X{bd`YZWh*qXlG0#orA4&8O|^GW;7Fa@?zq01v9OnV9S{AVl(G+%PtYz-Iv#k5N2J-gJ&99*Ki5`~AFN+=%(KbCwi4IA z9z32#a7J;WsWFlhA4qJ=ZQs8(ld`L;yzIKwWQ%;m8ghNV!)rVX%m?awgeShW3QvJI zGybQ(Av4fZO8eK<2Gje9+Sx9d<+qV(ms-gtHttIi+p+3R76Qj6tq9d}{6^q}kGu(j z66u$o&$q~vuWX>PXI=KFpCiD6H)FVW)sbU&=sm8s;uWQ6Lg25im>G62Dl}f%Elzrt zLsbaji~f@>@v#pvuatO-JWiYC*X_QaTF-W0@MYm+K0>=v9?{IM*Tm=t%vqR={mwxg zuQdk>ItOe}x=?x6I1icwmBQIHlTpNjqRi0+d=new+s)(HlFZ-}VFsKpqE4zg${*Ke z{r*1ZY78Uu*3cgv`^F>>D~5=N8>y_$LCSCv7HUH|qL1OOV)W9B3Cmc``84JAvh>T7 z!OJa;6(w!Bfg0(LV>>QXbNJG#?cBbRnKd(-hWZki%K6g`i*lIjpPHP^U6`v77gdNG zFP|*1`ong@U;RO*#dsO4GRaoB7Qqch?RXPC$1lvmy`I^+@=+QlO}zTvWV4DCz&13F zdi65WwHAPY5A*9Ou!jd(B7+;+IeQ3IJE&aw&l@jxG_w1sx~_%AD1;=dEg01i9<5e$1JH=xps8;Z}kknBjRmafYDN=?K zMOF{aw<-G^B^jNep8gMtpfSDg>s0=S%Yu%2jI?C31+t?4ZKYG}u)*IP8X%HIrLcDt7szaqcD zZ9ZwI`)*pjSugodn&+qQbf~(W={7rkt-Z_Nn`sNcVq7=H&{*Ha1`*Tfx;x7OVGD%l z!nTGe!T3i&aXyl1!rJry913F^zJ4q4_M74%>G`0O(BQ}Ie zcj)hJCKtU9>2Ini@_D~tt;If{bGqTal0G|o+pBm=O}BUc3pwh3LHk~9?GZ(JuFOfB zhaZ;KMdgEQ9SFVx$A_)`Ns7V8X6@Wxk~}Wujdg}fiEwu96H{q_>ushzZZZrh{tRwm ze_(k6>coW$=Edg3(^0DF>T2gTJVm=p)D*i~Ev)e1q{~22^Td#RbE2G|x{jd6j9$Qa z7VQUi!l6r6Ch9Rd0#+E2l2nY`FidAXKkZ?Glx#deLgQ>_T#3u$DZ>zm18!SSl~RHe z<111mRk?w;eoyHwfb$om{eWKs_QAY#8R3G2OGV?GPiNbf!rEu=V0^`!#<4e+0B{=i7s9a!>s=&7oA$&ffBgyib39#|;98|-; z8M;_Fy1z`nIh}j}mGvXt!k5KzoC@j8rRI_{fB&mrGJxkQo7#-t@*?`=b^(q4Vqr;J z>2KuXD@$H+>Il0uprlZy6BjYgMw!fBTG?9NRsHenrND9ZCZlb-@8St)eS}}0$3Y!8 z#UUZVB5_UW{!>jgPK(pC;+s|?!ko0e+NDpG($(0v+vK-~csL9STDdclq<%%77D2db z^H(Zx?I0r+Zw3df&&HlGov~WiV){ z8ZigI*t8y^)Z}WN@T}VQu9L*b&VQV+n6qh$rx8u|T5+tZkWgSN#S9ynit>VE&o4Z6FFXOtR2r(h;e_RU-4lhY-9;r}*Kuo8 zN*8fwqTc15`N3AjBhT}Tx#InA=Gs=h@9+gA?5+wwj9Vp7*UxTEn`$w~v2?~B!lJmo z-@fR1@H8_IEj^DfYFP3_JI&Of1BqJzfA(7%L~P#ATgNg7dhY;Jd}g{Rxd*K3R(V$_ z4RGOWS18RahOCXu@N2g?MI=g~S9@WBa>DC28&^(fEQW$z_xILb^hF$-?QgIujtOw~ z?GZ0G84$)U^Xcmbu@oyn_nY@3bh+k3pG%IPU<-!&5QNIW64~!(-_z82SC8|jCQS%d z%emHl+6v!+)hBFme9Co5TQ$PNDIprUniu@^(21sx@W9?e*Vyqr@^wJsJ8ux`9?$D7H*q^7NWt(k>dNuNii)trq8_T_=INj zihBfnEmuh%IW&}+Av>dga>Z|n@$O_jDd$DuxJ^l^6A;iLfYOd-<>$1)vUov3DttIn zSG#GjK6hqdvc^0)ngY@uT4Ni(= z_;n9eMeVS(?pnxQm76UxfsePiN86RAtQbdqAz#0(7N7Ii%$lexG+iz}w!`Mt*f?@Y z*}eI8d^`}f@8P+`6;^G`u?Z(5DEPPbxvrIZKyC|9}mX`E+GgC%== zR7tRy^~B`wLr>5e-dWJgFRYV>saHa-_fdHs$*{Kjp0s;EhM_QSdq6t`>OnzPdFS73Y;aC2}?`g z`uh5~RnRqFTjO6FsZ1vgZHu~`ij!z4+LcsR0&CR`i%5f0jt6sU4O=vaOIZWG!P0*$ z(-+mp3i;HyhF`*rSco3J5dWtZ`M zsx|ZZ)bJCLI)9gazuFh4fk4?kfF`{Azmkx|>v<4p4I%1V}eEAnwvG zp0~7PYC*nJHlobAj4 z7=KZv5UYWnsk<+E7a!j7svzfHX=4r6Zp*_&*D|hmiTDjJ*1O-5Bts`Bws|GO(e2&o z+8MQduXUuSCE4^b8JIrO{+C%2h#Kr4Ymy^(&}2H|7ex)41|O7>GQj!))S4N4A7jcq zPXnzbLQT8WS>NaR+^Cs>wQ09N36G?6|EKCdg=Pi6>wRP&8_E_CdjqYB#A@WRg;UQ6 z+kt;E|3!aPoAPE`uX2nJ%h>EaA=>eJPRbV+B1}C6yU2QgiNWJ#>~6vYD>Z>1Mlh(4 zQM+nA1;tn{9Y~M`C(55Rj27?_MSe&h8);gsUYv3*NI1kGfH&`v!?@jC=5q^EW8eHD zNsH$$$;$xqwGFCup?eCqoh`o*>3rACV)uuAMQYfz9Ju4E-vgyRDE4Aa@h0#-Tl z;%VCg%upWkw8Ql)mcQF|hKP}?lIE=uAsZwLV1oss(SIGz{;U$gbwMubzqB^L6|`8$ zEWlZuqt4#kmT6`tB6dp;f3WTsaAKjI#3V@9u%04x5~kd+>Gu-VH(4eqd2z;K(KT@_ z^Lb_ga~mm0f&AWO|}&Yi^wT$Irf6b$Q3*?+RNfL;e7_w{*t!(SYSQ00m{!1 z+lH>s?sz0XxF&3l-`YE35;)#9H=~SP@0a)=&tr&ej0Xv6$<;JUVmdLl7#mQRh>3CKCr~l6Xa@lqoMuv~~wRhHM!YzhovxKrP z%RXzWkhvn=0_2rl!d;;$YDR*{p~%+I#%h zi`mrv%hNY?(AwN2Gw+`?gM5WaQS)gW`Sz}i*=DZ~K8`q>#WD8c5wUHaM)Kp+Eu(Tm zv(G=psZ#&l&i~#li}e&sPI~EmZA-acB1)6Zfv;@|Y|8j08s3+mGhg>WFtc?T&40h& zoz0j^t0D1!jT-+N)m{eboDXS@PdCu$+4Y(Ewn$BpXSKE+te2v1im8j}E=pt>--L;E zLv+K+T<{^8T+lHjE_aui?h_F9L5F4uU(W@V-+9tqn4JW+ zXyyL=o056znF}K3 z>lqsIf}pgWFi1juhJXq@P+ZVO_i7G0J}7%@Y`moS@k2<)1N*uh5_6;}(!)WgJ5|!v zf~CD-M4Iak@RBC;VcmYyL}D;Mc=<84ZZ<4ehGFSTY845z>i_4P4@Cm|3}4Ftq4NVU zZq91ZM0IujD5(J1-)sq~vg?&>4Z3lnMRSXM5T5&3L0Ap+%l0ca31_hJtS8S}|6=Y! znCpL?1+_L4-)v9Mn8{>E5&5)erZ=>J!R)o!$_6}Tcnkgrceh^-5GBY|Ur>9pE+`D3 z0Sx4aN3lH}e3G4*q`<2!Q+d6N4UXCo_iq~nVuEMG1d%RRgy^?NoW3^-<~Uw7gGvVA zK2An9wTQnDlqJEBN1j_{T63&KP`~zbMUpQz6&?AB5 z_?j^b|1fK$A)FaJ(^G$+DWEMs*6B9=_Dq$DO4jCb zdOyb5>+>cKrr*=82nfc%gNSxk9!YOKuAocn&qUZ%0o22jonm)44q(Y1Nj}Jv$ug;# zH}vrZzH|z^zwX^z;Grd)UvAfuHy)0fn{~ZYx2RWFPmkx z@;Yg*MiC(w9;F)nY1{WN(kL;{0(g>Cojw?>{r7fXgY;4SC^wlcpyTi7cYhDywqO8S zVi+%N2e1&Ofq44#vXm57z)QZE11wU-G=`}WU%$Q%KM%3OY;YCf0Lc>T-M9gNRybjb z`@>X+j}*LbexOFWo|=+U4Dxo%f<;9|l=lIBC-?3)sI}}n96Qm~lIBT{-vOkVH|_6s z3V{h6h;+H${Cmr42X!9($gH@&^tJxeU||twtZ)WmB?D%v5V!f5=%o7JJeki!(9*<2 z5le+j!@lclv1FDGy?t;EnHh|oK2Fr=)HTZUZRFCA+mI^04zSw)wx-y6?#xWuY3c28 z8&vH9Ku29-{fAKY@3(i4SMn5(99WPjTG?CdD@&PQUdxC8!oq(w2$tu#0q86qFatGm z=gA;S;JWK!LC!|{aD!+@&l$|Lxj(6@(+Fq$94=nQwQ1q$23-Jju4FQ2^kzteC$rg$ z9~sKlo-E5KIz_WJsL?5alku28_)c!XUphwkKl+0J^yPVn6M_=J=F*e@`(GN>Ef;7H z&?NUM94rHp44~Ux8rajfxj-gKsv-@ifc(f+cD3F;zoTKvBgZ4AgS@7=O96h@fQSp! z|M;N5upQ3ka-Mh806I1`#i7PNdf^oZ#0ojs2%Bw>*#?EyiplY0hF^GK#%`l7AcuKj z^86?uRyWB!@C(0UsKjMFIMd9%CU}x>lJ`Xl$O7OXkQSACN_bY1ubaCm;_%!2mjLjA_7 zDl6Z(Z|`Q7h53zL9;blhQj^dCPU~n|VW$c3Y(*!zKCn9F zJDUYi>!r2$NWhnELFyM7grT1519I1!W?BezsZs>}-GqFjfJ=niAFVL~$q4JcFIa2IPM+ab%l||9L;{ko@BP*$HGYegZ+Y&w?TAlzl z6PfHRQRcc4nDttQjwsgaKLS?z^nb7Gj|BywBGoise#CB_WcE@OfJ{qjaE^u+zP9I= z4qq6R(o#eCR2uuilWr9My*4)1bi8G)_*ucwe6pyIE_5r95434bW0yy2L^{aL_mU>V zqEF(!$HvlP>wVp&&MX2rlv-lf0RWd>V!ea(D=vL+2a5iw)!i6D07W3Q^6_Eb;qU;Py4m zood-*mk8jRHpDT6cH*}I=w95(E}iW0?yT~x3Yp^8&n7Ge@TtbLy^#P+HmN1I{=mt> z;lk`4;4gSELluxTL5G5&fK--W4iQl?v%%Gcf9&JhXh1YA6> z#KA`Bfzqn{N&^9pvINAvzYYCL{tW1JtU`_-^LLs-Y5((d08~uK`2#qbR;#}K{?1?w zIBgB5P1iSCh~Zx62FK3`9BE^=bdF*c0SWNHT@+U}bJK2{H2^|kCH$zCx# zFn;?92KZtwzyS~qp02NQAbj=(<^*8N@5^eEhifagK4VHq!sApk*YU*x0|1q7g-szx z01fMoX_=MMw`Vx(2o5_kwvGhgl&6`$yk(QXWn@|dDws1adLR?A^dyOP2{4>k4pzLI zWXt-|jp_%Y@Td_HzRY-qGl_w$;1!c66xDfaFpzZdm+7v47k3&R2iW?DWG;0A516l0 zpHBnEWs3?g9u=lHT$brZK0GF=AfLCk?@5xvrYBgoRiq#O=H>oKFGQ4IVi+J$@_{wB z;=OW_(~uA#+proc;Kp;O?%aXe*aEm6P39NB!8Q-tI(3nT;h^;>%Qw*ee(O97DyqZ! zA7E+M{2+2iS`z1DQ@iApnX%F(h^TCDZ!be!nV#m)*ucxT?G0Xlg!~{6Uy=DwzNVcK z;2bBEjgdQO<~lt9xL1$|5Hej{Xjr~dJ-s7#01OOIfE@RzmrPIfN3r2V7Yh+zl`TiI zT!1&p#cqMOy4o*RpDZ*G#CrR6^MFfx^^B+y@*|db0V*kmjI?A`Dfcmt=cI&KRRToV-bVU~GqbtJhp87Rn$AhNvo2gmi;qZL z07S0*IM23fb=_iiU3y6_e|F6f0*TB5>rsu{u4nk)>t27x5`HM=K~W+^uDQkpl9tJM}zkscB80!tr_>^RlKSxjO@j+p|X; zo_gbP1wL`oipwK(uVMfp9c-T&$i-2*J(4IHb_11H@IIA1{Hv)*M#1Gs!P4`FQ|e?x z`jefL(a*avyf}Y{v@xoFOq8iZLDynU}6Q8X} zP;v#71s)MC>6kyRQLEaYd_8)v2FUcKfe9@#V1W(^C!hD~uT;ELneG!hSw`{C!_fUM z!^WpghjSv7985&Ape@NV=sQ^$b1@Uns=|pW@ImoS-TPX826ESMk^yRNi_X=YaV#Zw zsuJUho5`}{U{LovXr@%S)FMf$@sOQf^>LLE30idW3qJD~^Kv>QdabuSJc#cD?Yk{b zF9E6*PM=>CP8 zg&{-h4vu%4EX#P|`I1u|3fs43@o%rU#Hmp&1x$a1_W2JMJc7shzkL)3?(`wpnL_Tg zN_OJZm1wxbyr>BHfzpzaUNRW{pwGLJzLedx2Mi8OrG4J(ZOjo-Pke0nh4C?Y_i6Z8 z^}(s}hy#l;sLDc??mcf()mS)JXyhP2Ga#LLkDp~WyX2A=n6N52?4;G^Ka@k~zr__5 zNqP=8Vpd=`@?Ht|_7Cdm2uiqd?F|=aQIr(W%le>z6J;@x4&sh7f6wiPQfs4&+M?D5DfT=+(AgIqcEHl2_Lsg5we(^} zXv>TSnXA|WwZ?&Q@(Qaic}HT@&SoH12FdWa1*Y$dV+c!EFsN696=y4xkjXP`fXU;_ z%6z{f&BFDGi9szJtnRbz!@<^BhKzeI1FFjOl_yq{AKC*x>N(SkjpC!E4LLZimNoAl1@(x}Cp%uiL z3+%4=C@^|Od;uE+S}GK9%Qr1i?c&<<%M2L)djI9}j`J%J$XUW+E+Sw~ki>}aQK?Pw zVISak-dNL=pVvDSH5B0-a=1!I@L+3_2Pg|R@&PY%ju+%}=d20QlJI4H5hf2+B03cS zjySVsDwIyaUR&|VHg(LE;r6H{uhAo$1w~j z;$WZg`0vOIf?SY~*QPxVGSvuaUILsr-;jkil>Ah?Ykw)&hcM9%*GqmmB{?GhMm@qq zfiuE`kmk{-1(aSkU`oh%us4rINzhHpMQ>Pv12a-B;|Kbp5Nr@A5)Tog9g(w-@*nhl za&4ilV|EXz$v(V?q<}Q@@i23_h>Rp!=Wy1wc;ZkU?P|d6obDBSe?H zl==Jf^E_x$e}ArB|4*HANHlm(|Ni5h*Z=mUgUAa?lNylvB3W+{m5i8y7ytl}sjEHI2LSM} zA3+0zIM}z7kAly!Z$M9d)%$?bJ|;Bw7hHR#M@j%dMJ&n1Q|wSsjINfUG6sWLU0t=d zwpLVBEGQ`G@9z%}4<{rf6c!fN)zu9S4lXMzJ3c<%-rmNpASET$+1VKz8=IAtPfRM^{%@2ZO=f+}s=-94IL%)zsAH=H_^Kcv@RqO-xM2#>Q4x&!nWr0Dzvkxzqms z!`9Zlu`%p|7iDGJgoJ(J;j6;JqrSe&YHCx#!6-$=2|BvLy1E@6o{`SZgRHC#UEOIm zw&B>=H5lxtgTsQG+mf~Q{PFRniOFn1!6qeTKL!Cf-`+kP8ymN_?hzKgJU(8{%IcGn zLI40?2?>wq<|Z8++9@f~1qDNDYSV6Rv%bC^bab0_b)zOGr>mYHSHH(V&#%n*EYU)aI(IA5S~yYZ4_gz>i&*Z zBAuGk_Mx-1VKfT8TMHjnejNFl=Rp$=?nA@3X?b7&dS7X)>gp|N?ChQGC!(9kde7E9 zBd7SAhpc6&pxW&6rjF5H#@hbfBTLSZj|mKdc@&KL&yz6c+nDWE%tAP3E*RAt^3WjE zSj)4!IdnBrr=6VeI}_#kpbuu;8Z)4n9`WGSJ*}|Y(yx7u&Z_}K5`Y0=z-1%A&ek4A z%Tq)~^XLf#$pVg!3BqS5kk6nKQm^B4_#Rn|d0mStq zmz)6|RDk_-z+nym(@u$*^|f*cEhVN>c@lou>@;a6_LTs)PlRc=)Mml^0cJHTHoZBJ zPc?=~#0y$DII&`&3sp9a-Rmi)>8QGYM=`uP#dF5K z+wR1Cg8@>s@lq37medJoTuqAa%I8OnJ?sB8R+=Qe6W#2;<2Re`EvJAx03PEg$dmQq z1j4U0dbY^qwPITt{A2w@==6PZ_+Q!i!EhO5gx6$Hz~+^@KVSPTwO)>0>g(CCrfU z-Ao#bDOvX2%`+}-IhfpCn3+Fw60-0|)vVh-F_+V321&-&2zWPSdc!0J)GJ6`ykDL~`gwc>ih zjl(hh4{6#^R`^AO-pgYZq-Pl{I@PGv-PzIj_NzjZb9B`gtcA}`rz%=u{hZC6o>~fTvM!1D6S-iAiPi|QPm9I;(PGRBo}P;5_zF$%)|`pSA&#Z9A~|N@9r;lWarKBWpa6yVh82&G+07-2xBX(&Zm+mQvI{0x0X9Y3T9#TkbL#iC=m#{UvX@N55fy~b?OgpP zN1o`>wt=V}G@-5+KkQaF*z3Jaz5F&^`G6&O_>CpD2c=Lrvqku$o+zdHjtz7I~#to7*Gb(F(iq1d)cg)=k;986gwYB95 zm2pEaonQpLmj3+u5bJ=Xt9kHdp0Rv_Js$8svJIVOm~M1m>Km?fcPw2o3b8b`bgI6S zUc(q&Q|WHVlsqjUvw|8i#!LBl&O0|1*QFW{;|)l^|B zQJ~CcdY4gEY-!{z!G4c%K?@&(X(ozvG|}DGf6~Km{>`+vObkPs4ZiHA5pZSAWw}g6 zv-j1cwHP0w29@-qPXD8LaAw?XVK;SsF50fowxj{3eD8>bO?N*t?x*1=0z$fX#cb11 z1ictJ9{>1)V`Jm(xt<~iLwbpCvp;_#r9_m6dU|Dwz(Lj}klC58q6Jh<&7i9Zqj*{% zua$gDQ{z1gpIWR_Vd@<71e(Woo_#MSo86bTo=a@4v?OvQ5cn+d8c81%HJBA{34Gt32c~SIlJ*0v1C(mSQRFkz*gRD#$eHSTD9&bc8!;UhpiUFRI3_uv} ztp`66Cy?PWuPQ5CKwEl|&cX({@9rdl_jd_LW8$4%*{>VzM-@!{$C89_p8?|5r2lae~ z@uOgBD9O#GS;r!pwBn@>BH`6mnL5`wZSke&9lXpi70xGZ4o;7bFHS2 zu+H7Nr!RWeJEWrVBw=0pPOo7Ws^RNFbr+NM#=DJ^y!>6!B9T`#QhbfoLaYoFv7JZ= zxtlpqI|DECj09l*UQIf*GETGc4(+#%nK)_)y8rvLP0=r%6Fn%FA5m*;>mpBRi<6=u|3q8qQL>E33r;c> zPotxRxGQW?0KdxjqK&Rd5$!39&tsBe0qOJtJLVR?f6{<@9)9T;SD<3kYESW!1>FrZ zPl$2}k{6FpN=(w{^Lwm67tM%P$C}^2^>n!@ou_TB_Q~nk9ey-kC-uC>XHR;H5SUBy zP+4;^7}0PxzZzc&T)rh?S_^9zGdJ`B$IhI7t#aq{`!GBndd>^^=E)wIufj3f+&+ua zWAOKkf8zPl$6k&7Qj0x9D-j3HFmeV@ds>ecApD8z45&h zl2F)oY5QhcR?y$F1&|{tbvX+&7EEzXQc_b@t513D2iN@a+VtS5DJwe6WSWyxf+6I> zC^fbaz=bePT@=L43Cljn1#N6Acn!ZaXnw0$ttNu@KOBw(Bd)Fm(Jbs*T?&Q?cFgx1x0MDdht)6(NU6B-SQaL9=;WE?s zs!2V9pL(_J=IbH;mIx&w=?SELz#v0J!D*0T7NW$=HE+?)0|w*s^(h4K(=r%gpzj1slR{cX!2O{ zcIjsc`rU-pHnU^tBzzqb4XXq8f6|k+`wbo9dmH|}FaU4x`vLtNs^WpbnU*o#Tk?cQ}N&N=99%DJl zPt?9QbF(jYx}lCTEZZlXxZGpVoqFB~{~08&<<`Z}48Ik(?<=JzOxF&&*MvyjCYo(r z{8D~BoEpMw#XPllOkh2Ve2HN)2B`tv3$J` zm(9XABIFPBwKrkJ?b&&h%~fYhsKM@~nZH4w&ArU=>U~3ey)m;DjJ(sQi(FZ>metwj zVV3RLv>DDQQMgIFqU`0OPV$JP_jv)*2KMz|u-u;Fh}56w#hscdBWzq{#ErWGa)i;{W=sE+{LSnGlYy!_Z7+Fzmbe*D9T!7JYn&zNC>eYLMs2s z13BKaqp0tpB%eXoK*`WVp!~Vc!(?bBXvd4P&EH>#yk^3N?^B@qwJx~;o*Ec)?R*nm zMAip+?u*edbC#i&>>ewjX9JPiwR`kdULuso1wz!8yfUj@|Kd~rDa0hL806X;Z0jW% zde7<_o53H7TK#yXeg5iE|7O@4h9i;$+U_}>J)I##UR&@xoZ1?d zv&4sp!2-2R+%UB-%RG(F?ot2age)b$f*#d;G=Zlq?H^1o6-j3Wh;}-nPc0b74zqh6 z{F$IYdECkUU`67_+P?^zD6`#Bo;S1YhZs>Ndj5f%4^*K~HQ#*in!?tCAtsDup{ohN zbwcFnABVX@e5J=o|E#Bj6_~B$MpN%}RY4_i>@~)PcPJ%Qk5yCJUg}?G#EH1QN{`I< z%IW@3BILy3zrv!d96}fU+BIpj>RLWN^HYZ2Bfdgc2HJ_^p*~-WU{0~3Y%exe$Tr0v z7tGj@@7DZn_dow6Mo#?k)HZ}CbiVS{<7)}|ftN%2x*uZp2Kn0K&ULo*%-Hs#Z}dUf z$FCC$SG@4$L@){^_Er@M^4JevE5r{x_I^<2_DbRPn$-Bu#Hr>_x8CYn==S}Qv|^I> zOEBl3oD$>ghN(eUWk~e@`!Ekq#FXv2^EC(gN!v|16{+VTf8co)@|{Q*&)1R42dxR#!o)2+~)n7rZ{(cswTmh_pyw=!ak~hR|@`g~OUlPJk z`UZ?RUHf;hkx*NcT(gfD=P9|H{59bB@y4$Oq5P|23Qqc;6zc+OcmCbT|Es-+aMt;> z|2eXU+E4|9|L(UTZA6o&8uY&)%FeAgN91AoCqs^SzS~bGWN%(Oc?Q~bX0du_Xr|lu zr!W_jJiIdP`BC{wqMr}rb|5iM#l3J`Uk_agiSTGu+fR1fo!RWadK7AFJx9EH z{o1~j+-zB}8rrqqLgG{YwHXgkvl%u#aURAgv$(6j)@@a1Ol@@2ezhdT<%M@CkJ*8< zS;x`{)pPJUS-4qfUi4XiNFiXI23!3f(?!&=1N-Vg0Z;301$R-vl8?gYf=*_&A?5n2 zHoAGg7pVrB^PAawit!Aey4FoxP1YL;T|2#-2j)cBC_!qOd4(W#6Fnu(bbgc=t1KIl zLOpEzp@C-9DFu3k#&UGLzsvz^bX7~K#&DB)CTVng~j@Moa7oAV`=uT<=bk=j_F1wZBV z-wG{7W81|dK;$H-f`(|vdqVnS6`t*Tmt<3#cG;g7iY9m_HQ0`^9In{I1k-YO|Vm0%R>x|nA0iS-6W|TG}9?(5X zpCQR(D_uU^HoxDIee+jm!iUJIRqR>PT$rD=SPqdn;(d13K*X& zFl|RBZ$|KUj(^}i6NceR)n(`64W7~rWr)_%2~_@`BtYreK;JX{S|2W)o4}uA^dC9< zMAB}47cbLFcZjflH`2CBbA={Uc@$f?^?@`=c#AHa2v18Q$VAF7FTAc z|E|sd*kRwBgN!LzJ=C4un)Gn^ZDSIomki9@b{Z67=V>ytNFz=UCZ*B+kA)HHh_njQ zm2|7OV#nE}wc%|Gk0;iMuSr!g&5790#Le{7osFr1T9}c^&Cv-IUbFiVS-trOdx_QT z=9@(20aoV5|5Ac3q9$obstHWM6|DUIxbIl`5$t83h>6yJ$b6epaD^#Ri4(Cv(QPOB zdk*o#PY?o>_4@q6mUkWej_0h1iQ2E>VLI61xXS+=ZoaCrnG(Ijwzu+2B)`sS{~VL3 zg#!?(hGRJa_i zgC9l*yUjiq#YRz{lni9?TJMAYgEO_fINr0JV0k|b41U@he8wGoV$XUxcMbQ??*HaureeTSzsHBJ zp!2$5RDZt+d8Vtb1WV_fV}Y}Gdw@-O_V1W)= zmN+xN%7ZCrmja`w?LT}q&xrb>X@M zqBT2eXtrslky;CTR{Uq@$17eWSP6k$J6tb3ASVWC#=7_fZ7wq)J7n{-@_}E@M5dn2 zUD?C#66830ecSFkqs9E4+srYGF-8$(Jto(fkZPK9x*|6lJX_su?LI2Q^n#b^5~EEI zn?V;16ot1bF-L3k?-z|R7Lcz6;;`(1)v-mP-L$#W?1Y63O;Q?*Et@W)7X7Qhv{|8n zeiSC~PX4j?#%gHmUay*XX8@+jp#Q90K{TKBBvFAiARR-4fnO90AD)0PJs*N{^Rp`A zZ~EnVWiSLBOL`Q8fBLf~ahpfaA%i35F0?1?L=Kxkx##j{mfGT-7oB@=G>^UnBZIHB z&txuEr|sO6(g*nS)<@=>f~nA3_5AA4xzmi;@K)*)JIV_u440{ZF!lV`lQPuu2p3Yw zT%wUZ!yx10Vk;~2J)jjcI8r6wt3!?)iP5>*pS$w+L$NNGV0Qg&w|`t*^m`1YCoBiA z{qn9=PJw-KV7DJJhY9`e(|K|Bqzn(Nsyo{&bm=nj{O^n<*2X0dEPy-n|5~-f@t#I@slG_3qrd1bK~) z&GkRAAH|%_p%x;Kd1kh4MQg|j(0LR`cSVjtm!sYyJCdzNEX}?RKc|q4X>FH%mH<+( z!MYd=(!EP7cr&{|F?_IGG7vBQjH3SGoV3TCleE^0<8BUG`=zcg!gD@;a+Xz2$Fg`Y zcB79A`rZU!E)`mL*qtS}yfB=Tv5Q8ms*LkPftNy8sInjh)Zg2fpXaQXwiA$$AxNyp zij8BD;07JGQKDrP^#+*s&g~r!9PBaPX4F`K7AAWW1&2 zvSbw!OdXco1gIIGnutg|ii}&^J9Gx4AC>ulBP0~XkDdv3w>hjP^~N2LOXgT?ZSVE1 zBs3G_XD>;Nj-^$@63i^eVc~V6>OzyYn&9v=-d)84<}yIR)bLmps#_MmAxoee ziT+v2*}}8Vj(&;43-D29{3x$6@|z z>uqkB5@TIi!BZ2ewwMGMV;kPK1?y%Awh8cKCZaUCRRo&Wc*_feIvU^+9z5VXJ!;Lk zH$3a$X$W+2R+wf8YKAwsn|KSzP3SauI0eeUA~mPh*LxEr(*jS$_I5c~N(wkw@;wD) z)(IYYp7>raoSo!~BB(XE=Ds8(rm}D6^?K0Mr?a|jtS~D?X^3?53fNXht2yZ@u*f{y zsdp~uG{_W4x5uYZN(=~(o75+gDgqcdaZ;EKgQw$43W39!m*d(*JL5N8bz)K;L1`ts z33s|s@j@Di{JSz*_8|s-($f)gu}3V*H|pXtC#!2EeCm8`bP@yfF2Z_iIc6V4&t$Zy zVt1U~MSAVMeJFzcJD1g6pie#@B5`VzB29~qLb-8Dz|*I~{vvl_XSc5}A>U6n=;5ht zFI*{8OsjvExt{`LUXp?%fSOpsekq;k`RKlLZcaJmxduazOP&fRq7(eF<^5!pYA$ZQ zc*gdSfnhKrht9|`50}XZ>MqY=#T@@3ZmUB-nJHhTXZPDqJyTrO%vwack*7YXV^caS zu-@ZiyeoJ74+rucVI5+Y&#bbtC#ElwUkQa~9M{&dc5qrvYEjQS{IHhZ`+g(zdvROI zjE7e#fGi{gPbBjo@`a1N7uEBhi7z8=)h4W7R917m?EDg4%h9p^4B0}XkIkyUyL$vC z8i=yMn$uRpVbnK4n+iAApJFZ?o2jLM)_9-T<-8!qk72@)71tq9y&v|AVHlKmH?Oza zzrM~OXpudxrP|4Gw5k23}AZIW;<3sqxxBOQr3{-68Ja@1cZX-i#yn^`cRl~2)3$o?W&s?jW z41u*wBJnJcGBG$T7!UD-u^*UR6KpG*{LMKjWMfK4e}UF!qPl^W+sDAE5xeN3dRI6) z&g21eL2Oz)~DKd3zt3t5c)}?#ldzm?ogorSUu|!9mM~?Q46MB)N!rq+#S$>P+N!h3t3Yu ztE{UnPH33$xO1h!c#znt$IEnpfepVmP~d%+&#{EcTm+aEEeRjHXt>cjWld)ywyo^V zF!3QEbo(^VN~#pF6gdK<>GFPFP;pr4&oZ>FNj*PgJQi+X1t%|O%K>S3a;zGBUMuXIQl}6kc^TXT%wJ`WV(28N zdl`P&OfgRtwF=O@+mmGaB6>MJ@!qp8ZAbg%uFz_smtp!c+WPkQf@a(FmezoA-kqF^ z^Lx3Uk6Q`>KI}Mol^bCWC9W>{m1Vh|u9DI5i$n0j4UG~>Dr$=^`;TIDo>1%+AYKZC z!4NQXL<(EFw1P`n=|DIzZX~>Sb8{xW@|nZA_6ucRx>$Mbk_0})9sidCWQ+4siv&eK zWKFgCVzVTZ0QThLPFK^?=F;XG^un2BZtCpcqLr^S!Hy@|vLE_MTL;9hwD;|u@aSYd zZfO!=gvIqMWtaj4#XI{WamPIr8D6T+YL+n+(ad`=Y3m$st{TAO(vf}$Dbe&vZX>8I z%4-sK&y2~eqoN3W-kgjxMDox>i^wgryBwHl-w2vU5(#@J8C2_$<^TOc18P7$zcFno zub$2l6JQ$is26)_uSy<4t45G}dney06v6eb3L)d#nxfMe1m1jSCtL4DCwWiJc3Pd< zI(;TXmTC3gUg^YY^v(G=oE(wqIc*BEx#)1f-EU75{n4_nVjVa?^r)uJEr+!|UwwR6 z633F6F_o6inW>Q}*v}|Lm@fT^sT;4Vj0by(eamJvWhYWxXvxszuZjwZJH6<svD zAALNjK<5`MSvaz$K$S)^1*;ewtejS`16BC64ktLdlf6GMXcLP9ksy%z zz~0ljC4m+bdL!>n?&hWFH`v*vFg-CL3c$Z>Y)O!!Ssoy0KK#9|EBGQQ^t+vz`wMoB zrngvLr0a&8fiDAJgAu-$&lI?yLAyohL9j0`O%EhBto{~o%G}VjT~POgYKE$PxGi@v z4Mv!o#w3n`>PaEY)-I|j+C0`@?ZoBgD^s$rt}BowT;FAA z+up&~RLc1wrY&YBCg)^yozk#;M0W`6sCF!^$E%!PQtCT?+M^rwHF74CCJIvHnn^PW zD`*sv!km~U!;G5v%omsaX1lqKeN%F^FjSD=kal87qx-~YP!->BXHfBfGOfFcD1FN5QzS9T(N+YW#IRb5&8Vd;JA G*Z%|W3+L+q literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/auto_quant_v2_flowchart.png b/releases/1.32.2/_images/auto_quant_v2_flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..3f97910bbc15a724bc961edf8bc4f2f0b5c289d1 GIT binary patch literal 95155 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 W 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/bias_correction_analytical.png b/releases/1.32.2/_images/bias_correction_analytical.png new file mode 100644 index 0000000000000000000000000000000000000000..92e930ac88938c0c9630c743aa75224479b963f0 GIT binary patch literal 61604 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 F{{pB5td{@) literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/cle_5.png b/releases/1.32.2/_images/cle_5.png new file mode 100644 index 0000000000000000000000000000000000000000..07e351585a19d78e6157b7aaaf438b011791ab8f GIT binary patch literal 122895 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ð_vfY@~aAQ1UyKalazPX%u_5|hu3)q@!!ajYOz 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%0AB()&3yJ9S*$GK%UO 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%0D?J2}|cWlyT(ThVnhd+!!2rdXR)I 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/compression_use_case.PNG b/releases/1.32.2/_images/compression_use_case.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bc42909990b44a64ba901fc8cbafaeb15dbdae79 GIT binary patch literal 46589 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 MSFc|wRkaHKA4m8`f&c&j literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/cp_2.png b/releases/1.32.2/_images/cp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d25a132b3099a551090a0f6f27cff26a53d12290 GIT binary patch literal 58390 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 F{vYm5BGv!^ literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/cp_3.jpg b/releases/1.32.2/_images/cp_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c02570c59e54904f5ab955b708ee0fed6df9c09 GIT binary patch literal 68184 zcmd422T+sWyDl080VyKACOK4uRzB8C)_TkHJnz~3*(%_Yo|di_ zfaV+kKtufkoGk(#0?yI=bNzEa_s>N~`_KJ69UUzl{ds!&e+`BUjPwi_80hI4nHeuI z{c}-&Vqs=t`RA8^9`bK*J$Ig#_B;~VJkiH%E3f0vP&mHj@asJNuGto&m| zWqm_qQ*+Db*0$ch{(-@v;gK(sQ`0lEbMp&m40i43`o`wg_748===U+<5ApBGKX%ao zX#dSD>ivIf7dzFibN_q>4FA|gb1r~7XxZt`UzMllcwoff;LRzb5X#7Sb3yc$ zF^>Di>j@?vF-6QZ{6D7s%d-ERVPXHTEc>5^{V%)F02W#r>W4?m4gdj8$whHD00nOY z70t6@vnYPD5l#x@giM59b#nCf1I7E^lbJG#U6yD4Rqo*`1xP9nOnN2h^R}CVaai?x zv6_L)WYnRn-1{VvPBmE}ze=dQ0qRlBxM5K(6pokbIRh|v$U?2xLZ0Xc+sli@%6wXH z``r5e8wcO>P$A28$I06>*{iEp%=w*3uVCNiU_7n(h%UvB`o>zkV18tUW+m}8<=aj# zWxv=uu*Rc2^m;P~e^Gy0QJI+8Qh1IpZa%IO7Y_E|e3NRz8(B12p>(-wXL2g|bmVmC zV;aNtxSwjS_yY`YABwX)LJhJOY^(6M<6c0`uW%ioM5eKAlfDr%5NW>^<{eejk-89)XK@sPu_TAX(R)MdQ!C#$ zo%5fRuT2r+*s?nFx^RJCMJg-W;&Yp32wlsGwyxjw?=X^HO9&Fd$B{k~a&2VxWVi^qPYVPDWnHLWBqs4s3Pya*-RW~2HG$)zHYUbZxW?l#Qz6aIl}kF_0n z4)|%F;ReDzlZ%>LevDuOIVGc|hMtZyrb&%)u9`KJFMi(qHTLPD)8zz*7AfxM-4c!| zs`fOLZ)bqIgFRpY7$iv6tyr+w@o+)lvY~dw3@lsIF7Fn=h*13mAO9(+TZcW3OHA5G zxOWCfgjkPr!Ar@kr?Fjk$oHofDff;&K)tg9EWAS1K(biYiDR2%s<3U+O`{L&_xW$0 z0eZ|)P9F4Mq|N||C%gk}kvB)YL{wI|C~UiE<-CjD(OJf6-{&87zP4L+bQPziBOUae z0b&qr6zM?qAuOF_;{E=5DL8}ET z7k-bKEouOjG9ClO(ej+#+e~Vks%?0#(ra zr{Pdwd0^Yo8fq^H%SYiLKWhK1-%dKEpUKt0tHmSIttK47C~Tga1ZD`;(H7qSsX9gb2P+|&>_|`h`k+=OBshd-x7PZYuIYBRQP#5 zB6~efGb!+T9LTufT-=TSzR@90VY*hbi$?C@nThZ|)#mDJ$w_KTA>OV$Di zq`)|A7J2RIM_a9Dh^BrQRpCt}x8TeNmCX8u(N5!MH#Q^$lmQ7>6jGj%!Wj3!ZBfq0 zR-ENpJg=KOO-uP9PP0;@qZJ!wBb%}PQ&m=_)9PcN5bZbi117DGCxCg&bU22gl|?YY zff$c(vA`Wq;60WyqcMpBBeF7Iv%Flgyhkhk$|yTr$Nt%`EP86x@v$$lWUdZ+3+IRG zAHQM?H9rGHEUr1n9_NW-maED%mO(h~nn;LC3rs)PNMJitVd?AmxfDlEt$Y(tCpkWN zsX8xI7RTEIp>aj9sPhv;6g$~;!bhg|(#+Fe{F2rUV!m7V!ZI)R)hn?yT_se+6OB;B z16zw9`*R+>K%;tGVvhZGRUI)cOK{~aTCHZsR^ZR$i)#g~w0OwWl zPp8${dTqL^reysas=ONP9r11zD>woM_{+mtqF>7 zpx*dE&iUqY*6K;1tc>%cwy7F(F!$a4Uu#J&e@zmH6>e%hpxZmje;58DfdwEDG_H5_ zb1EI|I9XCE;HtY+P!uO=@XsM)6FBVzxfpU%##S24TGs5NRc)IK*JQM?qYrRG@BLTW z+vl33K7UgD?Zqg=*ZMiOg!w4Q^{Sv0c-6ia5{;;X?=68>N0Gc8InGgvi`9k$c5-vC z&UxtVqxCzr%{o%@opPM>v1a0ccK>r7!Gz!7dp?Bh(@Zs)%C8)ghRN6sV>0qR1OvJB zqg#H*IquTE;d@opXMnH|>A@u76{3Pa$N`^~)WMGt^ae#4+_J;o{<*WV zS69FQ8%MCoo&j8TJ1-MPP769zr0kX}cR(yq-cOGn+g+UcX|wo4k@Yaq$|V;%ReL1U zKL+M!s_&qXbhvIX6#!Ie(3x+g+)lL8v80P zN7atByWu^GH1X8wg0-zgDaMZgE}i-%Gy1Ect2vjv8kq$+{l{b14@VaoQ#`CH`%>7`bR6Oo@A4%68^@ zy`jm6?+oAH8EFEz{+osuqVZs0i$X&gSHDI4Iw75m8NX<|V%@)V?Y)R22k=h`8kHEN zj$AWLKrnRy$wH@DYIoMGtB}CJon;Fpkbv6`WO+~uY}jbO9C~$8taOQk8#-7mnU)aa zcn`I|zA6)ph3`SAfk&OYB{Ss7L2rOZ`C@N-zU$gUNiBxgUqihQY@Cx65j~28el330eU~d4EM_td592#PZ z2S)tfzqQY6OiaIDZ{2=}yH#F27vfnjb&gBpc@Y0Fn!Kl|1|q%KPTM7@Um<4T3d960nxhwQt#;Sx-)L}E~w{Wk@ zv7iN#DUK(1)oEHu7ljd?ZETNE)PI`$mLI5VERk`~FL%u%iG zcBo65Yly2idLnbJb7^YDGdI(W4HJt=-iU1rQWTtgQC3OXg}f8%maj6 zPz~@wZ_-uRxIOb30K*De>|((4M*Qk9aU_u7zi)ghVt&0y9!qmqd!aCZicr$UGZUPN ztrf7D*V`~4E(g>Hk^mIDjZEP+qccBG=-`_$=mWydP!YQsX7LxbebS zD3|k0FxNY=z!)KAoGB_sPE8PV+hZ+lke20@>rXH#Ml|ZGbeNL)yWy{1l_VRa3dwHE zzL9MpIqt;1cXxbYsDD|M_@HcnmC_1~R`TF~iNCkg{Ifn!&X3tY>5BsUl7C%Zw@HLa z*RRe(sONW(O9&g`6K;HO1uLjG_YB7z=wpq0Y4t5#sH#Mt^=H;41JdY(v)B{CKE_|n zvW|BRzw$U}v*2nIwRy#Zq;6Namc0BO;NRYbmRhQ>oE;eAy<=>mYk9Xq@!-a?k#%q- zq4}iUQuM3h86W}3spd%HBflUXVC*jwYwl_Hz`2`3f*(dvc782m+}-6k{HI<;8S^{1 z@K_kMCswupTGtFITs`2}rpV)J^01v(|5)uP8`&(P{-l0aKn%wbj|PP}h^;sX;R5jx z!K-%Fu`Dop$WCI8KE8DOq@W`z$S-zwc|tTrvf)>npHVCO=MhuxV`MLaaby)3mBSY1 zgc$P>*J*B0fWt>)O+ZO#%MUIg_Bj`<^GZE@*Ar)E3I3#o8WU;l*?r~Xc+YKQi>$eG z(+p*e8i%EN)l>edd5Ciqrnz!rbnh|^ZhRkzG2q!Xnx?Q3clGg&0)8p<`lH}GdOMdS z&j6Q4$_=0~#p$Bg?{up#ke&oyWJ8|;2)E}H?Zbtnr#x$*`j|xzFlIAG^n>mzbc75~ zVaYPY<{-kR4=k&_{9wpxm+DM~#&Y9KtuHY`9K2V ze2tQXeUFerj)(*9ar)P9XeZK*)7jiE4Ubo6AO0T*?7q!+P z0l{s;)8zXvTJiQ_9S?l*F8LBpiAJ)sSiYaZ%m)&p$@{ujDx_Viq!qZLbY6onorqpI zUXHj#5+uLIl@$XyAC^JywBilg{n-SEqPu=1BzV7F6a%cUJyr&&zeOU>0G1nWhnr4c#EWvWQuGii9)Z7h`X1!C z!h8RaoQypK#5YIxSs8@>GWb-o6Y!)sCDtufM{CNPCxDf4sF!Wt9y1q1O+(HA=_ZRG0!BOxI=-pE7;%y^KtO2B*Bv?hrOp|cu~JfvvMAc9*pOz z9r8-yxv8cysC-@XbR~QBIR*C{IoWC7bHdXY32`@S`0){$?ROBS&e~4RmGid+z^)U2 zJ#avy?3xv?aqrIC`+L1>cM`@JD5vKwrux#7Avwj|sC+BOGdt|=U8l!yWB@)uW_4~C z3eBWrb5paalTjK^yX1dk?f##^2|8$v&j9brwpIv`69fezEw!@Stt9tX&ol81@ahau zaR%5v?0tKW@}GIuf9IS^a2p{S6T)-QpMPyu#&=(}cj1>D@}P$2h6hGd`cUVWMp0#$ zJ_i7hZt~;DLswdxCm17M>Hbw3`@7IP-`&pukUWjKwekL7tyZFu>zhfk5-wqH22J)VQ42hjMZR}(D z!#3Hf)kO2&0FFOboA@BdiuMoUg#i3NUV|OGfz1Z-f#ZfmZITXDdKShL*k}5g=R~Qw zRm9fi~t|^b9 z-~Z1o=ncGQweQiAUh}XR;!$V5hE?!qhb2YMI#*ebqU@12ealz5OFeWipVDY@{r_Sx zd_&=kWrB@o)!C?#rJ*_ez}mD=_P)cQ;KWt3YWuhy2J3G z_IE3@j4~H1+veD!ZJd?m!eR+eX66K45?`uDrAQL@eE{G#z1OqJp9qfEwVIcswDe~mBK>AP^L>#k&vpC#Wcr8YHlr{|)KBfC3;EY0#T>HI9`ZRSzh(Pw zA7B_N1-BpI^gM2Ggr6|#u3|FQz!V#>((_OZlt3*n`T`m604?1Q#v?EA@H z#-#eW}6-LcOk5p4roc@#iixpMGBC0ou{csX` zBAkHo_<;fjEgAUjs*b<`k62WJ`*!kP+432#EFz;IXryhj~&mB^-tFHPRB!xb?$-Q}y{U`EBX*}NWT zeIOz7{;;N8a&-Ep@NeY((@L^wIgyh9#{Wrb%8aqt%4eC8JNUZaM0W|TFP59^gf17K z?7DFpi+a8iu43Q7@Rp%pZs9Iwx#`m)QBfVj%cVzCrI$!=l;z0~He3 zVhisGSWS+}0g=T(Y-FcWaI=s@@;+LJzQ(J2?H=QCwHr};&>p7;n%5uj zr|+|-8sG=L8o|3l=;ZBIR`vKU%swzs;;pBe{%!YHJ~L8)BYS%TeD3 zMntXfx~~|S34o|oVf2218#DOZQ@1wGAes~C&|`kX*^!0T3C?}wz8SKfS1;$!MRUB*{gr%;IF1WnTM1hwrs8g4 z%cIqtF}vk2o9CcX)jc1r^hW<=yb4{o!2i=(w9|L`za@$Kze(0;j-1I{;j7I^eE4co zc~KzPj50R++(n7);tuxS8DIfjT7qA)Sn@bnx9MZ~e9*v6bp`d}`=UjZ8T)gM$hcWm z2;o&ln?4&iF=%~BHujTsOIEeny9*n(=a*Agr;LrdUK=30^2T*YR5q05VXXtlhwD|(&CVHxjdD*`?O!z0*|`6) z00=c712!a+IlBxafi1iPaN-SyLHh(SmD9OGr0^+1n0RoL^AA?XS-SV|uF4Df&Z&7{ zI*xulkSeN;17!;W7tR0_rT~%z)MxrRPOD*!o(Nxa?nQ;FU(Ie@($N0KwqX0A=VO`o z5n5j%;q8FMKCPJ-bAz+= zXuYmS=n>bs6*AWu04r^ONpXygz=V6Z>|cQwu&5zJem27!I;76`DouW&_k!eUhKV{t zU)!ms6a2Y<8}QU-Pdv&G`Z2&H$WEqj~TFJJAl_Wl=m& zp}?oPqkSfnB)LvgKyrvnDk4eARPX}GZedZ|)iV>HaGtM#q482}-=lI0t*I;&RAL(@ zUYFRg)8roq*ieE*+VM|Mp8<*@#0!mV$|`VR^C^q*0yo*vCmK;oJI|gn^usw(&q0w{ zpi95H6p1|JHbf&l$9~@uREMY!ZPO}-F1vlvBtHPc8esVNQJH~BU)-VMDyOL8$;-4fUeJpe^Z7p~22sWA zaXSlq>`UM{yh_im^Q*4!KV3?`-8Z?pB zZEFx&W-Z9e=QK4$_`IyT@mRS{%&!#A_4w@RZ}-*T|3iWQe=$C>2|z&;P=^a#+r z{jVfaZmKuZ;FCi^E~t25t$HCC!-ftR%qdS&zwpIuMUU88)tYO8)8BNnCdPK30rcub zY5Wo(F$s1Fo}G~T-=`XVX0_qZCXo)UO|6km&8;mdYOe?TBzO9vj2VTK7?pa7N0>Mp zv6dWn#!(UOOoscTBB^1Y*yt_=aUY%mB0CH!;XOB-bp0+fOZ);kOI3wmZzuapK$$z51%I8?LD)lTj^vY;VtSIe3ZW4-+KyUhr*)qaL;Nu0K1{Y#?*r2oiB9T2l`-j(k`sBB8a3^p;NDPH@PNZ-U+j~@J zkWtqCJXVIWnEE3>nR^#3Uxrr8mM8mq)Y+-{`YH@%&@?=&wWu&5#9dsOTc4}VcMMB} zyxeGQ{@pdVAH2P^_2w8r(~Xq+7le^0PN={&A^Sn+$WnN_TukCaL;XCJegQI1il+Y% z4Mryuv-u;jRliZ=`i;l0bxJK8P_75eQ1?dMcpOY3(1cLiiBm@u65Xt;6?#Yea@?Ei z##oGXj_h@VSSBAwL|k?Nhg4RN-lAuik$lLxC)s6bhhEWMSWxk@*fI4&SrmN09-B2+ zwYBT5+*)v{5hp;1kyuDP9H7RJzdQIw!4=&SqbBe8(anr~aI5)f?3~UP_u&^>d4Rmw z#ggM1bZym>XO*}0efJ>INEQRenW#x!WVVqeH+|2)7g=^RBpdk11Z5ORuuwvrYN+Yj zodN8XVT%-HoO2l5)o=m)43CI!>=c<%mj%oI5hx}5<15bqy}VelA68lb)=90_V?RNi z0@>8xdE6!%bHC-dTyKIY{Ik_cmzhgez`>5M8y+g00fKBVmPjf(sNx5U(4?yZahg{eDQg3qEP| ze|5L47b-pNDaL$pPVIWQ+BZ@3ysfGwC!Ll0BB(i(g;ru%H0}tIXn&y*$WMH82GE~X zWH!(@nBFUGobhcZIpr)LqMu1fD-3pjirM=5=@X-HiWV#MlnSI;;o0`$@gV)vaCOC< zmH^nL8FD}I!kVqtdZ}}im@I{-D`Uhl2+Wbylrf^>pIR$6<|?H_L(t?hx_|z^cre`A zwYx|&~D8wx9Gs{U&IGwai;K3bI9j| z7b;XF_!&geEq&(syzER9=H9Nm%{d>49cuE~R@p)A66L%edozvdzQhA0YYmb`)q^zx_F513$`-_o(YNLi@_%`i87vr*<*@XDlGM)ItiEbwpyPidHJ8Z zl^QZVI1zAKDy=?k%rtKvQM`3k_eBP+R0W^pgVnIx!gEg2lTAzu~_%lqtX%ItmttUtS621#rd%lgL=5D_ahFQ@&eb*jJ*YCZ_U&9-=~ zj-D!y8WW@OZ#?{su1yZLEl-M8*!7D#UXqheq&=7Fq0O=ZDkjTgAgqB>_Zx8K;lG*h zN$F3mT1YGIt1es(Lto>2mZV5ybbl29;D+OBKD-K!>Hh|;%9LqNYpZwFLM!G?8wVI7 z{e7N)4rYytR1psvkZN)E&rMrW{rZVWw&eIQ211u;)z}IVKHs(r2clg(C9${?yVz|#9kzJB0#xrFk` zg31iIZF@1~_-?+r?)vv0Ee|aT85#d9?Xq#C53pPHTLqSlabf3VJhX|8)#gj|*9j#{ zk9_PL%QFVBWm&{eK;O%Rn|-(M(7s4%V@d0FL@GA*iH}_$*ZS~GxHx#8ico7tQjZD4 z9VGWD66JxQg?-8KOOCGYPzs^umqNrS{@h-5+KHFXKBEo^(Vz33|4M%H~;9f!w`Ume5_-aDt} zqU3tioNQs-t(eXCyW2b^hBw@cETXlq=-(xS8!(D?_55v~Qs2 zx^ZBTSeuahdok!&-8;LsYE+h+P}|y;tAqD1Eg&m4wWrNqu4cmT`>}EBUgpYt)S3`0 z;fLS|t?aD4jMg&z&fye68N!fL)oZBg>u^odMhr7U(US1INvXYq-Ou=tVUpY>)_q zXZySJMlh>Ej^cD&nBl@fbPln*gO1KqWe8M{>>j_e6N^O@1In}GBT{YjIX)hVgh@TGJ%@(2$p24Q!J4I^SVfuk9{59UnHDCB?KV9mzo0dOnMMF9!bVywT ze8|bqrMkr&g~OsshuIy9wM`%RPdrVtr@rFi8hwM67LurRXZG)~{|iV?KgMLpsVNf1 z_k5!ZdRh;1I$(nO5N$s}Z{roSnls-NiDkCcq~D49qtg|onKSjY@tqI%SjYC2iO*a3 zng{$0TUHgHwx7BYn=1q~+Ami$R)=}$LWFZ&}TBOCS^c#kvxD-K)@KxR@StSr3S-mM| zv0q(as`}yhnjw=8R)6VQkntZQZr)5wHJe8-FtQusyQqjW0Jj<~eh8BlO_8T&QDOq) zQDmdy#ho0UDtEqXGbQ*>sXDZP(Ra_ix^HgX7mfpLx%?w`{VyCx_KR%TZ>2aDf(`y) zAd!{XO+Y+Kc5~`J-5H>i?@Mps{)U3UA%w$KNRnuYL58l>&h;g8tZdVQPV^2YH^*Oj_Z#w$vi?u(cx4&PBC#W z>4L;HB`OHWMg>0D$OeT(Fd>G>TN3z^h&1d>@AKKpSMo3tAfOj&tOkE}=AlwWA0-(T zAEjh}@C05zCKltO2{ET1yEp>lFELW6rWa9jyoyk zj7g_kS%>8CrMWUDNPis|w4m#ICmNb@7i;zUPix-NGyn2!=P4?g~jK- zrFFB3E=X|B&bHMo`UL%J00Mw5121*xV^C2bE;T38UCjdGEo|gcUefytc&}9pFTp(E zsbWgdY|)YUBXJ%V&jwJ}us0DB2n4F7VmE za~d{vMcJr?^0fCy^}wglj)q#pVULmzJtPsbF0g@tTCRpOSWLj1U;?{c0-bYZq({_9 zy*&}}!MY`*bs_o3@<+xUvr_!QUgX*e2W3_n!T!6`Sv$E~AhWb|w@Z4mH0?pK_b1m{ zn*q12B85bLIhQ@l9@dxH3}UmHBjsl1x?+n~qt8kjmv(O~*|%BSe!ykI4cX`y-+gcl zE-fj^3BFe1^kpSII12=ZN2~KeBJ!n)$9R)9?Ibmc>sc7yw6B4|LjnFgZ^ZEZKXtjx zs+sI`4(r)|XJiFEGc~2FC|rf3eb%O7yhI2t4iwo86CqYqk?%I)84{|G_uaQ<-?+K! zl(>pTp;!M-+GLqVilEQw=nI>&AR4oJlF`Z7%#$aSLdJAQ-%<4$j9sXlXoRvu_U_{MntnHpPMk;SusnHy#3`5*p{>DT|nEf6T4-n z*^|kEC(qs$t-V}o%2*e2^>B9bZQI#vR^v5@w!*{r*#ak*)L~Ez7Lq1btqE#OX@v01>NvKx&B^jGPB^4ATs2f$%7TU( zD+DyNhB)Gmdd<3Mak9y)?fm+ErLMJBkM?IWZ_m(>Bh@B-D;-*k!9ML)q}RQqU5{$G z!eNeIh2tHk;6u{fisfh)gcR)fD((i7?&K-8n4-mkh|;sj3h*0-9(cI&9NqS^3~{sc zdaG+f^-Ob~!^d6lWq7@;VtarnDl0ri2T6O{pr(xsgcH2ys@0?_44f*6VQYrC**v)C zz{>`N8LDN9!xyxYSks3j=}A$gE33`10hnY)vJ!DqrgxwWs!D7s*%jDJOmVFJoV2Nv zZxq@ct90wuChcgP;d7`DVHEeP6U(+RZqtEl&XxI9irMW{>2DSYY4c1w^bmjAJUzL@ z5RigqoLd?Qk$o~Zb3K#F3bBm`)+kVB3f6H8us8XU7zFDUj1{+xz_2lId(Cg>m?oIL z@ylrQNLpr05%d1IS6K-V3PYL#S%~Qm@mW#7&j7qcdy^>A;~DoC9aBh|72kkMdZBBn zhJI9<^0(5P&aFMD+QHX@&*mwVML7NmnFEr@BmSxww`SRZS4!CJv8Y~W4(18I@abiH zXtIO+Z84_f9V+M&OpyeJ){`&S{XGW8pgR#!(jG(7_#an3w1nc`!1wHz)4v8T@%zq$ohG&2%Uif*C6B__3)X|=V zHDn4@c|4JWy`-V%;onI*z3|!D}beC0q!w2FrYo#OZU7Qn+&9vxlp3Ly4ZXqB+YZUsLy!EC#V+hBu+#E=V2TE=?lT5oBJk*lq4wKKdN6lVPT; zKxl^6oP?m=+EreKP@xIuAkQr27VnWOar|P5J!TArbbj17gnug?X3UY<=Lm)q*V1;W z1fIGGRQ_{nywcEHnDB~KO8=%8r&{G5aR3XOo&%K?^h8F72lU7hB~URNE%6ys>Q@6b zMlFv>9>It-O~H%LoRiif(!XeQ|njK?yIq2lRx#`)m1u#=l4=Z`*rO;6wB#qodJAYDGalU=A#rL>SOvS zJ?N;CE+9Uue_y|+t%{{9YYoJ_;(Dk}IqI-`dIsp)MXL)^ra%p-fu$;3%Nio0L*pPp zyErfkz20+==Gp591W_d~q*hsK+AHo_zCHCO3Eekk0bIrxL?Laf6vbAC!s;jY|8Y$j z#9WNdao)9>)yD>W!@}kx_O&f>hI^qT^T1>R+gwS~R1Zu&{VBes=iY#5+&BMhU8D

a#dPr9Rxf?K1vr!5qMOK3bsOe^mR> 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/flow_diagram_cle.png b/releases/1.32.2/_images/flow_diagram_cle.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e5676719f703cb56d9d67495b140cad2f08ea6 GIT binary patch literal 26072 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/greedy_1.png b/releases/1.32.2/_images/greedy_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5afd97567c972d9afff4d5ef03a56a0c94b44f GIT binary patch literal 25113 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 QKKuieSCgxd`S|7k0A@ac{r~^~ literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/greedy_2.png b/releases/1.32.2/_images/greedy_2.png new file mode 100644 index 0000000000000000000000000000000000000000..937d4b08146ee4ab39123a61fd2ab790dff19bf1 GIT binary patch literal 17884 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/greedy_4.jpg b/releases/1.32.2/_images/greedy_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..653fc39f2c5e60466a9d1b9648d978e68bb931b6 GIT binary patch literal 50524 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%0Da{}%!xE^}z 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

Vb% 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 WOj2#5D*u zhvBrZq4zoaan?EI)kE7>v1-L~v#=buEj3Wur5_X5 zf=`dKSLRtY?s4hG*Rz-H)P7Z>{OU*zbp3e-Tp8>CzlHvfH0QtS*n+<5rLHG7$~lQW zjX_F=S#SpK8V-!6O3QxXRm{ldEt?9BSYz$&M(qCQRb6uug5VX-JBv|-q!V>XJcha} zFtx}$wQiK(IMBXJ8hzdkEUaE}foOQvF5+fNk0tk`>xz2|a89y(FyVT&2h5Z67v9%nENyFS48Kh0T1ktQL|w_%JOe)8E(;gH4!yAGUm&9ZB~pmD_t9 zZS33afp1cTQN*q^Bezzall-G^Oq7^?7jIN{oeI)$BIFVxwTvwpZs~gX#%8{p^5GlmW9Gl!OMX) zK_Xt>fn$lK<2(ao_RQWcoSTy$e#e8KW;r~{9LRF3l9l8y+|AiYG&tg`CbxY6r#|7n z0PQKBytC8?B(wSeP5IJ5&pc81R(+$(Fx71Q50Kj>V&+~g z_=KAK?q^& z!KNP1s#L0E=&m4}4o3{CYMxlSa4JHQqqCOI3YSEhr0+kIQ?ZgbH_nyX5B zMQrBn-vJkuPr4G1-}eyv=9j1$qS^(SYfU_P)!b2gMC8t%vU?RUd@OdE(zB+EAy0aYJ8SF!Oj)Ijov#+ zew!^$7lwZ{Fhv$|h6ddO50I9)r_qn(j<|}zGMW)JF<1xpl&9<|m_f&^^VE*-3f7yL zQUTUXw}cm1%R52S>~%aYkv1IXwuAhifP@1j<3{zh;}7X96fWtW2W;8@6PN41+xV4( UhsO+boAH2<|LF*7z>m-W0e~bxEdT%j literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/greedy_5.jpg b/releases/1.32.2/_images/greedy_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39b02ebe6c0f3e47c47f8cfde8fda73f30a75dd6 GIT binary patch literal 31976 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 I8kQIS9~9VPTL1t6 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/keras_per_layer_mse_loss.PNG b/releases/1.32.2/_images/keras_per_layer_mse_loss.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3b8cfde4f6ab9f57e33dddd97dfd503629cc7556 GIT binary patch literal 103129 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/keras_per_layer_quant_enabled.PNG b/releases/1.32.2/_images/keras_per_layer_quant_enabled.PNG new file mode 100644 index 0000000000000000000000000000000000000000..896279a60dc83e45c424ae98b370aee6f6d27476 GIT binary patch literal 53609 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 F{vEQ6eH8!z literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/keras_post_quant_layer.png b/releases/1.32.2/_images/keras_post_quant_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2dba9c658d3df3e4ca330e0ae6bb19a479db27 GIT binary patch literal 9544 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 MZ^58y*$*NA2kwB3{r~^~ literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/keras_pre_quant_layer.png b/releases/1.32.2/_images/keras_pre_quant_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe929c501ec1446e18e27b495b9f477df4612a8 GIT binary patch literal 7062 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/keras_weights_pdf.PNG b/releases/1.32.2/_images/keras_weights_pdf.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6b6dd360b73564f3f4994707e7412f87f1072131 GIT binary patch literal 19691 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 V&hOLO#`y1GvNFGAhBLXB{C_skKt=!n literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/mapping_between_onnx_tensor_names_and_encodings.png b/releases/1.32.2/_images/mapping_between_onnx_tensor_names_and_encodings.png new file mode 100644 index 0000000000000000000000000000000000000000..6771595d4e3c3393f3b0cfcdb110d7b6d442a90d GIT binary patch literal 110292 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/pytorch_model_prep_and_validate.PNG b/releases/1.32.2/_images/pytorch_model_prep_and_validate.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bec69113b3a3610501e551e59e9b3e7a53490122 GIT binary patch literal 24145 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/quant_2.png b/releases/1.32.2/_images/quant_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c81db4fde911ea9a3a0b76826f88e5c66a06a72 GIT binary patch literal 301491 zcma&OcU03`*DVZ)5(FfnBP}!q=^!AzNEHFGK_cPbDnpM?|%324`XEPB)`4)+H1`@*W8JDq^C)B{pNKdA|fhnEw#r) zMAtNkh)BEv*YK~ja&4^=5rK)c)l{DP5O2@s0rZ{Rx=~Nt_@tGcfUFmay_6| zuyGn=bp8S5mHx55(EpR;s^#QCz)a!BFW(})(J$C@k&lK&qYn&7LY2Wl0O|kpAA}6> z7Tqe@$$RbpIrM*jS`r9g&2vrlUwt^Bn1xi8$ynN)jq&EccozH+PIx=hzZ)6q8LkZA z-uP6sqd4St#GZA6~6m#!U}-j_ZYGNzmbEq zB;O1Lbaiz@3dz6|YuwgvF=xhuAFOL|6z@t#*P&o!ro zX*sV=EhEc7&&fJZC!;jmXbg!2y`|nsQkSqY&1*JfFLq87(EZ znY%cu9(iYEkpb^ed8d(|ykYvH)$I|Q_K=ihhD-Fis&}v)C>yu0(yAUD4#krt4-x4C|jiicI!^Jy_+-J zCaCu1@rzKF3i|DOXwnO4ue$p8`EOAM)*KA$j9i@VWFJj9W*@+A%X2E=h7$Eed|D}n zsidbxlW=6_J=INz-wrOY&B24C8iBnbMB?^U#t~eu_(!)a9$%%m2K3m$99NuzckQ>Ni zs^w?6|H386^2^f{qc2Zyj$fVi=oMP4+bD@Uc>z+3kgq>k&8%b`=ZZ==K#%1@2V`!~ zydKfL;!=qF;W8yPC>v#*QG3?!7PQ}T)d2-x{mmEJ;-`$?fWyIF_xQi!zC|1yau39? zz$@abExYx7WH?IcY~j0oZ>qDs>;tv;QGuxuI{_HEk)89|9ic1Y`M$BEw*=|eG!fbUk9#es)~lgZ*ICq=ANVABG#AYuXfF3eg}>*J7y*O zT#vjb{%bq#rzUCWdh~bh_n?20Y7uLw+{~KZ7ZVpH6Zt>MiG4=uKzgj3lKT<@^@xs1PH>E#q@<i8_2Mqq;gvpt#pIqn6nm`pBa(^9-^#1N`k1uL=_IrtyWPhCk zr)$J^Q|I`zlJyAMe14>ZZNfH=&}JXEzuxO$EOaVul)9Xu07+05)uefsHfhL>h(^;*uv7qrb_S7uLw-3sb<+0PyN>T9#E*l?( z0IJsa44;S{k$VVuQUiBx-MVE+Yv=Uo8!iC+MSWoQfX zItv%=q{_h=4-jgM7EqU4Yz!uyZtlK=P*zK>pV@LPa%JDVTwhAV2e~MKv~Q(-%N28} zk_Cl$QZ8lu+_$ej@rd*^Zyb|@H^H`Ew&fa4FCHuB5Y7fkj1Toc)rOZ7+&*N>aXNnB zc6sEM5nwy&hpwNM^tTVV*w04IO}r|8n!LF`l6~>|Ms^i;)?efcbMa*iNB01k;%;bd z3E|+7U;7!j<3A^u1Yi6_Qr`12fQjV`Z|F^>8~AU@tZqKvl5vhzto`#-V8ndeBkgte>GW-_VmUAa$3IW2 z3@#JJ7gs^JegMlq@ovr)@(SZ+9(^sPj3T>3_N4S;y;PjpG8$lRC{xzv^I&&Z`HsS> zSfa5Ah?DjB<9`ZjwL}SXHsTwN$R-yjMSrvV&*BGc-oaI)(_2b~Q z`SNtF;EmqTu_~Px;j-o%)=_L;QLMazpFij@s~gzyquH7X&|)+$M5cF|7fmkS$l*r4 zP!o;pRY)wg_(g{HNbe=jnL`{D+_q0t_f1WZ+pZCO-CMsb$F4AD9mvM}KkBZPH37mg zWgkoZ^Rk~Zk^7Nc^S+$+=dY;1ZD>6W(}UN-!gX1!y~g;|n<`v0AC~nxUAhb0zysi* zN!L-F&X86<2Yk^F`txS3lf{kF=B13B>;OG}?i5@hcNvW?5-)xy($JU>Px2LA2{muDjC0KgZ|c914d%s@w_5j$=$YSoOD(fsvLg$0(7O&&6wCtmI;U0ZE+@0Uc| z#X05aIC8>kW{XPd?nFs3!vG`3!Dnp$*`;Ox9l}-qIB9*gobZ_54NGimrI)zUk+s5X zgvCJ~>%%--L-{hz26mBxo_U%XDh zf1%?*t`>1)N|%Pr6BuQ#4eBig+RYXxujO`&`iJ$6n!j z=NIofO4F!_b1U`kEx-=G8a3Ww^WQ9ALsE!5#0Qz_QOg;=vN!k24JllVcPUCK?D(R3 zon|jjgD*us_^xKiG>=tCO6mO{SoNQ^Zn>ihPAM(T8;Je%HHhkeV#S>1)c}sK@k!o3txNOZj@3M1WP+D`we;e<&CIs8beR$U=^1Xj;bvC#ZgjVoY=t~AxiXy z9li-_87#yImsMcuN%f4EDGtAd?=SY1E+wKkQ+DeZ-JP~2;GKoujT`18S2&Ja9)7Ja zIa#e5dhYTa`QAa7GkW(JcUT(y;p&aB?ph2Y6LGeDyHGb%s-NPm`vz7%0&upTlns+E zEPMGsqyR`F07kv#w|Q8z`d7SKWdN1yz@EM_bPN83f_G3=8YmQ1fAgsX#FJu*7dDoo z4sx**+cp8P?}MW8#iu#@%`BdMe9P#&QFNwqxIOtfs>W--Um9aZ9A^$9RzGIJChRSH z>j<^C@jBJ;i=xs`&-p>2n;_~Qmp#ebz|(C&cKPdw?HcPiE2gw{i;-LavofY zMBfKVJDfRpwwmQ1{RkVQAHbD3+9kg#HgRQh(y7$^fFwGIl+M@w;FOTLoeO~H&3v!j z|C$LtV2ce1dzsJ1l18X4|Jh~ubrO{C092fqyYDTMCJ3c~?Q=gP8`9wUv}>$DNe zuJ^Zi7u(jf3` z7PCC8v-eebyKGToIm>4;My3-ds!B>O=P~1n=50R;SovC1@^b+Rd_czb`jIQ62!jip z2Jo6|P?zsk7ZX~wZO@`+uagD(J8QsiaiN;T>Th7 zd9+1R)wYs8-H%9m*GRYUD?$EGx8T{{L+&4E8_gF^1M0&%3hvJTosx>^@hQpB38h~D zx2p3D)&j)?!z?E?v)2Wsq+P`pF}&xg1U5E-WO0XqZ)#LPkrWkL-N`5GntTu7I`=r? zyC%t^Q*NnTX9saQXRa<_<)_fnZVD@B`dJF6rF9L=ooRG?ABAuYxLFaOiB`?1{)hk+ zmS`$+M6OnC8@6DIziys(rtNbFxg8l+6_}DF?BTVl_mwM&j(;J0_ zh(7UnZRXL#TRVaD*=)YNIGHo%z1uoLS;I! zCHjz?A_ebA_XW%INlDJR=4Wdz&v&v3(Bb$Ka1y8PaWMzdz*C*m6<{!_?g=A+i>CB6 zi??xFT|GH7{C47;w%0iU|F01ek?>x@J=dy+IYO~SYtP5*N%}Q9JVXTi=~?R#339hE znmza={js`n%f;6M{G4wVi&qdfjgRs<&OevN&AaqatVDAsbT4Ig<;&kv2lOqP1wKo$M<{xtdJoKN&8h*05xb2 z2jT>1rIs0)xvTq~Epg0^@N)8A&Qo82Y16xVtm#v0Xi8{30PIkDp08)O)FHH8z%Zam zO5Z*>L&W;j?6AWzR5_H0!d0!|mC5DB&Lu+o0g2h$R<8LAJKmk3^L3-<_dfY--qY^d zHckjjB-0E=5j){I9L9r>-JK7Jqwj_GdunX*i+xvc&Q)~K{c!e!oK1c(I-2#-K0Vsp z>@=XO9TTqJ0`Xhs=E&HO+T|Ltgnql-xoF|P_0C7^@QssB^Y)J^*OQg&#ZGF;1VHWE z|Kq~gn{oXTxwL$r1NVp~%%jB1E3b`WJJr;+2Swaw)+L8x4i-rWc@>I#|7g`W-rMc% zUun?l8y67SZL&2{Q}Xvq86f3Yu>LBy9-c9G@sisZL%3-p0IJ8kXW$e;jl3Gxy$iRR zg~)@!D8;)`OE*_}E9f*QyOYH&L1;E#SduCaUBsbKY4V7^k^-AYH|GoNjJHUW$&hzo z`1AWE>c$EHpaxzIa^p3e=7dug&cOuUz;JMhfo|j~A%#8!ymx|)sxH#V$x(pRAT7ws zO?-}bP)qp_IBei@*MB>J8tY7>NwJ+VFU_bNX##;J*Wc9Nk2Rwba14?li?toT6* zm#_4**0I=SOjX1-kdvC)*LOhibo0P5_{ec0rv=)&`BcPh!98jrIc6o2#Pie4Hg8M998+4#4Y!&(3TwF zasQ2=N0J%}|A2%tS5T6hZPOqmS`|T`Qm?odquROv%N$ASAf(?o)3S-;^DoDz|t?$QhAOR%lDIETC4h@`n$*k%TR?7mn=B`))<+IqW0;Fxv7q3347r_Yvs_RxVQ?*u=wZLkcHm;s zXO@__oIa5<*D?$h;NI z_z_(8F98O>_-+Zww~(TJMoI8X?B&Irb7()!sWr7f5lDSu8J!f3UF_fPTs(*eDIYtYaetlg{TdRs%h9oQb0X^yMF6R zGL|<3He<4&dfS!nz7Ko48h(i$XKa|i>MQu#UkGX~{xiFEwrWrOPV|ArWbe{CH^+(A zt=rkVu-kpw504&OvYt)>z{$LZSUd{}< z(-N@x@G7aHKS2MHrWaNmODhMzvQak2DKIKC#gc*n4fWMw^B5bStAL}0I+?>`Ck_RV z+m1bc14IwN6`;j<-n{Y?I3F?}U;9P+xyJD_&4Iiyyr{OlB3JsZ-XJ5%_KJb!n^=nd z>EPC@jCQS9UzESaK%pH%j3Mfo#*n~pC5)?!j=S78Q9;Uorp=lu@XLUn{;{<++u=2m z{180T&L5;0iu^mtP=V(crf>P>7JR^C^83RxJ3-h@$wjxZU;2UTPiV!rySWpy-n>?8 zACHFSI~v!qvM|6n9>4g(*uCkhy2=`Kys#fBJxM@ezL*bbOV}c}By}HRB%sL4bE;iX zjR`!$T0}_tutX#Jp#)J?@X0)xQhL+*mYZYIv#tRn z7~pB2aq&V#vsGj1K*u)fWZf(Q1p=3Wf#rRk=N+DY=pe2#6vyFbP5WGL#hsRw=Wba` z34q^)X^orqG6w!CH-CNzZ(ju+cHzZ<+Dji7nv27HnQ^8=(~XR|lZSiWDqfk*NlX4a zjoueo-pS=ikJ=}Kg4>1E!N+ZD>9z?y&|@~!o7wQ2BsksX`oj3DPH+s2<7}SH_r_gn zKmK;XIsa>7-neh>o%!uz=YY%n$SxDN#2{gu|64Tg`8+fFCXS#?mwrJM>C3JaoCPQr z|Db&n)0}VE*NRYQ>Zwtp#&d4gA83Vpzik417&sU@!(H8e;bqgSc*Kz!W^wjkN{<)k zeCu?iU%9H5PnXQ6pFx91!69(mSU#y&hwJFv@_f{CYck!NUE+7MIazNI zvfl>H?F?9a-n5iNTC!t#v0~{V9HwGo34;5e00v$y#AJ3UUs(j(Z!liy+<0riw~LRw z**ENX?umJ2Kx5Us6S&j6%${2?5^krMrMV!>;B>`0{MiL>npw&lb1YOyOWQW4h6dSf z6YY&vc+BKpJbihAMR6X$w&vL$!vwjLXsUcnIIqfeEeANdQ?%nBUKUeX#F{q zH$o-QqHnIa4MX7+#lxGx)MdS(#J5alnz(ysj13wQ_H?;cYgrk>k|r-~d}&$_Un7u> zlT+!&HQfmcT|34ld-q5A|QkCDmXvpa;@ zWeCB+ArV1~{NkIt##U9FDf5$&$`DqTij(VH#6z{|5d~^B1R)oCT&A+Bp`unk`Sy2e zh_V%=_&7dnkm+5XrElqY2^J@nL z9VzO$>H~o8h?B~o|K3fN5Uz=QK`LS%;m7*NoLD)E=hzVei@jL$WhE4E0p;G=2z`x4QqC5tHj=rCdY?t^{kPs#+|0qRY$umcDsr1FP?N}IYI#3;c8Or zH`VbQ%G_ZQBlS1`b7CT<#x~GH0?D^RMK#tf1NJ&(ifJl3I=ilg{03u5i`rJorakmX ziNju(lP2P2PlH<-%RG?J-5tl6`RJ8Os&MC&1ryc>fDJjepv9&0B z)z0Q*r|4kVT~J8cRUI#eW2x5S9g4>eGL!eBq2u2Pd}yFYBK|7Opj4ero)PkbyGWI3 zjlNZmeaC{ah=rVsGDi%fXv04zg8^8#=9!d$xMG$V1cEG+q>wqxX!Xa~f!+IYqqK8m zBswZNP<%O^Hiqj!uX}uZbG+E7nIl|$?n^|c8Z&2l8#K52oQuQS0K&M~{i5(g>c*=n6Cam=u9ezV7!4v3$~PUq)a^vN`!2!iPJ)5yDsdS7_MafiqN zDm=XD8g$XjWYa;KeEzmLST^ib$^gCkf31HEK)>Qrrx z*})6&vG@vERE5c#`3p$4+);12rI~({=O;$#^5g*SD9`O5KAs+Ds>igT5E2rw4b9GM z)JffVtZ+=r3+o$uR>=>DhPrIVsMA5Olqd7kE5KF zo4`+!ZUff!hDphV=qNd(uV&s`MFs-HAxEXR+*=$NdiY9Xb+=U6wfC)Y(VFsH6x=k{ z6rPpi$C;&w#|TcEVu6z6x>JH}HOV{$ZrGK^G;*xACPHf2jrV> z_9c0>#JGLs#c`44`5m{AB>v(bak_^dlG7R?l9L2Jr>@V>%#-3LMy#$L&Dn9yHYoxF z>lc!b(H2xNvQ=p)SJe2_-*nB6GLgo*EorDYJw6TT1jDow8iI0Xu5|8Y<=?-kvp-m# z(GMjPgrz8pdzwz`d{}m@ZjM_D3J)<;d?h`L;}?8H;YJ&%Vz=hadH}sR)+LDDtJM39 zfBIS5PjyR}H#qWGw4=)CCN=nYo$`~QV+TPyX+cvrn>VP4p~*qZC;R1zfr34fwk~_q zsz6(zftOiWO_2!B@T!}&FZ=xn93)<^c&0Ntz_DYT>F$>)9Xa$;d4q2{&@w9@KTXag?ddpr%G*q#(=YbS(t zH8cH7ml4ea_{{%UTV1n)3dY={>2Qd$XCfKa@RJdG3z5Ln-6|Q29h>jIfx#@lA?OeY6xDenA8V`THJwXTEA5#8`wqNuHZ>JoX z^m$X7$3Du2a}+O78uUetadV=57R8bl%AL$QeAejKs(j_$b+u-q+x4!JZa?4A6>e$&QO zq+I_F#Ids5FijQ&#>>zK_pM5*Ze$4mqN&hhdN7;1YMa+soA5mN;soP}0@?Yz9a3+Z z_8L?nTLHevKHqfQ&sv^%Sc6cdyOl2JsViyuwM*6l&^{)SI}Z75I>oHT2b0?0HnVkm zoeWQpJ_wNSybzMJ-k@ZKnv% zjKpKh@5Gfil*cCpwYTABymiIbil9EUd618sCUCM`X&_gF^7RGVv6ay2xlGR41yWj*1@rP2#WDr6TYUXDX5iZ#H03|B+6H{#(Nc0* zV|#bp@c`VC6q2KnF6zcr6~+IVS?9x24A^a!;ZARZ$FzIb%FYaJr>g;QYMaHdi*$hy z%#L*IEEc%r@~hNFVT`R|d&IeRUo-^9z9PZMdf)96RB#YGsxy5DRNlavP0+hg^z7PW z9$Y;SN*D5{!iOr9tzH4ryJp@Up7Io0l;9PyE^-p9@-U!H>sTT^3)d;0!25dXU|htzJvPg`98%aaMAwmk z#WoF{zUK@t)M<1VM&MCJrA@N5;^*`CUx8_6UbRvA(st1te%J|cWSHb}(&U=l{l-&k zQyKHh@A7mmo17CNeoj|Yi|DxC;PNtJTeZ$#eT|yfHm>D`V1_hY!g`43y|CJyWeX9* z(e-55d5?aO$9CpMNxiWD@oy2^{5MJ4KSpr@KO6@)gS}0SSfxz>>CMqlM#}*A8`cpJ z#r4nmDUw!@4jJ;0&UcbYgRPU}t`Y#zruaj?{0QZ8MIUK5dJQs4ja#>G zLv8!r#_TQF&IhzV7@7C!cRn)!^r~C?*u)=+Uy5;wrY?JNlaw6XwD?XaxK;3w+6!is zj|PrFSAV$9yuUyHZDk|g$+Q`u_UG_$3hTb|H_nLVRz6O8_~^Lc96P5JwKTuik{LqQ z<3VSa*dJW2dUcOj8@CG>)`PLb#iYYoM`#*AUQF> z&Zy?Q#riNx^=HrhCv;nqr6mPm$anj}o$W1)J@(fusg;VhNlZ3uvI{U;kBfxn^Qq>U zcinzWE(^?m@DihF95*b{kL~c zCY!Rr-iFkR1O3apaUKM0ysuC2Zsf*f6XXetq6K^wR+3|b_KBJM-+I5nM5Ohz*B6xQ$_pHXw9D4e9zQ>Q zh>!`jV;ZX@z1p+H`<=s{;^lHWRVtR?VKc5#Mz*~36x(4_op>ztB%UpuVlM1>ubQ+) zbpU+S-XuK$E2v$J6{w)!5bZK`oayGv)Me^69?@S*B^Cd1O23bLfi}6IN+C+MQ0G_N zcY|e@9~L_*2qd~A(S>*iX31*W01hCyePwAmFHZPDFkb0Q`&L!Yn@ZlNrKb8NuTfAb zKEfJR)Zt0F&j$J#w_v{GXT*>__Qb{w+jv5G4K|CsuPu1&ih)_+I_n%29cF@8-Wjdh zO?Nsh6g-pD&Cra@kw|TS+rynHfWWOMW z-g%dv8Qs(QPF^OC-h~d?`~KVWo$Sk#Y)9%RC>r_ACOpGg6`R~*tsR$HI>k$QS|`l! ztU=rr*2N;B?qJdDfV0(@AUYFTm%sX{__nHKVu-H5FoMZ_+&ao$pSb+MSb)nXnoEnW z030^A>I=DQE$sEfjA}-HmwVd2ICXJhYMFW0Dvxp zsuP+vZe=GcK1&J_EIO1fA7rv9X3`wi{N-YoUZmCBS>yx2>0q~>*stqo@CFoP#4p6#|lwdhG=Jd4v*Ys8x^p#72)&@W6= zjlV!$H>ip8!qGM#yBXVvZ23{boo{5Kb7KxInFcLl_nt=Qu0Fd)-?I~>X zeyIMvDN~oW-(DWt@|n9upf2-Vry0HAJJhs^x8CRnMY0}2-J7@Ib64?H*~(LqN@OK= zsrs*@fj7S80m=plvRS5dM@OgO=F42E01R=KJ(m+sN2Kv?)DB;Cr;60HgNe`0TE4oO zr{J8bs_6O|eg78oj_zqD2HtT|^suM^u%4@D>{Br|z)PYUm~2$^fmq zz-{b9Hl642f@~FN`HS4)YxaM9z0pB|ACHR!U|^LNioVXS=EOT zwqpj3MghR9KM1NQvuZ(w|C<)BP=9Il&%*oowMBmL9bzq*jc7+{D*j16sVT*~rfbw^}YTP6ALrH(@=Pq1U(4UWIIwx*D8#c_`7(n{%?j;5X;G*!J zCG)X<ci49*M2cS!8GrW_}K ziTFwwoyPOpaqciP>}qYe#?8Gfn&T9TE0;-=jegOr^Hg7BBgQt?QXm>)6_3gj zS6)5q#HcQ^JyzNC=aCAHCF(j2FHFhe(29yE-i_&qb?-Uts-e5-#A&S-*Z{zrE>Lz( z!Ar3D=f(Bauu~J=jvCKP?MXpqL2LTlItvQxzCaO77r_KFjUqVCQz@f>_Q+4^ao^fL z?9=oHIf+wOBg=9#Y3m%}?qi)WE88@Hup>G0rmu^6g7_qW4x0VS1eg8%(_Ej<6yA%FWc|+`8iGh1 zvje?;(5MglM{9;mrF${3+|9Hx3>F0NzT;&dpROozpc>Upj~b9=#Idw?F0wF>xTvVz z(K`Fckm+IlT~B_m{UHDhzh*oyV0OcXVo&kqRnA=f!z+0R%$3|&Wy6{^?i}NY{hOgD z9w4S}y8@2TR+(g}Y}~KHigC3TWnqd1+b7#QA5$nw($Gm}z&~4br1#(r40k4@vxXf4 zn+AO}khG8M4j)5)H|&|qO_ZL-p)&^crmEdgwiAsC^}h@AM98^m95*P!0HtDF6e8k0 z%_unkl2b{!`urkq>&rPT00b*=U#cINJ3i&t_kDmX48|4mpkts+mEBsL>97v|_MQnB z_Nw5vjx2|G(c9o1GBL))Nl&j4cH5q5ZMuDrIa+wqXcxYl?iL^Fx(G+@_D(CoS!R!ZRDbLh zX_haI*e^#QA(Zqodk-%Vt^#H31~(C6Un?5*Ipj8 z_ejZKBK$5VLMtc6S?vfA-{Q$a9$n1-v|Q}Fwj%C#e*M?s&g_qG`&%e1kC7!omE$Vy zK=%cL=j{_g>5pTZ9l;7BLBKL@QTXJo&d99!oWN*Mflyv*p%&+R&ZkMwrJ8YHfe-yi zY{_!KwzufA&kyWnEQ7e)z%2aN4ogh!_r>e;=VKew4hbbrTH_;p*&r#v0zO z=CR>~O!0p%jJmpHB(|MTd5suLx8X}FmP=WCd->g|%h9wHnwjnX+k3xr!o?R7KM(86 zH=gxB4pyY5IX8!ubJCc3P1v8zim^M+ZIIH+-18~SxF7#y`Qu(3oF}0;l7taT+82L{ zZrt`{-WeS{QmGy~2H&KOfpc2_nZEphU~5D?c`nKIp}ZArt*G+hUGu9nN~S)v)~-dY z@AN%<%V92~=Y{WMA7Rgw@y1__UBXHvos&fthhJI0j`-QmR#=d)+1^;}SkCBwuPwjl zw$EdLWL>KrkYIO@s9EdC41ewx01_*9YY*62y}P5sPnz{cPxgfoJ<^-mAKz};{{tPX#zxFNVZzq~3XSU~roQ5PeHZ9z@k zTr?sxX!#BT$t4dxT$8Iw^%E`m+cnMPP6`ZBPru6Wx%fWCPTat!DJyPYdY*h6iMW>g zB%mkPo;iQNTok#;bE;r_0fVa<-uOCxMzN$0R=z`72fn``1+OC;GF%viarxnW^O-`E zF5fM1!)XpSd7ra=+8?umDpRhWXf{|Gf1QIoslWV&=9rNMuq36+01eSD4tkTexYuK zzr77ySj~1V?#|xN!Yn^>SZxf7Ra{xI zyI58)8*CWWKi|t-;IcaNWfxBbn)F+*mR_DWUwShr_Q{YMb&A5I&bK7abvKO~XdS-g zHzfJQUnkRS;eF4<%Ip! z_JChh-0C0nKu8#tt#obF@PNXW89JBYh{!;RMSBZw8d0z9rsTzOvV2s_YX=xO9~< zxK>EjndiQ3UL)hnxl9H04&)pjWU63xXpJwR8z6ND+TR0|y;Vby+w)FyP&~IyCHm5w z6pAaGQ(b->HO(xqpVYP5PjIRC=Dt`hN>k3)1vC+io%)Vh?wxKk``escn*@?rBG{ju+$h-5BK*n=GdQ5U6}9ect<%2uy?{kX@JbAyz~z z53thxCu{HpD?Lhul(8UiA)?)fgk10Qqs!ZPzs+mB4zxO`GQf`-ysdQ7BTs#Q{G_q& z5Iq0RSx^8j`d!^$AzSppF`lkwGIbPJNj|&eTYaK>_VNzy40W-Is_@==`4XEm`4iZs z&>EM4PW7ESw-??S<;zD))rxHP0NxYmeI$Y2f74v@`-k4&Z@D7J=)4>kpFVvv&CEml zh%|lXX?qS?;20VyIMD*)c24aWGJjd#T2;&7SHS3Gn;DRrDAgY>SVBRr*I*?k(@j#} zc0*3k)apjXtjcJ|;@gk)WjB#dfREz!`bpm1*9!nNestH(KqB2N!L<86s-R22^Wt4z z#<5uo0R4g*P;K#hQD&7;-sfG!`<+ROq27CcOtHpq7r@GcD;c@jKnD@u9-WFof#R#7 z@a`9s-Hi9=*9*ZMK0uIUf0TR-&_|6X(8cw@+mW-gCYvsIj$px`tGH%Jy;lIpUc5(2 zw)b(DODt9MTNzwk?|rH7U0?uUqs$o9A^#kDO2WHzv{gsSBrg0yFTCTeQ(f%ICO!S>+GM} zrHC~go)zrNqrRdsWA#X%kfcBOO9n~`_+Dc_8?tg_9|3%)Ws3sAh?XmAzgGqh)Z=d} z*rOO-=zorw_1?)AZ6j)xnA~(Si&xmGwaE@V>Or^ZI9I)m6RzX)j~%C=oO<*r)Atqc ztI7fY+2yT+K1W3f76-haN2D7&SSIG)C@-au-PzDg)5w8gy@kJeK}kD^$SaVZMt0m(8(V!qtOKRpGR)<4cJ1RM~W_7$2d5QOiIF|-Jg9sJl-(`7S5Lp?eIDMF&@ov)h!rg(w_khFHhZF~RknPf@W*&4 z$o{ER34rz9hGv0ODIY98>uxj?54^k*k{-^*|3hruWOQvZCMGV%p$r)ku<1x_;8)E(lr@~m4zew#5c4LuE36HbvOUL)*9ab* zk}T;;kzdnZzYH{2q-uksWmZKG!OgzX{GE5KQ*zo!Mg#9X=*WsrUrx@S5gahSP79_0 zJ%2k{KkXv6vunZ4M;jaKTb}9FG6qS}B%Lq=jy1xcgjGRJtH(%;r>R`s`>a5sD0&pv zs$rPu!h}Q!iXykbM`Ks8ZKQpS=gKf@J2IT!01vM`^()X%n9dl~o#x%4;r}ZG0S(PCKd+{j3jKSyISy zgV?>8N1G%Q;)5-6q^DoqpY3hfv=`}3r?Xyy>`wH^9n%edc;w{T)zYv?gbyhT<#M1T4;((QSN$FLDytvLe|`U;a)m6G*B zosse2Uj0Cn$uwlQRu|k#bRwqJmjzR-|H})2d!fWyb-(86DZqPh-sz)tS85Kx*%fTge9A z0E&J7Kq_zhZuCd{YKM>ci(=L(S!|}Awx&u2ahc>>HVx-#--P@80vC`BsWMTox z*dgv(^b3tWgCZQsJKXwwI~p+T3mLmLT?)b&#l5qrx0sI@;|B{=-L^@h+OMRJ6sj3e zL?=0*i$tdgUV|9oD0z{wN&_LB?xo*RbwVKiB2~Y}<4Fa$O+z~R0P7JgdTthu`AN_? z{0Bu}i8f*Ue{2?BoCMjjd7;QPA3jaQ_bKTKOie(68U6PyShy&Olw^aNa}#71q>*$; zxKQM^w&N@t##A2t`3>vvHD+JiD?f3*bAi}?m@USw?!>g_>WTWV5uI{!AXg#yw*QHX zbl2n{IF*O=pRC5Qk5sROwPFY67;U>C$~bPt z@1{O%V>sN%PP>8zj$A>F34Ad=k4sqjGAF3%&JL?g3xgd)y!qw966~s1eJ2QrL zIF_g@)!tx%1{#@RRM8=iQWC?WV&}ZZ8V7e4>$gFoQGin9B9k?DGlh*RM<%MzRIBi| z!kTvNV=TM7j`4b<#^!LBT6>=2mUZKcAjvd3o}3*J@2dV%S1q}Vyk1``4LeKbq^kw* z-Iv%03>MF}-P2!W`(FRlt&Oy5=DB!aG4eTUsz&ri-zi?lSHBeb2-NWL;_A6R?8AT9 z;f9tbX$P=tjcINemF_3Y3`{?t1;?g~#EhtOngKXhp3$Ma;7{ba`4IbkZ(y`}&IY$z zPY3T)_ruNzZQ5+5vxMEvjP|pq#V6`B`Dd<*^Dpk3?Fz13n6C$j7H^D_?T%_}(1}GE zEzh0x&n-LRth3NJOWnww@*V6*5|MAx2QkLzfZ2`NPaMDI*`sb1CAA6E{kH_YstKue-`T<$tML$oO*rJh^2e@fuJ73aZ2 z>=B|&;*A-T7BHVzCra00vS!wQbU&SmEJ0w>nU#K7sRHez@{s!xD8xcl11t*}XO?S< zDwl7gZi+fCTv8|^74Xg8SCedqm~?i>u*Cyu9S8*YXZopq-}0ljg0H|VfY zwbs7?UssU!{FqSwd?IMm$=q3&Y;zgX;=#kWj7a3 zLX=mSyDN)N!4JS?420i{5IV3iyZ^ThVG%HX*AFC@WG9{*V*pnP&e5FlE>9fn?A z-fg2sEi1;!kHOT<4hH4~52~Szhk~!CH+LXvC*S(JYzVII-i20Ryp%@}TDN>i`5s+v z?y`vTb39R-pBQf&(O}a4bipNz%^8sB^K*v9uyvB#ko<_Q(K8CNZPze}2K#UoQN&4I zI?$gGoS6OscmiD7%M%5BA@#Q5;V&mM9F>5d8rNeG|AyRn>o8U;C2U?8=PRaKJ3d~i zMt>vhdA{O#D5b`y4eli}8J@Fb(k>ji`<5anQ0O%~nw&9LIohRHMUbj;PP5$goEsfc ze!Hjcq|XtTFsNfCiiiyocRa_N(cBTiNe11L`{7MD)!Z%V5Oe_9S^DB*O9Egox20sn zNPMc=U*fp*Y2pCf>WtnSkZ2p1G7|J2a>aO|Xs&>cw?z=)u-m~brz#EDF^N?ok|N(o zvKur{#WZ4li>hz#_$zpefkPiNT{b@zUKKtz!4?k?$0X@-)aQ(&Y! zq(Qp7TM-5ry1OKX?rv%6Zh?Eee#ifQ1@mO~cklCDYkk(IuNxP37eg+vxHX^ljyq4d zZZz^)|0;h>qwW=Kfpcem#$a~EInnUxDc1BV=_*^m%loqYs;T9>r`ei?n-rB{?9U2I z(z|lo28T>r`3K?pyCkI#iUXA2e2r0!FO$-DCKKl4J`zkk&C5LD?!1 zRFATZ-rDH(wRGEV>EW?PrtOsxJ~USS_t96a-!}Zed%s&)9H&Ku{Eb_m%GdMuub1YSS_#i^+Yya_dMUr}0TZ4JIeC_SQUfno?Pt{K% z5o1~GpooQp7fAqZ35pD~(1Y|hOmyHgSnWEocO2OXkL6MVgwQ0VW&EO{WDdd#WbHw$ z49zf4J|&Bw16w(AVO;aM3@KsX2A}@|+@3go^I<4mBWwpm&?*r9jJm?XjlSBUoVcI_ z<#0+#^6o`njXPWU&b~tkLF51-aD|n?(xcL~RPsNlIM1j5&|SnTg(P>LcWhr@{CI*c zN@>>pq1(e=^VDy-qsL+Bq)v`e{~0Gl@Jn6S`l^-Y!v{;}Z&bPoRh(ZPFHT)PW99r- z;EbFWL4XAp`}=N9@%u`>=KY*5hZy&TYF55F>e@$nzYFfRgyB4{D?K_`N$qug*1msx zYWgO^sqRs!eHkFF%%gvP=aMv?YkM=tmQuV*gT`rMdU~xt*8i2NQ7jsj zbT{*>P&>wB|L9c$-;8U5nH>>p-S@Xo6^KaE1% zC(2_a|LtYq1Ak?(RJ^6zBKiNLoTP~!mgMy%qUqRhD>-#6UbYdI4?ncLAcFS2dcPcg zqM@Cc<*P&Gx2G|~$n|~U#{1Et2>e`M^yo+$f6(?9o|9#}SvyX>Tq*30ZZrym7(6j6+B2(Vl~6FN24RNXS|_!J%*1C{aG0w~dTn9yDe+(O+SQYvhLk#UuxnEA@EPqQI#n{@_su`icOx9f7!`#{ zAm^)jf@}A&t;k*m=#uCA6}u%Dp*;Mz3~SM=po>nTDsRUld_5X}!@AUJ1u7XV1rHeO@} zyRbxisyh~G7bIrgWNJDz0-5=MkU514h9ik@BAuyBfTd40{g2T?CbX%;W11fXuI?(d zc^dS=npNpQzpNEs*g1v8c2tYCA(=L*`lXssU<=#2Bi|gf%(`4#6@&}cEQaWhdu0eD~T|hMw&yLpL|wM4qztsK(j(i1FS!6Z=Xui;=dpuuCB5T z0{h0sTF}l}W?8!wWoGd#msIdTmh8+;02TT+{I(En3Z>my<+&Q|(i9d*N-0Fk5iD1i zX;D;k)x*iNrhJ2BR|*jpPlGZ7Ag%eSrTD+Kc|KIgF@uqG0g&0{%;Wlgskf;nZ# zl=4_u>y0{V150IoYL@?UX|Y^EDhnisrKQp$izr)xv@r&ZZUCKe@Uc@Q<&OiqRODrW zy|b{FX;L*>`17Cwvq1ayB$ftXshUdhisMR}!@~pn!Ctn1rn{Yep^Gb9Dq2KQ^@o;B zh@K-o;|Bo%WZJG!pQYGF*5Hu&V8#ZpTiQIb>$^6l2`~n`2x-}*YUVP5(MfHs&0N`4 z>>%J8ltu6tCteaTZ$m{MLlfW3?FxzY5&O!_ZG{GekA219GrIWsWBvp?UmF6eZzC-;uvP-5&D%^GZ@L8BFYV%zwNx~r7yiPWN4G4|iu(!j{ghy*7y zNUklyC^U$qTj*vu)Uuvi>zp5%Acfv_iSBmam0_`x`Rg(RM->rwWs90ZZaGA%dtUCTJY=-g6ex5U zB1gpB1nf{()6f{>6*FR_EChg4vML}c993G1JUqLa6{=s%7`qC{A@!*JZGsd@)o-~MFU07WTarm%RodxAeK$; z3$Li1CixWL2FTMe+~bR-rq8U>gyRQu?1PtOgjDSE6kt#adiy01Xt}v12>`0lEKSp} z?+xSSGFAnvq-rjGQrF0`RxZjMj^ou^&U46p&}#j96gQjmp&07M%2$+23oiNqNv~BX z++ZDZ*C@rG@2bzUAkfPx=xAXo)-FrRs&KKvN`$gn+kx2aSAj~n8V&WPt!e$4qDcB< zygX|F5r^-JD~{QU$xV&Zw+5EeaVy0dpxQhfYTDo#ieh>{9eaBH$@{b#&8ky{*o#cw zsgfcBc*Xl@g@ctP1-D0m_3q5GLM#so1weofUrY;u4(426 zTGy2|l6fGz6p+**V8=MQv+sWcg&%Ezr1qMk>Q~JWN){IR^2PcZ zPXdSjy%0&79aO@*{t)am|G1NZHBw?K!v){87g^G1j{zaf_%|P3pU%2oeiK)g+xEw~ zs+Tds3!M#Qs(oZI@@K@Xj&R-mh^!!mX-X-*4p>xW+)vMw1fTJy!=FE#+Bl?dGQRx} z>UmEF330xLCVct_=S?|O=>+!JQLg-4qCJrY zbCB!!dr)R3#~j^!GA!nUoKKR1<5UFv^1~cUh>X0vTeVgotUYLXv>2sI<%v zu>)QM`C(!Xb?qD%Bt&K4M`h-QL!KqT_dA(64+>6$zEEw3(&Vo5DfU{xM?hKjoC%Ll zDQ_9_t#@VHQn_WBKPfsX>eisD5&ie@gy|A~V8KvZA1eHYGP(oaA4dvQu*)#T2R1>L zRLwH&I!+)&3zsqDSgf14NFQL1AU{-uB($y!nzJF0^AxVvZ)kLqA!2G6x;XR{vR^b* z0m(s?S;vlp3lgAG8hDtVpdR#NfzsAt+crvA^gWsux?; zw{JHRK>@G2_lH}ben;bs5A(LsGB`QPb0~x=)224$uLCr0yt9^D*~h4Ek8bMaU8R?6 z_hptrcWcuW9xWQn?E@6ny$+^q$NR<`XX|$M*v!Ai{wxyl3 zmYxB}FgixNz^u0UQTadzuzswG<}z~(*3@rpK&*w3PtdHvm?mjiVa>4+PaeM=k<#|k zQ*ly9nni?2szui3*Xb<9R3Nhtd;=6Ph zb646X9jGOYrRL|+Q@bI*sdt_Unx**YET4%L44dI9v-w*vMzAl&gK0Z;ql*DyO zy)+fdfb5kzyUaX`{;f5V=Rev0oD|X1bTPu%`v5G&%!Z&Y9{vwG(j{bNc~2};ElS5< z>#yOND7YT{V0T$lhd^pFAKMq!9_HcS(!KH4G`0lvYeU8P11Z5eCx3=0>U&^S_J#-& z^^XeCFLr{n*sy?7wfgBQ8|@E~e&Gpk=%Zua6Cjg~Hx7jjN{4{NtR7)9Nc{W(5l8C1 z*LYAWK0C)-#6Ty8f5=CMmVMF%HJ{}f7b5bsw83d6CFvhn*}8!DPlb+S=#N!(-6Z+I zzJjyA!!;udzgyE&wd`fgRqHk&_ z>BbrmO^%9NL-_gLT?Je;`GnR4nqgd?-Oxngd1gfu12e*j9o@ti@CM3fMG{x9I=#Ti z1$@Vi8A`E2#y#^gP{UBz4@`)Ces-#MZxu*$kr>ta#_^q$^46kVl-OAo1yNfB!B&n4 zyEbA!R6#`)N5=7|X?3Ce=>E4R`>Q&vM06{sJK1&BpYl?`V&x`>?WwN!H+yF+BBp|1F5Z+w}w@>+H$zPzDvu;Uf^wdQT^2rq0?}n?Lfl7 z!^QYe;euhR#j*el_E3hFCJyr%zX$U+!Ul@I6rd35J1M7=MQS`9W^Y>EysNSps>#!|GA1d*q=ih^F1HLS1v2kDCk_zpr;|M@QB@rK zrd-%Ik}!wA8}a@GVfWt^|FXHaS<0TW^9gnj+ZQijyDfw2LkuC>u9VuaF=+-GYu&Wg zSU6_DU%VXhNk5j%->#H587dG1j?HGgTr58f$)#W5Ak))`sFf=f$cCgyC!rLBe~DC$ zd?G3<0)W%%#r{X58i@^1DUKzIHcu3?@@c6hcY4~q(}l2 z)c2%Mc8TYXa+V`AvB=ndC90g`abq|`#Cp1@1IjT&i$>Rz4J`PpFn0^s}%h9FOvp4a7(hl^u*B;i>+XZ z<@qbAw++2-^AA_(9U1E0Atk~Kt&d~&*y31zrYHkzH)I}~8>8O1&(a>sGvu}C-Sb!u zEQWroge+mSeCZkNk%1(3VDM`W02>mgM`O-adW=zc`jcs%N_TE;G;RTmP~Kt<=BJu- zRqJT9_D@(h*$J=PJ+cklipJy{#Qf!&YUp1F!+}E%JT!q|<<=3%)a<%@TWvs!w3+js zRgp?tEI8In+AsdDSt5eW5!VnYg)ZaAZ~5CXe*3b>L1 z8erbJk|x)b^9(q!lR8)%LyRGW$hnX?W!95Ni=Pi@&jubYvMIG_${3nWkaVa`w4wKs zMK(AQj*u|-JJ=9fP&T+964JeFUV?N!G}E5}#KvYxA<%3(TXy@Y(THm}hMhU(hQ!0& zMk4UCMP$VEZ5*}XuL|w5q8bzwo>1mw9&?&-ELV)}usE(7XHolQ(ZnK#V)w9#VGN;` zt`J+EN`M~G7W~}!iW%C)?9d&cCAHM0K=a|XUbfFDSn%aP5!{3ri*p0N=3eX=HJ!dZ z@cx;-MjjRL%sL`CjZe`p09!}IQ>c;KkD)Hr z7j$u)NkT9;HIM2ta`D6a#M6HZ_>hE}g9fts&Z`E?4qw%FKI2eXpB~&i&NFk`f>Fyo zW|=%8B_h_%#xNsYxopcFv`J%`9s8!WwBA&z&wX0*NyI*g6jw>MG+B5(iX8U5sz#LX z5sQ~F_MPLx#M;@Q_7}2zqz^|2{u^)mSYCshFypbQr#(A5U}U6;?Lkoj^RG0Lh^g|5 z)YY%s5-%W(iDt4p#=w&l4b`DM`RFke(Irt16d`MIKF5nz{K`~n1k?V%K+g!oM4y2R zD|YXHLCRR~)w+?X0S~)=a*0hpYrkqac8}~BVkiq*Q@yEB4B=^nPu!bq z;Sq%-<`2Zn6bSfVIynJjHd)qu+y`rM!n4XM1D6=qLrwXW?h&liWrsld`eg(;Y9s~3 zPG?_HEgMpeI=)Z6;kpeVdox88a1e8-p2o-0r{=}EqjDL=O~b@peG zmEQV9lWa)2t)Qd(uJvx;CfJ5Kd>|s4%Fo-x@3-Ns~zgM_ZKJ(qIs(Pf-9Rq$l*N|eYvRn?+ls+?{HO` znyu0zt#ZJ8yx+2LEmtCFst8FJpyFmnIj-YF)KXaTeeyeQDVx**qFnB~h6!{HR2q9E zy^p%o?_2lj#r74|J)^vg1*-nonq_u%%@=>ivD6JE#H9&_VesgMF2Y6(S?z%8yXm z{L+6IcP9T1{)qSIXshp5B%?*NS;&^UJUO3mY)qP4XuyMXgveF6&r}ymW1sPryu_8H z4&$j{gp<-FlZ)*bKlc>I2@eO3C-%UejQv$hjn&$YVow0Wa1SyT1v32OVk_VKE$p+8 zrmHXeuYbR{s1bGsZTi~22;a`rdi#26uIx2+gqKZ-9@LH2BZ_y+`q2S#wEo>@%4#DB^jl&b# z4fiD*ydTQZ?3l|^tk_d#$iMP(i2&P-zo8jT*|3~~(;L4F5uB3DSiv$sWUWpqYpl@8I)Yn2sq>3uI;CHAB<}nnvTX#S6HgqO1Qkou zE0!C{E$b**7pbeQ6c1ZxZ&-TZEy&({oP07`sSB)A(i=}L`lJrltW2GOqF{=|y4`KG zXpnrj0@uWrcOP0u5%z`wAI+a{H50>w24rLxD}kk2UTt{BNIh1&eeAHKz0DD#Yp`uS zf@BZR60O~rRi1E8!MvYCe~uvTn6|1eC8PT3i9LKmzh;Xqv{AJbHtt9On^ zhcwot6&c*r`?&~%KRc?7&EM98o-~(RZ{~UV8pQark|A1ofQo6&(wIo{Wq=9=Cpc3x z+pdt^Cv_Sld)R(PD2z~@ara^ds@AsSHbkSZ8ely9s8vU;=qn<#bbl{1{=n5)ljTx- z#S$14{_aBQ=hXqPm{9UzduW#ZRM4L(ir`13F4$UaNXVI#Y@Llg zgO3jp>Wv)zevrE5d}ghH26OnNi?QEY!l-d2VdbaY#^TXFq##`pHho)*VoAQzI?Z}k zn15`Z4Pjn063^Z$)Un1HpZ_D!_``B;KLepNLzs}WOa}hxjx3rDwe@9d?UlTOTpzc< zegEM0_|^T&>T%#_qM!aF8ZZxkdm>I8>d=BMX$19oHFe6U*N6BF{}uk>F6q^y*MGc- zOvyRILG(fg|3>0nC`XNb-}?pYa@41biPygqOFU6n5rvXwb(1_Fuw={6@b9L4Lv`S2 z^o`0L6DN^v_9MArNyak;*`Smcp7cMAG893*x(o_}VaS^sk7@lKos3vnZ?H9by0CtE zqEe$cw(O>n0Tb}+TV(xCNpEP2qCJlf-Hp4b!?5{Ao1no?c1cy)mLW7dS|QiG$ZolgnL|f z!3|#EdB(h(dHV_60^q7;p24w3`9;U6tK6>ePjZ-faXyA~%gjX_BfIx_?bC4Hn;t%M z=MbIXb16^X*AWa#d)u<>=3%V3|54^8qSf3?8eX}I1CyB$>J zvnxFcE5VW?%Xx2-{B(x6VQNrkei{S6)^rg&jATFJx!lpfwdTKa>vmLCG<{nm$6`-E zI$C%DAy#BwE^sYQm?;qe7R(bUN6<>KU$80A`%`ayX-Mv*9X9}5lnNXP1qvm?JAYQ!^17!u-jZ>@=O#7ZhlgO0@35A0oBcRy_~s+=~9t$D9h%~T|dOwVTy<*@mBd$VZS zZi~3))*t<@`FZb1ko((^z`Zm{+FD)CB@BP-V_Zwz9}buMMN&;BhqtvtgsWBt@^SubG06*6Bzarn*+^P zDJ&w=dJVu_r<8tNGcwHh$a>S@zYGnUq_`xu!tvS1lt6w}WFt9aiW2)@KdCpA#W-jP z9y9mcR9QafF&BGF)2?h`Ph^Evo0{j*pBOUW%%;<;SEaaQ)YNts@AGCy>O`g^-l!1d zo7>wn8f{FLfQQG4%0b(6zJ5X;iave)-~O`*>1rd6`jsc>(b5dseMxl1k?h>UuWFVy z@Jyn5NC=a`9;p5B;bly?6K2@d>AXyR$k?iL*wC}98*IXsHoi5`z55PBV-JOOE>?RO zq@yFn<8Sur+M!0)Q$(o+K z00esWWDysqK54=H2ZLt_1rN(7dT%}&W6AbOts|(1g$K064qm`aodO*&0^XS7*iAuS z4iKZoG6n?LnhBBP%JhjS~-p8nVUIydxo)aS? z;uQD!Xt!mus{_|OWEdEO0vc%Z!e}v7rtTqAv-{{z6BxnVZ}cpNAq%7 zX3s>mQ%9(TM4hwuQBe4cD)wB~8+?&J69i#J4gxkZc;it~tXJD8f0k1qil$#^@)Bk$ ztq$x3{fn|Z(4^Ul-5y`TaCaON_-fxCXX@mGAA;m@3b0-C_Q9YyAqG^TKC&yLlou?M z0L_qwn^mqArQ$CAr&s(crJ;^UT2`%{C2ZAcZ}W+dSh}Y@p8~D;00?zYai0z!`dp)* z4PiQQ15Nc`kDG)9srOgUgX085J3XElUMJtpO~HjAt9RBml(jsBVU$Ct>Q%+oHkKW! zKo$3RZH%_rjJ=+?B?ohyyl`YGZ#y&4a}18Ljtq-h~Gr+-UpWQ_C^*YCjF(F1KjE> zS~E1*q`EglP!M#*RMdKHe6m*8m788|YAP2LHbobaDHaScJ$X)}j4#)+ z)lvZqAOX}9Gd0`V!kZ;pG6XYE%q23#z$J^f)~a_zVPPa*ig#pLpQ3GyPI+-LL)`A& z)o>g$ltkd?{~+JxSO|jxm{0$>=2uUhPp8@9HxM=Rpo}>e%Nn5?=9-Tte#%TA>ubzp za0q*lO{J-Gu0g;0xRZ3=bEJUr7Ujj5$7+%KKah<}y#BT8;7AFbSS6L+==s&m0i|dCcK2>Nr=)gr zQObn6C91E!a-^#OjS&6{-z>5@kZKPM!ZFRIqw>cyZ0yeqPxyb`cixxNzL4JH8{vCVY_kF$*(_ z@a-7}JL$+i5lT%y_&?5k-*c`ILv9-H87AEXvqSmg3A~DbmOCKEXn=0dVBFifMR_b9 zN9^{fn)=o%C%^i2!^?lQ06s6x@i(~-fkY!C9*dzwy}eVSAFn-ER@T!(E#!D)Jr!)f za5-j;j0zd6KgxI4h4Y1eI&Jw%ABt_ff#`|jp8`bjDzrUB3pv6yaL@hF5{JVhr4#nU^tneIe%Lu7Q-A9P%r%Wc3({PwFE zr|tWBOP97yYaU9txF9_;tHMlW<%R4SYZq^B+=X2m=GgcvilqeplTPNf-P5k*Q~!y! zA{8GyKz5UIAPC|!~c(ps3kj^pL4qdm!3&$7_hfM{hZ zR!o1%a&S-+DQYUVPhPod37MzS!_yB&+}q8X)Jr{X;A%8wv(F$>N_7F?rrIpqn`yM( z<=p||{m#X$&z??mF?=pJtzRX4<-C6zQ6})G^B0b7!&K1nBpZ>dV9)a(F)4J6>8vs` zRr-9fj$}%67y1}WJFfX-+@?PicT9{n)Bq3$=#iH@dt?zB#O^$Te zW-bO+oGg93rWrlQ%Pdy|pCpUaQb|S7Wb%f3;J%<|ylhyZdJr2t7{WX`+eVrYiwnkm zY-{Yf>*p}dvRHZqLv7S|UX*f1{~7(RBLd#pW^-m!RBo}Q``vziz4`1>GPGZwjm@!O z=&F(j!j6yFq1g|jq`t?3KI@`qjWoQCY?>X5cZb>dY7St`Vymim9?d^PCGKC3JKm+x z+v=UZYE~{odap-wWU%5(OeC+r;V<-*MbO~9r9)wQA5~5tP5-e!BtQud`^^s~CLyv< zNeZ91P+43$yw6$(`HVtbG4_=YtEG2eA3Ns0+GU+)p5~oq9^^fmd_P_4@Ca>!6@@&l z@B8J2zm?G1rh8X{wXvE(TCG4E=!8eI5IyWgu-%u}KMxCtN?qA(dM%IR$Mv+(#D=V* z<)H@9=G^_G8;W=&iSa)AtZ=ThhF6De-q&ya{z=D`o|n+ZzU;P`c(0&^ zt2-US{Oj7f^xvJczdKg}6lAy*j3@jLs!v{xBWK42YkR6eh@dbKc)HyljumdD9rJ#~ z{a}JK(*)7|#7REjMVbb89(kLzizki8;p>T$Y(Pyk0(O8GoN=B;Tg&U6cOzZz#${U5 zpMOa$<*?Ww;xDgEG5MdT1_T@3S67exThILb5hK_yb|m?(Zf zAi_C8NJHO@Qk&p>wyyAtoB7;2FZ-KQ{`Vg^TEn-a!|ai&Ma`R3oXy$rEzEWmU5>4C z4e&JgtQqO@iVa<$Ji&k>k}E59OKFJmzy$YB5<39?uN+mB zph75LRjd10xA??`m-VxF!l9Iu?OMCo^=JmUB0JrJ7d)FK_h8NYO()`M1XN&W*yeWE}hb~7u93Y8vwt7Lsv7;yK zPJbe|S2W@4z`E>@=eD+LyeQYY?j#Tl3A3-#!0=R>+cX+q^Px8mOAObTrLvGbu@X5j z4kf;0CGjG9S40XBJV!2Gb(I z8ctC(?_b&0Q+;!@6^^q4`0L3z?65`b<4)uR+l;Om-?c7e+7ZgW8C^38tp}Ek?kCWh zQ`Dyir3VY27PK1eE#fh&JN0Gw36aQ3aQ-sQxmayqMMq+?eUq1%-b#cbBtql?QzLfc z`k~J}uZ7h?J@FOucBB$3&+D?k0dd`l@N!ftTm6%r$ihc}0Mx7X>RRul{%XSEJ#&i< zy0PqZTV?o_Bw~Bgg23U|pPG627C&-}GB4{d2F?vxYJQaXAf+ViK%4Rx;`xaBqP7*B z70gqMFFcFtigjWGfjXUrj7evRhaa^hoTU~FzX4rQ#ooveq$80~DB<;00*XHw7iATJ z-pFc0Ex$VW>W|E5=;!6lFCXU=E$Mp23PkR_%?qlA;GjN`L*ex9=S4zUJ5LppEHiPs ziXS}Hr7cSgBp&qqwm{z}U!N(zPZqx%Z14hqo_P-z+@Qa1ER1llqI)Yx(Fv4~^|d3> z1wK-~MT$Y3YJEi+eP=L3i~sh|W$xU= z-eD3ZABrzODyKOrqjG=ZHj9$Eb^ekYL#5i=x^TZj@Q~Z?9_3bP`sl%8k0LvHoAyBb z+K=sl%9)z}WRkeO-GRg)V>*sojrARQbBvHqcsi-zBiVpXlf{In>e|i5B0KX%`;UE2BT!Ls)_^ugmP&s#fRS=ug6gn^1c3VczL|5Q1 z?k){ax4i3VB)fhK$!(a}Z4*!Yjd(zt;2|m)y@InfuppBpO-jb=cbjMnKEWI_Dtb9&5W^#Jku|8fSo!ccPu`kAHhs+c%gru zy>A07OsF=+b4TkNg{RyAL0P5D{Gs3F3d&@XS`^oNE3Goan;W7@B^W5j)Z2U+h5``2Ol(!=b$2IwofA)0gCl9ZT4;PoUn9w{BK}LfK z2OsG_pqcw=VQYg7Pn=XiCi85hb(B~#0kJ}*I!}sY>E6S6LnNqMqU#35& z!Q*cM5^zKf?cM5lPw&0+e)|6?q-2hgerrm#@nsM$h2*?|3AIcaZqTf)TFwfNN(RFT z85-N6ELFju77b5#^vs3kcjFyt#2QeC%*h&s=ov=rv(Sp{hW&@esfD&XC}W84g@$fA z0bME#R2IgDiXT$VsZg&TtIQ{6Orgnq^<<3p{^5iEpR;eTPfg1wdF!+&GFlSRUIdzL z_M;MTa=IlBm1%UQa0W=-J4};{%x*vQ>not!-cH7S0dFs%a%MXK)i@_RSgydbT%sX{ z;t?S=gA-2SWpcwq1Ag!>QJYq1mSHe*DU~cdcH!9OHP@&4CZ2iHy@5wq6IV%uK!|)k))&XbcDD^0Y_-4e)fk7Fb!$tX=-%?YfyhGRSixL**vYx#O?TVP zdhgWnq!WKZ_YeH-o}^Yx#)owM@-MQU(rGY=j*X6JoOEfOzHt8xp!#DdBnZ-hqx{Qz z!XUIO%-UC<<5`ttu)w6s?8FNCD1#mCu!L&iLDmMqQR|@lltkqh${1eE#@bLTJm2Cv zqOTVS&#fgqlrjO-V$(bXmTmOl@O@%=bl}4`WXE3so<9+YBVjmM9Yr{kY7t;!En_MV<$ZA1(T*Ip^aO66yOWp==LU zk_V8~$k4=`?YsMjdc};MXTiH!<5H`>sh^Z5@r>-}?v4O4oCeT(uJkFEZ~mxy`LPf{ z3;*2PJLHZM8 zBrwSe#-U4w(a2xq9DP<+t~W8iE&3AZ;x)#QCRJU-Mq(0805~{ao zYpk9%M)e8~R7Uc(Ni}XwvD>C-vMxI)upTvXf9e=7I+>PY_?m;>z5q|Sdr=sxYwe`6 zb%HVonNzMeVT*YD<~6J8fkcUk=G`K^Y4~r1(@QMH<;F+@C~t--p0LyF2CQ*e`%h1E zzu&}j{5PB{!o2Vp;?cxGBfEt^Jk^2l#>8*h+^ezS7X4w}M%E0+qeC3#AcqN8WT!n} zzbzmI?voh|5ufD6JaHN9FnZzX07Pp{H>-*k6Net&=811KHiyIW84$cah_5`uuDMi_ zz=FCggt0z1-|aG%(R0!nN1VOeQWm`8Q6K7a!~Xm-I(NJ)0NJL;P**ZVCvl~>7|Y3< z8}FJe#DHHqiRt=cO{K2IX%2dy@=^+U`t31Tn{h^J{dOK1dRgr(wMgD8={oQ(ON48(Co+*hErwU0C?h264Lyq7c4pLgmdznp%wJb2x_^9xm+z0azacw=e^!Zm^fYkC+O zA+{nLl4F}(#`@x*!m&UehJOC}N3%#Xkun$y!+R6$M1an=Gs(5V>JxO9?CIM_OHotx z(UL3FnR%|3?!Ehp0;jVfCni6Ks6sQXknGzPi^(rdPc5t8E!Po`-VH(iDXO>0{vV}? zUeRC1yA+$x9dTN803ZzMS_=?9+ZFC3^N(?VKAaJ{c-frSMNK4zr%t(M4{!Y|N7hCI8EF=pnqPwsHz|q z-ad4|k)RVN&L)b7gP2}7#4b{0$_9l){oo5iWEk({k0hr3JDiv{G2?lYJs8{8P& zYKvp{Zf-Pw))R;aOnbzf@V8HTuAMv&_X83R{T!Tj2L?L8r$)yoeo);xnfM>MK!ge3 z_rLDFAf#^vSL+B{kwou^H@u)cn1`@8elJlVt8HOR1oE;;Y&|}Sin%!uU?nIN8<(t^ zBr{;r!JSzFcZRG6pvj;fB+-g0D2129QB&N|!i+4)E2eW!y_ULpmmi4AsW4p2$ul=o zJaKr5n@kffxx#*OP5!t1N^#0iP(>v>X-N== zY}Vdh>c{Eq5aC++fw(biQ|liO4>G+ix*4t_#`Z(s(s3^)2ZQvciJW1+NlwmgJ<)#C zpT^TX8_6FfCQbg>3P#nt*{SxHFj{KEY&3fi)3i<1wTuRlhQF=Thb=2#Z_^B}177_l z$iIL7gePxtdivPFWy@(kAQJqXcI3}SzqjFH_X;KWcnSG{FPBG>O(+M=y1 zs-Et)3pgCPyr{l?hP7m)b^MX#sEu;<|EIZDA1Qx?+n4M5!JXUp9;InyNsuD1mo8Wr ztrM1M;r~n)m)I#o?`uHb^?d*Z3#k{*snDG2c>lJ|{^SD!ToRla9fBg-C-SbDCoHFc zm#bfx{-6G($~;mu;po82S$$}rU#fQv$#pc?Z<)|Jd%TVdr{4WrK&FGQ@*)VL#mw)2x5#e%aNHzEYW5St@sk%>PCq+t9$;25Ro)WjAvC2J zxY-xxu@HmdEoVDmB-ZFo*y96l;#dH5dMSH0yvBpm6tFNT#5K^47i&o}q4CA6s&Fg) zb`{>kwEoR4rQ6d#V(LmitlgY2`-$TEh2N1}qfmaP-Ha41_VB*;{frBNh`=FWrkJyp z+)Wor#=*nPg1Hg7IOlc<8FYOjUHKlPf&b8lv)vib>_ZzG^7`ht+!6wD5_Fqy?QzL~ zSD)-X3Y&l{o>nB6tb%t{Y;lAPM6(Eys#kd;5yG;2V}tMMQRwOF=|cXQ0%>JXr-J9h z@UXf%;U(9+JBdl4t2D`|;t#ypOT5FZ`$E<0J$#NgB&lI|dbK&Fm=jawqneOUehymC zFA5%yK}XjCRj+5>+mu}f#+Z#C3qKMu2RQu}Vj0$Nf&ItdSo}tvK9@xsgeS|$KCK>#vFS>R&Z zAN;Anv(QwKvFWzK#as6K!!>(WDx^j}ZZJJv zDOjC}eXbOmsXf7N%bjV>NjiuhpviQ*em+k8!&(P`JClSAKDyUaxE_IgZ%V|D)+F+@kK$!{T`NrRKKj|~sP9zW44Fj4t1b8qQns-Tjj0GW#ibDG?c`LY6 z1k6nVRv?hM8Yk4q>FXNpvz$jb@$FV58Q~CMIer)rMozxPyf<*}u}Z-m<8GzV4I{t@ zZOL`6C7B`YrwO+L`sID*S^>%aQM2s()K!zq=c#L*KGt$z5Yr+ik$k}Kn9#*6Z z7+aXTW)Mn|0huAjt^nd}^dZ&-3U1ZSbCTMiT8bR9$2R|y9qM45RNEQd5zEGfog1}hRI*AjS8y>g4__mY(}q{Wg%4cs zWMt4}&`fXlS@ojK`lkB@8FPn74m2=Wm%r)rH_nmxz84?~RRFMfmyBHV3U(Gn;tyZF z2F(n2BF9AR zhgZk9orOk&FUlB!y|RNq=lXU|W&A}w{=r&i<5~N59S%kDS^#;}Knf9YCeNCo)+R%? zahgNh(qj1z_r+uVf%|Rhk{;fOdbP@M$Ma7^@4r{h202yC@gFa?1_4cTOoY;*sS-u! zf0wMPGN)^p_iwe{RPv%>=t=lY)EfCmRujCfLJw<$jve2Pwvn4fRGjj6ZD7)W^~UK%L4JYR*|cgu zE>u=Ed}K#QzG~)-DvNcZ$O~ ziEz>27F9U3QO*Yu1sjl(+3b;=$CIZ^!wEHUe6Mfto-dj#$rkSO7IN@9@>Sk#m)yT_ z8QYz)Xz%s*GSE%K|3g@cs4SlU`{W2_CljqdJ?9CoP0}Fo0UI+5Ipn$nsrV1^Z^2Vq z$1WM^=4%}HOJc*%)oTyc`L}|phORIYHmns<5h5 zR(k>u3N6c{LX;?XZ0wxy;6GG9{3$YzH6r?i!!6#TxwZt*A1~f>u+>dF*0kI7@U@?= zgf=U2;$7B!pV;yB5a-xndU$}<`o0AD*PL4A6JL^oakra-Pj7=yE%@exTH|`H<9buz zWIxeXp>BtYOEOzEp9QW{GOL-zL#W|pkK1xyKW`JP@m|xH;TBdn0`R(6$@mcRFadz9 z(~)aoOym(KOoF?VBAU#@j|PTW^Y3Pzg@XR3t3xY`eu?EB>6Y)PHI&Ulw=dF+ zOjdPVLk0XYn|#mCN3tE13y{{rW!51FzS%oAHz#3G0>~(Fg{|iAmxJkjD0_F~iT9Ss zHO!7J^JYB~D0ikzfyx(cID)F^-?gQfEQ`Y~g~Y;Q)+sMBr@5pw;YCqrA8c=e&T={C z!X6#v{;x#*z3|(u!e1&6wgYtZ9B>*aiVz9(SG7A4x)zcz+`4SW$gi0E{tg= z>5)e?ZGjXWT~GK9MR1CD7FO}k+@e(S9~H*MW3<=(p|S&on*vSi8QQY|wh9D2F8PPQ z*Z7a`Md{_EOGpNZxdV2r9gYa!kDQ48?}WBZ;17G(HQlDf-*@&rzUPMjlPkX^ zsG#uxbIX-zV>gIzAks)~Mjjt|;YR;JzraRrC!vc`Nj+-l2}6rb^V_O(bwJhEY}{)52S@bYS!#A|OZ6#l`ua~16pNHC zedb6*Y}!XR0b*B?3Ag08f@UW!dcs$fP-gHuW*(r}io@e2CHv#%Lt4ScgR5}jWzcD0 zh$T6Iwr<7j?VFN@dUqqh=s&p+1EZMTh00dY7c7+uIezZ*4}$UBn>cfLhfBIl`KUr} zA4?JdLGbH&a7cOMU^`*Q17hJVQYrIaz=FEWzsnhvz>^TX0zfZ8ksCWV|HiLIe+q$b z+#A2*0;#7hp=($ag5Tsd3699mu<+Mm4Yuo)G`A8*DR7LtTy?Is+wB-zghL9jb=Q0- zkZ#0-wlHq+$lOl&5IDuiYH6Z)F7YDW*}*U zf~By-kEi)I=Cy&3^qsKy9flJ+D=XO;@(X1mfIg6&r@RVp{+vdqXHhfvDq|4-zNW0N zAY;YDYxjzD(gxpB2~ey>DD(r&lL5EZib|7*=bfeB-^DmvMpaqE4ey#Pz(tP&fs2c- za8UkbjsP(afOl|n$=f0~EQAXMzPbzV$doj(W(Y+ZA?IVN3ObR#r&LYEXZj}TMk{~{ zwK?w>Csepbvu88aMjZfY=x-z8B~0he_Ww=oKB2mudwtp#+t2+up`2?aR)xi_e(Nas z2IF~C?!y)&+R7OQo61c-+ zR?x7@thP3Avv(Cp;kJVuI&^h6x}~_8XXB^|&+t%F)=llec2NHLqeq;^mRH5EUyTMP zqLmrVgw>^v6=jx_V+P@E?5#KHi;-x^nx5jQa`$aBzgBe9G33yYV;bz)hA6Q)>r?wDv&P^*^u4n=AajTVIrpZ-qakO-hLx}vIR#0eM- zL8?B{>xA8d0$sRE3bgTvYzy-s1-(xxS9Iq$u&L_@5ls#YZpz0uePLC&b6E2HYBF~W zAr}lfUpnxaNNC5bU}YO2PoeD4Z&x8xo_Utys)okxIV_5_VR}!nJl578fDQx_aJ4{+ zLuxOnF*ZUlpvK07*HTVhDq+9a{Ql*pI_`aJbUjCpRdInKEqYEL666!S2WKc%@IKGYbgcM{DzS^LZn z7oT;72+HEItK~Tksgem2zkDa>xU-l_tw)Y2 zZ2f-hjGPJShHSleSc|NFf>E@_0}H$Fb9(N3cS(dj{ak1w1Kv(s3h?E{5eTY->eg62 zJ$MMHgm;)!>+c864^#ADZ3s*naS+u>i|%FF<-}c zf+#N-m5P>76l79Po6%KAFsGBZM>5dYB}6gUYL)@0;E`PdV>8kry3q7gD0i3h%kw1h zXt`S9eNafvYLzmv_+&h0Y*_?2?AwRqGj~&zQ#p2AA}1RUjSU8T5&pvTMP*V9P8=MG z@nUo=1dER5PFrN)h{YrgL15+ z3mfY=rxHGNu)ZrD%QbjQ+*U)V)s6AZLlM5DZoT&qhT5snc3?JlFZLC<^hU7nD5 z27a67CJ$G_ENv;0A<)}-IB`@E!+rM&Q=a}lv`io#p$4u(W-UUSz@z%30{q{dIj7w6 ziTyO$K6TV;q$GTH^>xcw!mKrnDv;irM8k?Ia`Exozh3wwU%Z~D zFR{f52{Hs=qy=ret1TtC$}j{B9xtL9Vgs}KkW}9smaqILwmrcNDdKo29rulS*Hy-@ znF#oCvdrxY7*17Vk{^*{&>8Po)!4lLbpE;5zCzq}mk&3?`C#N9HPbZg zfX`udYxXQ}0jcGX3Hd??C>UT+zV6(I!TjVudzvh~T9JMI&*S$&5xF;NdKN$m^gJjt z?tGvXmw=zvEe6d_y8cRxFS)`M?`5$z`uslfsg@4FfGQEQxg%T4J=zgsvtE`r1$w9ZJ+Wcg=xz5XY1l}8%9U&wkgeuGtWm#c!z+# zAK#eCpBZg);qwdN6PYEhOB|)LW^zxIy$_L z2&&e!by;Z7SZU@n{)vzoZ^%q4P4@1l*)6aDfAQV^HfCJMZq!@jfU>QQ-Hx}E@9XW( zW!Pf5rDQ9%5%+sJ!}yXnhBe>5<56azWDhbf(^D!hYv;9ZGH?twI;@!ut2vKG#NE8$ryA?-|CDBPQ= zx^SZ|{p5MQ&!}!6f-%cEHaL?i~~%jGV-hs z>Ph%lJLxdz>x`9^gub0`Rz3h}=F$4oYj>SBFqzBo77({m4S!OGLBfMohBZGhl-H|` zbyZFYt#6dC1QLf0>N@=W8Nr}3Vue+ARNT7+p4(7Fr| zTADLYB0pbhlvYmguy0_r_8B}8;ORo2IZxrQdS6hX>=1D(#%D=r_&vZTbHu!U?KhuA z%q`lU%4VLG-HKjuVGzdG2pOA2A7bDW-aazOXOh2~ku^mLwo<~td}3kp9}Xiu4nDyp zI=Dg(r0(!JpcCKRH^&Zu+@qw-fWJ4M|5-i81%hYx>;T>JYQ}bf7Ea(_gKc3w!$W)k z8?s)Ey@(Jr@i#O$;1Qhylr5o*n!pxBnI+i(CoOW{ z)Y1n8fTKC_miJt9coJZm9~_t9dHcM|a!I^fO#o<`?tWf<33iS1MhZ&yM!g(*c9KVh z7k9pn|2_SDblU=$_=LLU--`6>bl+#?{r-Ogqd3q&&HeNT05l_ruEf!)!W6wWNGMYsFC0RI>Qu$A-G*5dn<#OA?SLHhiUv6jhy>F@NyDIEGN-_u`S+ymzUUP zQVEn%C~hNWQuOPAiNUpbqb}EkQ88ovn%YPj8Q(_WO3EvpcJ25oc__=qZ2aMW0OH*O zeX5#cDd?lhxGs+_=bI(B7AEj^WDF{m1sPJG0RkL&6qauhB))M(eBi9@&DY(WW@5EW zv+A!CVfRck;W``kCJ(`0;PUhqQ;VV#T1{`5TRtv>8G(XRYQC6iM2N+p$9)A#n2jW- zvwP^Vkqqg2R48`uL4M%d9O}21dXASh@tMr>F~Bc z=jwS}eP+#S%4Q`^znfQaxbH+ZGxIMtQ8?z- zmZMq8{sp3&cl!8E@L&}5eytT?o@+1%T4(&s9ELrQT`Z1@hCqL0)RFIw#aiv<--dGP&@Zy0}z%)@{w^0$TASzJM9KAvW}l0dtM(Y6(Bw# zZ&6HT9;-Ka2d6OG=-oWTPz4~4+ z2Xw_>vnZBkQRt)IW*7y|w+ zk-;JUW{XXk$3)(qv($Crj`jA3tPS<>L_Ig3y83c+B{y6hM)G`EC_>#@GaDQ+J}|Y8 zVkQ2d+hzMM~m_DV3Kg z;Y41X`0;_8E-M$n-Q;yK#FF2+Q*hFyWj3fKu6Ia!eP7h*+U9Ev#9bRZpU5$GB81 z7y3k#Zukhj`t%rMW6#VE3)HuBH5L5)$y1@apXYl|`}?8CWu9P^3GWQRDpP(?r6q)@ z?53sL{Y9(_uQx^3VSN7Yas#K#CP;@WoeZla7|$}rL+)}w93aHu3&`KJ|7JyWa8&Wt zzNM%LDkgK`s2Y4QV#-30n>{jFZ1Gl`qmnS)eW1Wi5uUxGYG(5F#eOnm14a^zs>oE* zwsvMEu59;K>>ML}p@9avYiT70_RWkEK5%$AR4&J*iOXb4rt5#ka1?)Iiaz1^e_jA7 zS-){_0=U?#N5%dnVMoA9luY%3lSQgU+Nf5dl$e{kgeF8fwn+TI$-#_rMSPfIw3_2A z-M#-OkYxv~<;a3I<@b}{yvt3QBdcghlf)e-@}1cS(V9WAQm#w_DpvVcV6QcPpz{ez zz^&5%*Z4%>;ziW9X2We7lpFjlE$br(kw*ES_?M-rGUNbE0Ag0~{r$hvuS{^)amxw@ zW1&V4QpT5JzLlPhC~{@VxJblPV4aiPvn`xzByXw~>lmBNR$vPHx)Ieya`aJ$P~sK> zMc*o?s0gqy(YR8QFZ}Y`CO1 ze7#hAII%Q{euiEyd=gUJ(V~>yq+MF46AY_eG)?;W@lZ3^4hlzLLFEYy&x?x?2O%*{; z`yDU~Oz$P!%xfXco8A3z-sgqLT0(+oa{^m~oI;}Et!VH^J1oVPsb9~j4b5T2Z(+|% zCnd{BjyPzcW`Lj_-Qb->A9TYUNvvJAiQ!I|kl-P`J_4XaGVH~3CwD6V3XrKrzQRct z1oNOeicZ5x>A#t%Kwl(m!R(Sxzof!QU-pb>Z;K-!)I;|$s9{Z^MDP<_kL2X`8Dmw= zSZr_L;;jQ7fIu0^y8XG7d@_h`xNZZTyXbIr5*e>!S>^O;%3IA@vHDx?k}sX-xo#K~ zob+(TpZlF5@ORn-Tto_4r8a+@Ww!yGy9r_O+BHR27&Bn+&CWuk+1#hBvV&!5bCc@F zEGrK)Z@&};B_PIzOnnRVo~H_ z`u1}sUK|sRvhYW3Biaw6C6$c4TGad*kaULOJq@a_yg$;FoX zW&gPN=}^yp^_7-gt@ei3pt8Bx099Ti>Q$CzEuomB?r>wMu)?c!VN{Q9iX7g%jaI%S z>xvA4tfqF@JiF(UeS|;c7qQ+~ew))!TX{cqo(nzJC`=Bi?%3&B35rFGU(YkTb8&=` z>Xsy@9Ug(I;X<=!oSg7}OY|h&p3aJ`Y9x1xVbTUU_Ck|5Yh2vk{NHw>wdsg=AJO0f zT`8&)KlA3*Fvm(^%Erig23;coxI*VvHE}NVl^5ID+8Yj(53GtTQp|1&&PfZ~oJ0ep3VwO`i_tS(dZ_BF5(mTy&Cm@>6OX(-v;635vX6-0q|+z}_t1 z6tbo~m>w_PS$L(#SB!~+DZw2cjF1c-BwaX1p7n$FyKL^MKL1etZT{^$^&_pqWY`ns zsbBOp@J2$0FV*35gX-yUI|bAk$Mq@9jIf!N4PbUM{hTNkV=cb$PvhfQ{|vgkCu1c_ zj4Ph>*;>2ro?bJ{1GvzHT*06_)6n$;~`p zF`gsN51442dvGWR5lKJas1_o=vjqq>~qIR>hP~cRgS*o$_16N0@irZyZ6jMpJX0QmpuZc z!qLbffBSU_0|LoX=7a0)hmxU$m_{H=#*esUehxqQh*MdCUOvUjq&}fBNZ1j7XnQUP9BF}blvY{ zM?HnRakHY6k0q(W1r=yJ0+@$%S5h+Fw!?AeBJ?-XT_T_YbSfWf%G@H~xpsf=A2h%p7#>Oo^D^Iw#;B9PiU2@% zEAlpQv~M^=F{XpxnXDXB|I7z@0l$8e{~DVYE4+yS@SRBrmKA&HXMd7(KfYr!q4UzEVd=Kh%70hGny*=e2>j-3w7h7q zmN~|%%Mq>p-M*aIGFU)#SU@6V&Hk$?XA~g*%(zRX#UWne)PFkQ%6RSCIRDZXN_le| z!5~~{$q}StRr4o=gB~b8AQ@IIXHoyZ>nbVe$TFc1@OA0uZ{zy4p@_?_wGx~y+$6sU zlgH&nG7gVF*r#Vn!nPcTHZ|R*RdJLj4@F|o>@feQO4DbDH_jjHxyJXi z%TQkdT>;|AMDHhvK_@1P(WcLr|lH$6R%-scN?WkGFfQe^p< zsgskZu%aXD-qElv1r6R*0~rG*C8ZLG;WS5kjdCgTxWhSDK5CbOSprEVLMbBQGk!n< zLnT>~E^k(iJs;)D+8CFn_D*KH?Tj1|YOjqDDY+kP@`_j&hBKW z7;;QN;9HItsGmqqx=q_uPh6KnpxT%>eZ0MmAXJgFHmSlqT$usCx;mk`p`oI&Ox6DW zij+{_X7m*KDmmWS`AjYuOeteM7o-9 z*4oM_pUO4(S@wF_*m1o(Zy@?!hmS>TFICqcjgZlc7V~SN3Pz?^>jrPf?Rn>4D~|NE zfy1+%$NDasltZ}-O4SsjYtAlg{A>T7Z#;h!lo>I75;(&Iv{VvxjmJw~0kQ2Fq53k$ zV@V>2DJ=Y6m`7j{%V%^kvP;Ye()l`veZxAJiy}^2UlEM`AelmTF^_o4`NQGANgoxX zVvsIHhMwhvH<{!EheTA(r?nvhvC%bA=qbC2Z?jE9Fo`TMcWJMq>!d6$TY>5l7xB@| zL5bmw)Hssy)tZ$>Vum5L>2P({l!jIz$VD!&&#nXINEboAN}|$MIh+?x9*!K26bph! zE`fWaFvK^3rw0JBC>XTt{xG!9PGfz7y^AdJ7(SB;n}sTrkjBXAadbLUu&*&NDKy_e zq5f%sl6l}rXo+ZR!mvksNEx+SJM<}Th}gaCZwlf&03vu!2mC9Tnm-73>QfDlT*XX5 z#3?Q7-Qos`0Z0dQImk!1FbL%ezmrmK@pF25@=eR!MJ{7}1Df0JhTTKwAE9WWbbVr9v+d;#Wk z^0izG%Zla7dj8R`UPapMJ9a&fw) z&0@(ao@=}!Rd0-{$1i&)lDkczUf@c9zDo5b^?9W}pQcGMp3SNJ#|+Sq%cv9!OY&jO z<%EL>zhHq15tv&;^+UR~CZWI0@YaYU#fJ&CKlOvcrMudQagml#`tK>2bimU)lIbmf zICelx?XFQ}5f44E!kjRVddr~i#{%)69lbQ3Jul&D67sZjX@*30dtTLdDVzQ=6&W!U z{5&%tc5WH>)jE8e_R_M?-WS=9UZ?E$iqEI7cl?*|)-LuCl!uGi1z*WofiXxfhNN2YWq<>m??VU=RiRC)lVnyB9m3k^@rFe`I@v!H$}^R zGn#OOY~M2JuxL^oE9 z8j^$pjx}sY`wAU@JMO`h97_t&Fn6Nj2N0YS+SII4(4*`Tk>x}&gZ*sMSTpACwPgcx)nek#wlKuJEU+p&~Qjealx+E7rh7{gt89E$|n+_dFf)) zwoHlp0oS0U_0zRW=g}SG${S2&)g++0ohh&5d%RB9dpGFlx#E!0bI%=c@4MpLKDBy# z$Kn1Ad~R_Fq|!nC_@q_b&+|S%@%<5w@(=SoAYbbib3Ewf`?*m$N@QPH?waf_ng$E3 zOPwM9od*+mxO%EH;B+h=U`9Dzo#WCm3TrOqgFU0nYH`g117KdxQd^kbjnwZ$g&2^q zJ=HzjmDYYp{nSStnAr1ss{8pq-=YQ%ocJ_nvTGG++at2zw|m?)yLRH+^LX%2J>;DC zefU0^50A5v74u^qYJ0Rh?R@K+=-;!K5dgFm5Zxu7P=&}jnUn!7+$K{(5aVfl{)L3a zYG)Gk&PaEg05(-SX1(0g>j8CI<_jFi5;bYp6rL0$ACBD{U;ou3LuJiRRGrj`0J&wr zF-`{C52H`0H`sU+@6Fqtd?`C_v0V`oF*xRo;5;`thyaeik_l%hr*M7FY-MjoXQ+`?U7sHM4= z3duc;aQeu7h$Mvjpk4CIiIzdCf~obEi-gX<0!_Nf;YnUT&@-1X7^KezN+YAYmwiU{ z8s-Hc(0mg#d@qOhNOk(AejBn)gaPp|D8KNS%&7m!9|f`FIj8AMWYwbwCL);IU6=@7 zSS0e~Ol%_sB8g?pS)@*JebD*I<6AYS`};ZXVI|}N`FZ%jP`LqJR^|l49fhK;UgvD} z#p815lVmF=-)&&p{8(H$CksmB_hkQULRcWZ$|==B@M__dVJxwX3=2skt8%Zs!`w^R zw974_CXQHpYdlQhBhDzgB)pm=gtpstT`z`Hgzdlup3Ta-WagGoF2*9>fNU8#)qlSL)0iM((<%4o>2-0LyTO1qH{mjePz!Bi)E5i zaoMGDYDnOo2hY^81op?|f5p++`WyGD87q|3X4C9X{p?F{R$E1%1k$P^^auL49P9{a z)rRE7=+rR`qaZWb`<{>Q%$rvrwCufb7|EwFQ%tAt_s`2sEBU^! z9;WbgK*Mk9cW_tEsQ``vl5vtPj_}{i3JCKEHx#2tqUgO7dwjb48v3XOibY}F^You) z(irZ=7v93GrLxT7_1O_JkAhh7k2v=HEj^#5b$$Jld=U2WuQc(r?Z)TXJA*x%YVRfT zDPvS(B_MRP48NMgVHF}`N4i$dDY{)G_bepeIjFO0ozugAPtK;1l##@W)=>|k2#?D{ zO+S^)P|@W_6OLv_?fr@D>RCQ@e(@iF*Gf{EWqYi1_;oUW?ap=T@u#6HVZ3%;=OZq1 z3vfK!`=<+e?-X&+EOAyKYeO?Rxr_sQz_0NmKmD(Ox;K?5$#aS%*ii5?)GqK-D4awJ}_JswRY{igDP+PODP}Jau^-35UBJO z?fC5nOc=r%%yoY);~nf^)vft0)FiGY;c$dK;R0kmFE_J*f7CaNoD=d7M^MDvHOf-% z`PYlhEg^j!zm(H;Hj;W!f*12n$1dUDewTKa^bXcs$hYRUjDR42+KMf1npe#p=shBP zX5d|sJRkeUTx0nMWNrLy`xH!8hlPO>>I~i{`Xosw5xEw@(as2P1?!N>Vkmei#cl;{ zz-0o8(vd#V5F_E3Rl(H}1-@TW(Pp|XgBF9|Xu?)(#og{W6Nkmr2|N^&zuXgQe z))l@9X-RYh@!lsf=#Sj(!(~mKbeoyP6v0&EogbPVeA*)K(%B~LaS%FAmfU}Pp0joE zQH^$pT|5C9l>;Cn=zLJyq?j6s+>Kc%lf_Wo z9n2GkcAD!$p3%^t1Jv1eH8x*brTHE5&;0_+?w;e)9Q47Vgdi8^L+W7gvs2#RAL;9! zzT7GtJ;NOTjXJuzlSj9(^IQ1=3CTcETQ1&P*$vh<`;#l>x6#{#8&T~apn{%r@}Aix zIFO0_X8lt8zZ+v16{uYIdvdhzy{KDnPjZ2@27>GWvgjF5$?nwWGb>~HI$f5+W)R(( zRDWuWDB-$Xy|YSb%0!9AmlsJR{oKB}Hlsyf&xvx$uSJ;2Nf9@})Wk=0L}8%T15Jp& zPw&WXrCZa>2aN*6Cjg@UQJUT_l++g62|uYJPytsjXTiZDOl>(FjKM#ab5edgE5&6& z*DD!9yD>mAMbgpGV9{|F&zW;7)jcgR*}Y`DSkr~#X58lTm?FM1{%cn3Ku!zmGI05c zVr`tS^VFytrRn*=gA(|R{Bs2RWgXjKf&X%##+f=a?z>6+;{>l6izx<2Kldj%qS!P) zm!lTP+GPBmbu7w+YSNAWs{ds22GEbsU8`vu!YrY)z$C@8UQ_uXP>8yx4@&?jn zMK=Y3r)OI8F4D{N&Pg;z#GdEHoDWGs5$$XK*#4@;N?F5zkG)-GjGw&UI^Bysd==w5 zSfzg1pl)eL5my~AKu+Hqx;bOo3{1g%{<3yYnN#NLxmW#hXg2tCUzqpo?Ay33ZJZ+# zius*fxGXrS%8;$EQsZ47yJaYnBVz3t3@ij0d~VV6hNY_@J9oKmnDd&D1!-Aj>pQG z1)CYl902f3*hkan=Vxx)q~aPm5?zg0p9GkPPBXSh(+a&foNF^mA}R^nJ-#NAFtdQsL{_TZPeJOfJeH0z=&IrD-uGyR>>APM%HA|w@ zedwBzY4Oq-OS#$Sb;C5r20m>9h6~9x0FSVOS&f!VP1BSX@Y8)FWm4Nq4MWwsV=a(x ztV2hk2aaGAkTGNHMerskvMLjKX>>}s4on(l z9(Ao4Bw1;3U`<~Vr9n?~CL#lkWq~xcNA4zl%TH)SeFe!CJ^(1dxT!njp$T6oh^MJj zUkBru-KNTnwd(cYr7bpQyIa$oO-A!KgqLMRP)z{504}_C*17|3u#8q-y+Ef18M<~N zISrN$@}gBwmataaf2l2;fg<1L zwu8;%tyV>RPjZ8jis2SAavm{J5gyn^5mVLVn}N`|)^_B3;m6%I5cBda|7p+T?M?!~ zlF^c3@yLTWF%*GTfteZVPc?7qV^9**p4ho^x+e#AjA@$O>GlECUopjZ2@*a0@bMg+ z7K^LgqlAXkEDjAK$zH&KHl{hlG@2d6G_mK%Nn+x+-zNqHgKr*J_e2-b;7G*mu7(qa z=Wik>bs^Jd`iYiXzW#|oBo5y{_LhcMV%trOM-HLjFTweTq5QPdTD!-c&Q)o_ySBm5 z*eQYhgvCtH?QBnzW0KDE)8p>t>8A5_?mG75=~X4m@6cxJFGCLrNSERM$cL~X{{1La zz*;4K7$csTY#p`AArF(FnX`7s;Oy}-|25FEu>~)mLj@orAomke6>cysQ}cdrJR7Z) z#go$HSQNsdE+5^bGyd~6)AgR{c`4}`qTtlWY~E?y`H|Mm3yez>>22vH#M!Ta6kqj< z)myLK7+QC42M>lI5$Aiqaf38v-ha634&zY6@uLqXh>U^a>o)3ZCY-i|is0d8mvnKo z(6-d{6YqU0#+Z&}yu~JP@#erdFv7NdNd=2P=tiN%b0UK^#(5Y9XiENlqm`4ZV{O6+ z38#Z8s%#%k@zya=AHhBF@pUNJ$|j>sDb;W@jD+r0e(r9Ggvv4f+vS^p%WH8D_;>8J zr0_t;^PL4=_|PREf_pOd{COG$ugv@bX>|LFPD-)z+LulCpFJVFYXk{++If}Je}Z-P zR`vG!%crUZ{=QA=ADo{vG96`{ark@agR#k(%3hkCMWJJsM+zh83)caJjI4T?-`14j zOBB_%ov=N`lAqYTFj$)~pGgV26rd%3+G9HVRB4Gp*2`A&cB9Y~#}`1SJTo9sd~c>c zRIC%zDrfANX={_2i2Ah&@Re4*mmS@{Y1jy(&5#hoysfdNH8` zpn|N{BU?uaKBA9W6F>^@xX$PJvy9Gnco-ntwm({${S+2eD*{w*S66}+*9u0-$s3;W zVpqgg?8~6OU2bPm z!6o!Nm5}f^6M?aU)YA2pBZWl6H%dn6Q3ph?v@A0HaM zA8tV2ea=?%c_Vqq-trkO)jN*tgX|ejWPPEwKGr$U~^%O4-ZkYU2Kwv&MhWo}UV%l-OF41Ws>w*dp~E9+$G-5#5`B#WIAsj^wGN?; zT0un(HO++|Eq-+U%$#OjeqGE;@g&@%Lc!K12uaN5`9dpv{gXk3%Bz z*dH$18<(_UU(nCF^{#)lIq$8Pc+Vi4L(EIOEQ%hVN!kxrToQXJGKH-VQ2x9UiQ5Zz zN&Yg~?NsAg_{9j?Gw@On8*gdtE*)YaF;JB0IBJoOxR&wf6Zc-&Hu6Hyh*+KY>NK>O zK>`c@z+N>VTj713-qG>`ZYW>5WCPj^4iaumS+xN=nB(LLMn@^tc569xzV<(PFRoW% z5puE@T*LHNzjkitj}wb%IbP6W=bz>UdbY;^ke*+r8#`C63;F4JtB>%u>v7x2ntbvZ zKiMhuZUoElwBW{&Tl-VF=XXK99WBpYnkGo2{kFv7W{>^DYd-) z#qJeP;L$7&nEsvc*g4~y;sy7^vbrG$N&#u7!ZSHay0lPvf)#hnf=5lq|gZI-oiR^1KrhqLRRsUN!TKQzvaWT41VzqBIKxE{$#DLNipg_VYky#5B_26-FK@`*5nD6FWZJ0RE|8+HKA0P8?F zhXLwb`dQH0?q+QpOU}b(&}O<;+i{09oCq} z5$BhqPh;$)OfomFPRtWWp$oNp^+Vnf&RMc~sN{8Vq;Cay2%9Q|6o9b2Pmc7tF;p9~ zKBD5Oi@d9?`g>Q8IE0IlZZJQpRWiF*l7>FK&Gtntm&S3YqE>u3tlkDa(MGG7FsomJ zhCemR6aKeOz{SV*sSJE=g(A%$lAk?M|i6T2v|)`q!VA;0eJe%#T>&&pHisFnJq zUYQPm~4(y=q*(ntC|jV*SW*WV)j@N5K>%U zIMfmRqP>U~|A?A_$)Trr6KCIr*)!%oH%?f!?VAQ~Gbe6h5!<`opVlw&p}ybixw_ zv+|UCe2sOmd`puNG#&8gQW+_FOjsPR;&^7$8n>@#OVQP>+$UAa5<7ryo+xNpBzpZ1^fWX+mtYoCV-W9cAi#0#_gESs?b{t9oP zs@4g|WE0)VX9nigU^7T1rs|6Od4@OAD;b;i1HxLe!c@gpm9Jc0hGT++t zf4=3TuFIpa69Y~Irg3tlYd`Qp$!THmGPRR2VahXifS&kIG@Yo8H`?KPji$oXW+`U- z&e2+plf8j-ZCNQZ{o@FY-WXf{eJ#m`kiOP>O%Dos<|F#}`c1gvh|~cVpY6!RdsP9L z9BHeeSSJ(mKK>>Iux*3k z{l<7wbrj|_w~>)>a8zqdwTX5~EQ1-nttlumPTGIO7uMu6#>>TqYnThAkSp)BSz6xp za&e-JGmnZ_2jLp>Ijs}X$Ym;MBe52)j%PeZy1|tjLzqi?8Rh~@N4-91PApz(=*Ke1 z+wUHXJ38*JgrzU^R%7Ol3}`^ghTV&@#PE;)A5&-j7FD>m?FksVK^jIF8l*d=Q=~zO zp-~#7lo(nXhHg|qIu$|b7#b9$q`MpG_{P2WdmP_?F!RH+*0b*Wyw2+}vFk{Gm3_a+ zPYjo95quKx7M&655ss-fTV{TI@areIHk|NQnB>Owe^;3WbGJl}91;G4s)kO8V z5|*QlH48;MF&@aO^JCbl9ZBz|iG!({`}C7(Q(2o|Vw4DyN1~Bl#~?AK2L;|MHSM=! z4P%hmo)!7S`la>j`aUI^sMiCGcfS~&^R9s5Qf5EMNtPCvEPp+jFhnu6&ayuGvwxh-9|{9eWM?NU!W^hxs(o?(J0CaO zMAw$A>UTA0;X<>fpOXBuYdRHmiLOp;d)fB)Wt**|41)L|vsd>1*jonHuS(1>)8zuM z!0d)VxBv7gAzDE(2Q@;Zud;!{@${<}2icWWWOKAI_R>05ovDAjh$(pauBY3(=I`Hz zGE{-2qsV`qv66(!+1x=tLm9r5zXPS=G7!UlQ;Rl!P8{k9%WfhRNSKR>osqg>m+E+a z^Uvxu>?1DM?g}8=KstqPGRM73!H`~}K{m{l5A|A_9^Fpg4$b=4ok=(JpE7LpKMN+I zdLpF<5b(a)vw3p$P=E16F0IhE=^*>U^jq1^!FDlq#PQn^yTkW9!BifEADMt4nk^Kq z3xy7blFm~VOiT;{Dj`MU#OD}Ig9xS%*i`Q$Jh1iABr>8e*pe#arA7H`v(vzpD-YYz ztgM}bvYnm0vYlJY;hh&;M&_-zr=z!R7w;A+6GPq!@>|j)#Jj_S$n2vl;lWZ@{n{dr z2;^{-^wBb%89D`QCIj9&1v=mHeT0EK=+Bm2CGR=Val zd6%hW1t|b!w`W+6a&?0$8!>o!He#>5sK`_42a~!~-pt<}R$GU5?GQn{n7Z956q7GHXm%}s=eH5d`TAFmiz|{mJZW+?-XJxK1=hM#US+hT=Dy_kCD1VVWr?QU zju*OyIhQ}Prs%$|^I3J8Fc+uRXY?`>yw@?*e5fR`!kgXw+u0{?tQIRUb<%L^tCX?s zG|n3jFSE!NRjxsmv&4tvMGEGxJ%v1jJPTEfeW~{C$$r6bse`F869{}QvkX*IrmuDo z6lk7Ai^+F#tDi^7h3}_y^69xHIeQfoi@5RAQ2FtE&Sb56PyQ}X>ExGdxYDoo3d@9a z4k#g{1_K!1V8diu_IhBEfiVNa-vw%EsSr}}&r)93^vO0F_N8_Unt@nlt*(2N5H|$c zlao4YGcm1x`gC5(S!_@S?0@I6jkhqTfr%jSYic@{2oyj_mBiVYS7GO;W>~WdI6E@` zR4#~X?}!1Un!|o)ev$r{evJYb|JIj2Zohx8B4ss7Cq#50RU$|Yo=p*%0PL(50DijDR4zYP1T}N3@{H>MUgyg*chNu&1LK;?jPvnFh%dg<3B{x z59Qq1w$S=`xTLtXBSCub3ARX0=@-8uGa{W1xk13BVu2{NR)xTlD~3sW0j=A#GT&+c z3hOqJ_!w(|KE!l$A*dE*j6V&~%i>Sl{7~5d0XU?wq4=m9+iJ}bfq6tgOye{gDL6}% zU%MMklw6Evc9YC3f9mH=P$jo6Utdb4Emx*Sd$OSE!~PI}KBP!9*1Z_zJ>yu+#9 z7ddxKatFJ02Q*vi6BDH^n~$`TP#&1fZJNYi{!47vv{9!|r}x+^tf*MnijVNr+DX3@ zAEm<^JZT0hgrWSb^5lV2r+F7rEgQnswM~SxAK=0E6xU!VVYsyF$k?|_v#!0T(P_3~ zt}!l(2UYCE7ZxyC;!z}H^!wD9I z3J7t4OhTp|5((F8E*XPHYl*<}PIOO7Pc~o1QuRIh-L}ythx^_H=(J{1I#K_L<`sq$ zaA+$mg4OzLcnSI0tMda!Vz9FuXtq>~5PVjb*eM@~H|~{Ox$<#DDErxKJ3v8nq@PF{ znw&cJDdO}jj7@BEgfm2=(G;#M@i7T@rzN@2j@y zCv~SMxHC&vvAoCIJwN7ja%OP&c(BxG0>zcK`*;H?E2}u7nF+1~Qf*7vaZ_2Mn)}9K z`K9dO)GPfDtFKGPe>rSX>sd8%rxXhg+m&X1wtr&VI9f+PWp5? z}=5gJ;}SOXZK0<7)a#S-i49wk=;Iv?O5KB z*Tg^K@)ArWT@SQtrau#f}F~ z0;I<-)IIdpon!yO{zBrw>{gA<_qag)8ohhSFVO_!1NjO(G75RrI$FjWefVEldMJ)L zv-Nv$HXNrzb)vkb$hwMk!YA~blYU#i)5JKpUd@boHy7vvQz(i4v0a>90do09R&nOZ z>aTg5s0B?5t$4KAT)OhZ^mx^ejxT!`YFyI=v8A4U-hCIh{G@Id8U&@&+o4 zU&I2@mmOD9aL%XVT30|FjATnRR^>L%Q1XOj%fodph*MSk8H%T&-sojA-St16t6>&YAoin*xw-L1mG-rOehu@Fn^K$N zhEf3IvDk-~GujPGQmPfFLtgwfp)e^Wti6Y4q{lJGON}#6kcqMULI7-2@&n*ZAbadHK(UYl1@zoC^t60SCeTZwU}NU2@z} zrl&YNYTn@df;`3W!1WF>9L;El0JO@^bNyYodTc0w$UpYCUaE;plXIYT#DN?+v4m9F zRX|go(G60u^)7DDAT4>Rdgck800Lt32<%B0Xu)&&5tTl#uNGAL1oD{!bx z$OnmC^}vYdw@JLjRnQ(Bq_3pgaU}L4Pm4$PD{_T8{&r6z7mK&+Dm~HpuBm z*~-DiH7Mc$yr+{5)HIRccg543=_)9HBcWsBOH*zCB4UzVMJ=LQx%Aixo$S9#w81&< zAM$OH+$yi2(_%}0>tS9fAwiY#ptK?`FI&e5fxM>M`TJ%+iJ5b}8)7X-LK{nOOhGlL zFmn-04R)|eM7|6K@v)3?3%VvW_YJXi1K4CALHoJ0%g*$!0!wRFOZ38aY-`b?Gnq=E zzXHizs}b_wET0P}5G7J2obCX-(2O?k~XrgqJYv$$QN_FgYecTazqJQ%zrT1L3=tEwZ%jflgF0BfNt)y*DoKP z#FqoKbl6IOVvK3J1Y2e+EK~Q*adNc5=wZ76NK>o?u+h=Xf3Vt-2~$a~nB$Th36&rd zX=W=adyV9soslg&FBlW#`1Hcv+L2W>Ce@HO{nbP3EeU)DrI@1bWkaNzw{OQxq7uZ0 z119dnAm1RT@Z&4;ZD`7gQ|w>Cxbbjttggx~1d|;r4`yL-sl{;RlCL*qVvxsTBj4(~ zBFRBgESWXas@MRgWX*yE-78HBmR`C1Kht8paW*)EhZD+H;e~hrtfY5J#5r;X2Y-Nw^8*aPN*wPw>OMG}( zU}zYD!7+N>^YQrlBRhCQZT8$Aqw!nP97}(EnBFP3QrnUgvn?+1aAQ9e2%K==o}r#Z zs9VaH{;))J-+nL(_^q|_R#rJ|H`JPyLtFmd>H;X|Q}!T!5X1BCgKzsSAog+7@Lile z?MTnc-~PrC>FC<5Zpl#v|4~no&4f|F#jD%AO*>Rzd{hX;Ll;45y83d)r~zz@x=;L# z^}O+UXl|zr;J|d}l+>CCnb0Tau5Bk3^0(97T~nyx=}8-qa#{r-iDE`zrJ4DQtX=vE zUj*h^8rzk}T{8QiL;#HMIc_@7;kx`-tC^vVwevkU0=;tX%6i@Hfuf#FBab!ndQj4t zn>>>}Z{ZK^1z7KyQMZB2l6XymHXVQwUqU!_Uh*GrFXg2b|8D`5l+92&F#EujWCCwo zToZ{rx1VV}r=||xbD$Ov70a~f^pE2w6)Ou4tf`J;`r8#h-2%#v#eVq;jXNAj3*^GG zOavtLvg}xY=*x;upuF)FWdxL4jc9{OZKLroBA zpIXeEOrjvcbwu9-te{#%5Gj-ny>F?><^hYb9tiLalm~NM6Fqpoo>X7XP>8x4-s~&P z#E~#_TA1P#R7x-YRC>_7Pni3CH^p$YVta49{)MEc;jZKEX6$~jY@&Mk`r>OiHY#y9 z4Mhmt1DtosV#t!nakMuz_wBZAnv0yj0~?uMY2yA0_Fh(>zeBVgKDqFYoc-^WAPM{E zrxqwH3`zz)=tU4}8mnFJ7olvzqW}au56@_lT>y_@pa#L5CyR3rGFsth31 zW?V$uA0e0Y8wIItJv5kdx(UgK2Cu&VR=aoUU1>FDtRsN6t0EI?EJH@T=3!Ptaz#!HpnUh}G`52|nTAqfE9c%R&`e>d&Y9qbr-S zUBRYv4O8bho(I+~?K}_>YtH>`mv0pYJ`HICe+=8EW zJCWO`UfD+Pabz>442j`y={e)&y;hCy%q`}hjUsO$v1iE zNu-9LN{>EgacVU6Vf+b(w%Zhfgmjsq=Vf5g7?8L%>=~mUF z$9)u##f~4x(AwI{YW!fE$*!in^Os5d*$3{-*UtN~{1$NAb}hM+SIz+?zuuIYAo0#a z7?r>7rSG!upgjCXk$-D^Zux#jC9?_HxIGa7TN;k$i5xiyFmN4#<`1`o2a>yC^@$&> za{C;XQy*i=wPz06V@88+1>|XowGMFQ@CypqhiD;3-Coi?x$#KOdguJc(`S`=;+4k^ zW@-{&Pl>wNqOC|m1$gn-a6?*M%KIj=xtTJiA*hi9);6b2Vo5 zEMKnRCJys+aF49JIahoYbbKM*QntMFU3s@T!h3ufrPoOg!U02TX`c>b0L4B5Th~-0 z*PH63s=r0W(kx*ElJ*%Rb`hL>F90v5Bd@1uUFFZ+Z}LSz&KQ5N=?btDb8I?M7zi97 znEu1<}V|`eAU#*=kKF0%+jY#cb10^5l_E9h*4)Iu? z%(WBzW`2(5*;%KlZ+;k!PcjRW;mb;$7#wMD&FijQy?6EULj4$QZuA9KzbV@Cs*%Zj z&Pu-MLA8DWKNF}{+u;cu6;uB!xO5VDsHY!?yuGTIy%8K2+-y`uIyakBX$Nik1oocC ziDCU83xH&Ytz{LCTbcd|Vw}TvnjBRt0T#P!c~%0V-6~x*-=B!~s{qKODgQJCF}I7U zGiSC=XT0QPwV>9cttPp~=r==AlWxGaj&C{v*=t9EE_Aee3K>AaHsx#Bx}~G%oYu*` z{GjV?Jb&hF;gwIduArW({z+S%CA1swr`nxa>XS;(W zRppK{4-7{eXRnWczm`sp#D0Bi_pzVdK%i?6JD{sMa5%1BYX#@jRqt9wgB){zwWON) z5xCLU5d$XUuGU9t58>ymwH;pKN?UyTDxBN6N|@WY`%K|iOdZ-eXCT4z<@d|6fs;Ck zTvcFfYR%Yovd?P?dg}K`%F=$FxCs50#%Kw8Fo^F_{*dme_|qp`*z&U$L%*(joQU%smriwhL1g4jU-4BwQ+J9PW>EWg_F zG*DS?Cb&r8l=JBmLaEQr|BmJt60tt?g&DYXBpP%oTI@L3jXQ}wCLjClU8(!S^`Gjy z7ht6fvBN@PiaGsmXHDM&n}GBa+5_q4Ki-GfZmzwn!O>5RnJ;{wv|Ox6UWZ{kNp@vz z)>=P_H~f9Sg=A`PVo?i@5T{6i2_`ZuH=B;^hVJIC;j7`0s_Ani^F2=bdlV@<*G>%} zzE&N7m}Wd{qn4#&EA=lHpmB?%j0?lTp&(TinQAQDGM!=coaYfC6?G_OPEfESYQU#h z)Gra~m&8pyA}tWOU<+JfJO6q%yi)t^q4f(k)J*NKM4gQ5+wp8o^_X49dk7^bdDzCl4H~CmFSwfY z<$3uZg)$03gEw8LL&?apKYgIK^0phL6=kFi+4f)FHW-&C=+hm|s#38RE&sTPjh2`Wz*# zn;X~7us56oJhxOj-hlpe5(c4%X#9=V_c|U37Uaae=QG)y6b=Yad}7IH$GM+3bkq~h(AQ8IfTc;f&czDe$P0!Xb>`F zC*aFXo#r!>feSiJbgWSMXan? zSB4{13m2@HIDNutA#-9u$U3{WqcMz(8iVn(D)R1dW)FSw_MYH0RZjkJm0U9lz~@#u zxjRa-B~U3xo8~9Esdr9AgOpc~zpELdkM@&KJ^V|CgbPef5v#RmqcwHDWS%QOpbx+Y zV1NIqieDF?uKcOClP`@<+b^Dw327AnEMLa4BJvq|=9fvgy9&GHB%s-5Y#gFjTELY7DKa;I2JQ>`>3#Ov&n}I}~QdRK{N#qQmFk zz+R$5sJe(+C!cV7fa@?wLwpUx-JRoqrsE9nPXNp2tN;6E-801ad2NeSG~nx(GGcZj^~TM)neu$l z?@tW2*Q=^z``!xnnJ}>vY)!lD&G+*Q&wjL4Dgo4RkOWeap3cah)5d!gLsBzyQg4Q$M|2^Mnlx$PP3f-(QP!%N zpt8%-ES98j4EoLYREg}N?g}f|5s#x_h~$Q^Bv4S_WFkD^9}9Fu^e@O+wpTZfK*TYv{oYdYM6v3Yg6FQU%s@p>!SU&_w#tdv!)DgB}$pvp{ z8NY#Cus3wnlU^_ah}xA`)U8|o6D>efLI$ouH?x&gKomIchF6ogo$R24d-3u|JK^$M zWnGeL+`!QW0M4UKxrUE1w~{EgE5eZSqefcBGrqb zktx*X;cq&;x!T5n$5OxQB)I9DAl*k?;|NrnW44SF;-B4X6uF7r z#5(vvyZ%MwWy4)XTzddTaLX?8Tk?A<;!YwwgBrmS-5h3Ct;&ynQ5hoh{@_z}<_+vHxXLG&G z6ws(o&vM&+=)#}EtJ{gz`i=4o2kfFwI`xe8J)}uzs`!ab3yD4Oo3&I*QBL^eA-|R; z3a}aIp0tIoEK${j5Dk17u~c&5{^l`pNGKGo^8K{xhY*AI&}`V97Sd$cg~Kyf+%Fvx zX_YJC{%5F@`gh%%GM2KEkmsQb$XaXF1?G7SF_7nDh1Sxt6!>dl4SWFT3q0L@sXeIM zU3^1Tr&muvLzqTeA7`6yXb+F2zWY{yFFNvb5-XC{JB7@x$*$sHr7|h?v zopRieuZzVY=G33V1~T)#PJn>t{p<`ZZdY&!S~C5r-=s5PnpxzwmNzoKXy!C#I3b|o zh{+s~5?oBeF0B-22gTS#m>Qaw3F&#k>hQzsecEzf7ELLVCR23XU}g%f=0W3ZHz}GL zvbGg%lc<|Usa1RtOZ?WV1}0H@>U0DSTzovG94%))#u9*l?&(mo?l3~N#xngatVv4X z6ui>7BL|#}k{E4H{^t6>S8E1I!HWb8Ml!)QUMj()9IF*YgERBjni4;qAk%OwC69MM z;tE*p>k@7r_%X#*}r=U-02B~ZU zZCPu3$ip*Tv8cGnZr#qV$k(G@L_Ls#-{QzxXr>`E{Kk^=Y~V~w7*iaYBAih^8k<@6 z@G{#{-M}pc#_!vC_0A|4zqS6Y^rq)OEOeJ{`IqN|F{}0O8|EFhVSjz6$=??zy5KPC@=w9PH%CS>O&Tj( z?c2kpDWBXeHF3{(endZW7Zb zbAOn51#S*Hug`a`Ga`TvUj7DXSKO3p2bA%v0Q_kt*)LAw;%fK)ft9uPS%>e5JV}h7 zRp2dAimZFn4y9sAZ$0I)w)qk4nBMl0WO~6MP|3%cjn;9AXi#$&9!8fI%=|aVsc5)6 ztOIxW6Usje<`X4FqMw9&dLpqLYfLtARU>7*z@cXMj?s+B=wQyxVHv+zAB zPR{(uXGpGsyCPR^ug&ol7WCogA?G*G<+33UrPj~-R6ltlc%3Za=ydO3*jZ~;qqSGMX*W+i=?Qy?$5I-i;g%vH`?tvv33Mf24x3Liqt=&>2@a?nt$PGlEcmi~FU6tW3cfDg{ z8a(yYY^7Q8Lv=wY9p#|@q`i;F*RO4_{=4-Kj0Rkk|BJMXSQf2hcEkGR&)y_WcShP& z3!$9K8WQU*1zO197@V?ElI+H>ssmWd&iX#woPqOV)lK0ie=9$`GqsP=Akf*vfv?4EkZe~W9+6C#O zB3L;(Pi3O$NCjXTPVsg12D8Z-ZT*|IRXsN>qvw770(PE(BR+@VKAV7;QPk}t zxg2}@$(gx)pSm_Wt_wIWgNO*Ma#}Rr)_qa*iBD~tI7BY}dr3p-S`}W%70+&Qn>4y- zxB4hrAcj64Bm9QDcQrCWqp z!duNs@m1d^U!JdHwUWd0o-yPGe1F%L=pWMaylrRSx{Tp6PkzyeE+RTab%xt0Geupk zB|A`0NAh)Jp6O_fT~*K%zD52&JAk*;ok83`q^ZCz%y4382g z`s+^2POaVjf||ITlT3!mPeRWQANibrDFzGNS(_~;dZL**F9a|-ft8yG80Y}r8pVtcsyOQu?udCE@PU+xkD5PdKQ+f~pJivt| zM^A9@bL2nbiC~-4=@SE_Qu168_)a)$UpQ}7IC0=>dv0dm7W{tjIrOe}_10s$#^Xn5 z6dyZ%gyNH57R^16UVT0eoqWr$%Z~}`FPtua%3H0wB{?u;RQTm7<5x~&`PNm=ZtZS~ zV8vz@II>qRd}Y1*-dMD@<+SDg)w~jk>M08JW^UImOz7 z0Jqf;YB1E}z?Diw?PI@hSsflUJU=eLQ7(aJ`u_8OS4LP;AcsQ`RU+VBCs`hx48m~D zFYy`lw!XhJfP$3$NWa|jBjK#o4>i>TYW+HEM z2h}lR$1-pxV8sZr;EfkMCt22w^-A=bg=}LUvb`mV9@BnS-Dub!P(gI>gwsS(m6@r% zNHk^6l&?#5hyNgucCQk(d8&HmROG&|+o5hzDE}ypa_Vp;1A8}Q?NJmDX=fj)fQU23 z^M<+>t`_{>o zFNWjV%x<$+!${_;oDV1jjpg1q*M}nvZCBtD%L-&Ph zW6=O`11ly~`rEn9`R6xEw80wh+gnsZHH>EhuJmx%Mmvbk55)&VbL-kF;}-!$$jMCv zI_WMv2Ol(Pl3uJ=4L12p_mjQ+k3an#C+nS(^G8B4(1^BG%Zl(r76E?^Q?la050|fB z43$V*+=jk&>KGCoQB;r^sAjJC2cH>PCWh!~my(WFgkD#|cs2Gb_4W-h+B}rtR$wN4Jhnq9t^kVq=B0hBiS&9tdWP zeB_M2N$T!U=J3zMRM3b~{e(ztLm5v6!U^CR_j0H74med;%9*tKwNqUvDwj-8mMY&y}3dB!A z^ZXd<$Wm07;@z}SyXm;GcsG7K^SApD&D2d_T!6<>BCvqnG?hV#GMr3X z1DRzX)V;}8y2IwfAjY047yqe~oLS)-9xN!@q=KqAr(X8|X)P|>yp?dK;Qxv){gjRi zTkhI1lOG`$`D_9`kND37_z1h;>!=NeNomC6P8gz1OtT&JRI3%4OT_{$fU%z`UYnPAg2aUC6Rl{ z)Pg&y_3FjQ1ILTGpv%ah677H;y)@s=nNQ9>DhPX)yuW)*f?9__?75cTBM(XfOY;0| zeh^~y(72A1K0}@D8T~#N+uc3cC`!`jFV!-HcGtdR5+iE6zp6{|y~G48yP}w{VF4*# zo?3dbie7vbHTzEGGaIS?_KQG&U*SsXaxp_rE6ez!8LPV3Md8ix#bfEgZ~Hq@0E#Kt zJ2jgz(UQQ(U;Qm{Yit*?w`7eX09+vXHXC=shU^r~8gB|O9~{!){GeQ5nW|&c?yDAr z5bpLX4nlLT3AOymo6IN=6do!tT7})v@8M?AwRqu-KHAV56nHqXb*wpjiZ{ezEI6mP zb&5FX22>}M+uk}Ih<9Ur`Wta|mpST>%8>Up;8}1y-w~g$yaQ2T*g&2;1t-l%zy6Uo zAKTtB@E(L1$~PbwaibTnkuAyXbp$1@x}?oW#s4KDmJ=9_7bmuIwdLuueXt9ML@yEP z2rBqOt!g%v-XQnBY$UC_td37TXwRK7uSIE;f_ z(naHnN_l?*l^?5}%JFHzKQ*dGQ#7etzxdsoQ5;VF?VY&;j(2=Mmh_t+Lk!Gk6y85@ z-_@2ae=kNbC{?u{W?x{pK308e5d5h~?6>ciCy|TaeM4fuHVc)IUFcMpAZf=7J2j=W z)+6KR_(T?y0E-EHLj6@A%TnyA7PW`d!E&Gb1lM2LF|g-OPdG{FrG2Kk1ph@}Syv~u z9Sw)c!>UZ%F~L=d4V^y}H^5*yfkFEd@)@-=kV@;W;|sAYEsr>rsD3X?CnDzFQ_kh3 z4sqy{Ga!`sIyamV(fOT`K1$8tjy?b)`>3!!hb|H8s>1ZyTEF|Tn0uU>e7ZvCFoN)! zcC#tgDP2#Mok%} zuS%@&jjiLUJlHJ^>!L+S=fj`aFnZ-^zLyOevi6|pHbB{-2RU1GZpsiZ$+(4M7 z5FO(TIPVOE@_W`o@GzbWYUydr@jM}N4BK%aeGBl}n_|k2Dugc96Cx2e1ebGEy~8VC z-818Ycv0nd7ag$xIn?Og+^F+gx1rGdhuh7?@`rKlOEc@{mhFUDq6=FLU-R2=i%ZNO zMs96@_b7|dD_LZQ|L9$qd(yvNwsc^+pW%u)8I%AJXDdqUb8ZV~|8XV-Ch?oxXrgGK zFCYngR&(lG+>%AJnQN{5hxCDOB{ZLEwTo#fP`Dcd{{9%*WHdKMrS%rtph@yVD@y}WH2uHcc_ z8-p`u1HwK0^QLD@l(v?kR24ma7g{?pngPS#mmyo_v->7W7@7ov`iBttg8>r@gKc7x zKGCAgvaY%JgQ{v-TW6)?G~7Ice=S24qdVhU@DZH26n-D2G{VxO0fZ@B!;!d_#lA^W zYywbAiA>JSVf;0naM9i&*7~R98i53gULWH_p2568;<4V+~z(6&*&&cZ@e8kbz+nJ>h2q@IIbLz|McTNJ(6$Y3SjQxH!VlkC3iAoq;4f8 zKz@J#>w=P{Q_lAwiiUt^)VnLe1J^Ii`;Yn5t49ewM|u*$Z5mD2IeN2LixMWuS>&iC z7~3}2hpCw-vk59ogIjQMwP*jwAGR|CD00>qh&J_ukbR#AGHcVqm~mvvt}>eUQzI$} zCuR=)HzhGw!`05bXS*2A`C3j=tG}!&+*^MmeW$sX1hqycC=v{jaN%dLS<^<*G%KtA z=`{av((JsM0D#iFGo|HR%wuee9l~rA&kNorc}_G)fVxB02!^G)`zAct3)ZgZ$+>TbH6Hx!%fL>l*B|m-}29>S88wkNILh4s> zgI@YK_G17!$7Qoou41fdKw~>PTPbJ+n%Q;}MmsTrLyX3oX7;Vu#W(y%1<0YMs#Qq- z+XA+5j`ohDoOhrl@e3;Ca*bhSf%iAB#H8@2UD8Mp#8^I^Q~PTq(YtZ8 zPfKC<4?Vnrzw*9`$n-j0e>(3H0U7cAXTNaN5j$C{%eJgx*Ypg(>m%GFwCQa<-NeNt z-Ol>1M<6Q?_ct*T0r8I?^XMk-2?0E*bj<>)FTl@+g3~yC^u>yzzX&~&-<~>o!HxIY zdbiTlnxUPq-=m>t(vmo30BEji$=tK{Zl^ogj^08|N5i3?bTu^uSDn>~EOyDUv}UY} zis7~$|2g@lFn|oBfUYEnB8!kL*Zk#ppGCR_g$LeR3T}8XTQzO@Y(mPqpjL7eza;z# zJf0zv{whys%X_^`$c>X_y!Lx!LRL4K`QO0xq2U#l(S3HBH(HNgOS~}3VjC!vH^Is7 z6wF5o+8YXM3D7fg&v;zMy?LvF8yasgk1$WQEn^xT)|BDmt7PQb`K#GbR^maC>4;Ct zxy?s0s%z8s`W3pG0KlFhqQh%gP0M9&GPZ3~s3T(#R8(G?|2n$E59N2J-}q{neSnK1 z5SUh&N!pWF?lP*=u*achRwRDxBQ&hD>|wA*HS+`a?k5#(cUEh5e0`-t5g9R`AI?XtWJso)i z(}R#r8J#+Ygz+-?c9=nS3)?D#8Idkw|Gh%7hO4oT(U_ql+ZI^y8d}mgKCxqC zAhBgDP^@9z{wkDM5;rh|w;gKb@}Jck$G@ZT`0iaiE(oBjbEO?fBNvu9wMgsNB}H`r zd0J9h-BbEHvE%ig7Hj!E^%52taf79%InF|?2IOnziWpN@Z? z%N}@BG=5Oic??v}SqW5eU(_M@@!C2PX1z-R@~wrdBZ!7pSKH-?<3nNk<`ge1EXHd; zO-(QEIx3jGyA75IY{PO8G8fcNX(xKKGenJ9or_S`Qssl{h4pNqK z5^Eo}MuU&X8ldXtMQ62Ex_BX+8~%c^b0JY(NWrptXjL}@NuB!V4EKxrsWCi@N)P6aV;8u^WS3D|nA2yupw?&b<)1vOzu>zxrV^Uq^+>;BX3K7hb%n%D;$B)|7Be@fZw$2a^Pl07IAczfX8xqoTB|v=0Vw11B60il8-L+h*Tw%5dq0)ohl+?BQh>OO$s8k` z0{q1yF7AfQ3EoVQG|ogAx7auFh-g}Hhz!p2t-Wu;`~2emm;uTVFg#EKjQ$?IFz~=7 z7a<@2a^S<*!lN!%#WMC%A8GMCw$bcC-Ao}0HbTybr;j03zo&7>RKA8Kt)}A2bDo=E zEgp3o+;--)a zyWz6HbV`xZGqBruM|#=%)TGZ&i%I{JX^qv-1l$LrTU8y4i~eN3zQuUV^!yrHVYXKphF2+tZftD^n3>~w9#TWutf@|plhM|bT82}CdF#X87+Z-KU z6oUPwVzYc`Mz^a=V7WP|yp1c@s;)4XWtyVRdp>jk*$fq4a`Awi{IMk>FxYywq{|nUddc zT7LWTOxd(N7br`KRX4~ie>QE@HYJMagtaCTDNGK+O5i?jrmb)9THm&`LIwwML#8tx z>-?TL`OqcdPoRIjyWZF;<8xYxQgjb_o-8Ds2tZ&eTtTrX7`dnH{-&Z~FlQ!8WqNvP z@1Vcw5Zuo8cIHukBfg(UbO8CElZ{Q}4@obA7({rMs zK8s2tWhuM1tY+)J;dE=sTKBl(6$5gK0@XIWyD`3fVgq^{+UiAWAIKB&J-td;=rX*t zRj596VVn$i=eDj4;SVsJk%oIe2b;c?*?_>yxGPy~nsVF-%k zxbA@qTG5FuP1Xcks(Nab#IsL99s#`Z!?8u&ktw(ZcpmTmzv~zmXb#W!i4$&?uSjzi z?dZ`QWz%N?O7TVMi-O+wRyMd_Gl*Pr$QaJ7T@zdnRhHUq6iH-37GV;5-0K_@Ku%5re1gW_e{UxO3w%vf0kmXoWDoR^?K%Zsg@ zKT{by8QSHV%PcS#NW=HDgLy0FG#9vfbZnxi+mpW5E1*+;ucR0_B3U{$*P^Wv{oMteZr;yEUNm_XC0IfL$g_ z6q7Ln0)ti5khTo`tT7PYpIlU=u)|xq)%WXW`zXnJ=daP)+oX5~X_w*^wCtKkqFzLQ z`)Yv4uF5W1QHL0BGV1V}^K|UZoTUL^i0=v?m{Qh>AX8}#0q`cP=DIAN7qaue%%8!a zK3Ahdu`;J=0TWTA_{n{#t41#@B+HL|(U`C>L^+K$YnXLo>akp8QE+ph#kkZ|#em~O zLS05EIf6mh?YaJ`r#{fcPr#|;TAouSbIqC zGq8SxfadudtBa6$?b8?IYG$*Cw5)K%gS{k@ByyjJnpZsK)u(HUmbcIu@~|X$`!ij9 zlh2@{Z7Kj4rI~eFwwIb-WJc*5m4XJij7)UcdGVGfI)#7zZ-#6-f-Qv>s(mf1Wp(eR zdM|}n0cO?C@Dz=Ex8^lvX8*RkhVW6FW7^D!DSxV0wjCOD&t+7lS~@6O#7RM%?UK|{LPZ!Bu&Xw$omo?U@l7z5c(6qUPF#f*(&xz;5nmitQn^o^V=(Pq!{Z0r9w zOdz+)C3W8`8Ad*IqW$Gfil%q$7n+qYDUBdgE-))Vu+Iga;J?vt87?T_6VgCB)2%>C7QFS zy!yn9a`Z0U>fcUuXz`Hl?cqbhw%UH@n518U4V#2~#*E?Q=>VK1ax&B5flOf&G+IkH zkc`-}_!o*`GmTa24<7N)B%9VUs9#RMQg=akx>mCPn_^1PM=F@X8>qo zYQI`Do`vy}6I{TQr!?J5gDla{5cEx*rh@h+sVdsE(w|w0{zTV6$l;B;o(<4yEEftu z%2S=3gvl97JCd~;mCPfpwTm5pu@2VjPPM2ERxin6X6NE|^1SZb{amOCuymtsO+CSf zAL^rHdcZJBt^@^5W$6qqB-_Bx5o)VzqBO@L}_r`vJf3_OK^l08dwn|uHKIFsu&YqJ_7UxN;(FF3XJJHXF z59o7^58o-eFaK%k;NdAkT8xO7ZwATVoM7&L-S^zDHaWSn{Iz;Q#I|_iM)Fb=xO#X9 z|NHNF$=1&*{Ofnz;f!)}IZf_zF??_y8>tPxkNsnF`!)rulQ; zk?gUS!ahmQYln{<{PmZG zvbj_u^_5VF@XL{cmhKV)-X#RKM3yJwyM!Lvv)SS+9cUN3oKofajR_*_EK;fGvj-4~_Vzn>Otll{`_sJ3!yJf?u0I&W>6e&Ut%(mflJn3?o0&OV+XsoO(&7;oqI=Fa*-%+2k--w#~S*Xbd2it4|rL zW7<-r_Lu~UybRJtA#tJKiJynP*#P5z1lbOM^19w5i=}W>9}FuVk~w^kLCjJdqVMA>0qT&nRR(pNrXPCn)MYgIB-R1zxeVgB#~0JlvPKe* z{MRt#@1@8jR#JqbZEJxNx8|7q;r?aHjLb|?U_?8a4nPV}3RE7dH@W2P+!}KKKtj|9 zHHm&1+RGn5OrvGO3pE1SmiviR4$B?aP?9C-%yyMdNf-*n3V0kIdA0nqb`LpJH;5cF z?t!U9#`kHqG~`KkMfE{F%lbuHw$EoC9`w-q86evfS$Le)v%|oeQ`+tOe=a_P`bk&G z^^9{;-VrU-O78#&*63Aj(q_ZAqWc+19B|L%2TgdxcB{Gi>3cnT9*63aOkNaJbccY?z|xe$v^6Z*0O-nhY$ z%D)~^bkg`$;>>kwaB^F_{ub}Nsr{;L%YJx^7&{86Rf%NHt& zsn{2SuD2;KP^&DK&HG?BvJ1Eu3L5w5gx zaLJrvcC2enEoAOtAb(Ix`0K+&ql8U1vy#aUPT}lrMh7zV?9-&c2acou;%sEcE{yD+C|V^5E!m-ODSm$VpwVV$L7&MzDRQ4RrsrA_^S$9BG{#W2SpERhO!%i&+dSx8PtBr=SfQ^|8el~@E=u>$B)p-ygL{{#M zP9w&FgYJEz?j?HoSpv?A`2KTKZw_Rh;MY3p^Tfw)8oZ#35^L`PzczawgGfSPT9mLxZdJLH;;e1LftSwTW)yiMw0tvvMqtD5<(+)z3CYHEVPAFCl zu5gbR6;6SaU2bA8CC25D&FnKb)F>MC10VT*QCWtgNe(6L!5Et(S4u!omjTs=t<0XZ zi5n90`>Dz`@wn3U()y2?{t>ksWBe)!6Hr5pa7U(2G@#y#sxf^f4aH^!DXEelXSPTw zx9EKzEd%?qv8|Q9p_3wm!fP9Omd&~5y!ZwZ^di#XiQ;CCt&Ed}DO|q6&mWB?cx7bx;%~(h>|e8-0MvY(GOa zhEWupApl-27kv`BJ8vX4w=n%GIeb#BfX5dzPJm@xxE-B$*hc|u7C)0VC?{p(U)!^o z@C}7Oe!2;Ae~BwO=s_pdqDLMJ-O*HMuiKuYfFZdL`D*k^Jb zuSry4KvNBZ!wGLF4J)$|Tr_9Z;vyyHpt|^#Vy36_zXj7%Q&`zGPR!C{92?fR-#fln z&CagVgWgS3BNyy<{Me4)|9T^eA;!rwW0}exB$luJ$!Sb8d-+F+7daG|U0sH3X_F>5 zD!s2vIA4rfl(*1Cg~g&--U-8y4vpO4y%7Y8gKUz8x4H9gW#OrdhCda|%2r-oOp>C+ z?p9PwcSQSl)IAY#ZtEf}gpNaNJ2$|W-!@<-2S`V6d^a1cdq4?5Nd{e8*kjmFTD2e4dyxwi^Y^x?xs>!{;Rh% z-_}Wl$f*e(42o~kVNbYC_v4)Jp~krmhX~=jiF6;b_&FxyRGHZ8QD;xl#uvbK&hxaR zy)pkYjlJA?1&&`|c5!{w^R^>2^@hTDGgQy1rCDCao~Y6lQnhBZ$RFZ=PfC2qlhRWA zA&A0xNRt06qN_}CjJ5EXvl{<4Qm~vXu{TscWm@5inmv0ax$>F7?hQJwKCsO2z)+IBs@(G_DXFs!_j5YKW=2P=m zgC0wA$C8$vae%_N>C`*R&ij8bNktnA57KCBE(N<-Mm>2Z%ZQYuvvH$-;zuqx3IFsG z{JG{-K5sR1{CAaCVPNZGja_3wFP#{O!%C`lEDb>by-SxkR?D4FBxKwg6?B8?XJc_Z z;px&AGvfw}$8JEG?e_@&H`t7c9mrm2Lukf7Wn2Y&2^-NQQ%O74&G%6#|pG9LBWA8UM45CJ=ue4kn*{tGhCQr_^$ znY)_WAMTpc5IeQAs4uibUkv}-gI&pT>0S{kgNOwVwBZoF^tjr9guBEs4B~Wvukh+q z;Y0Zieh(!mIk0@PHvSU?bd~$n;}FRDJ2v(D83sv{~xfa#^4ftg?xe zx*rKsKYmr%I>8Zsj}DX9=FO_)0t@Ca5GEYpg$aHvSH`drI6iqY11@L@UotmyeXu_X z?g}0EW4`FX58v}3hwOd7AYK9#aq&`2&&M~Kav~f@Bt(m@e$hx=^mu+|7kxqZ5sB(! zW)x`b?%sHtBLQNoBzPT+J(9Vgo|tVD{NVd9ts&&hgh&RXFD~$t{hpNqKq%`_dZUizj%*u=bKcS zifvt|w-N-(hY82RW^!NnEO%C4oV)qzy^@~d>;e&yVs?9MW79a!%6l9}CTh+VnqF92 zH%vJt;g295$-#Ef##JBL?=Xr`=Ju^3XErL_bj0g}sd*=E4V;dcv;P8Y_&b(>;JpTx7@+wUP z;qsct8{#%+@L$I9+t)d-+K{t>CKO}zai2iaa}>aBM$y?F_q1|;4ZjfEQphs08Qn5T zEa6N4gMDijL5{LPC2Q5%y@5A}kRX=_e1Ug>i7~=2JOZ5*nus**Qlak2sF~lHJp=H#gc`^B#GUd))gL#MLY@KN=LRj4_wlQv7>`(tTYAp2 zY%=Wxi5Ei8cpxp@=w4N>rC_IM2p)S6(d@oo<4HS52$d4wcD84e=5th3fX3)dJ%jkB}NX2kvE;MroH`%R2}Ah6E+Ml{S?@xbc$_&3sul z{^{k!9uU4;UI@=@s(IEx@&o7^ig7}H#f$PVEI#{jVCtZPsRyvpCpP@40ie!NRQ-FB zs`tQDj5?!7!+XRnC<+U{83Da_kD&28hfcNdpi{A>SKzoYx>(T#O?+2S-G>4DU*L!U zFz%e2Eg6S}E+Su)hUT?m0JB>D)PDQ7!Z-0v3f0zmE&5{^IYPU`KS_gv-9G9kCswI= z8Zd!(v-OMTHveUFywC)X(3%j(&}#}9iA(1z5m80P2uEgw1)YjwVb5h4yY@B71TS{M znd};e05xZ9>Qq`~WjEGgn7m!(Od_K15H*>JZuj~s+r1K20sn?mNdDhqdO~YABSpm( zpy7HR$u)8E3k_VBwdkLZz_pp3iz*8_3N>E&YvkY1Usp_FV4*m??mM>}mXRilWa2l_ z-UEK!wjC{|UpEkE%H(8sY@LD|?-z~pnFYo%ajX<{l@N;sZ0}V8yW-|Lw z(qa4P>>06;0XBg?(=IV5Ytvs+ewbXp9e#N`EJccs-Ar?g^^Of85fY#FAYSJ6k7#pc zsXq*WWbo@F#(o)iRSK(k;t*%Yt{)>>I&kq%?3rwZ)AU><<0q8dc`CrRZi!bCoK+NqysDee zST`bF;Fu`|cU@_k^$ z(PiGgrxuBOqYJ?S$`WCGDa-ezN}!9gp=AtXoe}3$(x~{q!+y!8&(<93$93F%&`!*4 zMN-p=8a(~msjH*21XKI&LMjqaXtxh4u{jKHI8z_&{+k> zGBFT*Tog0hr1x$(EU|x{L!QFSO2CFe0~vf!z-u_U1K(;->py}cA(ePA<~T0aGXa-6 z=MW6n9DDCWOfLh^ahCRfx`uJw@hvN{=hgJoe`NWN0})f`k6)PKiSZLu<-=zr@uY>A`2~t22h$>8@d?fQ|)#Nes4Z zpjd4Y1bDd9f;va@581BNN?L*Q_nVyM+JoBiUcDLdP0)(V6qetr5V=L)T|wH)Z>DPQ`Y?<$Ob`f?RE37cVi+kGL7%EBuExUE$>X>a#_9#| z)@v8HUB~)kH6)0pMl0q=Olf_M$7US4DJ%ySw+ovswaIf^ql67m@LzB0n##2dKgY07A9x=b1zyFXobtHbq> zIn&Jccfz#u_!%D~w~p0)j1)XGASnOzf=(`A3V;0m_8y>L(0gFH!`d`QK9;w;oIF|K zBA{IQ!xIM~s1TOecfV1#Vp$P$`HJOjs9yD}4v}@Tg?y4fluF1??hJpEwo9l|KNV-# z$zo8Lr;=tb^<-Eq9sm}V%J5pE-J*nR7S!j)DEk(1{nL`!^dPJVvI6&^_N%KF?L*B-)` zh!}=3BHY9DAO6dxwi~4bkvPUbj9iLAWR8NP1lt{sbcZy-Mpw~V1oi!|iRO%!1M4<_ z2vZ0gD-T+4*1LOH7ConFQYI$f3%dEC8d++p{Fn3ZMGyDKD;mSkOFM10vG9LHME69L zZ{SnKAwm~!2TJOrsY=i|QAm8Gg&shOM7FgK{O}DLnrmVk@P`{V37?&(O#+5*Q`~bJ zERbt6`#gNnd&48A<7#1{X^~gA=Vo~zUYBk^br3X zJ!?JFpBxw>>X8Sw9Kq}j*Jd;fJhU%d7@S_$mCQm#-T;s|f?uJ5i}Uc-*ARnP-vYLm z>CNRd4FBSO;C5(+>uaeq`cI>O%?mO>McHI~wpe?MOMdT}!)I=nJ(ah871Y@0VWSr* zm_bnp$B9q?*+w#iWv2`7yOo~N2Xy?Sgkt`HWw z1umm|cOy@os{JKdyGbc8jJAJ~a z;vN0Zd`wi1Fh0_d-+WSs@WBxSJ8=f1ciy)yZv}es&D=c5fxzx z9t~C&%ks5A#MwTA*u%%k+_jE89B!w&(Qc&W9AZkXVBZ28(Um1CvISjzpxO`B6*uaQ z(R>Ft$p&r6mf_3I+_R;uD&(aQV_1Aay(Bx5K`yhIjw<&Iv};F|eO5FzyT z=<&4F^`3gqvbHiJw#LF0I5o@;#B#YN?y!XUsYl|p zOLzgr;q4Pfdo-z$`w=6B`M_y9(<0!YoKIfsq)M`;&M~smFEVLii5yXg9RwSM9ixZ> z6ba0k1eY{A2Dw8hYoJ=&cEg$vNVw8~TSH>liybG8SXk68Yzc|mL*~p7bv6tIBXt+U`8geY`e-Gf}M|5g$`(-5& z+X`(LB~7ZwP;lUTES6y@Q^6&3%xQ~focww`^Bkb1StW@LABx#Yr8rnsBRvlr^T z>J$R3E<0srH`=mk>Z%U(PqS=#5K&_c->W^)u+-cZtc`(80zVu*W%?b_HXeSGlhKI;Ed3Saz}wWGLg;ET`O%--pe#vCI{oVpTO)HA z=lN;p>SNuHgIhYHL$W1n4!yIM#069rLAPG@x=nm1K{`PFMY3&O1uz$Yk>X+%K-#xm z6S#d~E|2jSJ+U31To8auc3Up9I>-fH&d_k~*4VyohsRzAa-aZEIRxzv&!NTw83SPv z1xe>I^!3OYpsodKwUvIhRH9xoB2XaY{u&>7jGKeoj`3vzVQjc2ZUy;lTd@0PRlox< zS43;K7^EJ^ipgP-0uEks9!=?M=C$dMSr+i@2bD3XNraf>1UxeIl;p`_lpD@q8@RtH zM`6tfRmQ8?a%i@-!V(;;T6W%KYSZ~6%0UC58=4pS5I7(lUNbSfj3t;{>aGuUS?@?`x84@15Wh)>+*%cl72XxQpZbSVu5z}~yprPBCcHF=Rbrj*+J3d3^ z$-}kr_8F1Bf9AyVKh7PgqT6d|-h;Q{XB%s6RzW1jzXD@BF(WZ?x*4b#VAm`2cis@x z6YZ#$pYpoOR(%vbo;}Y|+7KvZ;u@OLWY^Cea%$d3PJ_B7W83n5Hf3F3<2yD#eI)oZ z6a_|G8fB_d0#b{+RW$+^&R~z-{2m+V*~jAc15F~av~0quzG-4Wmzrk6aiFdSUk`9Y z4>bX>6TtvenRtb5A8QZQ!1{7jZTxi2+`nK5iC(X`$4}K_p!U!OH%Ly>h>IUZ5-#dM)JN`3tI`kXA16e^O0L)wm1K#^a#11anc;fuTxG#9dh4v?c z200F=AD;DSD0(A)fCg)Q>qN=T$Ng(uT+nfc>M6o;Xp+TdC}s;(MK+UG{G#Rvr=6n1 zpo)vOgjk}6OuFl?PsxiD%WTdHCv<(no@@z~`)+OFik;-*m378dZp_S9H3ty5u z0sbbP$L1|4OaT`SeOfzJAg`mr#43|rOf0V&0g9!S$z$X!T%tp{2Iz)bND6cGcw2{2 z?0CY9;B&l<6tVQq>$>BK^|~k;>rRD~UwlE$1(s42wlg%ZOXF!T&_fS;sM*N+JwsTRwUUo3#jTt6X&IwUofCwV!N0L9P2FA zgr$MrzDjQso}v)l3(+$)iUn?jM2FHFKNCQh8c<4UoZeiZc;zPGOiT6Z zR?i&F)IEtbM9ocH6V2pQFRJ!TXVRWgXb~p&xqR;JboOnk z&vs@w&vps{<6sKy0s{I+qxf}Hosze<%xnNWjlzF+*{zZm_mU*qId9yr}-wU18$;R^IEEC733%wrr8U+`hs2=U?}tFrF>JPg)&@eL4SH zV2+JYyq+kk-E*&PKklKpp*kvLi`HD2jeTDpoV)i(FX}J7fAa@Ar^2rs{t)|bz0H`W z_eM03fpT0UCI_X)SLoMaHq5pNobzgrj*ur%9K-l1^lU7ZVD-s{tk3BEX*q{n0Jsa( z_oRhU_6B@`j85;3$bPi4?dd-GGmmwyA94gz9un5o9IkrY;vZ5J12ky#QOTa0*>d+ioq_0>=dlS9Gp2|Cc@T z)|0C&!1>}a{%>KT(D$wP*DXB)-u1?`AHBLKJ!BauL9kA-19;aDxCB0E9gF5yULdB*hsW zuGs^3dF+!G94UXTPWwqBi;-Qr(sp3P`zwVIl`6j+%d=^1>sJPfzakvXQhz$5>(#II z;Y$BR?)x@aB!ie}s_TVal(ZA74C{&xhH0hLw1N^W@E-AMg~V-e9@LcFG!WyGB&bkXYE^W|K0J; zvHLM_!mZFRc>*YLi;o}IC)bojSL9w(SGzhmZ_UHgM?cA3@(4jQ5dR<#YpC!5;Z!y% zl8ULG79uj@3Z+T3{?x}Jj)ESEhejL*j^Zv(>CTO7Wqx8J`R+oGlepE9Up?2$(kM)w8r6WhS5*$j+X9#e24^4BEBmqj^<8UiD?WJi z&%QXDm-t-J;jGoO&VWvQOOaJ5Jrq1diX+!R)cTW#yb8p`UcMimmgKF*;*O=2w*s!) ztIB{q9{LuiHDZqAlOAODDJy3ZiD}#hm*KBolEu;&kj1iv!=nGoFQ$(xA?X}L$95@2 z91`e_A+Dn{F<>o<8zMh$pJ zgGuXtNEp@D$oaJJHj%AViHN&XfI~uMK3hrlyhW+_4KO9Py0$OxHeP0x%@I*WA~e|S znZ(56b-f;;kd;=z9`2-J7<3&`DtiH$@x*T!RXGht7T=IoreQ>jQTxWK^Li2fFe75x ztCV+at(CV7W~1{W?IYlU^@z82^kFaxniVdf7O=HV#AClYuAGPa3UOwb!XP@;TAlvW;#!dJ~tfufrfTPY^HXDkwBxt%d)J?u>%b={{pZW}HLe z{wF~}4bgGA#o+T~e{|x6*_cKAvvSM7`LDE-8m@@l@@Js2QP|Vpx91CfQ;)KH*g%4M z5-GCnKh=4i2m#v&0e$CbwZpFQkJ-L*(e5p4(s}Lt46tnp{nE%(0d;)8&FqIMUS~_@ z!i;}EMR(jtJH*1B>$PpI_=q_b-HqD!dbT3mp>jeaBDX1{M=I3wR3^gOAwuE;WAOco zq5vB#k^ptwfuL8wA{MHxR;Iyln-NTQ#Lt4zit?7$bX$j+QIsnr`;kEk5pAkSHs=GFE!NW3@JMo*852 z;tRO7=&hWuqF+4o#2snyxj|X;yu_;^@kvbALf1}%?LXo;O=02Yg#x~S!2|?b5|ZYF zUbZ9DaNwfhc5ha9ALMNHN*Ux3`Ar&CMK;Ah5YN^0J^uH`?<#qS>J`+X0)SI(O_R~3 z4?T?Fj+>|s*F>6cPu=3Lj$aMwRr%3zMzysTrDGGDq5J!HkY9ed$Re&9cWTqIspdHr z8`e!fM25se1G(rlaR$wCqa~_W5HVGzy6$16viAK#q= z7e_EYA~hX}`Q)hKKlrfQ#g&H?)M?@PNiLqNg5@*~+p++^u>fv@ZmdHdJdeeQ!O*4U z^x`xbEPKUnAHpg{MP#f zsYU}-k&T~FdM{D#$QIZCb#T9Eo`f7-*Dk35R{jMHnpaaIqyLUJqG)MBePO2PCl~g= z>8)MEEaQfd9P}OEj`%#G-kySdPapW_(CFmUzz48S)h8()YqMo!Gh0s*4?JW8Of==+ zvP^Ea=N?>FOVlDpqmD(mCQ-2vi<71i-az-Nu(o<72pkB^ddCNq1PWmg#I~MM$<$w) zp8r>*=p)!8qzXO6szoSYqp)59BBs`aUL5?LG<-*Q9l-B>7pi`2L8W?0CKD{)Q0eu_E~alLL{QqdnojFhSH66Hl15?dy& zrT5(Ozi;=v6Z{epOp8N3m2zmif8r!O%VICMe0aaR)qWAASk&7F%xu;Ho>~G=NpUa` zNSTI%5zLY>5$)42+4uog$9-Sku8dRpAJ9o>taMFM!G# z^r2J&6pPHZ>L+u^?mru}E6W4{<+$o7jwjFzP%MBceEUMN;}&v!4!vWbtHrY!!bD*b zdxlGqX-UvS+-~2`U40q;8kTbMXWQ#3#H2z3rr8mB2;|q>)zvr6h4%ciwf#UPs zfc07i3b&2<4@%&LG}CJ_(*^o`m*7ACh?T0tUd4h6izue7ZqK^Mvo<#0stnmx7u*-J zZWaqJtTC@G0t(QpHwsJMxSojNP$Mh3cwy3w!>s8P8E4w$Y?dq3IHy(oO3|sB?lCHvS%PYCkhClV_ zRjps8ecE?QO>f;<2=e=^tj1ABbIx@1NxmbVu`sw?ecNm}oU1bV5ZfpEx||0WYacZf zTAp6wx0=RRROdJhm;DZsk)`BXmKcOoN@*5?e#Ca1H4l}0c0>vrf-gOOAcFj|4~Pzr z+S4CjE|K*?%B(*JeAHZ>^2NKH%nUWtR7pP;?ZJ2hdc;q#Ob#kdI!ReQ<*P{*+Ujch=*rj1dn6UFfiG(0 z4zI$naQj35YRB26#9Qm=;_@2XFQLrwL!j_jH^PnHE? zXh{(w>EK6=Fmml4C`ZB42afu*SfoBZbZkxi8ZM|#W-ci~IjxwONkO+ic+<1&Ik2Kf zG}$>h%P$+jf_VZO@c@n#Fy?Sja(-D!T6{Xt4cAk6ya>5RRVN~KL7Tb&un(3zApVGR`hHnFDiBE`$(BLbh^;fMW!F=k1A4;(Aw~G3Yid;?$0E2do0_?N(n>R_8%v-{1m{v&MUW02APrQToC1mEwbaqcJma3XK-ez85T zIpkHN0k1{PTwBZP^bqE|N6wRhiV|m{#$jpC9}oQfM+0z45fAg)Das^Ig_M1pj;o14 zSlGPr;sOil*7C$g*WK)FRg9Eo>{)i*n|^gzSkLe08{I$b$9+9HZu1kYL+O)R)&g{U zKR@lUXoc~nR^cUn9*d~JrH}V9kfqsLpl91f5`U!v8x*_b&f$=+SaRO&W}=ed5X2F+ zs_ItT2@BM)7-{9Jq#kBL;cqIN^4XP(P+X3wN+DUa^Q?>v$C_vCRT7Nua zLy;s?IoO<8N&{TR<*uN<$y4uokr#3xQkwW!DlE!LxHn*&xU-0rE-Ot%$8b&xV0$GZ zGIY;>f@@EU|1R~i7tklYWYc9AB~5@JbAo%I<#42Ba!e{hgUBWl}hTk5QO9$EFZN&*62Sqhcb*_AskPtp zj5sy~vHWW$vwjYBMhI#*IA)U-#bL4s+UD9&--Oni{BAzeU3Odby`n!95unz4cA~$- z#=v1FVA*a7;aHDy$gkNu6%h}ITaxayI2m+DQy{e`w>sMp34Fz3l6*SSrNsSkul6i{ z%I#@X&RJJv7$)2&VN=ID!nx$M^_aKi-G7Mj6!aW*)>hVL_?+Y{2{p1<&)9AFY~Hfj zIS=DY=a&~DH5SB@Q(jKTbPS5qh&eqgcVh9&Mg?jm71Cs=@WB9>(sl3#VpCzqa1|l18g+`n8#MkituY$$l8H5z=LZHKvRhzqQnrGLV}4b$i6P+;vd;*y}S>8eLF_VlZK zA%zna|6Cy*b|%)pi{xQ^auUAc$xACw0R3H0kFJqSor^wN+)!-c zNiblk9EpUK91T|**0&XWXThflj^!Pfw)BKGp=qGBbS&m!-{(skF_X>HP1)(IE)#S% zN_bpDurr}u`k6v3$iZK>Qx1xxqDJ}~86l!*^n95EuKrcG_$*r2Y-aTROfk83f2eZ! ziOXT-?mH74k0fm7b6)&eg5IGE1w*4^)LsR-J5Qy$Mp0%O7UjmZVn2qb;Pv895|d+{ zN^JVxV#ss^NKrI$r0r_4N+wyIY0qNpnyxpZfO>;LJE0J7;~>CmIgI;3I`H<;jCaD` zFAdk5%suDIRP}x6w55wf3rC#mdvrl#EOc_tX`4y!P3V7PI5x-WxBc?&`KS|WV5b*rv zeW+af)}e?7%8@{<5!OMyFiYw@c-wOt6AVjuD`N@7d$G&dRp&gCeK$e&k6*IxV5 zE*5|3K}U;^VVYEjywe7`LXf(XkS z7*4fRYGX5M=3rxGXH>$up9~JExZ1i7!9Vj;GcYL9u8AyUE%0<$@Lk{ssFmoMq8B87 z3hjP_KZsbjOvTxkxJ=Z@c}<4ucelHMYa@98wcqG8G6TB4!6PpME~jO2xe&@U7r)D6 zv^s^!WoXUoq=8Z^VPxEu!{uyD4gnXC)?a>-xJ^DYbA5QQxa`z1QVt^y3PcV|k&j`| z<`zJ}q*#A|yzn88sf<$8@X_4VHW?!=m<#uaQR*h@Ng?JbT=Lz(sOzwPNg0i2+?KVD zh4~y#SLfL7c4br0`@s-A2ykZ(!=OtvqE)IoD8QP>Ds_3X_=Fmsi~K0ws4#kNP|pt``eFKJ{5Q0*nHwfH|?bSj?RT> zME(EKbQWxFc3rm(1b26rB8B2^!L3*!xLa|GyIXOmcyX8DP#j9IA`h+wiWRrwcEWqE z?>}T`?|ZE==g3i%VnjJa84k1lvMZwX@<2pF1qub6cZRSwsZ`f+&`=33lzc8Isif_r zkUF8Syx8RpDLAGPup8K*#qR=v^>R+Ma3Zbep_rH!7<4}|yE53A?b3%V6^I-20Ap127vuyvDMiB7VxR^|!~^?=O{U#1+o?vVT}#*6A{L1i5@ z3xg*q`T$d&8EWbyXr@pAx&x2(Hv5_bkcFf8s5zs6loKMxC;o7l19 zN}W|&7Axi50vOE$a{*hxtlSHUtxpsCzU$md6&{o5vqo2aaIMFd03fQis z?am+;#HEQ?-Ld{gn|;8eVErk~eMXND$?u@JBrL+CL&w20MW6pU6s-99 zh&&@=28|~5M3|ao;8qWNU*x+y+#r8JXg^h)DDI1A4|FN)WB(!AdxAX!C}kgXx5`*> zk=Br;E!grGTuqo`I7VT>{kRFgEX5TOT8G}_A=PGk5lR??Rb4Nha%;Wu<^Agr#UPi@ ziM@&a4xz=Dg}N!K&FqWJVNocWGNfhM);!#g@RH^Cb)8ohYocRT%j*g-_o%{NJ%Zar zs_x7)%<%J*;n*5X*XDMzrSDs4Kjm}=qpH3S5G0^mN-Pecx7^?RJhEl!>)IEUb^J$m zOSmQhN|SuJIMd6y?sNLrmoEud`i(GWQn*Q<>O7I#G+2x zPqdVTTu!38HrtRPyu+A}DtswNmQ~f!@bwESkNek2IkyK1Krwd4baUsDS*Fv4=;B+O zc3(qs`|@;^8SMb|Zzg5JcMKRiFZLL(?;nQTPuLA9tw|KP=LgL zU5oR%s~U^Zgd&A#b6odJ30CF!_O|y)SSP(k$hQ&-%2&!U{u?!QGouQOK0G*RjNuXX zhk0W+@!Lmj3)*HTA&cpQ`pI;H>7h8QwF>L1^7+b39p$3+Y0|2E9^^8recl>NKsp4J zdj{Q7J!bD+W~|N(NBs6^e$9Nj(DQ1 zAnCRds&}SX8L4gTN`~6;REhbt!$V*{rz6qct6(T_b&ebPi~Gax=F0#9c6)%lkdv;@ z(|GUG`1RbiNKY+An=Q)w`IZVyh^YB7u<@#3qW7L6{XdoJz<=o13J1TW=!{UTqYg>y2h;Q9vn z0Ag>Y=0=R5+CNU8Tz8-@`7pjGjyqtrvZOttxqzG{V*lEL3{W_r|5}>opcN=>nk+r& zlGAe3hD`G=6My8vv~KA@?mwhO&b^|8?lD#8!E1;(8a*@J1I*>ub+k{Bi5SC$X7FKG zJj_r1RC%;F?C$q_Oc8^+sI@8MxT3Tps_(n`<{VM~eLuTX{jMRnUtfBhd*yg_+}*tl zgx%nUJGqDM!K$i|FFeP~+(?Ef334vO;9Q(IEZop%oSzB?_h$?F&z+U4oHig!0^F`U zHo_+tl)hs>wAHu1i zviym_0t~iQ0xD2b6=5KFvBDZ)|1+)VUjYqXCnF6e%WZ2FE0(qN>mChig(=ouyHw4R z(_0}fC`ETM(|#SABV8}G>TuC1^{4-|ptH!kw#11ycm?!HQq_&^KQ%3uxj~rr&Kh$g z2hPp*g95><%)?^>3AWx3Ul&v<79I{#tI$FR#M0Bt2_9K~)k9oe$;L;{{dI)Q&WiBr zn1->z^s|*C{lT$Pgc=ne(ClXrXsczw`MBh;14vg&17TXU zVfxFTga>5g4nPqZa^qKBRnmEy+48Gc+2ns>LlTSEvMqkPu6)N~TncT;&}NSgj)`{p z=`(z1$Ky?7wL+0!#K76DZd@ohCL@j|(ZD!P3uZMgO?JD&U z-OPp^Tnxy=7VV$6g>=1*h>t14zwNCTIs1(p#|>-oZiUMRJt++U3fh*;S1z-0K;jY= z&DFkHS}yMI?T~QRlXZt+UuN>9*5$$f?h_IA(Zh)VM1c!Ut!`p{6k%iWAU~7{Wm{ci zm%599Q^NWZNg05Gh1hV%gs5*1bbk~X&V5J7b_G%sdc4`ysl}Ogt-9}&AwT(Fx;GSf z(;)GWYn!a-n-3ZyLeS?IDMlczcjc<^`bPIdYK%c0T(GN%5Yv}hS-yd#mC@_d`R(?c zM?{U-(6}*2z)_yll8ofs>HKl@$)Va8mObgl`}Xgv6VT^(77?K#%8ocLNtLg#`p?!Q zgsD=e$7OMBTkQV+0J#1ChWHzM1k2+5zLt?Un6Zonyv9>V1<_N%Zl>?`$8}HHE99H5 zUvcF%(sZZ2DF7g8skzG$V6?iKptjgqht?xdPTE{o@&^Uz6q>wmUW*7f(=+m9qlmc( zUn@3#Rq!d$@+Z*LH@mjF&S09D4^H4XbyVF}oHvPRQv?mADPNP~*QghrnOy`JXKTUj zSw@lA+_I*KG$%Ct7zyM^0Av>Z^3<;~;(-$GJlJ+m?kVY5N`y+wyXmTh61=0!U-*St zpHEUl{|-p_xa51$Ejpn^xKoydztzuFQA4g0qh!0xTpz#}SW?nk@zMiC>%2Prb(Tu* zQCd+w^epiHki+&9?~ncbNB6}bfBjqkm!==D%D0D0$=kvnzS6e;jbK}hSAP|Tkr?L7 zSa4hC8uDRVGDp?btWDAIZ5cYmm)ZIUUy7=12p9vJhN~!!D@4JT7NB45`!ahdSxn4Y z1I+w>5LbA`EPF?9Ej@8=d&Viu z`S^Xl#e?_m{)F2NGh3037t>NsZVnBHP|zzcIWxz|VI~Q#o)1go0Uwmyzv7O%@1 zA2@mY=Vf=oKmq+m?5^2;i=wB73&bc8}ZrqiSbu!IAcMT z_AC7GHuU}FYr5|TP)8OL1D6{%eJGcNKVPpT`{SD7A{G=C^`7;dM&@OU`b82}P8DQF zq*ovGe1ysN`1|bH7)W$+^g1ZcG_Skdg*Vmc|`2E(%tAnrr z*IXPd%>{pfEHog-6*Ooa4o|~cib~$AAz9)^iBnfd@%aI!mivh^{MCM{#%M#V&jZmR zm@d7xsy1)sJzF!4M1yu-<>2J{5e{zB5%ufc@YHi5rT4zrnNOk~#D%hB4v7UDH6f2^ zarmg)Ma&%Qr+I2^;XzXxLkB5`Mr{e_!oXMujXZuJmv{ZMVL#1s`NJ^D>Q*GMaM#RM1)fBB?0IL7l^h9K?1> z$cpakB~X2>sm08A7&mH7AxxwoX19#GU-;b6m1j`w%6sK*~xGa&I> zGn#(7q-A^#a80Rm^(>fOysT}jOpxl(b-nKiIay|CGW{}wC4sdoS1A1K2q(tzp+6q(f)65%JN>uN1T5g!c|46Ks`rP#_6J! zmT+0aAIk?N2q)hUs}zl!HWk&%h?V{pm5d6bMLSrzoZRB&fb`6N2QvuzJ>zRAGKTC^ zNnBPhhT9|9B=6^{6xCxnU)19YE^P^^{mWXqQ&`+gH?vg`v6nws_4j~GlSHJfl}j6K z)8FOF=c@S_=^{-rd}nS7w2dZ66Mo8>;#&&IIvf;jUt#c?y=q>q_yN;bD?@heSbbC& z>D1_l8+5u#V_fUiUYed^pLQ*CzzSKE^+DE%s4!(m!|j*TvzN)LLg$?vyDF4&!Y!>- z&2H$^Grq(H{>>jRD$~k;dvI|zfU3BlU7f(8m%z&Bp1kj$SG_YCOtY%?Nts<=ehYdo}?H=BI+adlwolB09t?FCt{=3@@K$ezoQFx(mCabylpnqV;6;}y5 z5q*+48})Rw$Ay;yo|em6kO>BtM{B@JY!EQ1_)k83*!aoq_yKV~%+J@^Yw*_l&6gAV zp&VFWcm@*Zj%-g{!i2ys{zrVkUKaep8W8viA%)WXk9j?C-*{!Wd+<7#F89q)_^k~v zs^F2pvwh<0Y)DR9O4|F){5>?#BJrV=BVe>HPv8$XGoE_Z ze)&uFYn9um2QA+UnqN(Qqd7ANqKxOfVCBwE#(&eM`*WtXb9<7RQVd_gI+e@xgf;2Y zCk5aH^%GSb5&l|cc-BkaC8n{P%DCasm^BCLY7V^-f4$BDv5`S3<&fp%0`r1Us!rNq zJK%Ta&@DGBr{X31!R}7CgaH~2J>3{j@^h?U>hLlO$^UR88;JJyRqT3Q|7yoGS=82J z5)4_o9H-(B341HcCo)q|KFPoqa zq~q)d7c*api4AIs)DPlRYH1cNnaAGgrkA?PYGde;eNxdCX3(0h7=c{U@eK07_g%wB z;PUI%ej3FNAXk#@*9{@toaQU5sL;UXD~t&Zn`o#_+e>G3NRl7qZ#Q040BDZz-oMl6 z7i3|-DjxVy=aep6;Y@QE2ck)h3U<{r*>PpnF(as8*3@(^$h9L>I#wSqOaTtu4Bip= z)RC=zV3r$UYqF6RANbs`#xtqs0sik+Rrv#$ zTlqtq=SM{74Gv_IbPHna%jWDiNx&wD(b9_7HNMstj|2eu4Z@*H>+rQ=C!p)i?&Tgs zWke13YmlwQXn=d_7&r)%VfUrF699NKmSBnJp}U9E`4=R%*OQGG$0i4V*vQGrjpDhz zrHJA(+LfcH8%cvS>bSo;|~AzW=RJ=XN)phyidu zE?s;14||a`d}$^8k{FUsX*#O*`cLiq3H`T!0vS;gm<&jVfH@apJAdR)VQzVj;s%2m znCMc+N%=R;<;zbE*KRlzfOIXFrqj1lJUP=#QWS0YOq7FPz@h~|Zl-ykmHE>+JK0EIFZ7QnyrocMT14sMp>exjBj0=sQ z^EU1&HHQLb1p;P;7N>O0KXL_13h#5}w@+=I{WAC_jC|rhWwJs>D`$NBV{!R9 z;;3I$07X~9xDYgoB$c^Di64${kV~ax#m!zA}Ai6VupuVT@f#SqKU3HgHI; zI5hYqx9cOVFm5_P0`g?M3&?9WIrb!gmKFBb6^}xkNeA3bw(PFt#^{>-@q0h)5_kNm(va_=lN!&{_i3p6Zznu5HGbk(g1QH8#TaF} zUfC$r)@l%}!mpil>2873vEupsMqd<1Q|00noPS#Urv*w|tt z$wgt3&Yuva?OR@I^j(x2Z5*4pS^jEzKCl9b2Z8*R(jOmLjYTb097L-jaZ@2gp`{8C zyVOE7eub0NxPS|Rau?eXgU+U+)dHTUm8N}KJgo6+=0DJZrD;_PZ=MY&8Ho_ov%oOK zfnET?uR0Xs`IV)-HJ8F?$*{qsgL_U(#aaejPR#OERLHnkP_hFdKm*-?ZCtw2V7!)% zJ)Jm7COzJV+I1R!OIgz^f(qdsE5}W}R*UVFEL1IQ$WX&3MU^)@j(4kznY&c4iq{$Z z&U)W!BV>dj3c1nk|HF3cf8nT%QC)Z8h-0&rZAG6hIU7?!)1?j@s)0AC|Y7@u$ zTC)!M1PU$yAv^--e!R1P@o(7rPXbc+mU;d`=Z6E*+v6gja{&ItnX=T}L@?-kg9P_Q zkv^ZoAUc5zhB%>wdsY5~;l!7}iH9oAzO#BdC;>L z`ZH`XmaSKn>mk`BVSG(xYCJd-bA)!oFS6c_9ZnIZE4H{c#?QqesoHyN#le$);4X5H z#Xz|;sciD_>G^5uwTtC_+1Xk8cdg~u9krK|iH^<&wF)rcN~6wLar-x=$INcUP`zdM z>b+6EWIHj4FVywYl?+XBZswbvt&h;r52D_y5qa?$wkP!;Q!6#dp2f&FSX_U6rBLy7 zcZJ6=2?%@OQSipMX{rZXi2JzCWL=o2YC`qxX&OZ#ope{U1Lmw)1dO_FLXCf;^jXp6 zJ(l-UK|KY4t^TN|Fh%}3L8GRw zcu_`-F2g98bMJyXtBw{jY+^ldJ>~Na3@Vy)^<`z-`F!XciDbzaFqfr4-gTU=&8}Y* z$KQ{;0!?JsD?o^w5o7ZV@cI4|2#96vExvXseYupZUGq=9IoYU(;M-g9 z&M?0R`$Z3&ig&!^u9>RF zA&k_lSkR5nX|szPW6BDD^4PU?Dw*)!ZiXI}YpKdrvA+k-z^^v0Xp!dYkaEo&_$sC7 zQYpn~tD1kW%r>-=Rh`8C#%PR)@pGeQ&xxod540yH9q zE91z*xPXb_m&`hfRKt6*ZUfkzp*Xfx3Lb=2tkUV}^~|VRd@%Yk$>w|+dYwiXQK_u% zlD5-xS0Or5la&cyUEwC=WLBb>gPLNWk{ExULr{rWExl*jLWoe&W>}ibl$y*^eAijo zp>(O{ik>pejWLg=M`M|bLu$_NMRoX2EpSsj$#G`IRniVZ*%FURz?DnQXi3IOxOQpS z+S%}usoJc&zDuEAWU8>cTqBy@Bk?Ho7TZ1c$F8ZV$#fQ#s(O0V()t0!GJ=~%@HrCV_8V@= zEWSV2Q|RUB^C<_-=3ClF(%aYpQ6POz>pEpsTK2G6|Mi#El{1^e+hT5<*6d|zCDVXb z@b`J7KxV|!f)8TRUQ2yIZ6M5JWf;5y@SwiyLq2|azDNw}GQLdtmiYt09I2YIvEW0w zhHQdVOyGBZ=qu0n`;Sd$*~_QR-2+SBZvy)pM^X6`%R#KY)6O$~kEyJqT?(Ilkqujz zlLSlvnnlVS@dQGprzK-jgFNQY-fOUh)5G%7GZQQNp4Obd$g(c=6~|HU3=%Gs z579i_e&Kov(r(FCRMxc?X_qPLWe42O27{?tinkNJ}! zSg9m0dssC>$+x5GZOIvqq)qHY+ei(YYV(oQ=hzib+=2#-b!9hfL}!>OZBmkHxm#I% z`}X+1kacpnu1NbR?Xd9L(^eNdyMlE?(v#RDmI=7jD>CUAR!2x_9Jy&wx}4C)6BMpO z;Gj`hCpzWiIV%9VkwpJpOF`ars8!uAFp9SgqIOgqUC9S~4rotIOdUy_KE$EecAwlJ zSNFD8ygm&Or&&h`ch{*CfG!;zFg*U;u~7D$K~5$7Kgz4tu^NjO4CPRj6$F7sXT&GY z3^cqN?DcT%kL-m#FWVDxMV&&9^z^Pf%U~>Uc8lP z@v~Y!N;E!ZKjD42DULdR=lZ%`5&czN@)4%6v+!7d$dx&Fs!tRmc}md>hpj9j@5jGq z?J19F%poXsC9JVRFfh2K)n7p$34Uq{>Uzk^B~;Xa_bbOP6l8_9`4!VuNPwksgK}Wh z;6$s8&zs`U8;ZV{>p#=p*QPM10);+FAtcF$!52ev;Hi`vp3VI`tg-je%*U|t5RJPO z@3g97CJYmi=$HiN(Jau4ndj6H8o&A2sXA1s!%OfEjJUz`l~(_7m?Q8lphM;k*%l@# zt_$wFWVa{_|GtVL?iDbsMdP}n?x)$POHC+O2MXs@rL{(hsK0Ec?3FcJu+i ze$i-29b=|L#_a``6k&mqp|Q6WFV^>f>m-qHnh}%SBu83JZUMm+W=0hV z4GRMU=r|rnE_YRV?IABA9;DBgbza@}^0(R7McN?%p(ZX*$d{+(@6UQ7+DWvt(AGEB znC}nzJnAML!uW2A&Ft=Epm89!so8Lca>&qvg~z>eSF^K}ur#wK1F*rxdRvIJkpK~I z+sS?b-whYxB=LDEak+bX>gm^1X8OX$)5Jz@N9NJXhQNk@6HUW!SiR!$-<|>oP>XlR z;n!MnWl8*POxIZR(4$%|qO59~?RKX2H7Fm^5brI%0NsC6SF3L|NUKfMx8S#8g}l>{ z_q_%i2khd*56n*7BDFNUp<##qi;T?_g$7R>zT$CPK*)_GeMa)+V4+ z3i&88sn#Fdtz`4R!=KNuZqFG>lmh#(lslz!DVCS#I0t3EtkUZ$*q;KIn8je!@srOiZXcXKQq6YHGWn_tR)+QO{2~cUN zwXJ$7a!m)07-W>T=`+@w{T-o(-GQWwkO+ch-Y*7m7McOPx=KQ!;lWRIkMuG0eq6=b59z@vB?BNnZ}Zt;$bim=p1^Mo`mpWpiyh9*b#c^e_3PKp1)u zbt8h7M%Idqh;c+yK5T|Day%RJ@$nRFaF$F3aNm|h zr%8bPLFen^?}M!SdiPG>oGd(Qox%tWGj}oVO*r>+c#M3wynSj}gb%Yi%)r)A>HXJ* zz*Q{8i+%D~$0yHs6B-k=A5Z%>AxH z%c@K4T^9TO4?9N!F5DPa{geGEL})*P!+%R>x%!JlY@%oZatCb^FV4nWOm^}|7Z1^E zp9HP^U-V$!*02~C1(G?=Bu?F=f;rmT9XTf)Em$j7YHg4wp6Q?Vln$U`tdgz0MGlDx zj=@up2L)FdHkGIiNYo{5I@r)B*BZjx`00)_SKGA!YU`&Iw+WU@67iW-AsyvE_= zXiD|V2QcxA7)Run5wVDulhH!Ui^x8T5a$~5S=x`Nm#3dh;)Txl8P3ZYZfTE!P%_LJ zzoWG;wYL(h!!1PUN-;l18avjY?GZGg1RWZLeR053+IFwE{m$Fefz&*l!75hMbA#JVU*OHE z8TWV(%o7vP(2N?J$uP9-hlB4?rbmehJ@*){iIkF1r+_LI)&0m58h^hvz)hNX5*b{B z+V}}2#tXI0ll(sUv$nYllkGgdWJ$@aj)u@7T==*~#_o^To<|4j3v6+h%jQ3-!wM;| z>I|{)avwV-e22OUq|VoKTuLz)DSXZUc7%Og3+Au2%8@%%G2fBx$M4GR;9%*JrXz;D zzYJ4Xevj-veuDj9NRG3nSD>QPTspbuTwaa&{HqZgF3OxDccw&( z08jeCrwX;>{dO{7uDX%ekFiLehK>g74+9q%ssFF>GINC?q7{t*HdvJ`9@+5=d4_eq zKcksia@4xMTF)YQJCZf0Y+|XxZro!O8V@B;hce5%IxNyutynrQV(xZ`G4>b1_kQ+a zufr}RWQh@`J71HUVkha!IK%yrKklZ9XjUv3zVx?({5IZ_R7GU(biA<_gwgTyi?|Qc2Em4v}0frHCgK=f-HWP5B>p z>SAhp)KR1{t1ylz)oenjMZTDRA0b3-n7S1FzWT*WYIXEO2*Xy_pU7`C-c_{h0wp63 z5+_~!DbcC`JNb8|{ zJ5+%=)w4>q#Ykj&=LDHXb1Sul|A|y8)lGH!rP&m@qg7qOh1vYvuAQq;g z_wZF3CU=gY)*%tVm@q3!>tqLxg%LRHi1pt{Da}YTy#&Zb>e`>)?81Ubr~k5OKrLRB%9Ow|{;n*6bmf7( zG^<$gomF~y=vrd#$&};jrMrV3GiWiMxWXlX5f(?jp;RvyaTX#2pNugIFkqzVLxa4GhphKt_qv~&F7wbDsnlKWMo6$Ma$<8zxN!???Ib)itr zJ{Jz@`O0EZ_H@-xgtlgAxF}(LiaWw$^D0GSw9UVH)TuWqC7Q|pFs0+trzRJNK2M^d zKSvsZ*zu5=)gD~eb>k~DrN%SNzO!{Ay&F89A+d;44&Bonaw!O`uYXw!_08+~1GxNH z1*4)z6-mvGJLHyHEJLjld0S}kX)tFT95^0O=-?k)oZ6TYb{|%I1!AMX6XvMBX@b)i>|4Erdbm^){~tC77c z+}-NrX_-L2G^IGnWyd!B^I}kCh|ovSQT@qAX76kDPz0igamG}m?bjh)h?!b%aWigI zpFq*L8!AC^W!933g$2c>?8w%Z|1tw}td?GXYs=Qn$^G{>gi3aoo8JF{25r8~i7_^3Jy)*_=I?_pvYYJCk9+ic+$gXaYVNH+GMLN_!;PCYvwMjqMre_C z&nr~x4yL)Y*Sz{t=d2T^TTXM>1QQbi-TFM)AMHMT_RX_)khC+jEmqS2&0ts1IyXmN zrvAY=4e-4D;Zb~jKLv|GCnw5RSi0V0XXIJf_a7uOjIT)~M%tup!!vfz zm$GS@`_j@wWhXjZqlhzMKI9jQG#^nf!7)-kXL5d)`3xq%>W*6#JuBLZL zlEs--V*Q^Lc9m|oWEJmHqfjj$SVm6ObUW%J0SY;kPu45$J^iuaa01-Cr-L&|cv)JJ zTDU9yL|Qq0Q+}way`4h^+3G1Ccj8*o4@O1(VXis0xE$RB?+Rn41@@}Og!9)o)z{vE>X=BtQ_S8^G|v_+_BWwI@ttR6!1>) zWtYH8CeLOMA3%SdirPQ7T9St)M{du(WVr7U4vW!8s~1p6^i<8yW7gKz8f-w;|B12I z)>MG!xLpy_Gc7WFa8mQFB2BO6Q1wUA_==iN!i@Jl#UA`Y^bolYJs z`B#JAj(Z=##VJAJrXewJ79J@${)iDNXlSXk^30{P?j(X7m_!pU=(A8m& zFX*KhIamROb$>jIh=2ce?|+Z{w@44KJ+9PP8#>z`<9M7;dxF9B%C<@HOVb}u6hG{C z;!Nav)jWPI3U%RUJtX`D z`wHnsIJl^S@qK--~>M!zIP%Z%4T4gEftvB&ME`fT0^1atuS_vhAv%HR&{j zGzjXMmO`v}tRstQd*rM!(Yt=lo`%6o30(yfz9>?SAGp!goypkRX*dBka8Bse_Ffb^ zs@r3gl2(*kbBF*ZQoP{xCG?9?v~$W%Mw4^S;PYY)a?bb@LVjaPDfDg#rHVf>c}+p` zKKvn(wHJ7=)W1z*_G20`aNKSa9m`YNqi*ZV1OdgidkHUjrG&(1(4}`8+IZ>9TG33+ zoaNdI^~q|~;!$J9Ev0%k5t2Gnp3LpqBjfcx@h{4Qm%&@xfakPpKd%o9J*9|ZfB$MP2a{vf{lHeCYDfFESzP=&|3tW>9Y7 z(w*(T4U{ZjP_3R-YihweO7^tud}czu`jgBP1DHMRWBA3klX->YRzkl(&QQ zAZ?u-k9((^PU!md(O7GIXkr5JD3d_mvV*{yF`5lM@Kx?f4lxrZj`~UvQAi*K=?Li_ z!3)6|L{l9|=;z~(GsNT;pxN13kYY5;uqWL{hIdfe9C{RUOALX=bM%s67IKR4hDGqQDefTf2)gloO9^kn!xef&U%0!B++f;Y8x->R5t(0_bNWczUmp4O)>uLdlq89(A*W$r z14o-n1JaU$$CYJNr{{$yP^SgqCi&nHVxnT~Mm|LO>mdH)MiH9^uY*4?Nl*H0-|mf` zP8e)TSLfB~6TRg*2&6sDu_AG-qXTHL1{P&V1wUu?` zU$2vaIEOS%gDWEy?%~LdH&eZ@!D+=5GG0P^IPA0K{D6aZOq`-Fmbh-j9ZLi2*qRVn z{djpLMjZ>Ym`nCyeq3rh{nj8{8nEv?iR}mg;Ed7(#DZJ8FF)%3XK zr~CQT{0o5$nAZNvkrZD|Sn>TY-^MGB-Yk#XHrVoLSmNcvGgA^xyf&y1L&)?7PGimSgk(g(bko+4X@??^r*qPI)Ws3NNFQSq81s@ zFfr)qeR$6elr>GvJR>ob>l)vgQ>zScBMSI;KLe$5>^tBO+{Eu=g zF=v_0%bdFYLYKQjlJv`9WLG;iJ#7@AXUaH3ADmg-?j~P8c4mXYz`EnF?TP!J1Yr~w zmT~+G@q|(sNeZE)p~I-70Us-viZRo^Ywc*3zB5DA4X(jGCd51agmXi1i!AKXL_Fb(JSz@||0zswhF72$|D>gzeTG&*TT{XIog^%Le-i(_&fmMS zm^x9>*rJi#6bdq>mCoi)Hf5p#}-tTupoU8_;qoxM-jVgOJD3b zhq}o5QG&WEO7zZp-F@3b*wbB6c~E!J$V*CjP@&3|HkIf{f>X~0()z!?9D=*LDh%pW z5nlaOb#ayW_{;yW19ZLo@A+%L>&;V|bVyqO3$KCg?YaWH zps>pyr8f#iIPkdr{-@|Ul>GW`IH1j`=lzG9!-UOx+LW5k{G%JUhgorp}sU8I~6nA^=e z^Dh@Pwr=cseLh>1mw3=nPHXJlhixZ(2g!dIeCzpF>N{a?Y>_W;7nJJ^7e`AQX(smg zjwPH8gDs^t`ue1G)R$x;Rs9v_Lj_l_YUW=O@PwD2b>b9Qbp{yPZCuq{!^FTVeO2AO zC7*kz{P%d+aaC4r(f3oXKz}kkCqKWu>p)?Kdil$##(FIk7%jh|^nH~kJ27N~tXHut za^aiWFf~Qo3^q|YMj&vXMA=gUkbBvGuik{eA_Y+|NKvB+VjN+4PB{^nKi;(U8s%bZ z_AW)_y~)Y>oY_cXk-Mi~NDP1=AQ5{bO~g0@G3aHyaJqGc_>(!Ol35H_!x1BgPqb0z z6=-^#mVce=)Cl3jB;l8{L!U`8K4a7@#sbAazn5d^P9usTjS`wKzuZc)SAGUW zydx#Z!~lcS(U!jB^X|=#d=MhBbE}Eh!m0etiSlcB=V5zMS4?{<_tOqd>fAR2%~z=~ z$&H;F-{+8}53VvKvpnb<|AfN&me_nEa*0jxK7NBae5=G2E2}so(OlKLM|3u~iT~)$ z_&`KCN6UBLYqR|~@v)9G1``8SbZRHgZc1Z~+ODgo44G*tdeEJVdQm*d%A;A}Z#Ys-(D&rN7b zGove%b52%Ii1gLLAf0u^1XCf(Q0v{4g+!(6)$9eCTq@vzY$3`b+a=!yIFi_3EooQ9 zOsIm;9!mzc>;|dmsFfB22@WQw(&kqqFGoXRMk4IbTZWFru&lQYRh= zn}HY?TFBR{b5kAdIC}lPGI@!)6rBxvz5V9?Z{(G?U_Tc2mBkOO^bNBTB5AJXo+8iG zH|cmDf432_2CHN|UP^Y!VW<=xo}FJbET?}je_}>8cq?*xSM`S^Z&_biIl#z|AQ}xc zrJg#jK6RCwXWs@Q4he_>DB@b*_Y=`*j2!na4?IT&A{m*VvKVDihY-X3P#JUKVp0Q# zpWbgg)Na@TNTPAA`@O6lQToXG`!cg$M!p_vUz$IX8H)EN*~r}-EEqTw24X>o0N4s2 zjefPr74161!bsQ8uoMuKZkp^xAf+>eXrdxBU0V!hzXx&62CwND)$`Z^w=I1tp*160jW&m!rn}9?$(9qNnz}9tL>&zGI``_@GhmuL6wVRza-k88KJK63Q!2Raz^R9wG5flews zr8|rr@~J)amTLU`bI6_HTZdYc+0D^Q1F$ve$GMEB2#-%BZN}pA{-y&E zN?Loow_j%SbYdovBfk6I4#6|W^aIX&z>M8&zY3Uat6&W0^byNs0AqAHYdzR17^??F zC@QT(u`1C+9{k>_o3YG6Xe`gUgKr>-CCo#eqgzG9FIM*bj z86-G&z*DWSZ@l2m+gO4x5ZvP4ZRSPe2TqFrd@24h@}u4!bBt)Z$JHTXgF>_X-h0=N zfjBHw|5}=x9X4(smE%W6`&7PeAQecJrsL}z{;I6EyN|)Y^fx*1mL4=#<5V$}NRsaI z1+v7D^IX_gu__b5hM4))g6Diy%0MqW6v;Y!ZW|JB`foCL8+|pRnxA%ACx|06wX0I1 z8%Um3G>&Ci117C1c{zBMTu z$4dWRUI_EVd0KMl2oEZM$x4!$8@R&NANVImSm2CwC1am}^;0Nj^LCZ1(Ef5+Vth4O z2QvVNgTSFoPWYpge%$lTz#3?`}znPq)46s3GzaOMY@ z3zAe3%RX$pKF&h9g}9GdJ|vlqXr)z-h8YDtw^U6VZLeKh+^g39Kbp?^ugUjqAUSASE@Vn~er30g-Ny5JpHhNOwzj$1^{#=lch2zwEwuUFUfm$NPxo zFA^|nQS2{(4&JYmwdF3jwsc+mdZZsqpG5pnB_7)s6wWa{Jpr#iTKz!tTk?2oYOIr@ zv!Y^tcigghA2h5nYbe}zW^plM`l1>A69Inn26#5Xo?(1qgd9Y?=1RCFo=~^q#n2Ln zOpD-z?EQ01j%6#jKWRskV5FB;G!MWS|KZLgQYAh;=eLQsGhiS)hJbk>+PwvD{lp-{ za4{1o-F+a{h4}3fY81K`GPN@YRCt{dYx?}`aj4dS-~nzUWj`{PPN=% zqu*d7`CzCs;LPM@sAs=F%;qnD_GyfSwdDugf350!9+kdXzzC(s4|r%*Tk;GT1GTR( zG~t{TFECfB20t9N)I1ZcW>}$$(b53)eQ{#O6#ng6$aP|QrS~_G>D8aRHu3H(_T+tc z?*FZHgf_k&8->}3ZRB*B?E2CnnkD`wSNauJ`~IZks^O_veaqa|q9#Bq zZ7!55RgqA8BidiiGhDGkZE)qx|8YfIrLU=2w4ezXtDQNMhodX zeYuSpS~{pwSDldV4HQ138w$ePmixih&5Fd4?%0NZ`Tbg1%JT&Qjm8~Iw4M#EptB)w zTM~4Tg||{Vj|w`WuMZ7zjal{ojky@aSXt>N(@FJB&GrfZHO;%4sK{1UL&4Zo75Y{h z0ApIL7&*3JR?J~u_$-tPO+^TlJ82@q5tg3B6saoX66p z_OZ*%hK5FxDs5g&5TLrz0u<3!V|_(vUhc#rAj(NjrZr^{X^*vofzJ^`3@=EF6O?pU z*t(NQ(cCeCzoTy&eF6ZZnzh*==#c0z6y#{I=7-~IoNtC3dwL04R*0nYyIXRB)w008^nTUEDtBAk-&#ZCnS#aAVyU z$vG5FwRf{^fY1)jxmkO}=!HabsG~Gx4E1Jh!WkbC%?(4cW3HC946e3TX1uD=cF6$L zFO8M9#wt{~Sr6s1@Ry*jCn}S7KKzGU$=iAc2|!5fGv)zy8dtKZO+^rQ+U(>(DP<** zq6;;Lw$1nLE7{1LI7eynWl801is1d(0hok^dwwZEdqQpHWEJgi&wj;pF~5D?E6Q}P zB|!so2beQr@QD=?VtGsDoEvI)kZm@Di3<%LAX z_u_A6Z&bUo>rEl)jDtxUy@-E{dhasVG9#*AYIjdZJT2%ZgaoU=7z#Mu!zxr z;{>;nHo9gpXLK}xCvR1^YLSY=VI}34r}zAzy}2XC{6*5Z+(uyPxMT02~m( z3n&?uO5HtJ`L!FRGABIraGr2OMV`t1 zRIDxF({1)>471S=4_O6`-2&1R$m-Y4Z*H^MHAeNY&*-arE;+vBDi@PgzeU@9ak{fy z$1LgrhWO|5WFyQLn{(PL#+QZfj!D&*sNX2QzCxY2Sbm|QK9ym8P zQLE^sz4SW%Bx3enE+_ND}hdViHn&l88ktV1mXJp zwXy!bHYb)-rFWbs~(N|Cn3{iWj?2}YFIsn|&rvBF6t#jW39WFRboW!})>ZXz{G zn`Vy0To6y+oH;->RKk+hu}45fM~#_No@6Id2sM+f{uppMTZsqQB%UVysmyqdng)dI z_y(O#d{x}^Zlg{V%6AUIfrh@e>ZrEkD209-OQd_nasE~wwF*R3ND4u-K!;gFz=+qL zLR2aDRAsXcG0`GDSw6Hyih=y4e_%%N56&o!+@j`o2&~~H+PRxtS{HNz^caykC^v4j z9abH-`ZPWK>nmtn--%~Ywy;7Rtax7x9|XjhImOl)RIF81nl0*leE11W=fo2)8N;h@ zZgZ){Mx8M!WIMt*i4J*fMy%39=B=$H8eVVV{!frVYB#>A+OKdy5S_ z*s*-_OQ(v_;vuu61H2@An?U{hRh;Y?@zbP+y{cLGP{KTqL&5bs)_j^iVfQBA6f62n-o`Y$p4I7ojcmD41L3IryQf0$apr(QjYwaBDWiX+4iqG=eKP^Fi?YktZP$OZ zeUF;xyxS-5*1UkhR42b^!jC^0@4SsamAvLN9H~OVW#s96+@yOxr7JgIDld=#5LEX# z2JgEzZUj`E*DSR2R|F1O)8?oCIEpl3*iJrFxyKM6e&605AV$DWC+2P^+4EF z58oFP5miY_gQ)XyI-F6|TR!Cu(`kWFKLr;yY~V|!Bx~3bfT^r6*fDe`a;Jn#MOA;t zp_na6oE5f1pSa2ShJ~^zJtfuZ_xRWYCx$HZ%psqyv-1CH+czLR!h{&Y3+4@Nf`m)c#v-$fm?)$fH)0G~e*8 zf_~|zh#;oMlC7jDAy5HMWkOJr-aQsu0OmNl&IpqXeHm#C{kK{ONQo zBFkN5tnRwHp(av^#!V>?!f~iWv=AsCPvlESU)_3K-4uXTUP-6UUy(CegPWFBMeP|l zK6O;E+gBiq6WVIX3O4q}!O4e3Njj>L+J12H>a)NM?G6PM9d53(6c5ZWSv~z3cO26M z$6{ovus$|_JSuK_5cS=MA-yf9fvmM&o%D89*oO)#I%*`vD3#v$ES?koR-#c_o8gn~ z*Pn56>n7eU-d$bPA>z}qy2*uBD>`d`Ff9lRCkKyTj?sK13qqm=+7Un(-`5xTNW;G- zhqFE%4Ky(Ues*{L{#W4Yn;5)fw!g~N(Iu%&QP(+6zwB~#*HL_W^apt?*eIlL;soE} z`i|m5NC>_(p|U37B{&?n_V2-w{9W4%{%zo9?#dc4D{VwItcp4pLz`u&iaGLAMdvNj z1&ZHnnaX5@iPxBDRC`oID*u?FrgBcLOLy;5nC~q>>F&%h~7L^8%*1G*urWC5XrohNt*h zQ76{#hl*l*SE5p&udLvp>6sbzX7rS!Rypu>rul8MIWOsSK%X09^%cS|HP8b9j71;p zZ!2z3+^3wQ%Es*DX!^36=^4jUuF@uaY4a4et+TsUy|?-T%ms`B&gVA{&U_!Q4cg8~ z&R^f&<~-k;E(kuducFgSS~p`^LXX}Sdir!NuH@Vf+0Xk^nls!nCjoKA*y;u?4}}7= z2}A_o=*w6DOf8WFA~}!^F)Lp-vV?wqAZEJRVIu3iGjGQ z4nbx3gfe|}Bu4L*7Xm7aK4qj6Cm)A$&=?{We&3J_7UAiUp}rK%&W3IjawHFWU|pg@ z(_Irk^k9YB1a9`S#FL1qQeLG9E|Ig3>V&3np+QcF*Yom*AP|;b9Q-Mz5DMuayr}pC z9hU?0JvEseC*iQ;gLo0E~n`gM)KhvB(65co&&y$aMmL?2B*iVrIhpxwf@+= z0gymmRNR&)t^Oh>3Ye1 z#pBu9iW>dngK8uGcvsN;d2*$^AcDS}!ixM{##?i$6Tn73JVav4PZNVnz@&*b7Z-rC zvM{yV!HxC5zzSe;p^Kp~1P8|g#E-m9e1ksI#o`St*l4=)pG0dy z{enI=f={^Fg751HAtC4R(aV^@X+Iw=TB4{zO4%v}adBc=XNY7ot>6tSh5_U$ zmuyjToQj|Ku0hP~5L)MEhb2S_IIjyxYKmw5j?F_pg#iDPH$v*lJs|U{@p`ZUh4cu z(|7(&UQl=^G8r9#bpD(Tc!RG3XBJ0XiQn4y>KbdwywQ&c2qAzSct<1<1Hoz6Rk*cZ zLQreuck^@JoW+Ga%hH}D&?qmBlfFZ{fS&KUSMT8cWwOIUiUTkn^hl00#=Rg%;gSE6 zbr0ypp$d{A3^02H5U{5OBswwmU;NW8()7TO0OgYy(HwVMs%GS8CRFNcgkEhP-S!Fk zxFfcFitEb)UkH6FesS288*h~^R6TR4=p1tOoFz2s@%u9N6G7xB!o&+Np7NV=6w;>S z2@As>ga3H};sBjWu;WX$fIFQ#i>o(MgR@nf*YSWyfmL*W8jFeFJs2NA__ry>E_3`4 z5I6gsPXW6zJN%yR?~{L*Au-^iaF9oZ`rUgQ8)JyYbDa0_m0IBWzfRes|`zW6B zhHlZ?BW1Qk>TNy2+8sT%bPa68cUbkD_UU%??aB`%LQO8G_Gu8}f>Cvzz>4OU9U=qJ z@rvarCBus{R$Y4$Dy6%Nm+_hDV~9Np#&!wsM_~^X9nTV7dVZ3S6y(Oui|@pQNG7UW z2#d$?I%EEyZuTg@QqEj-ymiz#p3;|?!#f>#)<8Q8g>1V}6TGorgLk>%vK1yS8RkmiU7n{E4?w-dZFr!7SR)=!WLT~w3muglt1U)i zDOh97daS{C4Ww$Z(8(KwbEEv<5PEoV*NFNqJje0}RQe(Q`36sQ2&$H2aH8Xl5dZS& z5DcefeYddv_nPu7+b_A zbj!cQ)O_C}Qxh8yaz67JPCpYQM|VvWAXSDz4$B9;3p`^Dw8CbFEk<)VW$u5G^x<6X zJZGRMt_^HLgP;91WQvY@uxda;?-WEC>${2a#l9vb++VD1s<_Frzofg%qnr3ww~!_7 zGhw4arW1U=fH}i5^MZcipGqpR@_hTp?Ku?$kvobBfVRc8ITwZA6UT%$9B)!CM|TGN zTmfJ%2HYP`KV7|F*?A>-$4!2qBzfq$w)hL7g9;?WoN->uJeVy>s2Q0 zB%Q6_a<+f&1TDyq(#E|G#W-aB$S_s)6O}wUHw#Y=rSBrr&%C29NWx|RbdjiDge^4pNP!X;wdAC`k1MN!Z*?L;@n85*E^PF6{)OLbf9gz#<7nHVad$^hl`22|8WuzdOoJJ9na zLShd{bK`sxe%570nm{;a1daF~OrkgpHt$(Xdp`R>*+)&cL|1b*L-VNH`J_v}Wbw;4 z;{foAg$mH9o3zY>gcJ6!NL~ef;nC9)DkHY}36Oi6hGZ8(!sID{P?1)CA$C_^{b61)zCcJ)W z=*ZnU^%8MtKL3Fe5Pn^BM|^f7%6caQkxOc`7z*_PFev+A8}g!?)_oe;B6W{z{H1T9 z$rBB=8TN#uKN9bRrw@Zqwn<FiZYj*q$pyo|Km3|jzxjs_VWJY@uAV&?XuFhe}Lz@04k!pEVKRm zaizd(ufU?5$GM!P=~3IAdhz>=o9Nd2rDGuqZk8+RB)Kbl$#V)M+-sSMnN+MsKqSs8kXPiPeu$dso`0$wxqk?hwaT%jcoXMS`3#ps~TWTk%Y zu1y9-Be#q#SJJgKLilB9R^4&Y*`wNRo%Slfs#L;G zs@r=w!NaTf@|Fc#Oq|5Ba^SuiB9dDM}p=AOU2mcrEo7J@h6S)kQS8khW z%=f&k_8+X;o8nZk8>1&SGk*~A**cX*RjJ$S2U=k4f0{%>M!E-Q{UAf(8)qg*N~wC8 z#6m>UuS->`W9q&hvWGZnKkA_sJW-_tMfmD*Vl&BKN*iTon4^cS_64rd$u3#&S}fyQ z$aO9zx|$IqcVYO+Yn9QDCY4t@wDR(4b^x-$(2b88RFM8lcONTb=psFjPaR9O1~#uH zD{0$68Lt>x8GM)agqhOYZ6nNb1MS8_ASSbi==ZpQx?px3^1l76;c|6`Y7)lUP?8uv zq*55h_w~?vOPe(lamN$INRViKDVIAAa(7qHHRG*@c^ef{dVlPR$;Zv)wrWSUCCoZN zZijT+{ihPq>%PL%Tv6k9?!?QY*T#XY%fntcC*x(lD=SWoOA0Nf(+*hob%B{HMhoxV zEvnRo+Fj4A0AL*1(91a&F?1)}rlZGSF5o=?3s8YlGaQ)#ZzBA=s#DkOFRy0nd~E2z(k}E!KJSg)6(cQcX=&-_5%+9syhE~PS8^sq zb|KJGnF2P7#;fd`*ZV1N(A||O9U;|8PLnf$vA2OtJSquq?%`;X7W~``zU!e!mBwZ) zrl?}Uyrg*hL)i+`@$HSO)9`l|DdIEK`_3=CgA+b{?%~g_zAQSwi)nhP%-OTuVye_< z@ptX3cy6J%%7j(4)-$dEwEqMDZHV2 zM1GW{Cxan*}z{*zpi8&8Y65eg4daaTo>yj4qcZ}XVx;8FIbR{ z(?5I^B@sulq&}*99O)?;7UQi(3A09v8B!>^&qQAgEC`6~DJ)S%v=C0(m}>njgYQS% z2uyZJq!#?jf89Q9^Gc{Vo6EehyI4mT^V@*h%<0UJ#RnPtO-f0j247^B~0gp)4NUZ0SjsoyHhtyHABm!6X2HXr7GC67X!^hf&yz5qLW2ICY*Uq?xJ|oTtgw(Si_WDL zcAX=Vn8wnRt*Os?2<(q<0samifY?CG^~ZR6B;eP{2L=kWH42>$(AkSfTzHU=9~6n@ z!!j^k+=qeBL0j(*b5^PsxB?=5(}Rb@-)EDilE$5`T(!m@|FMZGY?Y5AYIv?u&+h5v z%Qi3xcCI#gCmAzuF-ek%XOJHr9J^|;_Eo3bH%Ve~2k)PpZhJvPB<&sg>F+bjOO%Mz z72AN;3YQ;EE>F>eLf3sUQK5^?`Wb6zT`SqTgxsz2?+f+55mNAy>$o8O(4>Qhk$#xH z(^vu${;VEiF;sJLo;*qPunXK^s9n-nsISYhPj#MIYq^s5&BqV-ob&WOnn_k$IIB}IPb*Up|TSh>e z@wffDglCfYL%5AZEnErv8G%F1V-~nQ@*||~{sLxGemhGz6w*qK1tIOnoJYosduKZ8 zYr%q{3?g<7)mJ%miaU4UxV>ki*bC>^{J3Sgy`7xoBv&rA{N?M5I?5 zW7SIk3m<35^-r&i?C{SJow4`=adE?CTaMD$2g{xh<8J--eo+nbTsaceJq*{PDc|f! zJ>Po9Z66XzN7_j8ZW^IB@oWYuJ)8+|kA#<>JSeoRkpr6$^&@Te4B>tJbZ0RH{ zgzx`Fm==wg4_;QJT$^XgogP0w9WQhPdXNrlR~}PaTiby{fYmR~4~bH@iDH;NnJW)= z)*Nt?*?5`EeB5Wm(#;|A;8Ai$?Z8sIyVdv3<#)Iwl_rcAEk?1YBURNByQdrbs6U!R zO<bM~xG{+m3p5RtJc3x>8zU)9oPQEi=*vJ) z(!4l@nt>vwEPKrRrT|Md+?nzhk?NqV?i%G2-RwQg21t>(tXr{WwgIZ7NRLo4@?=QJ z=Zqb@6Sax#kfxo>O&@@eQzPLJupq!qTxg&>4LJFU3!GlHhKh*%oyByE$AlYdEa_x7 zsjw8XvUrnU`vYK_k56z^t?drNlP2y5Dhs#nUxpvsi$t(P zrTTNpO7TR1Y5>eoT?%QO13XAF=K|*^TP0Cw7o4PVncxy-1;yhCIDOG=YnI&U7H|D(u#QL4sRJfPjV+v}RPmm+w z2M7q+RSLqcYa>(?kc#1-65M?y78^(@~ zS3`@o4O73J_GPYz&xR_V8(i;&tYgOP69p8GFs?8kMM9A!A^meInL{=W!pd2L^<%WO zrxA*?O`DefW(+-FkN@R(&I69x#1xUey;+(rzLEV>YCjii&;M5xCKO0D&t{DV0m0jR zP~cy{j0d4})%Y-V@3&Qw0NI7B9cSxhuR0$;01w@=>Kkl3d;Y|)Z5#9{oBbyO@2cN(G|b3L&BFfiCw1SpVS(}QWe+%ytQx1PF%`c4lNfl2o3 zLx}7#0kd)qo!(7`|9Yd0OZ4f18A;EeTFABjYz#W1@v?GY^QXTk zCAl?VTX9cAw<%Ul|4?5AYY30}Rz;U{d~ekYFS<8mx2MizTTSc zYY=sN2#b;0(tdNov7P7QP1y}@|LNPBEenVMy%JEhyNmi)($@(?ChS){sNo%uUZf{7 zTU-d}T$bgHpyAu;4-QSrkfLIclxF)3k{I7MHW!);?XQ3p2(ckKcz?lbvz%u>Yzt6@ zq6${!Zwe}6oJ%lfIZH|pd98;NTSFewR^!Jp+A2oB7jmZigY341Zv~LS_DL{HV~9I= zBUE(C(2kyU8x#MVT~3^}_B*8{BOtQ$bV(VBPg~gQvgF+e{kupO<>G=N5(NpA0CP7t zQH=_5W|rbj1vd`GQ0G!8CDW7qd{qR%l4Gh=oZZVUw7zmG?vI|jc6)-1+W2Y8seaO} z#>Sy`0V>C3zTq$Qu>$Q3vW)NAW`zBkX+7cN(jI?TS1Z^e1V)r#Ntm+pn7Ogm+s8(l z6hA@yQFk32)t>xaQ?o7!{Y_~2nFe<0q_q(A;H|?(FS?UzkIb^J=A^mH+f1^1z=1{k z;nR({@%-h2bKT(Z%i!X^8JB0rz(Yw7#4UMD-lCmJ8uS&JR(Xs&@OH5I{;1{fTw_19 z6&u52C@=l7%>XY`d@)Ze&Q7#{ts&mUeia&Xi)irWRBaaD=8dlgV_OqUGeM_EPS!2M zDSVxRk=ZcT2dnY%Mwt1xp0~`OevdGp&c99Ylhz0ZlRE$4+@S-`)7CCRP2Lg7f)&z! zsnnn+0H*sq!&c(`HW7i-@bfOAv;=u7`^64V`(C;o9nK007}HdALtx&1&ZuOA@plx0 zf7tVmIEtRZ*DoO2Hw0R{VkdJzwfE`;_WMhG<>X9mW}>M>Us!KdSCj&4Q$J=S)ZvHW z)3GZ=v+$caY#Z!2GOc%+CPY;@fH9@q(UhyVU!VYy&Y_)(19M~%^EyX}c`KWR>NpEv z5{PEW=;pdKf3+~m6Ous8*pF@@v-TNiVnYS4Ye%fFjA$WkR#&1Q2^7`uJCZUUJ6!$_ zJTgfSwXadNb@W6pdcD+bAmDyA58&FmYF!EBZh6L`UmP@la--^kD=dsQ^MuJae5|yo zo8JZD@^);|^9e1yI+_-{-j+|fnzM#395i@{Fn)-D5Gdj*Ya0^!@Fy-`->Vaf2a7^W z^b5vfw?4PYND=ldwCSjZ<~Jj@@l9E!Lpqk*M|J>;7LdA=?XWWwt9XXQvD|MRKBWLsab*sy%&0&-dMH8?yZ}%j`lIn}m zW6|hWUGf*1(EE38Z>jQIHc@KQpOsu05|PF7xg1gQtkvS-t$ZT&niOt6FSi%c(tX|b zdMv0S+4(M6%1Ksh3DCcwK!T$Cy;iBjP}(u1p*&I8fKE25W!XyMv55~xmgqb>6y#IK zy*NDDOu%HST5yaE0&=cuH6!nU#1_DB?NXFtT>TjKf-p4uyTi9uSP!D!r-ekD1yFv-VjB;ZoO6G$=g-G@Mix6ML(kEd|NUXlcJ{z;2`0!XH#Lpl0$kR9-cv z4hlj881k@y{xI8}gz7pgX>dqg5T{f`QOBq1GVkznZKd)4q7>yn&u|zT{yRP2FKp~e zeSmoqbiA+<@pl@ia-VM7(2}0zED_*{h*#Gh3T562-aDmcE{#ra&0qSs?vJdLO>#xY zs3F-1()S-wF0K5#E+gDc&*)?Eu%u88ya?&DIPjJR76u0l^PexvNen#MxL@kk9PhI~ zj#leB^d0Kfv=&BHM(5Jb6r{`t3--PaQGKKu|~?kr3q73Zemy7&2%)yTU4v^ls?P^KF$n>uhJti)hep5lhQ+MxKGjO z*XlibxQ7H`5o){ZG(K#0QyZrt)Wc>?XM^Z5v3YGiVSd_a5a!vP_E8Gc8uHJg%ksK!)`A;rs0>YF_ce>9 z*Wimru7c6!!8@<}J;o30au$J~Q%obU{|2ngVv}>)tJFmLRkF@_ZQdl~MC?-|>ag|+ z%&SfKEk-Hn2w>CR5r_a#T7KbS+XhuKP8%kcozP8C; zV|}G7O^(6jlU8Z$_7+vHj$g>K9G|J6;I1nOfUx5y%wwX-;-LD==T(+)5zD71EU#~) zB!Z)4{`4%qBWFz;+_7EmQz2;r0$*m6c~mft)>Q}0$2Fqqe3Q~`pP6}=h|+nrMwldD z^0z>D7j0nT@At2-+2y~cj;Sr{_%W&7VQu)#K%mWRF-BjeC}BDZ#ib_^z%jrox`E*io$tAI`(qKZ7OYs(iHUrZ_C0o17)MkV$p*b zc%`0Au?)9vGTA_)j2ZE}D7?s>J`dCqNAOgF5LKTCQ*j(Ne*YPEC@<1aN>a7FZ)t4m zvX`H+3QP2RdV}4u1v83f> zo8NPr&g0{~HpV)2psRX&VtJLdwQxDVb>nj78sM7v>9G0m^P$@zBxK7j)gd*rQN7I( zYr(!^!lL5RkxWQn@#mgzPO82AkfS4}NG-4}m` z^jR2`*Rff;4g!=@P5>irW=bEd*44$+idzK# z%3&*yZ0yJ!M7SD^NP%KV5=Oqzd{M(5Vj=VgJ6OCV@WPG;ayRxgn5NpExYMVjN81$T zg8CI;@c^b5!CMdUo9n6FtY7x=%iUq$57kbiSI&-{gG4%_0OWc96d_dbMCw?4!weRN ztXiQFZWG^#aBZ;V?U*?&i$%z}LJl0;1|l@F|C@APvKlGd04_-{u7ZvlqBvv-3{&!nKv{LhoVt zvdhyr7wQF3o^GE7C9ci{9L^kMe9ty*3Pcvk0sKO&*ou+%a^3)kc3OGOGQFNg?Wv;Q zh6RL1q91$riiNZfX&mQ}8RzJO+}l|;9#-+5a-R-HpVZ#?@9A9Alr_&9dhUA>h(!G7 zLHQ;VgoVFmWFC*8cWI$Z)1R4~1V?m5jtQ1gUM z4aX=Q=dj~Bo#n}DZ#J(X4~K9L9>1d(aj3U?%$9d@CmTFZ##R&xdQ*ZaZw5BxY{R10 z?d!5fT1C=v2F6si+HbGa50;I+&D){c=*05-{c$A?m1>_zw2et>ZxDwmS(t!%OIRj1IWkNOJ77*ym>+czU~m(&nmFE7)*6*#w(>tO zK%by8(YbVSjU3AI>R-dZp9;{GtBD_t))UE@SfqnX*mVEIIrC#znN|v9scl}^l%-5n z*R?6z=y_NV#5IXw!)n;n)Q2w}*wwYg{DBxh_pVm5>I%6{DkkHd<1R9)8Z1w{> zou1>~*qM#l5ZVry7F6-P-Vp)1F!I}tV%gNZ-%8Kt^NPtM5>fIZ8Hfst>^}1#NpFwa z8T5NE4W}MOz*(fWio4OX8;lCi(DFVLNP^dXNfRiScvh*<94tEHn%%beS7Qe@+U~E^ z_E&gPOwTo&-5XBIrKGd^!#;okGPk|A`W=F)U6gzs;TPRMG*h><8;O3 ze_QK+W3wFO9v4H>E`~w=i`?(ul3%MOGmgQN*EJ`(!)0O@&!fNn7$UKiI=OUV$>1p^ z3qmxzG3TA*s?^@vm3u~79-_1*jZQyW-yme>eqWfW@p0_E>9eZkGdSX%V_jEez-8&@ zg@t81)XA8SKt(0S;b^g51?|WJV$`49KK-ggIy*A)>F(1k8OjO`8);ZeBfnpc1_0Sb z1McVvUGDW#u_Q>dwb;B(Phvp39haRxg@Gv2n}&vQ$7#HyBG3R>TdJ+M{^qsnR@x{j z)14)(AK=%=Uca$hTkc-5@~)_l5>W|6$FHz54d(i2ZGLgzcL5hM><$>!t30|sWCCyk zo>5`ji>bW2_BGwIba$Hf*yuyQJk5Z!Uo260+Us$~h23(#XMJ3@3;_u-*7jU>*Q4|e zJ<^EwUEO_c%sFfemd6SPp#BH!IV5d4Xtysz`H59EYLn*f!!d z{+`Eh8d})4?wyNpz3TX6{WyF7JFiF_yGqGmS7CdOhqh8yGGU*aN_sLrHTiqR9-o$3 zJlC2zr=|ny!VQ?GiOzx*c5GedQkq#{V5T;Oh4$7=GVk=0>2+B^o@Lz+-Rwd)nci8d zv~ngC)JcE?>t;PqVE94mX1X}54p^<128pnhGO|$35*@O}8E2KOkvota#6QT3dfFyI zPj6k{`bnRYR0sWcu7sP21BQHxMJtwL!QkxX)1V)mkT|tubB;Kf+xq+f?vyf836x)Q&V@%g28e413X7hlgl-3%w?_sq35Rvg!7d!1YhOW<;&1 zekES0{2peuxSE~{VnfoAcVTKuCh4I^+2lWljZ6LtP2#_QjcpF{$gzf1d5BwcF_)Ce{F3AXWA8JG z+LkN7($-^j6aOiZyf{Defkzjg9VrhL4Jj0;}hfolRT* zf0@n22U637w|)&b7C2AOQ$DjS3O$4-%^u1;tJ1Ap^-iT5bsxZto7P3xor6uZ_E< z-IEwN&vp73yK;k*`SJ0)@UMQD22XAS=glFsyy|(suqwM^`pzf z&-T&S)<}eZZtTZ;kLr)R=Jq@j0yf^V_L#U|SnpUxjMJ^#_BKhdsfhw8j{^Iifj=8I zI)6p+`-3e+uj9@gGF!B`k7O_A0&i0T9pGC5f2@V$$`|a&f`ajbev$Mo{AT*@Zh_i1 z*d6G{d{+IvKLdeTsKE?Amx+rv(Y90A&fWUN(;IL8LMj4>xR}N~x!?R!a5ra+UXp`f z>5WQOo4tDI@Riq=Xd4hMMHj*Sb9f>OHZ%Vy#TR^7lKtL)!zH$tieQi9~Jj(MAlF{RM<^Z!8D98>+7fH_ueM@h3~!HjLPqG3Bh)u z7~^vv@RB$u4gw?mG?3!YF{IvIn6LE*{Zxg1QQs_IpN{;9jl%c=m*z~@Nd6vKBLLMQ zL)gQQn$Lxt%d)1uA8CJEj@=}BSKOMzKLj1V7N}wjf=Nrd(!LZkS` z=jYk8MBNAAS*04(GqJ+Uxuum&1M|SkOTU>13Hs&}uS&9vXBF-kwH{2_Pb-m|$x22z zBrTk7rEMkRJndAi#tAIZzSZS9WTD>^)j0g+pQNEHjn^X7lxYfnrg*oFy7EnVWnanN zqpU+Df}M=CY)d}+Tyvl>KrnVJ3mj@bS3-z)VjVH^Jx~!~BGb|J-`D46;QXK25$wl@ z(Lv7l5`!o28ZmMF@3LW!B8pK_Q!1+%|ROfzSk-p50s0BVKX*6-1SGPr_<8 zyiCC^8Yc3+?izZ&v~6jG+fN8<24|AjI=@)lR|0u$buv|Xl)e5&?eKz-nb=OfOA=1( zVYcQs_R<^y4x1NoSmxWgi`x%FX0$GOd%`a;HTj?QlVN92YwxN3h?@^Ne4m>FU zEP_HrX8;%%!fmIqsKhYwBLA_*tV7A+rXIzRr&T{JdJJyDr9MVph1{Hnf6BNAuuOF2 zi#fun1Xypb@kh2m=>H=(`z9!Mc%!2{13%61RD8}7bDXlx7O@rrK3DE3nE(ET7j_xY z6B3DWlhHwc_`kE4VGv{$5gU)(e}hU5)TM_yZ!ZGKf!mY2CW*Urd$ZN~Z_VCnSB9(U zx%iy@72u65q~E0i5Z>lZ8;tHYEVSi{9X-^rOnO*Cv+anIeXO)q>Gy&=###k<8Y{Bo zHu{%TYO8O{kPT{NZ9M8PhHjh9|cb+Nn1wDcvHgVvDoH~CX4Xx%|hs6j|RF;+zlE{A>f2Z!T z1kn=T<)<&l6$Bd31?jR zTcb7w16tqQlyHMVUJLHTV6<5Cemo@6fU=T{q@7Th0I!7_E?m8W=jEoi4)Yv4zq{hA zXm>m_xqD8vFdX)VZI6bEB6Wq+Wl~h!T4_u?%NO1gUs%M+>nrDuXB7~9BM0-thPgK_ zZ%`GDfusSB?T-6XxHj|GcE&x-eBbe(#HOnM_h$AH&=aV(hr4zZYAP|duai{r#A6vU z9tT{vID2wXUi&R8=LPO8cW`Oh$-rzFM9{T}pYywj|UwIoQz-_LJ`7XCce$#W%2+*(T6iBn8QvMpa)`EJJiloOOs-&c?f#SB1czEVUiyQxM+oaamc9uPVz z)~?e|qP-ot2zV7Q!xiiLHOn7BXZ=n_0M>_l$DG5R-c_qM+eOUaZL8MDmv+yG%`w7# z{=hM>!e|6E(uBsKtJP-6iI zwfB>gvhOH2i9#I9B$Q>c8j-BE+@0&v6^+{xX?owthu`Y~HFncm7ya@#M_7v+ci0@6 zqEJ8;(Wvz4x7GvS-Ci%}Tcak0+u}tCPNG5y)h%md&!<-9558vQPr2NcN6HSlKVnF3 zC0^XCmhfMh&Pz)P^Pg)6tYXY@kfZk7l(lxhu`S??>+o!n0dV#UXmK}pzOqG?{Yd?m zkD?M!>I5eNGuA^Zy?}HlG@PaN&DQ}a5#Z$}#{g;syQ;VxKv(6De0ji>juxCTp_5Ht zpLjN})Qz*;^($`z!yZmdXyKbUUP)@(}>Q6k{s~W$lp%sZ)exEPrksPdlmWtZHjRra>b1J5I ztnUh9{*vxmCMg-zEa4LiUwvacARXJFoh}%&k5*Eny`l9Dy{U@4h{&9CoEHUG=0k+J zAVl9xLtsROM7g;6ldj!F(nho_iWa>THOHC3P;P+rClzJPdnQ3mVCC0uZrHj^Eb^hJ zEv%wn?@c})7Aw4ucI>d}7xK3j+Nz8=K9EKlE2W7TYI$cL=s1&kZQ61)ZEKivY-fI0 zbLjblh+8`GN-QNEMF4THzAj%_xcwhZ zXBE|E*G21u;O+z|4y91sUHV}y?%q(`DeeR)P#lW86e&*8;=$dDTXA=HIN?9%++>Vg zBo`Uu&Dwj-IiKmIiqF*S+Aq@WdlvC|>b0I>4pSB1m_E@{pwAsRIh)zfJ08j%6tl6@ z*5SJbXOomg;mo156VRF8f?BAqot~~{(}T+m)S;3{NY z_TZ+g71I$*3$+b@%JrXHTx(Y>SuZ_4Bw0vjvDYN-q&roNJcsJK%k6IrG#~I3$!Re* zLVHj>X*a2`O4!u@~*Fto5dcEZUefo4G$c5a(EYnYuHw zXf`aee=tPE{)C8)#ep#NB~4@d1z3|i%C9jcC!Yx4s3snucG;8QgbK|v=}ucV&3M>! z=dMfs`Z5UhFsvZabIKfzaSd<5kNl2MFHuh;UaDC*Jb2@J*^Tx_SIAh5-r`uSyd*8< z5qB6cixo^Fo1~OLZ=%T%s6tBymL8w(Fv_JnCu zNr&S+7zIi&)TMC%ckkKOh-p_!%dv9zD@JX0!uVs0PXaVzz@x|Eis?l-5}R0I)n+uwKiDg{y~ z1a~q;6d`hPTTVeL;BJ!KqUv5*WEmAxxEmFVf@EhjX-r*Ft}NX#p>*zQqLC}!(=%E= z9nS{7MzaOr7r80qVWsker7mp9`k5-PVYqBlcHyjpZAH4NX+}dlh zbwjomwVQ{x*XpTW@5m%X0b^Mr#V;bB4U{*lFS&E=Cu=8pd<*41^Rm!q47BjqEI*^R z(|7>h{*do?PNE!adGPZ#Fy6VNKNekNG*&QMJBgna1_p?76kQ+lMmi~JRR8NlowUpXE=X~mz;{ovhVkXO zJWzCb=b6-G1>4!>g#YNPj>~?D7&e*ti<~5FfT0q|*jB)J&%ILR}-TER!k7?YtV$ zp9nC?7^M&0*92Z`d=B{iFZi)?ijMx@=>KoEP4($ZeS?F( zbje3;M~PF)GXy}GlzX;dF-wI&ouIl%;+SctRWW^fNeRBmdx+x^dj|~0(#5OG8reG3 z!c$!0=l{#5qD@je>yOdo*W3xcFF7AH1<^adXEa*}o8L#z%9+<(VG#HrfWKzwW&M`+ zF_Fd~H%l=()x5F1Xi#1tkhn;V4Aj zPzKTp#=?x->i3%+*gy$bH{}Wm$vZXyel?*?=2V5Pfe9!79J)`R7E&@)vltu+F~@Zc zh09;=A9vta6f#5aGt1nq^Tx$Kt#1QKbM*J-7 zyn4HR|LwSmAKf4Alm|J${Zm^WMc79>ZkhE)udklj@P+tF!%VJWrS}PKRXnPXt4Tip z1Ok#?RknMb`6T0-m!4YJWp~U|qJtEJwU(kxt z@KKjV?cS=kIK27sby#A%$0K~K1}fJ~{~iyX@A55fHEQh!{d;-7S&Td`M-##Sci98rs?GiM&i;tgX#b?v zMnX)7Hlq@bdJBW|FtqE(AXSo(wy#l>IHSVKwWNNagq;j-PGh`ad8!%$aqtbtHt@au z%eJ1W0x%xnpYXrJ3v!+AXPia8-C2P2_mvg|P%240@DCe~8W2_xgOC%Fi1;CFtYx>$ z?dN#K-Xy8=6a1IFtvK3|I(UY+0Q5U)M`p&&<#WjBXsr0=UhO5F&^qeSI$A>UOnv*} z^*sN9e?G{Otg-(1q2Q`HQ-S_gn^$qzlH%uSe9_4_4w_lkk+L_85~|x#`H9INeNDep z3wNVGwhb<*uVM{9&|v#sJ$%w5>s-=_J1I0zP?X8+2&ULn_^2Q%(cQb)_GwZ`tN9oSfCXhlb7{rPJi z2jBp}PH|zsRr$^1x>X~;Bqq}KO|?xt$}B{T&gT~a@c0-~=SZB41Fuv&hnXVF+e7xg_uHg1`T|0Ua4+<4iR|AWNE0 z+v@Bf2?|YVs~?t7dF;2PArn9-AU_A_QL3qBQeL5m2!~=YJifKOn``LHf`TnLdYsx}7bBfLZ4xnwlUO=*KUF_bX03LT#$;fr* zbt$T?=MeW|_Zx7~CH_Yj#zkrV`C(ypfs^AR#uNo@OPZLHFb*Mi{3QM`7n{RQ&YbJv z$~pTX1IQDKM8B3IZ_2rtX;PG_a{I5h@VfZH;Vqs3$>ew4jMr*<8@(HVlVyN9IP^H5 zgAr&zv*#W=M_bb;)%waUo8#qqcrv~xug7k~=zpw*p{&yRqM$M3hh28i-vJ}odJtB- zT214EIr#@%@aH(xUi zjyuR6YZ~sM#8V4~vw5SIXMeHhj24Mqy=!jgq+D-+gTJ@_?X*TLuNWIpK@j241%x5I z*aS3Ul=AT#uHV6D~td9>_F42MKbSG;wvG&KwmKv}n8a zxiFtD_L}CsDlhRab=J-h+S#sh-WkmlcK4e#vbl>wmdxc^R#D|M7c$~g3!vBf09l#5 z@6ALv{QULMGRbyM!5g#xP2h{BvCKLLWh^;*P+a(eCOBGAYLK5D{qu!q$yJnVffeIy z-=qoTeWHj3pYZL6_nWal=()4;xzYFsSW@T;ehZ*V$x70Xl_#qAlj*Wl5v}NuW}Ps9 zVqw@bP(>sFHMtEKk$wAQ9g=9SR3KCABd(@S_Y#aqV4JMt5$7#g(Dc44GBlsMsAOw; zmnbwGo-EJFoT#sB%%vZztM>XWFPCesFy8W>!;3w^q7g`Y2K8CC3%X5;16~A?^igB7 zqIQ4~+p!Vw?ZM2S&@XmTeP^L~DenOI9^Y}p`60c)Vg%uiw?B!^kD#PqMG|)Cf_oJz z)TFhTPkk<=CD{g@MWi_;6orOX6(eUmnh+Pq?>a-K9;N zKfFoDXaBU-|0otkEULkhKB%aR(ksYwENg<(PuVn~@^Qa4N`(0N7B2i}{=XN1@aRV< z6BQI`wnBZGOM{|fmJhJ*Xa*1lQ0nB`b8d=2BD_L0wy=3qaV5G zj=K2`+rEWDF$t<^Gag<;*zhN^+E z%9#}+?^=HxHu-MS&~9kX>aAk)$-cmjv!E|1K%jyFlTr-u8LCBp&lczcfXSiJG}q7K z2b|ecw8WbgVSyI>_tmqj>wQF^Ckg>wneTT*1=;^iD>F8KS0JkPOsRnn6!r<6Iq%0a zt>aZLMqU@R)uKzyE zWDn>Y^{FkK0KQoE>l=#nYA|}IPFIHxGmD*KgG(3I?7{d#CNYz_H^1d39|wm*Wq%6h zw`b0)(Mi4KGH---4#v}t{)&`?yIcgV6CI5@<}tyK`zw6Pry zL3(Hb^VqO>ue=g6WBPpXHHC^#dvXVT_2 zPNcGG_B0YbgEi2lw7WXwR7J)exj2hC75)KjDOR+#X!SMI8&J=Us`R!842V`gVy`9@ zpXKBn$5SCKEJ>NOXlo|8jYQa1u>0*f!_n8D{a-?@dGxqe;+R=$vCXFKc);aM%zPRU zF`Ql%?UGEjbHD(F-8OfWU^_mnS3RwW^-s{vM?%X#JX5A-y7FqJsUuNqzgt?q*klhO+3aFS=Fn)9%w;2DvK$4$7i-xY@4syG{tb(4Xg=fj#XI@# zlO2(BfA(pfT~rmzvD|Vb#+ zOibNDI0T6>1m<9^d*{yHdjV{D8u^OcQ$+B97WfJT2*02#RzLQm^|6^y%>vv5Z@Q;6 z8-E;>R$%ZdkzZcZ$+B%XGyG7Jd&g`2(KH(H>2z@Qwu&#drzCRihk0X$RY4O_;g@D& z@yx6-HBULGyY4$ya!n2iLKe)oWZ05ZhUGg4LN2>G+g2r(U<|>ceh{L>F|*qEH|vjm zMys*iX^i^JgBr%D+(29@Df{>G>I(dr!Aj=fG^JsIjA+3THIN^GCAOIMcSZ**RbYTB z_?@EpM@^RNHy{H51ffAI{w;b&uMTy;5zvRDKd=LOIqktw?F4|BdKNNK&V%q6!>Hp8Jmio=Hh(-RG7;iB4uh+Ro0_>Vb}T>Y1-F%+}! zKfMUIfB|ozAx)XO$FDgBc#QGUr)tK+Q2vUW_am+&Bw{~5W*z%)ffSKPDqM9-VPo{+ zb=59m0jAb7iPOcRmNhN0KC+&grRU_+Q&{+VwJ~H#%DL3oMA)E3?8-#i(u7fNtaTOD z&EgVu6Z$(zQ@gTmXe;KXK<%PR7Wq3za*%zAk3A-JnpM<#1`hVOo9`Adm62djPBqJJ z&aHVFQ3aM=B@(v~S}CzgjvsLEmQRZ?vc#^Dv-IJJB==_r3LqlMx0BCKDx@4qA8hF! zWG8%$(C=gm3-Fn*_nxP%v`=SqsMl36Y$R?cnZ0>^RQJfL#J+lKy`1=-t9zYTh!<&# z9j9N0_xZ+a0ZY8!HDp$tV~B~H#{avnZ%9oTT1M;58VTPwN4$v4p^|Y6;gl-+pyU`d zKg&VE;UcCTM)G+-M)yvH9e(a5PCvqdUB2pX=8EU|qqo)GZ5gH2%gY-o4K43Yss=sr znF8^;RvwQhM`r<7pB@-t-K`#lVbsFh?m*Fp+GcCOhch@#&nnU)((hhtY@q;hUDtvH8eZwB; zDD^=AXjLIcQ``9-}^k-yY4q#jzrzwaZDeMU8?tgTp?0J30UYxLeLRy$9Gn!4oaUzI&fO3)x5) zjC8qtsE9hVnsvym17&^b~p44l}bb(Kci@Fogb8 z6pMCcGp{;<`b@=d*NP*OXE3&*B%hYUTIiV?Tm|A=Rh&pMz+Fs0=7QQI-a@Hew>V5F zonzIi@PD|d2T;|UA8QuV&rjWNYxwORtUo31pGTbhysI6zL$TM~AZC2{))KejP1YMg zn%af@%Uan}w;>DPL!768^FIzx6xch|!esRV&!2gbJmA$D8t#;v42diP(g!-lQ&3!< zr6q8SHj+>#3vT(S7MTtJHCS_yT6tQ@D~gQoJL>wq`6XvP(!jT=QLz<~K~VE9$=~uKhk23cDNI97j8RR8sH|zR^H6=A#x2a zB2Li!wsnqZV>zOMCQPGb)3et2J4?!k5M#^lO&E+TGya;xAr96sX0+p$OKn(6J@I1_@F7pNSA+{ zeDxo!cG6w9735vJAdcm)Bn_VpdO2^$l?H-vo+Pv3r#%v0fH2!T^wvA77x|ONn6cfL z=cK-am&eaB#~pFbs&^#goF4Yv&Y0Io0aMFNC|3bEJ`!>QK#5bSn-Kn%j$U#^Z21Jz znf_PW(Y`L6?=Q&zXH!rj(Cmy`{DPZ!ZnF{k9;jwEtl4H$YEua~{y}dCPv_4#x%d8zIvUownw-+ohx`@r40v zs0Hcr`>lfs>!%49EJrZpY8-tOyd_4(klQ`!+e10o;|ZgPI1HT-x#` zAx&|%u5Qn&+998sf(aF$Rq@ojU*XGuW{xC}s*!C{I=vWl$@xY&YV81@CWTX zPUxrJW6LxH`J|zXGYlH0!*{9LQtQ9$MdF8;hZM}DVSMW9vSd+T`pKEm!EX@@3>kDw zOtY9Si^!sr6Su=;HgbQnY9%M}q%-IVyYz#B|4NDyzwr{AuO^Q8`j%OyOVHFTq3L zn5%+Q2^&NlAjexTeySEd(4q_x=gUS{ShaB}M3@CrWbH7Gp*w0;%WI9h)jlpR6G9<3l_UBw!t zHPe_mWNT9)@@~4@qa6T&6k^vf*55BLWE2llfMiq*gt3~w0TWqz)h-g*lE8MiK( zuh+(3OQ%ctYcDpDCH8zYlfcbYHKke=XQ}A=-$k!EBJ8IGvBgd}iBcB2c0j3h?mcG)F z&y!L@04Y}!2tG&;Il1=X*u8H%hkQMEX`PyNyz2HxmzeFRedInLZYVFn$y*SDMp92M zLMJ{8_n}9Qf(k_aF#hPwHvm)E{M(v0oDX}t&+X6g&Gu*1v&61=9ocN4V$Vq|CbrAV^vTf<%%%IJfU$n5Xu=)B!38-pe&x8N{bN zI5T29(F&%Jn^u+MNs$r5y1V7#6?>8HvN1OU7dH!?lalbopTRVi$kbTg-<}cT&t41C zi0O|R4x$Y-5XPamawKfX{c(}{`ua6OOGn((F&QJGCnQf~IjCcjfq!e=|E0r4wH;D0 z>Ib~lOm~S2*Bc}0abhi^`0YQ(h$}Dml`jh-o*vQXBEiM5KS*5;=fTG4DeVMd=Nx#@ z^V4)r6bQv3{b-oUXLtzQYn>q5a_lNoVB2Uoh!dNVb1BFh_XxqBQ>cFX-`syJM zUDQT+2nAnba(FyKT8eq zI(7i)sst%ukzj}D|8%vO*hKD*eC5XPtfgAmyJwV43YHtdMlgBIF|Bpl|H=}`>8v%Z+?4>yn`)>&P|;pFP$FHlQu z92^>iLd()vGRHQ%J><)noJ6I;r4PCF`>6v)9o3csjAmzRUA53}Bq3=^4Trhw*ql7@ zL}dVwde7F{HuTJtcI>MiA2;x(r1K3W40VrPhg41x=JGCar=Sz2`t1=6ysB1FCpnLE z8dMV;sn3>`ZM>3-Kl&28<(ZqBl5T-o$i(61vtNugO!v75-qd;0Z#I%Ulp>6*fTx2U zEz@t27z`)V+A?A+dTH7}vz$R_*{PN1nA#96gYHRJBN7++Lqblx(lGm)EM42N8SCoP zummN`m)0H&$*_~{nq9K24b#&K0l00XC3K2O`P|E2cilWC>2V<4u0&rcgNq0!-HZ>j zN{izv1HIJJ)|xHe7r-h+w-1C4(bS6-%ohyAb5srbv6!*m#${OM3?j{Uuym^)-Ii<1 zO(J*!`)V1WIQ`ZgyMV~ja>ZtVGlyDphxp&yYV{q7y-$4)_0d@J_%>2Kc0)Ge0r-dD9c9=`6EmG^idc8o!biL zW>fnjcIp+BLN-t;p>DBV*c{_mtv5yMi_!7SL-k1#S;~KL0|;5aL}rfZ-=w|0hZn#d z@cQ5Jd%f_^?uSxcSo$6$YG+x_`Wb!(X@LM(a=O$Vpo83ti#gWmpfRMsD2V7*Ckb)$ z`H#o=P(=2o-J26rNdC}^OPgIJjjm{?Q|=O?_ATSD54ZtPT=qQp41*L|1Ga%i9AJ+d zD~BmS8&?VucOkvw@GZ%OMGD^KSGnJ~V87>!?Dm8EEoZ~7$PTn6*C&>~9e$IiR@_L@ z*{iz6Xj%Q8d(O7i`4QKR#_yN(vq|-1CvQd8(D>%#>`obg-yxs>wFCN6JYWhw`HgcS zJInwyNl!*q4nYKm&{vEKpDw}-V-8&zU0|oJvbP`~s?Xs{#FebBJd_hkO_9t6>RzP@ z*d*R6jI5PswE3rwKYL_C^^l^d<2fEgS!HbpGcM*l-3*KKPH3q5IHVwvE=` zvW+MV$;hw=4--XJJ%!#fTHbGazoPeU;N50+rl9^Y~;!7CjiTw9JdQ_0{dH4L_az z$Cd-AmQgC^$+k8c=0P{<`5ExhNBd(R<}9c7XCou7!oUr$^%j8m`Fl;xhT5+oL|>P% z?PD1aBHJ)@sQwwtqT56fd-SH}^(N@|d(Ja1skI>Z1>2JUn4SR^+0% z=pG1JTv_{Yi%?P-(+HCoI8sA9F%R-9am$P$t5lfd3%k0YYncGp65LlZsHZszOP^o!M0a$e7IX!kNXUkqNMGOR;sGMTL07 zr2CwymBk@en|H{uipXDCoRLh5DiXKUG>5nN%I_LU#_Nsy0WL85js_67H*%sK!Mf0e zN&(wkuXTuZXh=`bDVcuX1#zzehCyu><X+Ag3j*k0s1QXF% z5MfJr@xOX`!tg!2*FVgvcdia;cXZPtjqoSWnqr%)*l-j7N$}?1_j(`pnVHlGTTenK}?P4B4u+{i`~4GUueVp^VeGkx}-M)KNn9NN$dS>*~P=T zr?w`1scMv)kFE!M?CSkj>Unu#L2dj0h1JQ~OsqWJWV-M7Mqw>iwN*GYugvawQ(dcw zZvOqGT$-g1fnRsJl)z9Q&IA|3RtMJ0MmFBWJSS751JT7|;7PEU zhIv85-irVUoNP9{DPXrT>HR)bRgMx5@hHgKko9V%NFOv@hD_Kf{ExoKd)V(GvlMub zj!<&h6{&ChG_DL0!cNC2j(-Ia@?yPY3h)0L3gdkIvfq0dF?7GuT!Y+X)AKORCX z>bzy8?49PB1QbJXa@ioIZv~h%JtuhoaB_-aOTuYSfXj5n_0dnp9LDA&&Xg~lqZVh& zPG>Fb2`h4$9nsJ|ne4h`{8{9x2tFzD#ex5_UaOt#jvU`!EQhsNE-EanWdRjT58Eeq z+6lG}FLrGpmD4aJP^8M)tqg7%6=rC6W@57XbYtasN6ND5yoR-b!uwcFsrz4QY3p=q zHn;+0F+NA_Oj_XNkMUBj;kJYXhctatGB_zkitH z@wOi-gtft6q_)Yq3yMFk4F$OTI4E#x?VZDm+F(INChH@JS`Xk+t)yxTd>U?{@!7g)MqyN73(2p_22Z*`zli?B2A4Bh#u$QQxF4J6yFNNdgxUl4ML^2~kOh zCnAcPQ;nQ5v2%e|__72h={k^Q5%~pbfdGGmC&mD?K7?BY4Qg04Jwb<8;9Yb{HP@sg zB|3m_z{egsV95i;_;QF>^Yu4G7|&le3h8NaS3rzT>_8w4U+aU3f2b-(6|4yyErq05 zSZGOz;_+L75C?`wHd5VKoi}5vXXENr%%-QiY;KTHa;`xhiro+NIR%7stqFp_J02W7 zJ~r`4=Xypz$sFlBYbjOA`Sw_QbFwz-{%V_*lp(g9VUk=ts#H)7Vd=#X3kGwc(ks&R zIS~HGDvan@$^;Z;4wj^zHIq@GV=sx6MpF4Mi!otd!S7^Y@WEN&%r@-GZh3VEO1kea zT-DoP*mcz5aMMs1ab)&rez#6t;~iV$ke+O3CP8~JSHBqIAcpDK+%gwxcDNG2RCaI; zj5SSXs{`G-sVEDt7jAnwQy`O(e7Ub_e@GC6-zp2JvGp9G`@8%356hZ(Lw2dl|Bl>3 zXX~;gFN17NVcpjbrTl(WiIp8{vgb9+(Lk=IqnH}@^vNRq{lQv58PD=>oaD;o%U@ho z-}%0*EFO@=)csjH*JWB!Jvf9MHNIzSSivycbWlr94n6#G&{5O6{q1w@bUzAV#nstC z<*bE+a1Q&@*P^x!AkMgY+p}NO4W+l0;M%}7i+e3{tn(cl|DcT_0HYMt%^UmK>M9u( zZ|C1~b=io>)AW4pu~=1h5Oim5+i~4@+$CgmUh!ugJ$^|l&-_gHtF~wM(3S`tq>kfL zoEP0~AUz6lC!%evKIHmc0EwUbjxXEL9F>j348ZQq*qa5d>}zu@$995zI-Ma0^G5gW zDMZt~i`^G5fUASiO54=i$^et>gJsI)n%MfWPz(B@Ti>#x9)7uY zF83h-?|5Q22OkMA_BDY^4eE)FV#$RP=8-aQLS;fkRTdUrisB57b3*GT!C8O* zwF@#uDd`}Y30PuGz6Rn$r@CRMUjMLc_g8ezbpP?&@Ju-~8qZsQj{q%g?bJyX#q#k2q*e;YIP(0$!JD~tsb*dU2!kbXg673393DWZuFL5O;2tSCD!6GXfpe(&OK+w0}$-& z6x9c6$}~i6(9isL(;8}EMM9*~a49P*HS3qQ;zVJ2>!=L|)~MufU%isX5{50(6me1$ z$X#&fB#i*5>h+jd5@{v%)Z8=7NI*YcWYZ3{^SB+SVs>p;B-GW~;hZLoINAnc$GXM( z-3P6PX!#WRL~XLS?^sX!B%e!oZDT+PeEoS_$TQ%aHJHecOse4Dk|7|u{~{ZZaBQ=o z3vN*~|23G*nt5O2K2VUK?jy7GVJ9_j8P4{Ap8Kn3T717|AM^Lo{bqeQHI{(&jhX;c ztcGOeS`zp713f}G$UOdjbf0jKrLs$XWUJ+&>`hY$3D0ZBhRHgzxv%Vc4A0*B?W|C5K8uC7$V*~F>De|%paRvgNHU>htq{=62v;;nMGhTi;E zmtXqy<{*EO(lJOmIR!Ovb3&1S+4LmmvN#flcm-q6#8?_&KzkI7_VD^uB+$ z&$TS^2@<%IqeQT(Dy}(~>T4f3VD49u(7zwvG>;KCn zTlu%_lws+=z#_{~tA3vj`J1mA$JN}*q3+aRyY+oorFH2? z5pNG(fUg89X1_JayJcJ(H)a$4<@-l)ewS@kYFY)H^mZluNn95lbWWP z^*^crkOUM3E?~?z^-hF`oc%Cpp$%84xf@m(A)huEP!gprNBl&0&dC&N1~>e0ZhST2 ztZJkGgUPX$zLbb`nKy^ou1UlSS!?`=+B8)M?;MJ=2$%UCIM97=>gKZQMTQwN$c4aq z6j{P1r>K$v#O^>9QHTv%PhpVR)uJ>lmSeTaH6^wQG!~`C$fEi6)mV%YL!4+71GQ+4 z;!VpJ0qyVf75n&mg-MxQD+_8ygn@$V49>iDpatq8?5Tt}Yg?`T+@#)zgsrfU50C0j zy#JOWH;f|$By*`96NuD_NU7x*#1X#(U7Qn&`tzr)5&CpEJdNIseO&vFjl16T8(|I; z`i7#dB*7dG{Z-IW@gn1k`m&#Uy~P)u2ca$^)qP-kGv;G$4d#m~f?*xquXU&qhfO8S z@C__(Pm{Cs6R4ThflAS*VA>!M()Vrv=7QwVpyi7_5YNxKd?8uN9MS!K>~#}|&X%)j zI^8gKv)5t(C$_xaaJuj9X`a0BDt|GCN}R(@^J4M|9cV-AM}&7_#hJJj!;}ur+<&@g zn4RDD;3K8E0NLmGfMcq|wBqwapZ{N!%BMi1v$?+A7mrntOOL6%N6IB!TdzQlb&*02 zB=JK47>duApS11$L?gtNlV}T_kB^K{;-82?=p5HR`HxoIXsWXHTCWwJ^sbw~K%@dV zq+l(`+v1k3e#i+jnXCl;tr7>uU6a-lFbH{4Lg{?u65=fI{t{Zcs`Gz-+SkS!U-OC` zHJd+#KKVB{AzOAqtq?bf85Z4Kb00c0)vy3dVh{6U|B|NOr2e<+0IxPoOTex1Y25z5 z3-V@dkjRa3!0DmIa2FyveJn9S$k}DxoA~%Jy32;;P4r%z$RMz?<7cim>V8ZefHx5b zB1bSM0d!z8``P6}*jN-cVx;)$yNf~sCjIIYI~pN_s3Db|QG(~wXDivSj*9~@7}0kh zDnh>gVnStw8KJYIRhsGQ;F3_o$^BVn2ks(0YvW*|iuCm44~79;wcCq|%gC$CaiwW` z%)VQRZ`;v$!;@Vn+MX8XL~^RrtUb+il?bdot5*UsQ0&_~F#F>+$gs$HX=vakAHIjE z0nR!x%z*01oUg{nvln|KdTI2;kA0_J0D%uG3+!9Sxj=Fy!(!T7?CBt=pUNk{^4gD^ zTU=HpOcHr$1Q!7ro?l>Cz^@|Ad4G8Cv$oWG;u)}#LKgm*FuyIulA{?bC@^EF=^h>k z;^3=-RM&oS?V}C^{zup?71lpT3w^_wKAjThPJxq96eXY7Aq6e&FxbEIDf~(}*fZQ5 z_=Kk)3%Fz1ERS^x-=Ev8I&a}1o* z!!z_KZq}MvTa|(-QkHQM$x&mcF+f&c>sPm_X#duOGf{BmcoZ*s65;)aL^fD=QlM8! zA@CMK0opOiCGq#YI@;BsOmBzmVC{}72Dp=crOij?ZgZf1_^AR_nrpM-^fq1j!w#}ZtTuR+y>) zyOSpsUx#Si>}6Sa=1)wW~M8=xHrx*YM>|@agYlR#}nn(`>__ zd2>0;*K_m})@k6V!bb%KWkQ#qm0gp7LQpjkfY|~e68H8k>cmyM`%ONuZFXknkW>lq z6GH%?N073b{tbBl+IpM5_g$5DCoqGETXNzSg{fmWQLG(buy;P{-ZnY9@mjn4Cc=3)OI6r)Ni5s>GpP3MoML3C)eF1<@otY1!49$L z`p4eU@0~yDH!r{MjF|i<`Q#8QcBudrmCeUO7-iKNV#Uh;n`1ZDtN)pR@3*A~*ua@S zO^A#2@rqw4I{ynP64`p!+Y-DiZ2)9sDN|vz;aCf>c=+`BUd?xs-*+-PDxm2+>ss#QC#g)BI3-uNQ-Ka*2@ryNW~oyl9~!2Z%cLGL9~dovUVD=C=UEi zdiLWaYSSw~UZ}2SLD2T#0_fd^A%*n2sC$HGCB>RMwWRo1Lr{j%DyJzRb(MvzyEns8 zs!w5&oL^hZfw?p}pOKHTXQ4xwuz%W-Mod)^~D}-#fGkY_gLgcEi&4_+FBj8~puOY&6Lso^b)sbb8 zB~Tf!%_izWmt%&qW=7T`si<+WbzJ=8W&-aCd)0}i3;FmOcqov5=oc%UeFgprPe@Dz za&b5a7-=Sv#mI&OB9?}$l0{e>6!!v#1TOS+R;WjaP--hbdJ1WC4dF6!LoF?*9v5JY z`E7&f*H{wN=QgaXtNrS@Y&I){t-P4YnuK+E^EBml%Y{PcnqI|ZDdIB6K-Bo^JfykU zQv{U_sje(bU{J5myV&u4SdbkA-=;8`+gVh{J7ihL(i7F3=~06O;@$j`0T$B&*zfdfCBh^c8y?qdjeJ4 z#pm`mWH)^*7GtmlEq-SRFK%O>P5CmPZpdGy~_rmY^;}nDp^cl;Ud;|cu|Kw zzAty$3PAXBn%>+NVf8d4=d%Uz^-roN%cm*jr-Z9B5rRX(6Y4Ee9RTR32^3A?ojklu z=dB`hLd!Ty-*93M9}qVSLxkm*`1Oeqns*zWruM z7YLW=l{gpuY78|%w|73LK~z(rVwW^F;^LPd#Pg{hJE&^U28xN}`DDpq|0VLZ>*F6i zyWnqBPA>1boVTmgGvwTFz#W|k^aYi7MgI414;oJC=l5I~pJtSjbH^M`W&k%lW3pL| z%cg;?-h6M_1x>ymH;&9Km0k|f&((>v13!Y5Tj1Fe&c^ar!ZBacT*M98*qhM^G=A_p)sD>iH|EQ!#wC$N2` zz(PjU2l7)0+Czo|10hzrq}+7jGJ4r7R$S_?YiL|(9WRW^!QWJW*uIl5Vw5EMFB zanD*LZTIh|it*eJD4JTuKLokg1}4>UjfJ#ONy4h>5#IEx=0gDu+Dz=62FlZfVOTOH zgZ%y&2#4L@;!>P6naMaK+OZh>f&yq`L_`YGoeMk}9mEoU8oXPDo-jwIoW*3L8evv} zDeMXw(x*G0*NBj5k&Kxt>xh4o)P1ZItyaX zL|SD>GoZuEit&JuVw@RMWDCh!Kk+dqQRIVhLI-kowG$$w$4ep`$apFE9#x@k0V0$s zW_}1JJ6Az@v$C+>(Pj()0_He6=@`{gE!>tl@os>1E#nHklb($J1-cw$4#OF590+0T zMq12~f8S`Qr;{@RiF<#Gv}lIp_R?vSb3-c|nNb|k-?7Q=y;uJskY=x$_O=*^p+WNe zUM}y>@16fDa|LkqWBi0vCq`lXZ|R%|6)h3j{Xrduep^LG7BXcvt<@g*frV)hM?D1c zivTH{mOdB2c3Kn0OJ_23eURn30jpF-YmBm_UkQNO ziU;)}#nLDrK}L`Z4REPI2t(%OR&obJv2Ue)tDIgA(rR9!^_mb@?4ekFSN&(S#cFn_ zbf40iLw)eHv0cIYGDR22M|TC}b06Z1qxxJNz}1=q+`hR&f4$RH4cDow$ZeqYsmTS$ zbuDF7{*NYCouyP2zCUw2v({?K*=Idj34BdSe&w@^sP5kn6WBRd%udV*qGa_L=2afw z+av+^0o$h|ZcuV~7siU;pOYQwY$&g1hmi3wtbS8676o_f6-x@|1^W)dh!7|_lwt?} zz>Qy6-zA+NxwG#gNA^R4rHlZqhd8lL)lCH%BHFRH(7H~CeR8*<*C%kdhu!aYCaBMt z@n8>1pMi2mjrF(aLLIa_3bKD1tb7cwBX6U+g`wyP3ntb}!fmsz4;k4t0{6cX&`1T2 zLC2&Ehhg|PghtXY@I00!KKJ2DQFBFrz3t%Br*YEx4+!Prryy~N1pCmjeO|Vd+IPQ5 zv2&OE#Affq_`2lgbpQ63#^Qk2&yK&6(bF1`$3B{RWx;K2lvkKy{0xHPvbj_y29l9L z(y{*`nxL@j&cplV6TgP2x2M9wiEYo189iY!ALj-6hnw69nEcn(ZfqXNc3({?HTtj0 z76KkMSipKok6hp8DDox*=JKlvJ0V|RZzTmU{4HX|goio4baX_n8+oKMzU7&Xp5Zkw zx-2>}0Z6PQPgReXugl1@1k|unRy~kt%8iltRyVI&=od4_x8oTI&lK}t)qz5|Gfn#6 zFH$dJTXs}k~XC~KVh>wQCld4hQS1`_hH0HX7!M|mz|q2orDwD&Pn z5KAKxbd;7zkMJNO!FdU@z#`egGUIyL@;tXq;zVnb4|k0QI@lFOy2qBgF+48GTX%6G zUrhnwlLA72T;+bA>BJX=Rk!>-9~{>q8*T|L;2`V%xTB7hr(%_qa)Kgrttq(*{NM~G z1qcGDz_kSQFdC#)W`49Xrf60b3Eb{0!wXFLRw*Ujv@;HN9JBesH+XaAP=_H3BPNS- z`x8gVx(afyTw1EU&CmCrBJXfLvhtYts)C>1tZ<(qy0dMfi z)y%^wS|%5im^YKr?|^p|EJF=EBUb#Fk+kvHi#l*{sxI0XAvJ{@Izt-~oOLY0_Fi4f z?w$4w*-BT!nduJpho1rSJUdMUe{gsySohj){JyibZT{0EWB=ruCv5)`Zr`>gl-N@! zQpq)WEi--!(j+>}3wU%adm2g}DyCTex^p#XZsXLoG{;(H%@J3bsb?H{=R?na?%EZF z;__128gtIWNd;aYeu1DB+s;b>FrXT&5a8|E3ktr@OxvUDD(b`kq3N8W<6y%rJh9Q( zwrz9b#ZcWRkS8Z8T~c+sT>y=bWp#nTuJo)~EgM{cMVu-yRMzvm?*L zp3Gvi`}=&S(c3(^a5^)SQVx9yu@UpI&#V3>#myq*L}_<3C6rKF>5R}NHc`n{Fe=r; z4(F0ahWMSY&*wd`lU^v(G!Rm$a1BP6?L&X1(E{6hoVG-m^MWnL9))lxcZXlSMHFU9 zeOc#06*oi8Wwlc@WNmoKMb5_AuX6eIP`vP-^~@Ls!)Aa=Hdu%g5aV}e3<$FjN$A@D zsNGaOCJ2CNp}U5-7VC)*=suKg?q#&Kj!4cru8$fl#{M2}AI@kL55EJRRq-FWtB)-7 zT~-iM@SVC`n$gz^uueJ=725d4QY6Ly+0nBUw*A0BMMvoa8Hz&m5FYpdXXvq@Nqc&1 zgY*G!x&aq==zY+Fy-LLd8{U66^6Kb1P#M(>N)~gjuD2|=d+70HO=1}1s6)MdY`aIqD)n^P3 zRty?Ief^t{6DA(~RkEprnfm2m&n{O>;+2Ary-WSu`fpHI-{===KG@ zZTSv}Ig}Q$V9lACSsC3D?if}x%yP@vq7@Orf6;cUn@sm!9IT{%tg(Xb0S!#(7yJ{# zka?!MMm6bFJpErDc2OmQzjlI4<5AZF=uH+ODh;dy zTg!y%x|w+BeRsgP6ifTb$&P*rQ?~7ai~67dM!DU`zcFpIO2Y&$0XWaH zdJM5#+0lEcS)+%Xjx@)WgtZd}$Arh3Ruv&8<(DR!O8Z5FmRFiVEYK1{pX2&9VWWOc z%zJb0d)Ng*(ZUdZ+pPcti^s7@BHBt}fnskCR8z!uT+3w&cY!gZZtAv;r6X*Mem&$% zLQ)hX#ABq@Hkn%T(afPt+T|sd7DYle&g2C!zU3GogWL&?)E4=FeaXKWHr&=uBXl`BP-chYPCgM#Xb#r zD1BdDO}8Tncl1z`-th74?XolPU|y^JTKjsrNDevVmi4*wXRxW&TJK|_?e*5qX=_~9 z&j{wWyJr9DqS1N7$)f9~@y=HiD1D|a*E`c0v!1*A{>HQOfi0v*VxvJHmSl6+j#m+@ zjh)+A=x1huS6$0yX^X~wviWhEAXZR*H3Q@k}e zo>*-KYcG6|R$9E}Ky_NHM6Xw4D*{=#%H+u2S?9~t0LH-^-;M!s_;c1FF#y4TM476V6g2!_r`ORiDb48G)|;n!uW94D5AW%(%T6J- zuEF~w-`;!QILMN&+t>Tea)_teNiSp{>Rd-!ZeETr%bf=d0hxf%>6T6-FsHXPYMGwibDBbKcn*O0%8^WcWdw$A?>e0}URL0`ab zIL$da@TA6xnHOmO6%F? z9(3AliG+sGCzR`m(utw+LO=XqDkqkKUPZY2^B7Oh%8;TrDhYHpunc@FH_LAwRYBAU(0Y_9x18Qy9W@C6a>`osG7pRjYInfJX>sRh1Tw?=v z4oke*TYAWt`DT9?>Q0UGt$vC)PxUZME8fUqfGb~1HO(i$#XMd$Pq;S|t2RWPHtlpl z67*PW@o5>NL0iQ;NnmlANwx2Cbbzu!S}{NueXqk6mYnimHCJ?-P#&%HA1zXUkJU~7eqUX6MfdLp{`ipb!=;&@(ch_Haq(RJgoSW2sM<>J=5Y2whXBwBg|~#sca=1F8j*)SwAMo`bBaMu zXti|9Ek{{>n&p*!$^7i?*+MDQCe;<#SGTj6kEP08!Q5>mKm%dkkNSh$=BvYYh&BHG zfHnAMXWjY~z&LdZY@Kca6HGu+!Kc!=hQ;R(vFG(7HH60NnvWfC>93ISr=?Q8F(-r| zlxnJgJSGVAzQKR{I?7t=hn~V5hV>cku{X{)y2H7|Lf+G<*I92B=8FwVf+QkMZWvsL z>BDUP$87<}8J4r>EsSgktS<(FeN=^-uKMDQc8%0?6KldGyW#%Dbzl@}nBX@y@ zG}z{;$vy5QLMG~lrBzGjx}5zb>D2X-lNT+#WG4W{%r>=}KBLS|i#R4sfdHCO{<>q- zPr(%IqCru7`>~DvhF@#EmS4bC7rh8gfEsk(`bG}@cLJKg3UGq%MHjN2-njc5Wc-_J zWmb)woziiyD8!`Dw7Zf^+L}hrCg%dg`+epGZzvANMX zFVUiv87}OSSA-tA3MnHQhbc^c6hamd*bNG~lxoJe;8V_rMZ*xoMN(_a{B_#7$duK` z?=kkoz{-_1#T*Y((C;!Vf-iGxuFPCKA)@?h{tXX);b{~!3|jgXyzn&{XB&rnb$(YJqqJ>j;`M~;vU|@b&f>f_Q(xG-7UNic2Li^qVfH}$Ksjt5%926e&cUX!)KWj&N)WPjG zTnu}Te_0LaaO7n!hir#^SZq{W4)fQGACgr&g;badxGG|;=Uf#myFSWtnlTQzj1u5d zS%vitDLmA)B%&3Ir#0{?$@O2*{Cf4;dj{=$vZ=XV<`)lV)+!_}xhIhx{Ql9{hl2&X z=lzS4#I$JxVYYh*#d-R}*|y@~b0%lSfZ@`8)_Huw57yB>B00v~pa<}X8jrM(>*_#je!eExN~=!+@RHo61YG4!dP zydLZdWn#KIo$IK9sAb&7@y7ElQ!z4j<+(s-6hW563+jj_2gs<#U&#^#!D$L@195J@x=MPIxtCi6J_8s# zzcIpoz~DzO%nA%QWm~dEm}H_;@xsGG&CAq03gn|!e=2-X+# z*PDo|LIrmRk6a)#030NE{DW(V5^ip<|83?sLluhUbp|9A7}Apq^%;6NOwPZ;!QC!^ zBY8JWANB7j<9Sg5+O*clM(VsBTNp1SZ;vDQ7GJ` zqR(ax87+FJqh*cEjxlXNGeg+TzWNyU$YVi%cBR@^(CSdQKPuaDCUuu>cm|Tha3z*# z3)SYid2G2um{eZE_XK=#71V^%*KI`^-t>qaMx3SfpBQbd?YvR*f2XWnyf=KUS2s&v z_ozMeLg^E=n(<=IOAf=oWO{x%6m{m5hfwU43d+F08Rsk6I_QA|_NC(-q1`+ntbYvT zH}s%3nj)_}dJzUM$UUY~!TFIHnx@|zA#9@e?xNP_`A&J@)xFb-2H^$z6eMod>=sCr zb%EP=4=wDy%;3*4eCIlr6_N@mtCJOqGGjYE zr_mZj!^TFH`_2=44Y-&dx7|ScjPTjdqopacJ|zs!8sR;DL4fFjF|~o^x%NJF^FoHS z$l}B?CST`bI=swmt$}D?$nJ47R>Fvk?<}xewuA-0kH2T!v8fS2-hBUo5RhVLXIx96 zB%^>>G`p7phA`yHx-4oM`eaTaN*7d_YS{DP(aEvf*X@NvB?-;iRM*6;r6}?)?1lcT zX6JOKy-~CpTV`n^6%$h&h+>_w;8PXJv==6@x9=>V7zoxQKp}XL;8%hnt4&S$9k zE`^JXEyVMOPA&Ctv`KN`au`;IO`Kp$Gv$yWn)(|~PuVbWdWBa4Id-V5y!qhqIL%n& zd=MI`<5{O_V(Fk~{q|$41@6Ie?xFtYU~v=($&kf|JOCtwTRUF5Sz$~Y!mPTqY5p8j zUP})pwVO!=pw640Er>D_8_f(Rh@Iq7o@EJal3)%g5Qgwd$IUfMVH0e;TOU*~SIX4$ z+Jx;IQpJlMm!yfMd<>{La!``yQMVzB+JmhPMgto2k7~>_cTxWcy9%-NaiULAmlmg| zb^dbb=w*ZBXhWHCd=P^|yt=HGxOerUw`*EH!Xai@(zvQo5<--PS>xcfRjH2V4)QmOM>Blh>)q9!nlrSVBQ`B{V%_msG=iA{KynO~g zJXs%|HfN40f>M2GnbMP|8{i#vff41&@22P9S#KA#O$0{1xTcw?eZi#aw8UNIJ@j|@ zlZ`)yUJfC)X9Pf&n%%_(SCONA3mrO>_1|HIwErIDM|}|GbvCW%i|az|lal`Th+q7FGN8P@y02F>Lwmw;!|ZS0?t8aZ zac0E~B!zz1Sbr#u;C2mdQkcaC5-m7VjB}eHh9%>`pGrUzU#pet?$S7NkRLj#1(YIHgt}<9aE1nlb_3IVudt-wS#Nj#Ojc^`y*=y3@GCV;FcDdf) z-WWl+7jYiVzJOrguZ1kJDTm!{LS9Nn9cmd|=1oLmAX@z#NmkW_Oj-kq_}0t14b)Ys zuGY2gipLF;_9I?{xnfgFIr&jfBAFM?K697uTw!_l5U{FiPEn(be>3ZDuG~-2^uO$6 z)kDXd^L&xMnAXwPUvjCZn5y6+kjk`F=gzRc((B=z?zyDa8>03E@ln8|@y{eIVl zY{(s@o6QPz_j9BgZJAO`20$EqxRPJS;I^aN-*VHs-(s?kZc@kY3is%O=z9TW0*H?u z#6%gS>62n_ zbU66O#=w>Xl{;5TFSj{trKzT)^ja~r!PsCSwraGlh2L;))`o6rAdn_)R9?x*UPNW@ zLEUGd;6Ss0Do@U-K!7!7Lbd#}DrG2-79I zhdMszkG^b_AaU(h%tjrm!QZD}1H8WNc?!OrrM9ejf)DGJxL@~9L^t|7Pwy=41Q)_8 z17y=tB)2ZFqFYzYoems5+mj7~*i=Ouufs^}G^sN2IT#`hw}mwwil{!NjFIVRyLnvi$^xlJx+x9NBY z1dG67F=orFwa_j;PCJ;wn)TIWkL&nNk(V}p+`+ea5}s&IbS4)eN&8h)@zZIfU-lYAtc33UlYYxdaaUf}xFjJOdvlodan^9e%| zPz6NpL#Jqe0psGQgY2o=O^}ELW6$n{?+B+tdLN>C+0f%bUq1ZsUmRqg7-=fDuVI%x z3g1rsvgsXDbf7tmZ|c_JZuFxGkKz(W{>+sX*_&MEJpAQ;HU7T|fNK;={Y9*r1% zMkP!b)oQtR6*$xyMpjOKrK~_<`2B<2)YMdNg6Ni>0~`NqW$edHp}xewUn&f-JxUr! zxRiMIU@4jFj0#P+{}nFy3%INi!xkdbHqhKgp0%4R5fXY;vV;?$rq6I{XDD*#m9F-> zWzbwEhC~Uc*cLn%d?Wa+pl8?#^iZu}IMYbLUS(MF0R7hRuLPwT^iG>#lxJ&R?T=MJ zTH4l%0Z1!G*XO8o8n^vawXVkG+cpBaJ(o!vw<$<sy_U?;nQk$?Dvg1$FY8Z#+LbDV@-j%3(FH2A z6i2G32fr57_*7Jn?mwioD74veX;-eHZIm|3V|6rSbRG^Cx^m|@SF~fsB4{z`>%|bl z6jT*5X{Lsbgrmqnp~#wBTGn2=jHJ_s8VEo1X&?29yyG)7$9-9`Ory(j!e0&s7YrbQ zeq=O$W5=tX9(GUQxz^Cyn}~2$ms(!*lRtTHZFBTnt0T@%Al2O0%OZD97pb-f7u-Ys zn1THvkiiAj-@b%4X56BP)!O&);PlVJNS_^-7vJ&6LZ2b-o+NB)i%m&Twlq44&Rg!d}xW zY1XeZQ72&HiuCh&t}boo>M#j=R~iVrPh}a&U!aRyOy7SlYqK~m@MRa)ihYh`aqawN z@?1yM!@+pLP!@8$Yr^GqIkT{i`m^$9LYi4H6J8T3leEk5{r;>1VlyV-WGLW-jSZY* z7gpJN%-OPyCIz#uz*wE5K(Kt^-w!!wm4My(ay8~C*e&}vPYw`xqwe>&O*wfv&+`o& zf0q@##1wV?FqwDN!e@u0IYJG^4Py(DB< zo$H5&rLExZ#&rs(rf~s}H6aZ@HgrSkU{62#3bha#QD`6VASc+jHQZUcvYJU_q2aDB zpyn}%O0Kje1|>A0U=^Rv%^pV8G5|$7Hv;4?tgqhQQ#it=_P6tZzo1k@KxN-MK_&@X z$(pldBvqye7^6?e$WgKqMzD{_`ZF(V;I(t_3Mltzc|GIeuY=TsZ&XHa^`|znSt}ux zVL-8jbIIG7P81Rg9=lV)j$z887TizNvs+$CVb1nFS3_I|0W$QH2$SPy!lbKGhL(no zlIbC)FC*jIrtVUgpU2NwuSQ|1f%H2Y!Sro&CSO%Vg8NHVbFr`BzzrX*b`V(OeM@B- zeoN{b+co5&06|@9QJ4KJQTS@CSW5F;bY))jAv7%Ll3>$2481nXZQgHPd<5xCSk;K4 z1fw4Q^msZaA}UBQ>20!-P+AxF@J$8^jL+N#MhgY3hE+#5`Rl=Tgw86zZzrzx5_-)r z%-#Sow8kkrWVMi6ns|H+m5P=*m2Ma%KzsgzmqFf(0tX@Ll(J&a=$c*A?`JJ1MK0)i zgv`eVa+@~poJ*@RB}d)K>oP`rbR?l}F~2EGt|ioIRfz>9Rwiy4d?3UmN-gvbuE&NR?jjw7S%zr4slw z7em}HJd7-cM@jlPEIY0pymI4BSD%gFkn=K>TmHQ#p0*l-hTG-zQa?YAhHmV(2OaY? z_in;xwkKmDMi##58UiMx0%chIUx-MV9vUDLctEDK2t`?@XK&p@+?4b&_R3;H(tBac zX@><)kd^)BHc|wt%`CCgmlIbp)ovK}(hCO5it$V~CE2bSmYgUw=|J5uH!}kSpFTg~ z=BC}y2VsrphjY7ez{=h`96W==>~Re$-f(-b1Tq95_*p3;D3dHN#-|G>(a~S$w8BSn zG-crE(p!y+Zy9X+{TBG)eJl!2%QzN7=DK{;$~hV70IUz8hzfqrI72S8u@nnaHbl-- zRjV(PKOENQM!1(fzpM*tm$BM@WY7K^_ODcbEcc3kYS)h%MKjBI@G*0E@%62)K;768 zem9{6hBj5LL!6hXqdm6D+3y<6P5r3b$)U$uNx!CA80UOn4Xbq`PTn3-9Bq1e#nS4so)Wt?eC;Ehko&aH0y7aI1^kL}q0Gt8ve`^Jcft`Muv1e}X*iXRK0+gs5f=IlFXnO?|vBNCZk8 zWZP~BaASQ&r7F#omnIL;+7eO1*p_4QGUlgVUUh|syk?8FBBIY{93dM*El1<|4pic| z#Kmu)a~b%Z+|@!DaNKHv^u? zZ2k&l^5?phVFn?+vPT-iurFCx?uPI{RuZydU{|EN<*2yWwN`J7{z6j@o)9w!IEG|1z=l5@Q6;t{l^=_(W2p_~abI zL}{l}*k~tJ@A&WOwd2Y)$J3RXr4%D;R(+5mZow$^ztwfEnan4z=ZnR#?wHXDayoCvy>C^wUX}VsyV=hd(Vg7>@Wx0CEi+oQpZGPNHZ%Pv zM6X*YK`oHuP(s_C9JPJlclA)+qfJ?(y*~O(V|@DBy;!&otcV!pJTQvE(Cp-?wH0EB z@y4yUyS8KEbMJ7HyZUf^6Io+Rp$D*C;f^~v;naGFZ(JaG&>f%C3lS5q>F+t|%QhU! zFIcR-+tXd#9@**+lZFZK_f&r}(Igk!m+_};z{wtJMZtd*+`ug=qF&kle9d?t=dRynvktEm$`ruQ#tO-f5K4GxCd1?UXWbHA5NXATj?Plei0t@`GKGd-n;@7g6;nKfBf83M{qJenqlxu~ zhm5F~uRogk`^1`(zfox(Rt~!>SsjDx;AU)yY`GAlHK*rm>=a(Qt_H-MqOw&hCy_KJ ztyY;zmqW8OE5T#OtFn+UH6YxVs1XQLAKgQNo?&>i5IOY@3mnSZj z6iU*JXdW+(US*7$Ee?(DrrTjl+va1QpewK>jl-gnZ=vXzAw%gv`X^@c4PSz*4ap#V z7)_E}JyQ5`sXu8i@qF2N`w8ph;aD^6zUPzRQ{o*je1XFbbzUmU(=uABu0-qYIiLFF z#@_}xM&K{15g8iP-Asr-?^1`of+oP!Y3d7`5B*dE>4TM9;Fr_yJf)o1Mh)FRhuH5x z(WFl{?iosPhqP`2Qy|7}O$}VTC|g!cEeh7f(JDfplVV1Vr5tc1{!1nTp!` zyr%)uRDd5@Tc>3mgHMii-_EdX^YE-uFd_dXO10|%2$526O(padoj!)6pOZM zQ9vZf1akS}Jser`S7egzS;sQblI4LKvLMvi;tcmeNx`lkUh^!)1;t468_O7lBwb@#7MnsF;=vzK4$1 zl%Ve5V_t&+!e^c{T|WUls3W99wJxw%$PqM5EBZLX&*p||zz5`E$tk^=T0>gXJGBYVR!iOsi$2=2w-s%8!yJ?_x1#JnIcMw>My>!fMShL#eRO&|SQ$xgZf^ea zN))`C)#d{|nFe2vV?xsRlg;@Wew@-)udo-k)U8;g$NJN; z4eF$8Y4y>F-2#_L!Y5$bG21Fq2PXK!&f~@PhjQWo-lR~Xm+!0I) z)aR$Ar6c+Mpj^gLx4+Gb;r-J9nXqrwC4JbtQm!7Z0e^;bIw^_9wugI+D`TH#;5Yxa z;ml}X|N2=FXdt-wK7nk-2&d$C*h4a2aT4FqefD>+wH0?39=UFAEaFjEg55 zVT)#o6c5{x=UVB(D)z0I+ZyhPQT&S#E8QYkv9by!k?|L)PBB+DPA&QE@B=}Nj+j+} zv?7vx2u1cBW+5xK{tDCf3$?OMv|?4ASzPf%p=+s%Q7xZ^N_x3>FC5AjJsk_En=dUz zLc8eIJQGhWg6tbF13q+xeB+Yt(g3hMk_HW z4!_<7J7-Wxp_4$j?rqd9_rxZs<46G0h-A~Mb+tWaznH%<5zP_lJ42DJ|e zVawPKk9c6iCk;T$|3SRSB0ucUk9ghdR0qHAV_BDbdx|#O=D$I##B+Qn5X<@cb6tJi z7;5a>FJ?K@v%Uh={a73>4tNdNt8VH`4yK^+({jCl`63dJ%_eE!7jnx+eS#5RF*Y1; zs_V-X2)Y5q>^Cb#j%IJJIObw5?HHlG}7 zO6Wj|mJRxpn-!hZ4fj`ZYyX~&7n&-g?V1xZ@9n1S6#rM|j-OL~xeeCxN$Oxz$RWJQ zw~t-!6hGJyOq1b`r)tO$GKVzM0@_=GFP!Rv0%ggEE&uW% zxrUiK=#Xv?W({j=&tgU|C-UWg+A?5sZ*9>bL)O&QR46l)92K&3?iD5>1maKc@@YKN z+L={|nE$^QU{s4Xwua!_?(7(g*0(ZgVRfvfs~2UZf1?9%zolguKI?xSM8{_>MI6}7 zcMrSKSOYpy;<63J?0c|b8Z1bc=qk8vseXDG71V(!pym+bthz_>3u%CiXM2#n$$YF~ zM>0XGXI&c5{}$gx1GVs_CH@4lUn&>39QK==o~2L4L`{al7H<$V4+Mv1&Td7epu$a) zs1Aa#IcUj(hrdGMj4l$B6QGi$<4S~|A9RB=!lSrtdf%*B^%Yi3HRA+V&4`VHFBY|) zjkwbP)KLf70UwDD(G;589ovRHVo%VfuoV#!P_E~p zT7^i|5u}B#!{#r$7$xNg*Q#2@qJZ7u412FRli>x_cRfk@J+e1QQ~?XJh45#if+f3x zksMZBV6U$86U4z#uD5R_x>KnwWWo-Q4T0yclBWhC9mZ=u{V5YEq51ZzK4z?|N=SqF zI&VP{g5C;0j&AI@GI|t8)?HiLTIkq>q+-;Y@S&g1m+T z8e!`r-Q49}>!QV{qxIr?=Z*t8MuH5rw0=!JE&?hNhQESQZ_bIxFTOV4u!dCLZ&dVW z!@iFK(p^aNR^zLDp62qL-SKa^ z*Pu+HV+fEwO^2TdU1VE>pRa_D4TQ2be8vZsIoZuFETgsbnBllWNQVGb^DLMMjTMcH2K!PCsjCkqdBOimPc?tStaP`kif5*Kz%tF=b;nFP zAfJ`Xmz`%Zt+Nz=v>J0`A$bRJJJ*H8B;fGGeA34tDYGeI4(NXIg)SH5Jr*v6DA zn@boj8eW3@+d_Y%>(j3mQs}|tARkPS{e^kgWG!L2yWK)PUFIOhKU(E#`)nDzQAOoZ z_C6-DS~*yT=F$P^HCP#`QmUAi`gV&YMDU*5Ocy!vLJT`ehtG)Wi+R^6eP&nc-EDIC z>z2(K%OV@tUbXOVkloS}ZI)oS+{=nX8A@qF|^p9@ zwQt7$N4;$U7A#3B^1IvT&N#~O%ndw#2_GT;k^opm2}>NK;>x#j)wWb2`TTvw3%y%i%j5&yTB zzmX(}dJU7!_)_|CL==eUcg-8v^wG5NFYx_7&`Y||wmg^iQQWw%D!3utz2rTcF~(dv zE+=&3vv^E{Kr~&VppZHMVa2Iz>R7P%TJRPuFe}n3XY*g1t24#`tVsqdp>oZ zTcDegs=lglgarhc?>;J%4ESyF5<@VY*7ZF7J1(hZ(+jWp^&n{;UDAoCewt<8A27G& zIdDG9YJ!Ur^J@{LVd{`QRTDm(E!vBJPX}$XAu}0rx%HlZvSlKVtJvT7wPQTRl=^2;0x zUj~PFnOCDFc0D-F$57_|`Vu-MT{B&WJyeirGm}mLR3$%Mpy$X#U&e|m088Wf5nR^PU?AY>`-;kDWJN~#1u0}} znzdb3Yv6B2tW&6}t{G{+wO6J%$t1^RFW=!*$tO2)lN+J6;SnjTF)a|X0oaB0;Y_Cn zrp?ge;HF{8M2t9)Gh=_x_0eyZt|h~-D9Ws38DHM;`WhyowV%0{A+sxNr>CvtC1sea zTS&^!x`n0`$!yQjQ<;WxO_8*gnPQ{r`VHy_1ey2Mm{`qu)$d=;nxwS?Xpt! zxdPk+JcaM(_G5#4CpzOZj7+j&4rypVpg1ew1fSON#c)g%&2Q{U@)t#8ROg|HyYKdw zdO7%i9}j$w91#@#xCjbCUc+ZQeiE|_`2`U`#DtFDHMuZ|r-Utlz*)KR02Z=(S228m zWe{)Kr!mrWQ>eN4Kpj`ZatkT5gAZ7{HnGTI_gstx6$d7e85uOE9C+yWZcGeuru4+S z@PupRU4T9BcdKbH2ik544l=y`M%Tn+6OD4;%;O9bP?n z{PWq`e20anE`V-FzK(^)9Fed<2p>F-^BFg<{zHH;K-d*FaMyOrYr-ZcI7l^k_W^ru z^GLg%%7gl}{FeQV7!n=MJYC+!qUr4@?`=d!0jmq}W19BxbX+#bUh>W2`Bvas)^)5W z!J1z2dJ8PqapCX>fj+|c{zG1VL$Ng*5NEJ*f^FOxUxR&c17FH(&(SNX!Ib?AIr>L0_lxlLmjv9{s zC@zJSJYglDC}y;bf3fY^bH_xnJN@@TrZff<(=wwBYlW7VTTF~u^TqRzRraK)NsJ?Hr}yy#5QKEmhg{8g0zz2hBNT(%(QS)b2V5iy}4ZHpt2Pgrq<+1Z!Xc zpvCYUaEIceOM>D2wRsW$=s4*U7#iW(a_N26a+Vi2 zXTSQnsj==#!LRI~rWqV(EbqV+SvWqC2J6E-gtP}K)(mt>NN3gH&bTe2LrkVh|2YJE z00<~9YJfm@rL$Dmo*N0fDpbuBxDwR%&Ir;cH$8xe=WeMqvx`pX{5SvgCUj6pUfDs3 zYlNfZsBsVp5Z*HKTeGC9wy&xrjaq-btB}>uH)r!<(hEr;84A~^_{gF1$U$N3G7?8N zf@5fgPVTg4d3||$bTps~?!pS^@#L^fW(0WP+CJrz?R}IzD}_V{;8SY?Ir{027@&k&{Aq zc)yVax{nV)HoTwQ?YO?(f2?z`8sjMi=taax);97fv29cT?O)3?s7KXgbP2JXHa*S92R?(%=gv^%CJ`4z;yB1FZEJ!%V4vGM>n$6R6 z@8uPI>fSxi`;Wi-A5(zvzOOuj?+YT=_GU~Jwm*3V{RsBD%?GIpIWIeH zPWnN&E1!Q|>T=k0W5NCmD0j{y>;e1d>n~5h9+>)xi0~J%=12EfzV-Zbi*t%lP&W>VObXh^3RJNQ^@ z|4ws(t*sTpk9T!Fxb0Rv5sMX_{&OxaLu7{1WWtFFhl<-KM*WJ0WkQyzZ@dY^#xoAq z?XSIvelkt5{w@g&_+9r32H-YjK}r?99=|ux1mho2VHewf?B{t&*ZThCK@(e!V`X2q zuv@e9IfTy{kY$sc@Hniya3@Dt_t=~se=u6KABoErE}}W{fT@$ zcVUO2soB;KXnrb2SoEy&9Y6){8rv*i561oOMOz^P!d=VmZ31{T&6dt-Rg5q@`(;GD zCd?%nQ)qo!wPSBPyS;IuBvMN6Aa2<9ZF{w)gB12GrTxl;HLTSpF11`GnCC$q{)ZG0 zMo`IT(@7R6MG3|Ij-~iQ3b{$k-w(w6jAATHnhRvl+-EV12`7k9DZ@YbV+u>86E1qM zibxmJlnrXkvt+r)miDw7f}IT07!eux<*HhH3ey4!dyF-1Q3OX z{4^=VFohHWOp&Y6|G-S`{@KL-c%1>DDR1rI?rW#Z7PTAJi2Ge-g^2ZQdy9QEFR%nM z$%pmx-lIfn^^r-Gh22G?oIi#28!MZ?$-Wf*Hj)TI%5Q=WR;qRYBP8!Moz8s0z)(wb zy)4+I=6{=i4lYtXU8%CwqFc|@%R}|kR@Sbp)i0sXTnWV=FmH5v{dJ86U9g_y>YSsc z+HFBbS!qpFhQzj#LesJ@P;htF*F7_{xQK8)+K2hW`{Kg!h*n%B;k1qsxik?KYW_lfsVUv8cdiwFG;j7M&>7Yo1#$%BG%{X<^dM}E&DDhK<6V^B9?=~ zp0qUiZp|Ur_0a%K^ZY9$)txd!e&Kp$J-(&@GSg0>61$@C8+|{24oZY*C4-#Ahj+W7 zm}*FRm!B6--m}Mg25xb2(aEK!;d-lwb4zR%(h66x_V)I+4j}VaeI4rk0_{Ej!%0@Z zH;9>g0j3AMp99AGgOuP37;8B+y4d-4^s`lIZfWMH|Cn`0oy7zh9bf?vk?O z0}(`RFSrV&Q(SAUVr^?NaE{konZ335fV-~YI8gtd|NUi!5JHHIP33(XPSge?WcUIi zR_~81dEvj7B zvS+@dx?wH$fJ-95mJO22o%DwtKRAZN%b0AT*@i ziGH6b;bCb4RgIB&FTQP`9No-KIg+iL^7U_6q=b;DUWZW?-(^d3bvYe_$3~~-{jToJ zJYMJ!gS(%w9XCJrzu3;fh1tK5hF`ajHF#5EYe;5R_sUC?lwkC<*A&0J41ZGM<z{)997jN&5Ne=#UiK$*#9xwQ{WzGY^*3GDJz;RiO!|7-#GK%i*~r^U zn4@?%{*AX-QhKhFef008c7}_Nk-v8&R%Ywsf($)%H zL%U@xF^d|)(Le|Wwsnfbjh~QTH7fezB0vi0^E)Om@qUt=W%r?K2E+-#aAmfM48Lq= z)57W$7-(Q~eqdFY{VPORNh(;Nny%AD7ukFIw`pS~Y#Xfv;nKE7=njdx5w`dODEh{;q`?V3Z@uOd3YVeF+Z)vHY22A z#)-==?HLH1nlgu4+=%=1Hyf*cE154J?(D7aC4HW^$eM#u>ioosCa);aJ%2>YvZeq~ z51csyC_%|GOc&gm+Zs7)Y_A2hf>w(Y&v$lF0L0#EO}1!5ep6^eO;8Sgkb5f|WEi}J z)F(_bWXJ~CIb4V5R@?gfzTW-C17u;p6t1LE+CXO)Q7KRWb)!D?#M&3 zHgFTHi7?H5R!&Wa7LB zj3lzSxM&{7ErrURv=|V4A@_B~znRBf6O&29ak<2qUIcIK0Vfm9^&1rqh9kY`-r z9f?J=S^31|fWG@-_0)Sgo2d4StKm5Sic4S_A)GX`Q9Rp6K<0UzN_<9?Iy%2`c9x7{ zc^xCC;jSx4qP%B*a9;`SbJ=zBOP=op=pRWiQ3 zLhd1^9CSXHl-#jE!9UOG)Fx+;h0N%jaH6PNHu?F1^pkq09w3jQVcVDZA>!p9dx3H) z|7d-h0bkU1MiaM-v>H-0)1#_ZGDC*iP;9kT0(g9^@QCZDs!UJBG)vSif;1<75NlTdn?iYD)QpvwqxYG`l>;?N z!ds)69agm%23H2Y1h2Gry*<0^`-KJVn;VgKkrPF4f80J>sLb@QckB~C)-r9O-gqZPWx zkB+e|G>Cg`HJWl)Zo2%AVrTwq@X5((hjkq1Co}Ra^ALeJ*Lm>>fp`FCB!9ey}|qDH^BbihV)R$y^q7Y%<2 z#I{qRzB78eG18(}K5l_y>Id(JcE0tIy?!&L-Qs3t;**v0-=-qtJ>sYb@9O+pG0hid zk0s{~M7;UAht2JdZh7Yh3X~~&fgC4dCzfSXzP)Wah~~5&8Jt;*FdxDD!0x;EwMTl> zD5`tsm=Sf4yszMvbq4hvv#)vB7qW#sj~Cg9z{W}ODnwNn3(mBUObZ#EK&&{&q)sT2 zzUQnnDVh*R#Ho|rI@rH^HRz9+PwCBB(E#uVv#6@pLxwBD?`gxnW5mG`UXN&CxvH_- z@2FLC?ODDU>wdyG1p+s8@C2n~5AkFVNGa>3%UPxVTUmpUHV=D%hX}IHx0L$J7ZT5y zsT|1l<=dwNS`|mkd z+s>Zfz0W2>(mW)p*=Jk3|BV9$?6OgPW?zYm;zc$ zRoo%h-0*UGQHtNwt6%u11VW6 zdvEC`IsrQpD{VO%UH-%4as$-aXzOZ*Dyk->&7Bt*@wq)i_c@OjrecFUGB!pAJx3%0c7l!&QU)01Lh%S)L^9V5(dO&4A!Q>_;Kp9 zWy?yEe@f2@UCj&W+&Gz?%>lfikTL~e!e_MZVTG8_pB1>cXPS^~jJ>-=3 zRgm9lp5Jtb{eijl> zY$l)D2!g*UWbqR%FPDDuu)y-Yb$-j=DWoRhb<&B99MeMmw%#q-H1#oJ#_X8?H&Q>=u;*=LtVgjYSe^q> zcF1<07B`gJl04gi{e2C{O$y8=VMUb5{1&^}%(k+|{aU*EfQE^{iYG%yA?PaZ_11PZ z4j$J9rc%LQ*2emdHVcBsbZId2a+|5ZRj{AU#;f?l%)wEzYDNPt|)bH9LVYUK2r%y53B5>+6i zpZ!Y(2BVt^Ca(iODXPT5 z5sB#`|Gx_~=-GSHQ@r-{eQ^yRXeXaaE`ZH7cS2i$>otFj9bLnd-cxFq{}`3Xiiy(Y zGyX0ys1PU_3KhnS;54@7zP7 zDs-^cukwnZsiUwf3~H3JKZ^8`o2VGc5VXwJ4D+0LYsP4GvhthoOfFC75 z73US4^+~{aaZM?Ep;GYQ!=9T1jN8OG2_o4dtxCD`4feRA4G95?&=CIUwp(4=qzO7h)bMgZUC*pPD!IZwBl;P=wee= zTxkdW7h75f|4L>^^5m7%MW9222|dH9cb?2#j5^2$WaJ;<)La1Yu2e%qe+97zS5;?9 z_Vso&i$-ko%o?P(25Q^$XIz@9MwmFi(F{DVpzkzg%gPTNEGDdF91)wCB5##dHF9Rr zu~=}0_p1oR$R=@*I=fhjyT+R$zO+_uH&u>AQ8W%1A1B3(;I*XshXp96_Jz^>4bBXhhN`9Q~MWir0iq#*M3IgMLb5#Hk9EcO8m50fKx_BFRX2i z$CGvfmg*~K(9XN=?~9V~`za(cD=ZqA(nsN9RUR*wgXEGO?7r47sz7ilqp)wdRYv$5 z$$!jB9_=kzeB4IYDIzQ&28yh5n7u7 zvn=r003=zxy{hV7Wlq|z;!b4b!_BXYd{ug#we~x0xl%RxYGTu=1-j^H4c6t80kBbr z2C$EV4!?h2DKTKv#>=+7+zkomnwAeWdR?cI-t0@;2pFDD^If}?&Q25B{zZ_MnDeE?#aEWuDzw<`aR~n zqOf^#8W7?n$oi?;eyJn2?IA5I62o{p=$6T16{J(uvP%eU`Oc?Y%A3gM-rEdc9W}LB z>7Bw=S7)eaW6y40#s%(@OUDq`nvsW-;jV)Ybgt_}f`H$uIB`>-QBcXF4}Huib|J>k z&se~2l!Sbc1?%PRzh4nakc*0#%T#AWOL0Q|XVr6yctYI6JZuhK?|B%(F+bzc3%{<92Y)x81s#fMq59J$9#nEW zvj}>*$4z~`HhsKLL-M2tfrCx~4yS)N3`t@lpK=^C@50#pe!ng^n;Wgfa>JB3RjcpA zB*vZbHBSG$N6V%?4w8BcqW%=6UhKE4@RretV3WYUYHYQtq5!^j%$z(EFFJCJ_0F7V zQQq_0drFsHPmx+Lm(Ks(8dh)S9nq6f$3+vU{GDKgTAMZy1FX=JRi#B3LZjT+SX)Tm zf8MIP9*lH8^DR!xdcaL_&dT}fH?c!SQy)vp>?wjhOR6Y`X5B8PAcQ_%r#Len+bBCj1(K)3s4JH(nBDZg6zA$i>3OvXqs+gqj-#-==5oHfZ0{)0t!+Vk+7=_{f|K4pY2tlm+c=@A;vn6vJ5tk;l?f4f6o@tj!;H(+IbkPXUDS-vLOuN&TJa13Knu zX$3@^Mxs++O^C~k75}zcoRhAf0rzLQ4$q+x&wYA=3puT7v>E|Qajjxb6*dN*_Ds#l zjhxJ`4?FI2FQ<2J*O2#&>W*a9G!N$*R>1@s8DB}5z&*tvv6vn+nki%(Z}UOEq2_lJ zv8VwapU1wQ=_iuk-?|iijH_5pzL-S&{MCd28gO;Vp1^Ojfyn6l6cBsrNN?chZ+`a$ zQ9~NVoLq>bm*Hrn?ejjKD1e}YIj&0;kt01*ZeThJ))f$&fX0rP>H^r!W|R;LzD9Nm z5Pc*b;`VuEBADL|V~g$fBm?4VYb1*0N-O^iM%63=nZZF{o`k1dQ5dsI{(v8`Pl#%> zi+3ri+F<>s&Zg)JdV~8)Sp+(iIX_Jq)VC=ve|3|u*xhs7!XOX75r?p;Ev_fDJWvE6 z>DealQ2(yy9Tx8Jik#<>oacxvAMl+|>^TLHSX3%9co`kCU-Tc~y7JFVLx`K&;zf!R z5l?{y1TT1|B>dRsHia{#G=_`9tXc&KbR$8DzyYXKC%XuwABf_j_PD|oZ=vJhoTL4m zt)YD$V&Cr3DHfdN35))LzVgDyB#HqCZ39jq7M*u9IxZ0ZuZ$+ePdKV4h>y1zn6n&+ zc8fqh@=P>OaO7DK8|rQE?EL2zXo?BQVgnjOvj(vR!llZ^W8Dd?GprMa2tA_&z@Hg; z?j&nf^gh)rrT#?SNN$DLG4y5#rgLR76F6AfuR8TB--Dlm|j=;N{IdXs8_! z!H%8dW#{!P;vm$;YzKU>`V?YSG}-6Fkw7b;#Fy-0&k;S(^$T9Z0;Q{_p`alWM>0_0 zr}NGeMqe+;2XffXziAAwn@}7GET_8|_oA*fbG8llQkd{i@n@+t8{lgovsUu2s zJ$IL#-!0l&8c#SRKn<0{6L)tOHSnFnJ-W$6#;c_o;mhTCZrl2uy+d2xd`>wV`d27~e=$W%5`>P{w6Z}Vk_@ftXjcna>;@i@finbIx?`Twhu1{PWj10Q6TV z3>`r?jnC{+e}>ZSXTLwQ5xQUI8LE}pA-k4EziiEB=~p+I`4GcIY>C`|PRcShWY+2C zNi7`HhBuY%Bn&|k)TSqw#n<)!N;JMKUU;$ysG68y#?iG};O&)I?OBFdkF}X8b>@4h zkra^5igm%=(;P!h&kn@Cr-3h;(NuNAW#@#fb@_|tFI+|jejc`UxpxWO=b|4b=DbD; zMw!4-M7nl8;lMdn9Ji_19AzBF$sj*%i3_2$Fs`|4Y9(8Eeq1Pak{3&lw%L2SKOCkJ zei!Cl*1P?nW&SXR)!EVZk)zz{SV2Ums>;Df7jF5zGn$C`G={nG%pB2P7F&B zl4RFHHpX@B|87g77=Y|qE}P}@DQb^Ty#NQMa19)t8|A@OnRdr0=1wuqztEGt zF87a6`YfAD7lhH2(3rje5{@dIr5kgcTx-Vq^Y2&>>CZFFZ3apqm9Uk}^)-MPcEN~_THXx9UZtavwu z2!28|NJ|#?(stWJ`6RZ_Z@0_c5+>9!+)~gt*{7eCbQ;g|^@{Wb$$}2?Uj1qDG-_Ns z2j>nwgre&lxyu;Q_mtxF%?47I<24ne3`BZ<$AGVX?nh2Jc`wR5dVlEI87j@Zy^}vq z{=rC)Pmb5dr9W1#Ju7> zGpqN5xUtq^c5Yjxi0`T)#nu@TAZMw`aAztladE%%>es{S>!1D)KL>>@R-Q|99_imb zPmOHJ_qFJQ)PU&snB+XS|E;CJ*1G~yN%jfdcYx6_w+oU?>g?=N(}1YR?cHC-Q^T7P zm(O3Wog+Rh4xQj+Y&`FE?O`mUVk~lYBgoEDN@JFN_@pAErdW)nSOlA{nQs1BPAUcp z{S8gqTm>0P0&_?YAJQaP^HuhWwO6=zZr7r+Y+M6(yFaZVzTd(rq{^0D(%880vl7uc3UP~vm&0eR@9yQ=m-M1oBk=zUx*)IU!fBq8-)OP zSIv@-$h@Lv32Fc>yP*Cgub|_qdK;MXFj+)la|3#oPdmC6gGa3D=RnbCYk>&OxlH*= z#{|NBTCkUJJV*34B@7PC_gV-*4>l+YFDgiq`Rs4Gi-{;TrZy`|yNDy^=bR5%g>+KK z^5sJ@M^m+$oY}?EwidE(fLcNClxQ~gEHk(tg%=5BO`N=?c~#gUfq4icwKF1&U|LnM zD-{Nq(-nuOvK_7OT1p8zb$!I$7ibx5NZ!n(X^}iiuAb&4mnZ@ZJpdR|ughCwI)3zR zxN7`s583}n7~#`8t@htmHsNM-5=W@>GY~E+g!nYqgP-id`(NdxZwfTotY)#vy(@*@ zLRflDKJiv!(Z-D3h^?NS-l-%+xy%&{=Q}(PI?VX{BmLTr(X%Qnvpy#MY_L2B)p#Z(7P08UF>`S<4Ds;w1#kb<{j5Xw^@8kmL?jKFMZkDHoEX%2 zPn=*INU#D(I$5n>08MIX$CmUw!F30HBT^VFZJ@<-MzIqN$v)e}H^yKKHzpz+l0r7= z`W9v9{Q@=dFZIpg-O^}(hwu$tcmE41I%Gj5e)MI`BNhZX8@)$o7vu#p(UD=yU`txX zpHoA7b?nHR%OU$^5uv z=SY|aFdYYh&oe0>MvhoKN8~GhZ@hriQX($W!AnJ z1&}^R|9kz_g1&e;s@*vwboHNVlfht%#9%K&_?2h(;cOKPi22vSbL{i6uCnMvKIsh| zk$Wn4=b7)>AELE;sUv<+{lQRx=bp_R-`3Up!;vWN!V+@RbH(mLazrT0K~FiqUkA>~Uxh+U=cRoW>f@EW;}{(kp;WbO2u0VY=mf+~#sb}jt|2gL?y02Yr# zySGv50QqatZn`h8yWCxWJK;rwPpVrF%Z`-qT&uma2H={gZAbx?@3hlKfkk!*&HaII z{ZVG(EmeAbUh-YYy%#?I+^VDb*(Sx(`f!rr@#;%o*}e$^b|DK&Cs_PlLP98NrqC+`rOC5urU*%OOT!nqG|YHpu>O zvv(1tfV=o}lVG0lCIO=x6GQ5Qy0#I%#+5UMGSUpSzL!xQA!lq zKur47AG7jV(6Wk_VsdgkZie7eTZ55z3i>`89#eYYYNOF(1sAuIVtQ%b*9z5j`dqax zdWA#8hnneLoreas)m8?%{s`h|T#~|k6@w7>VU0i{1~*?*n|r^4qDgGn4ko-Or;8~% zq6d;!#_WzR)*?!1_vFEXyiX`+>IxT>bFK~n(eb_u4ZH5Dnw5kMFZHF=wLmF8)5mUO zE1b~4gnn)IjC5gX2T6_NsL6#DzA zX>7As4t#xK%IU`>j4-!Td6+lj8isasKcDh_S|`y*K7V%MUxz7sj*)N=8|4^ISryOZ zq)3R5UPQYueyg0CwB$!u_4-;B11_XhC19L*(35w0K**1?v8%jnMblav#iDW*nmJ_a zqU;Fkyt2v0-%0!3A!B-mq*iQ-$@h_j(&13tGnbc!0|$8nZlBVu`BrDlT1&TVXgNj} zG&qy?u<$x?QA4ME|ri1WP0dJ+^iKh znGb#s+`o~IlSw~pc<5A2Yd2LQ+rg0F`ZnA1WcgdaKhTuiVRXJhF0uj~G6o<}{$opj z+4FRZ|80Ga9Wpbny)6Wc0yiAR+}7e4BO|055{d$p&GBs8K$v1N##Qybhb&u9nmlM9 z2J`&?y(e_n=cNNYaR+2Ujqqz!eu)({)6N4p+B#n%9W(m*w%C7xWU~Tmza4e?zK+y$ zLX98MTl`{MlllnP=f1mmjpuiz01wEm36$zh0#T47T=G_6c}!BwiO=yQq=U%fk8}Ow zc_bZjPCQ?M2~+nOW)!lL-B<!KGBLuf0BpN5!uLVKUunk$ zFj#{n1e}2hvko48M7B!dwRi7P%kYtRqWI^`9~2d6_(m)2E84^R?-vNtp?1q*`sj$B zxDxgNoVu>C6dX&qw0(kjwEvzeo_e27qx-Bw(-6V3_IB`N^Rrd&!LJ7ny0>qUoYm~X zp&$WZ2jKx9k$%O^2>t=1Oolmz*TNg`z9+q-1;7Ng>3D!*?ScGp?;T zipM`-$vJoJjx+0d9G+RlBjkUz`wXrj+bxZ<1d!GAhNCL%n%F)i3O`^$rx{1H!qu@1 z@@&FIh8%tRUxM=JKND#xK(_T)MOIoA?kg}mwq1jE=&S=Tz3z{hURgOYw2F20+~AV@zQazB+_1O!<&x(y_^V3BA57&c zk_a}Hd9ZVV!(B4>(SEL~;u(EQyRFo(sH1l||5{dL>v|q3-G~var;FCmPMlGZ1Z8y5 zySRufX-EfC5oogRRhD5$I#Lj^k|r?Gz=7m4opqL1-SwPt^B4K{2%5~RIEE~vjDc3G z=j^_A1dHO1`av#FBA0#MCBdeZlX{_|P?bSAd`=@by;V~eZx{W$zpQT3WrvC;r+U&g zw&i#Y8xxsiX~51_Mx z0(EK@q@5TwlerjO_jt?49I#;_*!Q)b&*?bs(yPpu5z+?{JSFUMKU@|=nnfRh$s0IM z6?A4ji*V3LM{z)=N8ACBb3fCjYQ~7ABNO*BgB=g+YxHf6Vfl%~pUPip^K?tBtb}LN zs%c|tQ-Chv^Tc26FSy z?eFOjG1O7fa=6d+Qcl@1*_zEDZg0qXObpM!BYsriPi=lkG>s}Tp|f>eW9itL6CSl= ziLTZ`x=l5EH$#N9-tx*Pa0)cu@gEP4PYzi@VQBQS=S~~12ec^UY5-~JSkhXgJ@GI! z8!OL|1T_V(({Drk`>o>eHzUe^VmVJ;;Dajn7Mrv3KQ~gBRS$!JD&v}%JtfOMzYBBs z*^4ddhFZVg@q@H)i~W6tz0e+^hsGipUV32t4PVgjMcjH%T+5oz9$De=YR3Pwn_Ftb z{8pB&P(2Cv!43diN`qQu)8kxBfTHF^O9w%xf`-H^M{Tu^hMC;Rl-muv-NVsF=8rIQ zBLJ&@RPyjwF@HXzr5ZY6qe*waY)dYvVUk{B@2MbCvpalQPEg{$yT)9?xhQ1#MMM0U zV13o(P1ViQ_VQO=m^_f1V{k3-MfOXIR5E7{1)^+SvYday_W&l20#A=y$S9E}t;weV zn8&D*jJxxM7+NitrR`8#*1 z8bdun!$CXl3W}hgGA-(yBNQ3-j8ZB z)pN5W&f+04v=B-Pf5-y~%>B3fYz8t5k+bpu-g?G@d?!xO`zlH}E{ z1!dLgXHX(Pr989f(Yye^26CWS^AjV=G}6}xpq}#kLk#TK8ATnLlx>@jsb z63AJSEjywxcrVMUI1Ta3-5wD?%7__amrXI+T!eoeaMzP-O9qP8$OEd%baOePf_+lX zV4aTBub1k4ih4jbrNJVaKc@MrhzyNwQwix=in%G_S#2`)V%7-OXEY1brX42c8+Z*g z4Q%O^^iI~A%>YA?uHpUgG$q^dhMM&eRPkk6nzI=3aRx<;`(BRA%x)i5LKml_NqmaV zxUYvAnH+5W`2Va5n#xo=>pBS^;=g|@(9N)^OS3X%S5MiZ4H9pwZbA#bkqgr0k4pPJ zV;d?xSp*@w>5&q7o0&MOx+925j^rt2E^@qKfTJ5~I}0s7%`BEGaxplWQrj1Vm@%D3 zQ!;W$*`!*-!EB9tOsmI(uLoFsMAy6qa0V}Xz6r7*LmU3EV$qzlLN(ajp&n2LnN4~? z_Ljh2e6o@Fj@yIss+lE1!ojSnw$ooik2!Cp1BKM`N^B1s6zG~amu;CG%AlOTM`nM6 zzkB1xLC2Nm7=!e5d5xnW9z4!u)>y*reqv~4d|W|*+7q!j$tUzmAXT6D?gbS3&NijJ zQ0ea*^uz~R$bO*|0R_i`NlwOT?XL5#aR6>Nq}VG`MRe2+B;xT}N1lJ_qJw`n%l41- ziMqCbailjIcFta4=rfi!W(`wS%Ppw0gpbA%?$3`VK~Z;`TYqog&=9UYiCXBBT|y?nNn;j>pUTIIYR(aPR6fGn5XTc*{2+1_y zKDSn>i@H|w%a5lEpX5s3tXknePkdP~VYSG{-}msI3LPEdGigd+;Qi0x=d}UcGL&_K zCY4zJgBiKfq=y+sz9%l*50qo{mYj$Q_l zm;{*9_LCTdZZ2|qVNhLIeV(#PJQy973joUnx+2J!92#u@zDaeOlY7BkOJ&G$%6%%1 zkF>(*6MARt=2(roCA4fGOSN26y+I1Ea^Gn5#A%uX817auQHs5T8|oHB_yrr#+x0+v zZ0Luc;N8cT9lk~^yall?b;O10_uTpb!Ccv{?rqDf$HY9AO~on!p3t>s6<;z=wosNY zmZo%;$(5yguu!lIh5=FG1l<^pj6uAq?xv;G8x?swVi3k86JZqm9)&FVs{ss!eZr5P9Snvrgr7|i-m)K^j1;IY_jrYfs^SPXtoO&3` z;~A=0r`s9FS0(Snb6m{YyB#uUEA1c)$3-6$wN~oMd*9L{-tG5Kzu|1Efu3ZQGO)FH zH4Qm-DI8s#bhQ1RP16;)8XDY19r@-1q1{zJb6D4>jTWh`cYj>W_h~Jxa@BMVA%@S= z(pH?){od6R(7v^?Uvf&BTuDV{de)?wx$X??-YzRezFNg+iBXoLNk-BbJ7XveEN>5T zR8L<+Lg(82*>lgzE+s;%ut?;Jre^5jo@8wuwd%=36$A?rhisEu4>&E3D78}tki-{3 z;XarTwC2rat#R54JDyoH-9O2OF8g#SY*WZ*m>4xVD<6vPO$z3n=Mq@medat%ZK|IV z&`4hsmfVUQ4;e{s)+M#J_0}>==}bsH2l;?X&?-S4SQ4fB)d_!6oaB{N1yb=CfHE0UiCPLvKlV=3fZEmGhd0;#mA6L%rTZ7DI?%9)8n@_3*VE z=wn15<0cFCwn2gYYURQ2|K|nptl6An|Esq!-4}NKCV0MFkrO=_Pt0;GDjh&lRV?ja zVmAZxb+;#mP2HJ+z}R#BXw%y6<#!doOBN8z1bZ}X;yR>UxY~xLYo%<^;}<(HmoPK5 z)JOU0*WtJ!FK?|A%p*J}kxLKe;o+a!33MsWA3`%}j;+t|`?)0qzW*}81OH*4Kj1e$u z5I9z)I#!rQMXg| zL3hBne_MZLwg|eNb9~j9L=!M&$!^DPJ#xJ>a9^)jqJ;-? zW}^ux%L+Lt`8>B&jUnl6 z;|up4wF1Usn~Wtz^bqH--(h?33n=F>;*PuaKIm&bYtX5UzW)3#+p?955de1gTeOfRPw$7!d(ambEt~tJntU4l=+nGk!xts z{XC1`S9x`c4QvF__PGDs>nN(*Xen&FSBW=`vU z;mG?^h&X{onX$cVgK>|zvzxM5Xf3EDrmCPaZb8GWxt%Jn9zTldgN69#kG>TslJ!h^LHX3o zUh#azDtp_5XvT^Q8a2F5bHk{-YPxOdO8kw4R@<@I_qo)6;!7Ej3PxEgm2tc}0|{#= z&!-Ut>7&&XDKpGkE-AHzGD?^j6|dxW8P+Hy=Y~zyPQ2md<~T8R@x8QZ>O+jiFK2!v zb)FzwF#!l-YUuu9!32*X42V6mGi0HK?KNr-rnP=)DPCx)nW ztPo3j;TjVB_B8N5=Sw`$BQCrJOmcmivturHZAgu2$PCug*Z(v^7qzj)I_F^`S{11* zR|E+X8tQ26$L=tGI;d~0;P|_U{lbbU21M94FNG71;^0!hS52V11Z;`1r>te-rcbak z^zcznf5m2q0@DPlV!I$9@d5chjan>y{2P69W z0kCeTu+XcRDapmLK2DlKzY_Ks$DDUOizX_WKeMv3AyRP!+9ZY|3uwFQW^C|d+Hj>E z>*09X*FqBqPW11!qQQlgr>#aN8+Z!`JS3)q@P@>wEfV?%5B2zKi%f@<>B6ON{XU?C zGvO+~pjV`vZf`(a!}t|^BPP7p&~5}K032%i0b4rm6yKX@Yvb`g32$>D58^M+clmB@TJEcn&JHE!Gt-dAxSIa`j zsd+cP>0or@mHG2;Nb*Oq`l`KeA@(A^f6vZWC~m4h5$FIHf$CPrmcrhd#WzSX9ZCzM zxf^8)qJ;ktyv57ui9|Pv9)Om>KHS>F(bIrm1lXcDb66XKc;S53d|_m^Kh4MatjVrl z4-T?thl6rkPC?JQVgDAJ+FsHr=K47U3cKqAIR*WlV;#ZH=xRS;0iYeC;RngsbNH};$W zRB~U%{+GusCenGx6qY>2G0YQxKqji3WBb)3%QTFFH^3I!=4E#hJ&wb)v&VHkOlXu3 zz6rq?b1hb20g^`iebkZggEvHE&*n`q@x|oTpiTH)i0@Gjcr$h+HxIt+Gpny=2uEgE zx9LwF=g2T~JZdewXc4&r-!<|WCat71M}>=o2(`@8p`5%xj2`Ed&icuQRZVI1U?)xL zI)!a*#`15)GaZ~~-<7robgG6RzLZUoL|b*pgXOKXj7vici@Cq*nWhF*`^SZ$PEQE| zd0^q+j$rF`FTZsw@0_cBUVCaQBlSZN8q$G|>oP4CUjQjbx>)xIs}#=N2_Ti3wVF~)f@&UX42py(VQFQ! zV+mapXNGa=LOP0i6bq8YfmKCFZLtR~0sm(Il14_x=cQ3+Ps5755+)PH)E9(@0y%>P zojIX(ElgU7u$R2)o^Tg1LZ>)85U9Zk$M^Df+~HnfVPkOXUul?KH+Ie2UHjDeNQg~| z8AK=|g2J$B9R4NPe@eJtf`bCWG3uAV!Wt{5BmaR--SDgAmkb+bxG2>Rat|K!rR>%0 zy2rKU&ZzC^D)bmHTKk5!#%{=sm&;PVt)sG{b)Q+iD2!P9lAOw5sWJWC}* z=+&K`ay*`u0OI%sF@QRl8j2h=gc)oAt7sX3@bukOdIpJ}`83*GYtaqJ(fMf8HR+>c zdzotKrf(9khRUZILtFq(UrK-ipb7lyU~M?+TS4GLn$bSa2**N%1+b>l7~RYn*^Lm= zNMv4}PAUKlirc@2D^Q(>ZG@BNgQai9)$2@wp-~3zGBMljX{#ZwP3n;xErJ-D*6!aS4C#@ z(DHMy#h~2(pf8jECA+ML(F$M*kOg6ex$R&WGg0&?h@sPe!XzC&kEc zZvRU-^cH0)ApXv*zJUY}&qW)r2~5+-&`#!K0b4Mgh@f+i(+k@G`U}YR_o16MEbvC& z=uwSPN@V76!^5r4kX$ta3|!|nrF?PoSBuN>Bo(D zz{*a8@7!NF2m;Lm7lf{J(RD+fU6&@PxyN4p4}SW|c4T7xBSHQQQaKiMwW z3i3TsDxsPfA8s=z?{3jS1gHn^Vq{haC-%X{KlYP939+bZ{tF%f+cjLpav!P>kJ zp*m1M{&OMtK~OG#2Aze*R(}58lD_;FHR873=PwRppNO!+)r}B@9KHd%psp4#iDcFK z;{|6p%bA{!?{r3BApW#mPBUa_!bdoAS7LaUN?_ipvg&mSA;*S-M41#QzJRqQ@;dD* z>&S#L7y3TrbB33eO)`&=-PdaNK-)J*7h?^@9GtdwNkQH~LT|!E40Td=sy5r?fgFuz zS6`~Unl(7&8u$z}k3*L9?3XNAy<)dC=s&3`*^U@5G9(6r`SqCatS3DFsdKGOJw&V7 zlrtiU``{3BYMR*o{K~;*A-de_(BqoRniDQ=gOw%ZYq)b7!zOY5d>%D2HBHq)u92bs zH)j+&iq6S&k`;gJ04Ps|h$ZRwRUw-E$6RY5o2x}+?;;Gd(`Qlo#CmI@!jIR(RZe8M zNQ1Wk?f})R0R^7m-`UmO?jhPzwK|Y)aOr>Kp}6-*9TKP`?kLNBGQdts4Z`>++OU5+ zXFDD;(k&?s?zt-7S;cb8GB$~Qk7aEn%ts+;WO~|!piv8X=Ez``zbwDB8S!yy zGWc*qY{+q50Q-3i*2(5Y5gx4o`YNTB8w690Me#OR4=aUJ)D%tKdA;#HJ&nQ}39H6RS|Z3*O-DT@XsahWjD;5jvb1lM6(dw2CwB@0B3x?kg&!kyyMGpD!zz%=6Bb|{4an^AaWnQ!LTT@tLvSa zu!ny{c$@Col1FxI);-GNQWBzR%{2X<|EW#C&!;ANF%nSC6@iqV0 z-Ew{L<;ga3?dAooCd3miq4?UM3eni5iwuCvZq%qx(Z3 zwB&jdl+Y=1^$_k+Vy~RfpsCk8=bV5Jld|NwL{aW z$pJcIZ!~9w$8svJ?RT0jwM`q>OqL(vNjUOu;@QMMKQDRd1tcPDxzkQjk=@7$-m=Bc z4L;aq@i*tz*DG>1QnAoH2x^_|ETub?e`JV;R@OD#4^%he;M+KGzGGDMrRZp6qH0NF z0iU51X=@ef=^9M`jsC+B!5p$7F_r+s4VP6lxFJ!6SN8Ej4cHLQnN~42C)38?2<2X( z`bmwr;4-UlrD+yqpk2_v$P}NW<3v(4YzAJ)XGlq(u+%fsonAUj->pw;$CfSZ7r~hN z!FtZ2q^C%m?6#Z6<>tnb!Hg|BT>AL|BUJr0q-?dxUQx-0Lo9;vkB_(dA4jHQtDSp; z-X&Pp68`)fO7ONl5DgVBPj)-LRoSHUz{LUbN8I(%6!{~T>x}M5bBh~l^5p6Zo+kKA=;UB{XXyP< zjSMQ`^JA|hfPthXNXeIVaE~;7%hfIbdH0l+_CCwbR2iDX7246CoLai?4LV>%;UHtw zhg%Q+R5M?_m~`p_E7kIG)7@md+=Y-CPk#9$VB)I)*F1VE6uRSS>0f*8EXBD3V6>!m z;E$CB)$$p>vYQ)DMH+SJMgf)?&+GNGS0vxN#2o9V$r$B`0YyToeUA z9I&6JJ%y1|N5Yti#u>Mm&u_Ef($=ctqX_%<;%~6|rKu+EPH2H)IZJqaG={;~(6=xI z6pY`9RNYYN1K8MpxKJAY3FKiZV9MiMLS#&{A3C-wFQ_u|)bt|>oj1q_uX~?27?1IA zV?ez>L~~$%)y zkO*)MNj{%`e@2^e2iXIie+vUOLfxDt0RhOyFe*^L9`v{dS-P!uQ3Sv$jK;*f-T=E! zOM$Q(_^Bc9vtZu-!Y|{#P*cMzzhhCs!lx~-4+9H$9s80g`(Yu2U>SuQ6xnt;RSQDB+{CG_*+d*98zfnz5iIGsdp9n=Qoo>x>_d1q4~7W2&A|m zJKeqwRS`@aX9u&`bGcs$tBWuir{&mw6jvwupZDCEtxm(Lh`Zv+Jk#-(msVD0q&Q|c zNHUtmv70Y9XMCh_<=dIXsPp5OXw(cW2Jz`5)go!|=07Bkl*JGWm6?Xc(q&l6eUYvd zhg#-7L+1|HoNcj?EFz2^)XjDARzH2onQp0s-=>w}Hm{r;GeMdjB)bx`Iel+-~-Wq8VD<`=WQ-|oa6_X`? zEmZEJ=-j78vCzDU)d*|5x~QB{3<(mMNc@3R64B?8;U8l<;<;UAoDh|u<6&hsHiM7n z`ezhXzc4?3e!A3-q|w|w^eD9gPt)8G@7^Ge!+}U)6Z(qmB1=or0I^B9b~6`X3d;pI zxLMA4q$ljA4~a+pKc?O?D(dh3{vNu!yM~aE?o_(Fo1sIbL2Br3Nl6LmZV(29p+V{H z6r`o&9zWmpyVw6Q&t`Gn=Q?}uYrndR1-=-&2Z+TcJcB}=R7+c(KOcDXorn1GM!b-f zEeo~PBsdzwxm#*hv!L?F%Il>pSI*zuREB`=%A8#%b@WQNS@?qSyKQW*Oq*Z<_im$f zRTpQn2fKWd{u4@D#m!GjP=YIpil3X#Lc#iqlp`1cU%ERE#XAy1sIYj9xB_Uy&+Fbb zHSuS&8E^tnsP4a3QCqxr7kGqGhmPwOC${v91Dv2 zx|dIDJ{u%nK|8r7m8{A4mv9-Bdp2}5t*Kau19ir}UaM(gIORW>|NA<<;L*}4{w0n> z!5>rr)GHKr{u$%XC$o=j!nJ)TZ-w-6_gm2KZzq2J8?J+La}0Aq1Cbu>xw62sj@;X| zL*I`o&+n51o1*2uf`KSn80>r%0pD29)QnKwYfa2kv91GIKio1Cy*&_VfOSNzYf|V6f z-cE90iFtjxTRSP5UFzN(JIX18@yV1UdNQAyw2|>!G7lD$&Bt|`hy(r@1*im=I&~%R z9pV(qu8#sPyisc530pZ$t$$6@{rTT%yiMUrj589_?uACql&rE!YHx1LnT_YQ4Sr%o zMZf*H@$|d=Ae9uXMx#LZ$7%Th|JR7W4?$#F_>VaA=WIJ(ZaW=r4MR8}tXrpzJF@e< z1!?|$etnTPzw$q(alLMn0MWo>xS|)kp41JCx0A=)$c3Tm+b?qCa6u1p)maSZpUR=D zXIAqRD!Kprta#zIyMXcVbNJ_;iNIhdPPDTa?28ZN`l?F?gMO;Z^Q_0eW@Ps(=5OvJ zyxVvOH7iq4e79M~l=}b<$?I=2-xHx$Fu7_v{nc3f?la3+D}J9-qMg2!7~B1MNAr7u zp;nOB;KJ5le&w6|4I!KT0|N;_Wi7Y7eDWgAJM)-j4 z%C@{pZmF?eKh33LByj7I3msh2OtNsW;~rLlFuxYyNN;BR1hw(s)niw{G;2Z~0)yC!_i` zKvFRQ^gTZ?Bng7fst}_Aq#+&F?mEhN%nKJpj1}j^?}9KsmX4x}`Y^F`Spxv~;(^8G zO1d_7v{Cvf7@_pVICkwx824<}L&-Dlp%ClQ-k>Jy6oy^!D zDUEyYuS`p3xm1%*OyI1!ECrcxz9&jlVmDjB$-VBATIK?Px@4*R!>jyE{*k#W;q%Of%bW>qkP= z{&<(JNdW`Jn9WOT>pFx{#C8UZlqj_569J(&*3CCPCTry)0iXU2;>YA6`JWQQi4{$W zn|+;=>pM*R=u&&SGi5|Es8h3nG2EGhkT0_1HM0t%jai}mml`pgsmD)wb@4OZ_JRly zNPkWQ$~c;WKtCyD zfB>YM`l=(Gx(jSjh&QZGYnO^VNN^1(rn=f&*B5j;sk?6f$mD@n3gfoy9I51*r5@uRN$f{z9800mEz^4bw>I%7=p-$j^5Ex(Q`C<&q##m~>@m{{*LmqY zsvSyq4X%iX1E#>}1M)^qu~)##gIkWeeJLqUcbh>pTjtT)kHcLJk*H$ zt_>y`tO}+5IrW6>G51DkM+%zJQHoBH3zkB2O9A=^Q!d%+kvk0X8ap^|cfY9>^r+vi zJ_`RCpDcIu;O$t?KXd#(+QO5-U&CCPJDo++LqgWopL)MF3m_&%R3l>f2!Fq2koI#1 zX!c7ehXotnFT}}=xppD@r|7#Xi1J<+$SK!dT}V~*HeOD1c{8ODNg--xh1}I z-Ibkn^(^kXYBrBCD%8~iToH)6_@7`DrC6mMC-Giu z4r;x)zAW&DZTHtDzElzD1AAQe)hysiDz#=PvdePK5K(IJO=K;b+-2M`uZFTRooSH^O>#YvRWB` z+}4BuFf>Xk3bpTJ8w|_V8d0}O_p4d1n&oRbw}8uv1E>SM+t)dWX4b@2ymp_}iaW^u ziV%YqRk#AOxX#p705@1J|4#oGQTWv+pmg~SgP-yxr7$9^QXOB&*!ygBZB_@xfqE(V zUP`PjziWQp2FzUyeYhhshr^56s?ZL^#^UvSJ25aeH zxR+`1MZc7+KWR;XfB`B2(Ai>0XNo zKo-`Yd03x}JnOdQ%CFm-DIc6qdH{N0Qw8*3>DTR5*az3w1Hj!ImBP)C#}X8xU#kbg zsyum*XmY4$3>OnGesY+9=3@aK`1v+mUjXO6Q1hyu0Rb}oB^1sFyugApxUxrKoX28y z(^x7uCs|LSWjc6i#DAZG_MHD-7K(8A^Q1mQmZ4ZJMt0RpR>n<#N^_IZKjHrYYO_@> zqlhWeZ?LY<-J!1zTr#%)0-TtB3i73iJj&a4web2 z_1z*1>^s}-1Va4CKf_*hTSy?t1w)G_y4IMrdo$Dn@1k`V?@@fMh!+W69%85>71v{V7KUMXX-*Yvf6lKgm=^GB+U`a!|u&# z;{H`cgGx8oG|yCXSC)f^|4brXG(AW$y@ict|MS6{8?lJ2AO6FMTgR!aj_@E;Da|br znRL5L{aWpji<0Gvzh36gM3-xFULBuFpcw&l$o2JH`Y6fvl~91#LJC)kYw|;-<1b@4 zN^X^dPtx<;QZ<#H*NciRlZK+N1oBDCQ+QBu_k>cU6-LGPEzaNAtGDqBGUnfHV~lh| z7X@lzjM_*i1jF#yGjypL`Thz1-Mo@PaWlPl+8Oz~%oGa(-5I}NVvsxT_4q_{`Ij{+v8 z9Cs3t)53o`*6C{6WJdcb*n`4;^sEz&r>GGWIU39hUnsyz6v z9@gbj5LN5^mfS*97dk&xoK732696y_Gn>5S>R0ny7k{}(>a7ocz~q+Oj{)sI_M~X+ zJqLzXyguihr$6@C?Qpe0b|NKESKwc9r4SyD_Ly>F7|3@9GP$D=xi-;z57?&Paw%BI znZ9ZFXIuz#!rV#R-Grge8eUOIx6Z(mU@4Q}#Ow{&*^dJR#>EDB9;bwdxn00|=+yq@ zYU_Smw{wz8Te#4M%x*BFtR23*%#C@#R*%k_gvIfL#j1R9rYuhrJ_Kf%cxdbw4oL=_ zZsJ+Iz~N$`CW(=I)H(ek&E(`4xO#k^>Tqi4wWRppnTP2K$MT!4uxyY$EyZl2sNvT# z4nFEAm>5vFXyJ;-kg_bEC94Ryrn)<3q!C@|f z$(%v@N~#X=IJ?;yhDGTk15DMnO!;=uaX0$Z?b`FnRIw$z=yag$eTSO1s5V{G?;&U2=i{g!Z3r&AoJZ&LlZ5suVSk2)FBnj^yq%K$Q;8b zmHoAPRv@3eZQ5RJ&i6CAw?fajtjSpCPxi6qhAtNi&0T+F+CCs!m_qT04BSFdNQ8FQ zJAX4}tZBRYkoUW?8BF@fq}$_mOhicM8hZ7{)(!C>0Aa-krIgdEs?n@BmYdnxVudJY zZ^)-00;d!Yo||3s%+b6~o2@mTPltGE_B#hPU?bqB->XZyd+18{| z$&3^(R!Z)PS^DU3%xg++IpkxgBONVs{DW>^**UB0;IiPZiN?mkjAG6fVMuq+?EA>4 z^{!%{as=uhi{Y^mP>fYg9oW?wD;6ZkOBge{9&=Xs|Fq2BAK!QXN4Gjhc>g6AU~G8}nF+vxzZfsD-)isaop-cnhm zxMS#DKYzDY63GMqGuR2Ke$cDQ@AL8UnF1!f96-+v=Sm`V66JeqW~VJMGewg@F;QhP z$kb2bhc6&{v;o4tb5OLFg9m1uZuc7AAp@f zJN1FIfKcqGdac%3XEl>FPVh}&+78s(=FJ!a<5ke|`g$`3w` zVhN0}$lhp12h)~;PA`HLSD*Ac%iyLcRz!f_ac9P7>;Ury!IqN8uUTKz-y0IW??mmz zTSUHdyb3ha>`QXiwt(&da}j88J`dcOwv{&G)>SepFvo31j4e*|=9CM#qiKy;WA&)~8Uh+eC{{l@p*671y zjn^6+8O9eB742#*SoBHf%(O*LJRy$pgJ0($w*lay!9j=_U- zQ6+^RdS3&@PVzje9@G(@dfTUXqK! z4@|dc;F}Lwb>n`Al8itq{T_?FDMe0O-eJC1-Fx`?K?SjV8pYRtp=-Ug0LDv@I9EF=zILmng3#hS zq9~fBt;)ZTi(QLLXz%!@5YJ%f(L%I^BJnHgJ`7w83`+4kA{bv4{BBJJ8A%_AY$$OZ z_iK;j3&N37>`v+2erPmL9gKf>O_n-z@@Nz{o%io$YO(ZVoiIf`wDQ^KT%KhT3Vn_6H@~E!Ft#|Iozw?_~`;t`meI zE6Ah{#`v{BO$uSJGA=Kb{$UEg&g0shb2h#L&WRNS89F8W8X&`jpijaZD@CgS`BV+q zl@-qUG8jt)EqYQc9Ces*rffyhqbUAm;6o)@A)nu^9HpPcdM%d`AA?}-Kxq7Rt#MT^ zWW#YcsX0e2UH?Acn>BJ%i#+vnR84ZFTS@nLCwjn!F1Rg}pfZA6Bc+|0+q{B>HO+>V z-K{P$Pg9R|MJ{0{Ye*W^X)yJ-@7LzMW?Yp_u{NbwUqsTKs$mcQ53njlfVT9M8SfNz>2YD6F-Gon@l1TOc44^pAz8UW$qvPZ|`cffQj#*4)g zh_{_b%P4!<3{VHZkHg`_050S_q|g4lTY&QB53Q}MVTQg)2Z|vu71OgyzT&QYaYHVt z1tP-DPphGOaLGqhFt4AfQ+_6^6Kt$q*e#zXJ*rjUVq1j>LXk;29HSSs5|0=8;XeZE z9T3^zk@%nV4HoAstHv=m5d!QgmExABHRzJh^^%f-e7yJ=>?{7_M-ij`#wWE{*-Aj4Fl zD*(K66b*)ulpK@~z*CO+bg{1WjFN)G2!4DEi@;b&8x+Z0u-Y7X_&7Ct1pcZviOz{9 zG4%*%2p9qcSmZ&7@xj((breJZ=bk#vWruEh^BwNhGI|aMv*uSa9}Pfshv;o-s0YUQq%WK9r%% zeq@(Mq-KRzSfYJ=A4-xOuJmCyLg6~~x@#E=zpay?B!gB#;reU- z*5emJ`0>)$yQJ5}{1~u{i97%mN&|GO8(e&aZLy|(I#M=w+`)OC-rvK)$A=O;yuEUJ zpn87zx1zr$`t0_x?n3Ysq18ip^Cj%W@otWT6b@_z*cAMJq>B6=0Uzf-?csm#;nlj+t`Cd2gt3;6XApT*h z9rzugr&QnQXl1GfHADM!s-ouk$y5_cA+7ax zoH=qfkv<49uWH_?`B(&h_+qd~x4stx1^l?B;42@pPf}%=J0_1Hp0q-A)0&p$Ux5z! zV{QR|oL#GoK8XZ*wxn@i!PzJ!FfpWUZHF&XYbn}nRebb7D6QA6<5r>@TyKs|O$lI{ zoU|QH~ zuFTQmQbli#k}-x`shD$a&`8fjw*9!?17}yOsH`dv0vQsL#c)(OvVxj{ZjLG#U`ou1 zl$ubN5Lm^El|qW8mKw8ryFh&y7aNL&n`clfTEEo-%6&~)OpD26*Y5%GdtL((Sxq+7 zXb>}6NL#%2f-TRKK!Tx_l%d7hQMZ1l#5-rO@y}=XymdKU#$L>WEV{sKxRxI>fGdpB}(PrZ*89G2bx{l|Mujbsl*gT7+sb1F-r-d1k~ z((WO*<+Y@{6;fZc#JPK{)x!|q#f^XC9!eZwzv|3)NK_``@!u{v3=8y}!srN)ueD)t z2phn9q#KcjkJ=?blQqj!LN^@)k+ymr%LDEiOX3t1dN+|c+bapaI#NhmNntLs5XzXS zNmC#F)3zIs%r0W}O%#T23y=^?K9ShYw)7-D1g@f+$1raK>i%_*JoLWaz8Y1hK>C>@ zolxxoLjD{Sg{Wo>-S!IWaLG?&y-#ryF6RN3CzdY*LY}x5$c14_uRc9jdB}I$L=C;% z1>4=pMqw^oS@ma0lM}Dvm>8rs^(=k@-0Dy#M6MHFm>$M247a;^$Pf&R{1w9jlM&|d z`F|mz&!|$!^F%6myNE|qupG7J1-lJJe4KQb2Lr@FMzY^2TzKsrv{_W}(~s=`|E_I; z>DUPILbG=Zye%B-_!aoBj*Tkp)XVN=ENc8p-*WyCyF2MuYTcj4>S5PZ=4t8Du&P*r z2x<2S9&~mokMdZc zLSL+#&vD*eI+irXj|-MK;Byf3UX4h-MYAYkWlj4zT9xg9@q=%e1Ovg?!VnN0Kg6JH z^)0R0U!BsJUyXZ(J0pT1{DyZ}X-kOp`+M$bg*#n?%Wf{eTCqBIhXNpjs=O0ZZ-lu* zBHVMnp>JZ}?P=m~dcl2Zk$hG((evo=rWKKlfSX_Q?*%Gkz0q)R@n^WCSUZA>Jqd@a z#6VT6J`eGJpD9H@sVL%C7)&-deXnpJAK}i3`8FI!nAJ?mqnK|csrN-%vYbQiF2=W5 zN&>S0*W+&k7ZIFAs6*r8x@M5X3`@47r?u*b+?>o|7Smt$&6SIBUi&9x6Z^)oPkIcj z`>T4QE4&=sLUpWjvJTamu`>Q^%iHkT-&kT2gnuzk8-wfyhJ8b*H+L*;kA~x0mh=9g zx)Kt99SDXy?mvE!3+=}^k3+-Mi4F+RIQMqL6sj*-LAAwx#>=jp)M!(SW_zJe4*{K9 z9=5TUXKOT~#=_LuVJx83q)LKf?mb?r%iS-9Klz^N!Be#yMvI*61&!l>e6e!boVJ?6 zP7IjMb&WRm*EeajOu+s+&mWCsQ^-US8T=*GRe7p`Pu2h}p?yBZLGH)5Zb?MGwZu)P zpay^~d)%s7&vAA<>7~IyQY>#PT3AHEQ85t3Ab^g)?+gHdQ!rUK|CvN(<7W$VfcBgk z8(}z%Qvb7#p^`(|FBfF3{6N9FL6FTN6gLERlcuuiWYQ15n?@o=+e9L&UT}AtAPsvf z$+_J7`q)cB8`i-A9^Ydsbv3b$6km(SD=bJ3mkW*j?UFyIKa&r`=pO&$8~7aq5(7G* zxe=o#l_TabG8zR#xG>}MmwSW+e>98Te=!&;!;Xnuv^VtoeB*sA8hvqL_wqChyEO{C zYyM~7kv%WgkLL~?QnzQ+Mz z#wevOhoL?0$^G5;r2#LEnZLMyA@PtgS*fCOqCOdiRl=$c8qE9qb2Fo;6kkwA(!uYb z$q_yi;Fh4gCw20D{dszV$`u43y?Hdy6m{{z{{OTln9U?7_fKsqcmMVv5$BQ6-|+iu zRb$Q+Ow~1+nbXr0n&(Sj9r$$t8fxijEaS^z{RkfcU?6q);v?gOW&r4up-qXq);DF&%*Ci|nn0}iTcDrK<8M5=Ny+RN~np?k$jJ2FQ)+B;f7^#_aopkqZmQn}2 zDIE!YJcHvXg795joU?_f-sD%0plR=s1(8GuOyy5ofoebHj44YqnwWF)$YHsCsim6U zVi@{7(WXNJLSlC|1?0xWe&zPoz#Ym6|2B;VMwO~OS8UI8e-A8xuL@dTUTr>(4p7$I zE!!K@C#F|$fW_04xpGDQCu`@5emLC-B49fXVJ*DZ|za_z`^zQ|wuDBm1IThX}Q(;oKab*E!qGwkQGUD&)j zbh2(ly+KTaKd%$0U<0E`9zNK&^^OKuv~xDDYR5?82xXt;^pPqqT z4Q)>tFgKg3d6MuSFjau0@2>y;$>WIIVWE1{MEX(CGu3Fg^6w_9d0Z#YkB8RElXY1r zraFxTNgoWO11sBMt(>B0DyztFyusX|y4~lZZT%AXFVhK|@t`=+L^j2rrV|c4P%W~@ ze;L)vw%*6CUSrpwt1ldezT(fk3h~=xQjCIAdiguuLT7OV@%kP?KkQuVP|xFK^U*C} z#DV*0ZoJxkOgL!^J`E(by}!~SAt(NJc0&NXlIC*SgTd$6-03Q_zpRhc3?|D21$P5g z!p+7vO*+lDa&sH^c^eK55$QJsk{1L5wb#tZ3J*m%fy42$aQ1a}pj?KL)wTo4*ZYTm z&7h$8kI$b3&@eN`{)$`nps^v%fU@X@mrPaxrpe5RfUm(YkvJCe7x_fdVulmeocA&c z!HXq)xmJIj4T8#}NhR1Z?hra0>=C$pX&sE&h|3?qOXWWq(fH!>*?6N!MKca78cN zEV~GF{0W_54VMi#>Z}U8v2o%Wc6SAO|F>Yp^71}kqa0ATnYRiy>y~178U#92#G(v` zo$~pe#7NfLAPZ-bNwj-r6hAg$+i7f6>1n?n1J+mqm@pmj&UzgOcpQTgXAkVE#-DK8 z^`+u1sU}z6Op!S1$0LZO$#=2zzK1TBCPm=>*c10RZ?-Ye(cj=D^+iZKXE7?&i5W%$?Ws+B>J0NIVw7?XNdKPZU{Ud(}ZU4}wfK007AYL;4Yw z-xC|8yv&%_2Eq&4H3LWTA7Z7i3onYd&c^l(Q<7=@d>0thejon&v7ZS~+LFb|(Ff&c z?C6UNnrJb8+jMFqNE+kQ=8_4PCaX$Wc|b270B{~OVcFD(0-y)YXCbvOugMfnxhlJ#VBYRe=Z-2Cv_FfZmB%XzHHMZYnsS}( z9v}4h9C$pb3d!z@21D=M^I2lN+>Kjc`>d?yo=g|E+t}s4&y^A!_5ZDHT%l_4k1j?9 zKogWoQdYzILiQy`lu|zrV_f_#!XMQ4ctiSX*nP#$?4anLQt8fW5hWnASws&Jho6Zq z5lMd#>%v~n(ib~*OPYZd6~HMw-|DX5w2J4?jhkA;o{JakvDK(|^1l9K0J+YsDR`~L zBs|{3%%a8ws?`}nhG(ejQzTr`3QFeN<3Ec}c_71KckcxG$&Y5fp9btg^6Y5Bh8 z`v2UCO0Z)HU{J8!x{$&zdCSHTo2>{B_clD}YuS5`p}DQ%s1}}gJglvb?xa*LGs9u& zA)cut*S<_-vhM9Dr~t0zvX)&|cZD9tXiJY-CZzPThHP0^mxW6Bjnu!u$P1Ij)z#*3 zv5}992&V3xRqRNfo3ev%5+ZO$e6ko+fNPA-IADA+q73N!6y7HEAeE`EUEc$e5Kmlu z)d4^m02L?w88~8i(vKP4uK@~nHe(vb=m;wOWp71bgg*xcuzy|>JU9``9|U+~)}vnx zG=&2LM*2JD@++BS(50AEUD6YrQbWu^2>4LW5jXSfj%PPfe2Z9Jbi*Y# zfxyX~4<44|?}OklEE}2_NGa$WXgG-?D(3a|#to=x!+PMrKNh5;=5Ke2L~s*g*&k@Y z_`&iwv1rr_xbp~`@;=Y*E0S?&B_nE*A4jbw;4@#^d#Kq^1Jh+~3Nxt~07yfQJ+xZ! z1;{73{7g7D&odCVMMkjTT*Pl1;!zVHDZCy`YUK6*%L3T?$2mTruwy(q0OkPE?WdZv z4WRyHpen;K=nq--H71pA=g}zSb80si?DhPA~7m z9aqk_Cy`8$8qGJ#H?gkFIbqErpMts!hl|CiimA=I>7K;1Y(www`fMvLMCeP&3C}U> zU5CP5ltzLY57|iT=w9l0>$}5XSF!xHYG8oq-!QjPr{YCyme(*@;cg1hP z#8^KNgcQIs+A?lCiXo;(4(cGZVR9wRSwOz{xU7bZ9vRz>ot&cF&BdMxukw3MDp8&i z3<=#t7WXHO+y;U_8k(SbjI=H$J~Q=CcBV`A$(3qIA<=D&PD zwTQX0EC5C@CnaZ(?k5!i>-cL~0UW$gB0sJI$QCntj{Emgn+=Lh4jV70fPD* zd3*gF8lm#ai|;VTI8KG{vt)LO5W`k-fG&z%@(s|{@8ngJulB4BQLRmh2vnI|v77Um*6Xm*qX_dh-7JB

2tE)_%dUx)^CyRM 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�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

am)%8>zPUN(AxKphHbAZL$&)&9GVQ;MA*6WoeP= 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 z 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/quant_analyzer_per_layer_quant_enabled.PNG b/releases/1.32.2/_images/quant_analyzer_per_layer_quant_enabled.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d8e2ad0669e1b9196ec881ca0ed5ac918efde05e GIT binary patch literal 45404 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≫b; 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/quant_analyzer_weights_pdf.PNG b/releases/1.32.2/_images/quant_analyzer_weights_pdf.PNG new file mode 100644 index 0000000000000000000000000000000000000000..cb932964823b13ae1ef2b1b26722e30f6d6deea1 GIT binary patch literal 16257 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 NF~>h}M=t*Pe*q@H0JZ=C literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/quant_use_case_2.PNG b/releases/1.32.2/_images/quant_use_case_2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..075ec7ee9e62d7aac74cda3c991c14cb15930e97 GIT binary patch literal 35277 zcmd?RXIPWz)-cN8pd*ORmZ~6(jtWQ@Y0|_lNbfZQ0@9KI(gTrEU=ReAUZWx)A_+y3 z&_VfcAkiPX7Bgi@Az6Hgc=(_^JbQS5*$e!FuU&QpEVsDz`&5F3x_kHjA z8{(cty?SH$?sbwO?as@`FRD8n8(;qXG$GQG{`=!DgJ?#7KO$$j(2V%)Teo&;19jtd zqx{&)H{zVySWe;A9KAd40DvjaJwwZJUhanj>AYgx>#b+PSnic)Pcfdm7ann0J|*rI ze?boV6ZgYjqgVm%RmGg&nR~q#`#(IQbX)+meKC~7+Cp{fZBf!j!lxcl3oE6|Smm=d z2$p{Y@m|f#??5(PYy6v7n`A#esvoNUJfqhRwq;qk^#`O!$r<~&+aUZ)O^ui{dp#qf z^ANLqQ3u3P`{#ok#=cReSqCC|gE>Cy+YhE}^-?CVwyD8d%Xr`K_}zM{Psm7(*8&S92&d`6N@cRsG9kR?J(227N zV4MeAEy-@5!B(7dEXGrZllz8Fg@{S>i zllA<3HuF_7Cu+pu$;j89e%pNDjga#v8`o|$l|Z8Y-bZL)Z@;AGulM@bwx?3X#I826 zS1ZF)4iX0@LgYl>KK~{#1Cr&n;(LBmW`fFW#jr{zsq7`x4rz!6igZ{D-$siyzZ6Fw z*EKyr#9QBdjejK5Jy7mEbt4q!o|@PkmsD2x)eiA3Z;f2%;7XGS1Mqy8H|nU9GI8T= zWPUm1@$0Fn2V!H}YDosy%-%8-MX{vOouS3072@TW-6U4gP_rQ4a!e8`19&L8H{!o+ zM2DJFyr69sOu^3+@!E&*n=M!D-M-#Ov4>IeO3C$;0nN_3*GdZ;Jez65TbwNS!T43J z{jF*b1il?;!Vf+Iu-)@;3`Xl|vpF#F3IKvGPw-c*An@Y1jV@mb&+L z3%AuYWCw4psb0Y?2ec`-SrVV0D0@KqvWlfgfjELgDAq74BUM%$VJM2l;HY|S*Lqs^ z`)Nf8N-xn=^>3VV_WY&?p|?#6nr_SX5S_O&-EW?3H`|5c2tXleQGeQW*al~au?Tiv zW9;1W8dP+zrYAA-oj?tQlUSZ4AB3uB97-eRRU`KE!LgH@o^~wj%}2_SKAT&(32Bkk zyw&afslSVtzZ1b4Fg*+kU3T=ws2Jbsz?R=O#-f+V)o>;Sq9kpSoU=>UyIRyIxWL{$ zi+SdaaVvI-#QPIgauZpOV>>KVH+w?Upjk_k-*ZH>nJLnye7O~>uHSTa9Couz_ zi7;~s8d}uhx%f_+Ev5g?`k3t*-56nP^3XUx1rqg%qsFL*2i;gZ^a*pd>-2uJaUuuF zITh7D#$n79C8}DDKYUq)FE~im?bGayxEI~80JYlh>9T#&SoWJMa~>hf-vliNYe63J zL9mMHQEr8gp?r{VQ=82~c*|O=RR z8cP@yMB)WOl+|d>#-i0uL8{ zJYv9yynddaG6(Jb-DNU=-!rG!2BqiYE;a{k38RnU+dX4v5u%5)d``bn%TU?$^))DY zsxoagACvGh#p?P-xJGK&c2xcs+v?KIB0qo*BfkkywhyTlR>s5MPDn$w+*k-eSGE~^ zorO4-u&1%8M6=HmCdT5erD=?HS!TIR_wfPajq=3%&q|*T zr^*#CT{-2<_w>B&gvsrVYz;WgzCg77^g}}12AJXg5A?fjIp~!>i*eHqhkV+bNWp{B z5|0ShQ~BQXm@RE;qFrx0a2UQqUh^UIUAUy2=BMZ<%6vLLum*k21##Hyv)!qK+4^tK zjSUtb-uDZnWI>|22Dc-#s5VuK7rAjQR_7Qsy0_oa2pj>p2;g7#+bNW8VvbUEd0JoM zGXje6o{Pd*?{uwOJ0H)srP@ZSsR{BsKe;Q6?N=QLE}X4vH$RNDH(grE2K3FK7{Bw7 z20&EPSoyRhO||}KKOpo*+$M7mZ5*#1`VntdmDPCH^kh%>IoaL4B?L4^rFTT4##VT`b4D&=vqM_?>f{0lfbesl}*RMjm|o+E5XP$~kp5 zn>nc5>=YYiB#f;N0LWRuYj;|VZ~5QwU=)!0|4y| z)YBf21t~tHzXYF>M=3s|^GdAFKS?){e+{66U95cTL*A`#vQSU5EcA#DAM&OWKgGxV zuLIA;f#3OvtuVIqTC6;odsgM3o#-2Yqf0T$VecU8W?>*?`RY_vPU5!+7|kqMUl zC;yl0y=}%v*FXL~xLKX^S{zy(c4C#I(Yg_K2@li%Ao|MbAC?_N~D4 z)>c&O{|Zg&TLFrbRE)dr9~#m0#6{$6BO>Z`K2~?hIp`|i^7!&r{C{MGZCi(7!{yj= ze1_YV*r-U;TKprvJDb*iz2bq6#i){Wq8zeA9w)O#o~yIFa;+`K$&+!m;-? z{#e9+=X{4xAuV~Q=-F{^>+uxU)U&^YAUKi_te_}lH;go@8SLS>7P!J5o}?4{hX$J5 z99f%@UYkb5kA2?gtztmwGy=)f~RmIkQMCFcAyu)f_Y0|eRW5BisjFUDWA;(UZ=Sf+&ZYcm z0vhtW!w00UD}jM7|L=TG=|4|B!UD+XIF<~~_2JSn3dgrB1Fmn}K5~v$oyR_*%?VnwEaUyp zb~Vmy5~9nMn+Gutu~GCs-35Um#VtP@VQhNu3w%MT#WYg!H?nKZ#l05e@uaSyg|TS* zf+b84R0vPw4eM!)a9kPdV)dj(XP4mPPH`1>%l_kk8LHBVUbXquKWrgp3Tchf739H1 z-xu^qONb=3!&6Io-v~9h@VO|qhI}T@WBws!9bF!SVn%i6R#(ej$n*59x*6?KL(gsV zb2zGre9d}qvhrFC`)KAV+5dI}%Tb6=saQ=BN>Fe$mT1oR$A!KL?|F#&iE1^DhQE0E zIJ=qQ=jHIWBqq?wD~6d%b_i({#(p#c?3}Td>g~Uz>@6|kD#POA{8Fc8SmN8>W`|fE zbn5+Onl>>U_ujuwD?ss>U1mm2xpNkQxIRzn8bDsLs6WRvB(Eo(%yP1N25tuV^_Ag! zNaPQe+A&uF3sOjvg^Hc>oKk;D&u^YrAD0xM_{I(|sfVVKy47j3K27lQlq_B`N3LPm zFB9;WOO!vPO&rwccWlz5&nms|Fub%$&-Z@J2X@kSkUwshEY$G&jemo$rmEznYS{pn zm?y4$%Vt%1`Q>=U`Lc?sD0Rbb}? z{pOsZ&j|)>>X1ij7Ua!7;71@5z%&3>`z!UWRu`;oY)6K-asFXC)79Rn|@l9LOr|LC{D|S1Td~ztZZ5 zHY0^MYq5HmE3xDq$4qZeIWol*7H!sqYx5~1eGZQ7vHr`zkHoo8k&*QpQ5}#m9c-G` zuCLnT4C@FOl1DO%4Mpp`;k`m*+XZVGmvt1N<&g6Y-2kT=yhe2^wgLwLkGt?;pa?c; zeZ8>qrc+{F^&9^qub(NHmt#tk`qZQ@KBvW0B>ofOet9T?xOwOBLmNBnvD8$f#7bs@cDI18= z7|m}Bw(E1`w`%GhnO=b^@;l!FJPg2VAdgs?8Mx#(>a9#l>$NrHte#fa?T9;2 z@nIy7R}-nc;q@lKF-Y20_)P_)@kXo;F7^HyXouB!@52uQR~(H$t9yD{+?ypRBSRHY zK>>@GoGi{e;i}m$Zo4RuQTUOVX4|W=QD<6YtmAj2p7oT8U?TuWqN+W6tytOMN#ohD zIc@lW-vuHsCY6GN{2s30%uP{OV4OyZc;AiuU1!GYb@Qu-M~t3CouTSl z0SZx7k#)MNBDr7;^IqSKKJ^T65Y_4d3*w8Ey`(8?Eaos86J>F9%k4?6-G|V@(#K1i zepdi(JzK9cY8MqC8TlkCmk+Ftd9c+RVcFj+Q^OkC-0+}<_{T_2R*^USMv%K&QQ z?ek)%qFz90B19G)(Oc(fA;M_F~ReRHqdC z1k6?5%pZN));KrUX-#VGuowp;=}E7%X-Yw6rFcb9O>hxlwyzWPx3%u*adCgZ8&;D( zGgrb_l6=NM;{~r~^8LKX07>5`QMQ2Rr}^DzHQ1c7OPTJIj=odEe)0fJ@PD!$e=*iL zY4snkKX*E*KWBzdS8XHd{<2Wg%*lrJzWEF#v1(&iJH@N=b!@2WSn;)_6K^AHLH0ppiOtecckX7 zBUQJE10cPiuYmGK7#uuWD6l#3m7j7DbmH_BF`J(P1tTI&-puNb?s;qRPp_I%VW|vF zlP>e~Vy`tE;ags=Aws-%B0D8Ub9H_EW);jPg|U9?%SDS%ncKo`UN>v=E4=RWYC3%A z4bFE#pX0 zVHXt?lF@ar2w!~PZWL;@e!D`^I}qTlOTmo1+a<>?(m}rEQ&~!1NOMM`Mz*3@J4xmE z3$IT0GG@c1y~R+VmyTaugW4HYoE&2Xhb zyD5o_hMUI?G^%+u51dMmJmyb`5Uu+wfN8J+yfqh>hkZu>sNeC3KQ2?Fd{AI$+V=@; zboi{_mS0uD7uATZM!cYm+{EpfNgZ&WKbzVL&(po(l+~}BXf=*BnlTzQPOX+ly-F`E zTdy^aWz-jS4b&zKwau?zd2L6K^2)M7*8z&g#3?OlVL2(^C{_Y#-ZVR_^OShV>O(4v z5hjCZ{W9}535aC;^H!aqU*dyYg&)cQag8De1q%1x>;g5)(X)@ayROG0jB)G=LWJvxRZ=&)(IU!>*Gy@zJOFp~o2-dK54jDCS8HDt#Ek9IVxFZi0^7z14wzjs} zh;L%;fj`y_d~&5lby%Hm`Qhh>q_oXHG*sbHu~C-tW?4o2SM~+AekX=8>naPPZ#d8h-R@87vz2YqOR`)} znxa6p4PJHjI9q;-Db0@H$hSNlm%6Xiv@chiz{SWo(}*-f_B*xo+9xsORMHTV)@F^# zG79FLu^30D@`eRVGs>Gy^-GI`M0cS9eB8|7wTsWL62ZC{LnroEE2m0hD!R+W4_NLDDTOstG0Kv^W1 zd4l|t?YO<`6{^gH4nK>7||Qpn%;Ul0;xM_;jD#T}P3<_om^F%j$%+2J9VLRn(Pro+ootIvZ{XwUH`FCCMS z#>N&6IDAEnn?p=gu{g4~2(Q-+glbtwPoEaXr0UwT<2Uku2ynFe7v8PHavBLs7|V!0 zp&DSbqZBr*UBU8oS}{+()D0K~O!G=uma9ak_t-Y9{H?RP1mgWVdBr#rId>MlAdc;s(>b_QQKq&p<65d!6k zxL%w;EAZnQO!(YMF6LIvyjxqy&eRod0IHyBVybtkxeu)f;F-V#sF^K5`5d)f+J zl!b;#e-9%^&MfhPm-cI|-9|@hJ)mR(aWlP+DR`NEdJ?zY=3e*Bre@&9X5u0)C}&70 zNW5Qz*}U^Uf3(--kbwpWi3W-Uw^=(Y@Y|I#0sNG!^{xYs1w(L5CXAc1>+ zzGC&e1z&wgKu#^AcCfb#)ROWw#Oiw189s^mLf$QiL!wr416$}5)By7@;!?Al65 z(u8p!=v5udWzAPR)6k#4eGV#H>H#}NGl#)sK+*K84fBSv3EdkYTPbAU$o54PWwE7V zzA@vZ(zo1bU(Axa+Spj8K-be&0XgVIH=qN6pfd2UpfY*G>RK9`n>;xO1n{A99QLBi z5Mdo*rJ$TgI7Lbu3~iqA;se)e74-C1;a%$Cgg9s^%h6G(3UoXp+89+jwOKEjK!+`) zww>n2wrir;Bufp}uw}0kF0@#HGXLwJ&tU~F_d-b2!t5q5zRnQ4tSEndfA@-y6-{1B zv&u#j;m=7hokY;+nIGu=OENUM7GLnK!%zfUq&m%u$+awvY)BDMfqDSZvpB9d=sp?SM{{63&Kswu*Fxk& z;vfq_8}4EHioJ+%LH}q)=}!wKKa$voP20u)Squ>mh}D5lX};qIUe`Rb`M{EUFhMrd zI@j2|qiGl?w;UY2M&3bF87e_gPq}esZsRV+)i}1nH>!b~1Ws-dwqMl#AesF4be8HYuO@x=TnX&b z(Xs2N$L!HDZ`90SYT;75h&&dcT(Q7nc{iQ;Dd97Iic4E%x$Z1CHeKVeomdAwmoX4h zR~+3*ZSo1t0I#!8fz5hJp-fwUh#gl-K8axyFRF*MEv)QL^8S7R< zV&pzpwDovP4iJt^13}wgr77{SSn{R?VS6uB74%xxg|6Du_06%)v5xgw{~(a#ee^sf zmXVmJq#UE9s@yQ=awRcRpAYO%Skhitap3-ABWI3ID`)C#;?yTJXdyF?sDmiISqJK5 zWMTERK?EXrU^5i3S#w9=v1D0CA(X>FgeVH`_i#|Rj5NgN12aOO9{C@nBq}zq@u)^% z+XB7$NDrxh14t%QK51?6hVkZPbP_Jf3S(rtKKTywe-4>zpjdO$`c{BOM5)r3woZYl zeJHpKd~PTo*AI$BUx^j)<|bm2{w|4leB%SZFgIzUJH@CCueYP0VsEkp-8j4$+V_L; z9Pfg-8{5FVa=T0x%HZbOfpa*Uh)Po<^rtoBoz)l3ckNxA@}2^dGBd#7p=JNWNo&Rj z2v;PQN4%yfj3y)H+-WDr@S93dGNwkDZ~2ZawBclm0r`5uA2zXMWvAbf;p~8<+ZFw5Lv;a!i>vM2b%-|H!{rUQ&SAF5>h?p!xT$ zc>c+iK_DMgn&%{SKIfEbg`Qq!B6)5{E;IJpf3L{gEXEgn{z2=E<3LU&@-Gka-)c!6 zxA`e@(Lfem=O|F(asR(7@i+kKJAhaJtd9KW=Y6lC{Z*Fue@ktuhDg=Lz{d|&Q(a(1 zAD*pGlA6_{rmK`QQY}Mo{Ldw=|I=C`w@&{2U&?dge^)KPm)?SNeVa^It1! z|33h)yNciQy=`Wb+ZP1W7k0>4#nydW&+?Y0f4J6lO*lD~Tl<7~mHca6liLB27B&{@ zw7Efy4BdPxy=^yih~0(qG@v6mPV03RC#OsGnKErtC!Hf0smc-Hwe46So%-L4y<7&- zGElHn4b;M@YHn{;HC1;D;l&wuAojXK>4cgU7>jt@4#zSOMwJ7e3W}M>;8btdB~)wZ z9(3Jy8OzgK$Scf?X4N2EbWK|-_oo`L!|A{Lv38W=Fvjf}S=2$Y=cWyAJ_*@xMwv*= z{b$7<=%c7M0eS^)4~gMc;}+SB6(YECt$nf9&c%fp^vw^qx$rQ!SY`U6Y#0Yu6Z74lgUb)dKTl3Is9B{67<6R0G?r}F#XmsM?DVFNv=Q~vYbOGKjlTgc z>=x!WRWw^LK=7T)Z4<}v7lIsf)?O3a8TIDCuuX1z%VM1}%wp|5>*J+E8L6k+Z~k3A zE&<5=(M4QSGra-m2lKXA{N4w(d|-bwj{w!`_=L8)=pSz3@#crynIC(?x&_|<+N$x* zSPMKbC7$B9p_MQt1>gHTJk=o2yuAbAuuYFcOf6x?T$#?7ZXphA2HQ<&`b;EhFfR#m z?zEm-ov_^AK6%vimX+Covm@_iSobxXYQ;NF>sK`ctz6zD+>CcqVvhKahL6DB-+O>U zzLw6vA~9a>s;>O&rIt#;2|6}MEB(@$9!sr^`GI%TobZf=*AGa=pIHa?Q&q~Qgi@R~ zwBn~6^?E0;9SB3&(OA!-BUs$On4nh^lPSWo~EN(hZJS%v!v=q=eaGf5~o_L3Ca|%^G#Us0r7#3N)qMikvh* zSa!~M!uqw{K7{wA4YK^OYnJ7f+IzZOe&HuL%}_k~yuQPGnRJ!S8!%penRmzCoYS{U zWKO2s7ZNgi=>dCC1!}Rm2vBwJQuA{w|))wsE}ztnyT9qxQ8fT7VQVL!0_-~D#7#ZEsNmG`BP!iS0Cu{WIg{s?FRjS z*igDycL=sEz;7K&u zhUB%Sw{0E)^rq&&NGn<#Z;4xMd2Zw%?D;%=0*c~qODnq1)JJr9cp0Q>0&OvTgB~l} zOHnm|QS;dBk^rB9{KRw5>Lq@p#af_kiWzh4_P&H`bUo+LAXxUX>Hb5hy*p=|`IK4# zLJV51&6CZ?LAX1(rm4lsv+w}SdUS;;@4=Haar+2ns$?U{HLD@0FXJS|;uH*dR zW_YWQ)xYCaAqP$BM!iqw8;)Ciw#_jN6-K`7ElfO8}Iw8GXKek77y?2M>=1fvTDwo#c)t&)7RtvBj zYv1Lt5TV*DNtA&5@}kxl)ZhLFbj~v24jcYzWI^0nd zLZ-b440(=STc4@2$D!tUH7oKlkxVD}>7J0m%*g{_ir_nES_WKf9g-+^%y_vjW3XX_Mo_eRSjez8GXsjWW zy+=haPZV24A-}+zm^#sq)|8mP8BN%xb~V-j>aG}6hqK91ZuTX+@V7}3vO3(;croIm zldHEv$Nb8=$&tx<3ogNpPCyoeI8|?3j4lXB)y#jiCWZ}slWuhI;AFT$Cwxb7(x7|e zhQT{Tb%wGMHK5faYdc5r>2~&>O0@+f?optK(t&&$;wJ!^j|5?UO3)D2Y$J8CbTh09 zM;Ax+qz5BML#Om*HtcbY1}*{=dN^iZ!jOfyCiXhhy{49#H#9LZq0nYf>Ck7^?$dE?X8qBI3*EuRj!xZK23!7& z%*7BQBNY%7>Tl|BI?dh@?mqg(gOVRcY~?)W47qi4@Us#3ReluVT#Zw&SD>z6rv?g z*$AVXxfr6t$52*L(wecRFBLnY=y{H=|CW`;+;Uk zPp=c&=A3C8K{K1VTOOe|GiL+z+7nrSrY2?269I``Uwdq{!9V&#<5+1-@M`KGw=UG3 zYD^@odvjzL%-$A^;=2*I*FC93Ub>K7-6G6sM#vO)LUwO|@0g^5XyQVSi9GlW0{T#< z?DP7B=JmE1szY5`9g=aRf;^_)7#lmW&8=-Z^oI68q&R_fr*Ek^f{Y6|pYM(kKhO{1 z!!w8zN!8HJ+$xEhkR|_+x}lx(Z=mF*FPR{V@v9O6sHy0|%Y!lW4wpIDoBQsg>qM2` z(iEXn`|q;e>#miQn6vkm1|A-p5xfc8^CY)aBY++M8|!jThWYBiT2hgoQ+0^=7P@L4Fe} zy4fimTQQO-ohnf6{Iu9D;Yp1yd6zGZ$L(tir&j;*xMCFVUx|34 zsZuEhlu#_cvw^2lbMr0UCI6O~j{}+@kxk#ENlHr1Kr~Wlk{OWXGZ3CHO~GZNVV%K?<53}Xd;pJ8^;0cSGG0|I1)CE_=?gpZBlf0pT>Y4RpL&^(bL z5*Bgk@rqTj-bByUs`qHftv{6h!_7=SFvJfx_#!K9ar)#-rXQ&7d??0_5c(E@|0)M{ z8`I)w510V+Npgc@ykP`+1)h=%u>w);T*%42g`!wRkn>NKKnq}{86a9bc=09gSf><2 z4QY_zEi>T$RDk0=_bi5|RG~is-V(5)5*T#a%;t_mp`k%fk4Z}tt7r4hnxXSi8w7nC z*(yzxM(s}uvGwXI4H;Rv6VYr7|H)@<=J^aFc8P1rzuy|ErQLNfscJ?-TdO;T;4qtV zD9J5(o_4zZB}g4azw$D{SU%N*qKVc)aIk1Z!ZnG-u+Pn%&j9vG508&>QBbSfD9-$Fw9mam#gl|lwC zkUca87`2Y{7eUasvsbFx@KSluOkpgvE1#3UpK727(0R~N+~}G3)8F9wg2b|<_boLG z8Ly7b`YB!k66&Otu+N^HENYHRZNrOid>ZKJSc!K1GS+=mNzf72J=4Q>DJy5)t(rg! zA=?$>XGZar9Y70P8V&L8`=J`w?FPXQ9;_*vnpy%c$X~Sj)80=p_xo$8g!%f(&~cIvSOtUo z7dE&2HUcG-Ah(_=^C^9sW_qi9R}orKYhrah)bZKiU=nryAT5JPCIdC_EuDERCnKQk z4|}*kLu~_Z*hq7)n%<4Y9Veyv_DD)SP8PkoH(n2Di!99N-24+b&Kd)o!xp2i5#U0X zf?Orn)KoEJQ~?S$3NDQ5M!gEaNu5Mc8vx1#aKunI=Hw${0|bF0M`G5Jw0A+g3c>p! zOfvhin1NXb&R#DZgs!hp@kK(ME6R~UY^&w4x`M|+ z>t{Nbv^froP6Sq7=T^A}ppNd*gb?>zX?N(6TGH{))+mz1BT5g#6iwxV8 zXquW09G>)+5SC8!?-p_m_ad9U(b3oU^MQ3&FJa$FnU7yITia-(6HoNQ*Eh}s(kR{W zh`KsNTU@LyUZdoPq0rXsTs&E zlq#qSPS@`S3-~k+zNaTKoJTWJa?4{d&EXV@#h(C)6b50*(W^zn8RFSC=-aUewySFe_h@1z!%h51jL5(&Wb71(!XU`O8_^$81bxBxDlT zrt2bB%(7W*_V)9O5WxLQ?G2Lq6Mu4(d>ZPm#@Q7=6`dFb^IkJRS<*V}# zp!rV&))L?ZY1C`{^vdiyvU!2!R{&wRm$3JGX~2V}gL)7)*do_0hzUxB-U<0+B$x=tI&)99qo5aJ#-WCU0~IwnBMOI0}v&T zJAEo9_Ls%?+Jet3XD>&zoli=Abxi8y=s6oRS2LR6&FpA&&-`+mCeS}Kvol}z#$#YV zt?#X1iVZnZXRP^HQ*7db!w$VT#hb(k!@A={7F;s0NE?Gg*;?P#LFqWN^tCgwk4OZd z3EAPmr#d$HLfwJ7p*AGAV9n&Bc>lty?W-e?wX!$&%Cz+eefc6Z_zf_nY!QdXob%Z$ zD>v#O1J++g>YFG(z&c?x|Ik#SF-QP*`W%>UgIAX}d1c>^odFy3X_|@TTCz$Hs`WU! zQB_tEo~$Hmc0DU|4sNLnf-me}d>BIA!eEci-qHBtvcc+flsC=xv#S=?(6S9!Sb}lB zNMcI9Y$&BzxXj~#f})u4+SsSSnJ@18x zU=WXLvtG!0WG>`ZOMROB$}`I7dS}QEE==DxV5^A6atfy8I+7YXC9;>dPyx8@)1{0^ z3CF+Cuc-@)>LD$l8Oyt_fg06zyf;e#b4)5jx+Y0_pL0m{v68rQ1JmlXE@prX%5AiA zv}k@Om(fT68SWL>Lg_Y)sirtzyI9vmKRct}yFyq$5{dB`2sO~a!sSz)tQI0QqxSUE z**(;x4u1`)TicAq&GyKtm~>i4>cQSG1aQnBc`_g{+qGsR2LJ7Q z?-HQ;gK5WR6fekdkFG+6<``+Z`n%88yUDj~+KoK$fwOQ&11{s%G$S46KF|qX(F~TL zAReXKm^J8w3ql& zo5*_y%m^OfQ8~>;Yn%d99JO+yBi_F=lxz;zq)sNC=yI?a2io_ZIMKdVy3% z<9A;OSdheB5CBvM^R2sxyBWF-^eq>QTp~yz%TeQwk~AimQjL3<*41bnj2c8`5EMJ9 za$9gT|TVVxa zfO2024c1l)P@Bo`mGanyAnryOK!%E9dm$ng5Wp55GEw> zYTqnh8GAPoIK@9|83+=k^;k72mvQ@sY;Y;VVwG|0Ita)dkif@3074xu#(RWN`g#(1 zV80qVV>Ihgru?iT2Y3@i6hM3~P~gmn%k7c{_;~9j5DZ3t7xa5iEXP~E?Y;uyD)0t~ z|C7bzp9^kZ+XtN5ebph;%mEV2JotQGu@bXbfy!W+q0Y6y z(0uC4ui_+OEd8e2=!qJ>GwUG*3P9?db@FAtqkSDS(v4L!rjozTo`<@L++YwAa4p{uR^XvIk-x%R1o0 ziZf7JG+2sLx#$)$8nPw9!*liWE};iAA|k>cAB&SWFkAo3KN9H^5p+(1gpT~_4z?m& zQ}}I-(?j_yRzQ=U6K>>W@zn`dvpN_B>MWwEJNHFnBX#8r@Rvk1ucj2oeP|sGOTX2?)~K*h|sqlHu9RnRepAP*iF0kjEtD#x&# zl7g&5)1bPofqWW8Kyp2?TKs0_+wv0i;@Ksj2W`++;Y#bThein9?{`Qp|7f7xDc!0H z(5nldfv75KgX(&xRbQJegf#=oN%IhFXJWAsAoWK7^7P~~H+my38TN~JHnK4ADUf^`XC zm&ZA28Ej5a@2e%?85f>?Z-D%m$}4tDW*Aj%VkR%pQB1e%c9Mr`I^c?`#S27`5^p#M z_$l_MiJ^+>V@NK&fd)NpSLin`U7nzoRr5fA!zN}`?EmoN81xr-_KVvIVHJ;vjvwImB8Zd(>)!L;o75OCq z720gt6*6sbUxhOa@RLW4pE7bSR)Cut2%X!mWXFL3AZgIx?Wh`SJ*4o9O#|HVt5ctDr(;P3rS;alQeyjxHWdqu$Akq5?Hitus3TO0sY z$0Nv3iK;38K8-v5HfC2AfS>QhHz`BmE4hm;afF&Mwu8GP(8c>4;1}?}3$1e^*ex%+ zr8nY&3-zZPWV97$m8-*CV~$60n`pCbiNIv7R}~0I#U1!@!?FOy9PKKL116rX8ak$z zY*cR)mM_pm;LSU^Ga)X~EADz%EXhuVkcenHA}QcYe=(1%*sgE@0PhTj0NLo`N2;Dy znCQt8LQRC5lW4si%he<2>htqXr`17I^OTeYr|ty+B<~N9U;)a|K;^*X+v^rjH4-jl z3r0XE*8Qr>TR2vB-Ad7QgZ`|f!)W@}4s0N#gp>tP^8RkI_s*bCEW>-H%T@GY|Lw!4 zd?Jb$gX+k(*vw*xf)`;)QKY?xz780|?H>dz1x%;d>$&&G|8X&w@TMLZjTh+OeZLR) zN#ye{4NqjO*UH*S*iD=kAQiU&LOcT-0P-d(uw4@qKLQk_k^@9va2vr(+6F2Kb|28m z4iezJEac4DvKJWJc_c8+Fb)nMfM)#*7m$F3ji5W46z3NR7MLqXOhNgpu0M)f(D7R^ z0?9QrHX%Lcq6X|f*FRT#GRsErfr zv-?h_WZ7e(^_O2(!RtheOYKfoEls zn&hG;J7oxR_;f&_0R*^uIvqozz^-jJl5kbB&`YinttLj!*}v`5_s?zuxf;vz=B#MS z2fDTF3jOb&6d)1iZ7dk_E0|ndiIb*>VPpf{ zZtre``c)bxQ?KfjJLz+Rp4eo0e!z&D|KDNatwT8}S;pEzQk*Y26^W94 z#@J;UTNwsJjwlo*`x=ELBiqc_h7w{#B{XL2hRSX-gTegnnNjET{XTy@e>~6Yw>|%1 z%;&!E>%Q*mzCYLfe!s6eZZj9(iF2O<_DA+pWE?p*6ap`9;MZZ{V??q^%=Y@ayNP&J zNp2k3XPAV`72fyYc|+g8g0_ru=231d+l_MTN>*32hDu*WUgJilkN1m`*n{Ww)fWnqY zS=;j*pk%?v52b~2cE+}`8979oDLNS1YBFAI$d_!pU*(e?$Ji#jqKuy;C*-~@xjfj5 zupS)*jLYV_DA)}zZVMv5%QsW!8O!%sE+~n1LyH72^HIWLRK`T>c1vzJFnJ1SFGkC{ z6<1J1-IU!Ll1(R!Pb9Z{|LxZ@o7)8wgk1c9mT#k`t% z)r8{=$OHY4JGM2+omv=wKu!3a>$LPRKo&vKJoQ(?gS9%vY(cGlygV(aG9Z_ql|2SrvLZU17U(NVEknYaYQWl0$*(lJrs6{kOum zSeP`dw!%$?YjfZ7i-Qykn92ttm`b6heK*UTa#-()F?n<#5O^?nhRHH4pMJ1zi2rky zKaAQJP@Onla^!?CTMbQoGD5#_wR>b)jQ znqiUmQ6Fs`UgHGi)W@!&GkqfP#3Y5!XUt`UH&j;M^|`RdQC%uhMmzul$4<2!id-;a ztw7*er^h@tLKj%`YAbAYMJIdN-BCSTEIh)d7!605Kuj*aoYlHx{Ty=TMF0TN-k@=2 z-7Y~lTq360=eV=t1Y4U;hso9xBgv$|ve8UqC=8k_K^QhDtJT@6k62E-rBV{i*8Ezq z+!CMUT0a~~%VP~uSSih?hE`(cfCk+6PBru5(kwe87u6H-xs8I&Ua2gP9GX${P{Rtf z^fiIDq+@z0vB7@h-g8g)EWeGd`sg*yNTAmT@VBn7hnP`e$5h;#hTzB^V-d%JC~!3* z2qb&L4{Vwc!8iMKZ9HtlTi=(#mNrEFB#vpnBV&gT(s-sZE)`0{b$FMG5)PD!dmgSb zN|ONIx5vUO~~0Arc9MbG&axv5LBQ>t$dAyctx0DIF}7~i;a)9TuMvxm1f zDZlc2ZoM2;x7%{hA$WBLW{k zsNL4HIkqRx*?%20g%*ko{^D8@dlS%}zjr-X_=3nay$+Aiv00RSnt}hh8%FQV4+WeT zx0SBy^xx|Ex?ooCf_Q|wzfe^2^HKq*-4;$@x$r&}Fdu9|A5FM@JOo&;d-%Kt09ZNu zG!Wj*+<`i9Bynxrc*AK$E=!r~rNVDoEs^oM<6wPJ|U#<31mVdI7Eo+vV@10#bA|FAm6+>D}S%pML-t zHu+4r4bbZX+zs~Gq0C}{( zoA7RFwHId$9d#X3X#umAekgBK&c1Q_H72$0XdDB{d(4*)1s}(IFZ%~UeqM`y#D3~9|0#- zw%j-P*Iz{{m3cxhl`m=m>0nQD;);^Z62eVvVlRz;r?lPVIIf%V) zH(JL|15W{7a#+5u$XMiB6PrX7k6;2>Gs9iKZYnGUCk&X`W|6-(o2>Otl#J(wz!e;) zL7xpETo$Hxk}A$tS+l1^0YktpeWux?MsdNzMpYH zIVY1|psZUOW4d9*J$}nl)DR8Cx$ZDXeBm>?<8OJbm`{hablm4e>IyXgZ7u zgem(tw$+9T4FmxNA~xUhWXQ`sB-xZBC%tg)t7>gL1Mdz44r3> zW;Q;wv}Sd|Mf-YIdL>I?vR(mSxRLmBplOc6L{!>`ds~T-?q6d1s7H{^^McN!N0y|k z!ooAqY|%Xg5V<%c1jL#Yt`CJJz(Qbn>+59~?xW<>yR;e%G&*XRUzX)j6b0Kzh+DMc zi<8b1?JA6PSXp`;F31CZFaisg5NI6}(YLSrvx<6fz32TAGj~y|iZ~Qj-p4}ZeQ|+Vd1aQ> z{h+p~IG0HGe4dNR%}PX^SHRR*Rqf67Eot0y@&n<)4}~$+_66vV5ta#^ipIvaMj5~A z;4~4xhFeeUhM{Zv7GnGUHV zxjZEvHXZ6BE#s)#DP)DH7`fQN9_Ah|)8XxR+56{>^8(&qOq(gH6+rCG*f9QhhO&>| z#qwGOE)Dapl>`QRH{Vk}WEbfN8YW7nlsDj6l;v=zsc6hnnS(`2^nxKFX15<_-~k%> zu5~&oFgV6LRI&YtI*aL<{mK{GZ_GFQcJp+@2^uqwUZ_t_$*(HuUo8)N6;7q3Z#yAC zsrjcEJ}IF*i0N7VAtkjruM9d_Es8IuUyJCtb?Jm+T(d)l@6aN-33)kx`h6&tk^^|8 zKLkV0d18PhiqGA0>a}w4fG@JFuKc>~VNrdmXFte)k4?8@d5-*a4V4lrJ z@G?679wMTzgOkbZv>>J2N72tj-j(KNaYdl*M19G)VoO^|XGSWE0%Qr>)`g}za05Y9 z-_x;q*s_KsX)RQew_lhjQMgF7;a>uv?0Xqt587Vc1JLO78gw!#>FH-TVj8TcAH6{{ ztmD-F5}PqJ&&C*x$*6!lQk)hmj)Nz|972rC`A)&i7asO57d%k@4A72etu@| z-wt|N?jWuI(!Qh-O`F>8Lj5GtnuNN=O4CI`>(4K@#Nl4xtla=9J#o`G~1IQ&)2Wu*T8PB>2^bQYO%KKDlaZjlVE2!46jq zLLASNm&6m#vlL(6+cnblc}z6ayr&^xh!sMBwEJE+jc)xq&>GD&sgC#9o$^E6OX<4pe`;oJHD0V&717Xvl{N~tq*05 zbvY11KH?k(Bl7+c#}xIhE%%#NCSW$M0RWcq4_ga&L1+VwAx5$Q$z9W`zFu*w7A!pD zf+oDG?oRXA`&2B#aR57z-Rbv})#1TbOHVJnRLN9{k@3FbuayLySg>DrZ^(vjKk&x! zz538E@^tyGA2xcF}fNg{c6Yb@0Y0G$7syqF#NuQ|!uO~QEc0$0)gD10V&n#R2Gefe=)O~vjUgjb+iS)jA&Z6GeAd7odT>Hz#C4S&V5*- zqC@ly8CrC$arkuGWmLU@lkEbp@fu4-4i_IAf;XY2Uv+cYn{<}tTtV|#|6*mj8Kdm} zUAp5ykcF`^I^2@ErqrFztbMnU()t{qPCrq*=zojkT&guoZ+4<0pEfBzGf?x+{$cOt zMrP%PSDv9uo`!B873Y#Cy&+b6nrHuLcBIlT0+}%teh-(X^{eo?^WZFZ3R2M3Ytax> zHP_`(%nS0C+oJSRoiA+^6!sk@2XL1#_b9}%a$g}hg*OL{*dh5QmMYXd96w{B*)6>4 z!jU~IAQZUE*eh;xrHSZ?0IYqI5U) zp?=-E3(&cLpCODzxP%|t>SW7JHIJbI+w7>zrK|bo6)TQK)>$mPHvG~*S|Fwn8c@M0 zre3}8ZxJCnhBKdtZ)2dfJ%8_7zlzaFtfE089+0#4-Rci=NYIJ>P?q&ZV&bz6SV4Q+ z`^!VTggYw!REJ~DKcx^WXTqd?tN-2dusL3h0{qJ(8)$vEy`~vqW-b_)l?*4mxo#MqMZ|B3@Q3tu_an&uw z?F0L_P6_-6K}6ms|JsC}iKMWeHgxYT@KwbV>0ZLK9vTpf2 z^_uS;GASokMbYrh(9s{>y$8Gmq4x&>QUXNigY@HYrawtyj(Mg$bB|Su6k$fkd5F1g zksN>cZ!h+tle4uIuJA?5G__CC#bRLnR$Icw$7$?59;sm&q_T#VDPigC1R%(H{q?dB zvU4MXB%`??3p(Hrd(eB>Z3!xep+KIKl{O7>ZF)rzlE)AWUM{tk1Sb;4zT_zHmw+$b zadlEblc*$+!%X9(8Kw09@mE&i0GsyC&Z@d<37C zBF_5CDMykVdL;WMC4uqRl{VY;vC=j#!pg*GS#BlbujEJY zZy^`7MQab(Q@ZD=W?iURovf6fyTU#@>n||!Ad7C!?<97|yfE1rb+cI0R3>j)**-8L zu+C9lg7$K5b#T;GSYT!OnxG7N*(&O#_L`^TC1zSzNWt3YZjSWZvNxI=+Mc)kyyKLK zaG2EEF#n{!_c^&=^!_Qn8#8goS@(4X;d8Zq?#Bz_@G9$5Eg@Ytp}w{ku`6JW?@A)5|-~UP=@%Vk89G-jMb4ENjfX3-&(ursMyEpOt_Lr%7G`~9w&+GrT zN89xSGRflD@TbRhKfQMdXYOMyPL|JwF5Q)m;4UG0Pn$2&QuJpvetv!u01zTW%FmNf zfJFVFuRHmg{3U)HaD`6Uty8MM{mA-Py6whdifmlT>y=3`u`b`UbjPwJo%wSmPn>wY zea8;hBH@?};p|o}k5cl3x6VoPVROWF%4MBWR9yL(U)EO!sVh{ycA-T=|CbczTth=h z;zgio3>Ia&!-2q$Pc}wp#I^^g{3&~uUw;<~x>POxZl?f%?2@|#?RYtFux~5#cAnA} z0@73GPPJV$7b@OaU{>e_9nO|?ZEdZ1tX}aENyu^_d?j=gP>V2+t%h3=C3u~Z-f7nl z{$XG%ZX|Fny?^hH(S2@psHH)+)WHZk(hr2(7`Z1sn@;g36^9X*r1neoO_Y>q<+vhy ze2!D`&uQygw)?MPYqHF0z>}QAY~*~x(VQF58wI_(s-e~9)Y!7oI{vd&5JUv2r)Ejz z-IpuFE&fr?lNL|1om#2oG(=M5r)g}{Xgg{2Y3~Ff@_EPI1>%vs2y&B}vy?hBS=4v>~zSnBs?mH-hh8^$Jjy05j1!!3x6DRXiQ3)^V;dbyt;m&7?4~pAcz_Y$A9#e)VK7tyK2tKIY1z@mv2unKR}J;Y+_}wNJ*UA(B<-at2d<`@uM<$0F5^>@yzGY`@kaL<4GjeCQy^=`2l#`BzmPUV@_ z)!aT65@N;k5zsckqWI6>x_v9jb*FE^o_&ip&0hE;YnhpuEbYu>`5_!qmh|og5IcBr z2?-r6zyH%|^>ANqF8!2jD`_NBQ2!@vW`yTp^tQ)`v@}nq&XDa(pL)M72pKYm2vP)Z z2|$OT9D9mq1Kot*5~D!W7#XoYm;{mTdUi;wGj0*B`5Kqi|NcBdir*eCYuSqk8#0%w z9Ra3n0#tc${TJvEUOW4=>!_knEacA}E#|u0Us%QimlFSlGuWnzSYF2X2`%kx=b4?D z6(QfjvHUdS#kSbpM=tDee5w4V#}Y$l;8hH#yj~Zo(5opI&uOBv#?|As6zeA}dwRj0 zhAm?7Icq8&X6j#Wzd{NkO5}xP!v-4CLK@s@&s2OSnaOia@7+c4jd7f8f_OF%Mhqb} ze=1{HRqgcS8t*sja;(rmNyA2i%gkNvFPr?Hk*?I-(XsJ7dS^%GM;Cv} z@KXTfFS$MKBc-*kwjgOL3)UP=Ic47Fm_D^^DHj!ewd0zPa8&4)u!~%FkJzH8E$me%DavFnj#R+AMI$qkjoO=geTz0f94jD)12 za!Gi&Z$@mnN@uW%a9S0j%8l$oM9+mh>yLSTk)g&W2jSV|AcwT{xw8u_l6K!LoL2UJ zY2*0BH=@s7UX4yTWfGt`jeJ=XwSVu=gpAdwVMm;TzxAU-u~hpCqM*4^F@%V>9;tSb z>~paaGkpD>;PYa2U$)zT%O=C;DPZ_Oq_u`xkGEoq5cLamlgeJ%Lw!R_8&#beD#$6m zSzDdU(>|iIO3?5!vIoPWk+^hx*W|<2;cl^jbY6BG>1TXYZZK9#i9FoB)C_0rvPXznP%RnDK$qQR@FMG-5D4AN`=t> zaHnUoe+d;<)0j19b6-C##H5xbOWiOtwF;Y3zh>CYq0%4*2Db=MR@SGih9_uUtu#bI zX2p6ak08q*rOE##QQB(DDrvOG@} zT9Y2|fNKojH)S5~u({C_J^8bSeayaVTOyN}dY>($csw~!XUk|o-`0R4sF=_6&azm`pZF&{<}!e}d_Y8iK< zB{#Hd>&pi5Qq(oyPd7<5H0RMEn>qeQ7tZb=WDH1vCp0mM&((504Mp7Epj>Hh1X}63 z&(HY}r8CR^S-rOdo8nz7x7ShBd90?%B-Q&U94q%5aa{;Ug`DfX4FhZ~G-+HLbCNU4 z=Z)KHv_%&Yy>yj3(V1NdA(H=STbgJ~$zaUY5Nl!l@Fr!C?5v=WfP^+7rN2OfcS>L;G6+?f{mktLtmC{Z)Iu3vj9iu3HQ(A ziFj8P$uXa2W4>V=wB06%Meavz6jDi&?2ZZ^*f$3$e=3|dhHo|pGMza&xGC`BA>fv&pDIP*}+oQ##whN;zY|P zJm`j~0cBvNCs^AO;?0KV0N|ejw;_>4Jh?ayBDp*25>E{mIQJ~~)r@S28VSfmbd^OY zaW)m6lP05HT#R7rT5A3HHt#o_@>EwILO3@1{j34Si_OBCPST)Ufq3hz<8mN{ycwKO z!{hmTbZtKylVm zuhz44Rv+}Qqd^%Cn~OgIxj*(Icz%$1c~rfjQE6@8iG5rP?n@5>*ssd0#r23>t^ub% zUNNMowjk<^?Wf5cD3^Sr8~3BkKjlFZ56mX=&6|J^?d16N9(amr_$FBRgp8@2Zw}jv zY~lQ&TYtv{R&p(J@lpl1XMXMTk&AR-?PEg>;?P%hs#2yJXDS-yJ(BTk(ZY85rlr@8 z@OE3@0hKol%{5KRFPTc*f7!bQzAVxbw@)vc$>up(qa-jd*{b2~MU7Tm-_5)~-wfAN z@on0<)jpGqkJnk8^OBFc%+m>kDS#b@g|=0{+Qu|j@-D4jiQ|Zf6!K1P!XaCtEIG4U zh2|g*>ms@80z8=!2a@n_RICK4N~%I!<6S#)b2pnCV&U0P!m*Hmyl=)^SfOsUVAYZCCVZ-gY zgAh7X@rpZtq`M{@z9DU?0r;-j;LAp?Ie&R9XS#$o72Gty;d#KyTh2(ehR8r zxIGMCA+k1fV*d2EkeOwp?;zfAU{7bZHoaUSFIz1P^jG|$kN>o?0fmiwz4WnVDFleq zi{gG7;~Wur#GfDxDbLr~ptq0}9}zEcgP+7VL8~{GlzcOqRBv*;c6oC=UfsKKEBaS+ z>(E?hP38XmkB1)7%<%Yix01RUEu``{6W+J97>!y~zbJ^}dTI;z1xr;LAu~H8wHyH^ zcVjz{KxR*yom0BZY!WCr;6X*;cZ;QR&!~-C0RHrzDt(4s3x_J%D7@L8LL$B^Y$jt8 zluOw7QVL?mmCX-8z6W0<=MAT~;F54Wrrf|IUKTrtFOl3JTrCI!4Lpt+|L33oi>>h!yN=N@wj#?ZPUN%sQX`CKi^b71TEn0l+r&ZL zDBu^3H_)rzIu^o}DySx#ikt@8y8d3~s|Uu(rrmsAa=|)ui?A%VT1*CPqW~w;-Q?H! z%~xmVv08vbkv3Pm(K0RLy<9!oHH7S`A_3^An;WR*sik^xa~;K6jL`2Ed)tG;Q=mnj zgKv={vo-it(H1TUR+SfB`qF<%>CUFJ98#|r=cK~Nl#<40-!79%yQq6J*YuXXsqs*qX|PB>v}LbUy(A z=86G35gL0=nj;0O!iVLy7_>t7X3+r$M^HN9wMOWeMl$QNofgL^4^u3!pqq3;F}JVm zW+57t0}ruHQ~xUAOHyfY#%&X z3@3*6a?$i4WBYLE!2G-E`|}T1*Urjb8ddl{^C_Q2@pEln==pb6xvBH7BLa-`oa*R$ z@yU!&rlgYS&#u68D>wZh%_W?fJw4c!5}+D$%ae_I!<6k??DP+!FqM?1Kxb6D9*S8cR zzXa#+DrPr1gi`RP09O)^w~HjNarQw1LCXVa0mqj^)S9 zBr|tLrJfV1)}UmaehUrLo~xfT8`hQJuAdZ8U##siR;H~ypc^Rlvw*4jb*!P$)==uN zu^p7UtB7Y~_q)2VFhwzpL&=>twE(H!^W6Rp*~bH|IJ824z&AVkbWnd(`#2DmC)tFQ z+0^Zzt-HnTfy&>ajqU7%L9UD7pTF8P5vW#^2ZbtJ+(SAao*`>xjxCYJ9K>BYBAXJ; zC~`h`I~m}51L3uZYsuqBd^hqFuxv7WZs+E=a|9_)sOr48o)Azx5n^s3f@xctd)Npo z8(N5=jxQKItLom+K5;vIcN1qEuRt88R*>1qqA3)E}Sv_+&T)2=uQK|i(r z1(y--gg%g?|RkYh8|+xfhvk{UrL_ZfCiteV5lLya;^9Y3FJfWKLJ z(CSLLG+b`@&7VMOPr6dh+;#s-2sO4^0e34w-QR2~k0+G9Dk@ZDGGJD#pWcfU#G+{a z%_?feanZFA;4(G66YJ|8sx!gNf&$!9H~b>fyJU-Phs2yWeg}@gc+|YUWeOwK+LNa~ zYkW%CzJoF!#;1Jj+tL9Eo-}l|}1glwK}BtO)m~Z0LK&pGuW;Y(f{$7@yLnhAQ~jM{k-B$h8`H1sWp} zX zwJS&uhni`1f$zJfbC@9IY{l9AYgg#McT75JraQ-ne5x~`fG8ZQJ^kVlsb1qy!O;9W z2OX)Ew*$m(Cs17b`-qt~!-p{r=()le`N@FDsdQe8P5^`ZYeUXRPgXXGUGS5@y?Kz{ zD{jN+XAEWyq!%Lg^$q$k@*2_Jk~ugvI9dA;E-783p(NA1p+4;doX`+#eHijR+Kcgd zxm)Ko-nE$2P8BDBdU7uDH{EhrpYl|dyak)opcyJQ7fJ&kmu1^XDasx?H9xp|GKFqW z#fpxtf>D2{Y!8aLsbXLwB&)_)Sqq%8x?lYF6GhUi1g!Nd^+JU8aI)i+_Tuo_*kUX1 zlEf!fi(jLBsyxKU)GweoOQaa?VKI$?_+*gN#mZJz+jUyqViT}IlA}Af+Y@}KGr=xt zbJw1J%?1>%Z%#nm01(yGKP?kND=%Ng-q9h0^^i;uF7by=0lb7+xWqA>S$#P!v}z{r zS=JC?R2y`-oJSj{5~#)e`(!Hl?9u&+tbXD5Azs|nnm!g(pC>CYw9M+%4M~=CmmZKdAmPCm+-CbUxph7(SG*757>2&TU?=C8Ow0wvDGP{zoaZK#B9WD-gJeRrqah_>kY3*?BuCh31p zqyKN7yi+VMN1r?STyS$66;rXjkZdmPcOZC$2)ErZ55n|Q^} zLVol9&2n;b@|Kq`ILOJZ$H~d9IrGy-;FIu9X$Wvx6YgMfPOh4Ea1yv#?|0Vrteo7- zv@I*wHURfO-@FV9my_H2R`zENIrO=&oZLAh%L`|nVmzlu(RjUh50xdAQ`LqVxEfm0 zj@OuHHV;+zU0KBAb{v0u^8Ct)qn?+ql+d;>tZ`Oi_xyU?C;t^|Jd8yXR9`x36Q$i9 zc^#J1eIz<6wmsR^VKzdx+VLMUstdEB>mW5(M&>OaX2iFKI!OT?n(G- zD?Pj!+l+0&tfFRHaNH3JK&IT)V;K zKj+m!RK=z8<}uO)_7-AcbQ{-WFmG(3{Lin`q3C!vs=wwV+Qp_Xyl_6B*I(tP6!zJ4 z>GR$3_LFLsYH&?kK(EvSLJ3ng!62cL2z5_Ar7k-qZAf9_5^ z3X3r3ilzwh*SUxR#gcc^1Cri;HVoN%^rmC3Cr&9$(h+Yo^83;iys^d7Tl1B-Rk0mu zD@)Xdi37|fUTAPa)g{uTNg>m)qH@AWN?kOdrKM)hE_b7Q8!-Y?Ngjp~^ZxN{%k2A6Yq&Xm>Wl~S zvFW@KeRS_aNo^%~FKQ{cJx}tfJ%M})HPeR9Z<_&wl;9}71YIxKdyzC7+1@OOfhx{k z7Kk2pUym#FUrOq4$%;HHSmb^EO88v+yQ9Ev(qn&iBG&-Wu-IG9yejt=5O4 zJ^3RQ;GfyMRt*`7PZnJ5p@|2TDe6-oQ8#$^JW*AL75SKU3B19nE&+@B&7~k)vT{^f ziLm>P4E|0W`mYJ5r#TuutJvl(X)O=qPSRJFSxsrDn5?=#K>m-cea~EhCaU7DA5D6& zv`d@z!t$O|{>;I3KKX}{b5mZP+n(93!@oBn#E{#y3dIX**Ye*eRxFdb$7mm{Fmk!7 zTF$Mzl_=_u-(G;#-QeH8W>ej_k86KfGEG3ap3q62Q|e+xoNitl7%Q4Y&nqTzK(vJ9 zfpg2xPG~DUrhQ0SOkEnfmXWWSMzp#B(+@att5fCVi5D07zhd5W?mN9%ZBPYqAG*9= z*EYlZ$u7)_dUe)$*zvGWs<wXnCsog-K;j57jYl@p2`Y(U?0}C zDY;$94RvtWdiZ^5OZ(pvI9u9rdtb43K5g9S(05fOjL~sS4J48b`Jp6AXz`mJYPbtq z55O73*5x{a#`oo0pcMy=`L9{hm74Y(v*~^G_o&5ftIrY`C;TYt+u@93ZNfT2PvPn` zJ@nxF3tOM&M4+kRt05wa4=n?t^dN;8Xarh%z3sZ!T!zm4m!grF;@UWhBgU09mvai9 z`H&d+WNfL+;JVj*KIgiWZIBR-h>J~_Z3{TFv&o8u+su#b4P7dn?eX$qW*|9RJYD|& z-Mecgc-Pd%G4?)Wg80L~~t zJWbovI>jOSnM&_`@vv*Q3u1Tpqn^srhoyXD z1=q(;uBCdx&Z&8N96L+8$MUaD)3K@Be)VZ`shG_->GxX&7NB4)r`({^R)R-)PW~5J zntA27^>?7b4UkQPf!=NbEoxQ-2==(6Rc>v+BQpOegL8zIZ*88o<7Abi*8XjXjUG2F zV0FJt)|KIR7};b%s4u~=It|nq&UAc5a10J&vFF0Npenu^gt4$bv?`O8sa} zh+}#41(CT9?Svzan9|y^$t4FFae}_SKx|rg>7=M}vO}Vd%R16_Df0(&w!)y(c}rKZ z#?B83yZbpi8QYHFEN8{GmDyK=1C~F8Juf}g7ggq}&Tupnx8|z;#9hqRu6VrTqH|w( zSYM*#`VS@ZCs>lUbf)C!eK|bltDre^fvSNT!|Dind!xbGQYvMxG1v~Is zwu-J>Gb4Hk9!Aj02*<=lh5yh&qb$ftTE{VfQNNt{^&di%qC_Zd0j8~-0mJI)V z`DQ>)`m&JsM0sFXBsxlb+rs&{B_;lF&rC~0z~H`Pn~PKm-_L;fUwEYQ;k2ilK&^2I zGvSr_>7$Q`fp>r(I{|98ecjm$KorUWq7V>`&MS{O=d@2|Ll*rO+c@2G{;n5_PW{iO)oKdQZyATD0$$v>s94wOQGk*K)3~0BX!>HFT)5qem`7gYX zShp;*r)H)v-%Lfp-i#u_j@Kg5!kdVVgC&F0Rl}(V|C?pQV40Ns8KtRJ-WL^0XW`y! zFZ&+P5Cc1aV30(#^0oM{PLl=M29Kure1c7kh`%lWf}1A1A7y%6twYKaF6X}%T!}sH z+&9hmIIAKRuiI9K?$MzGtCC4x#}S$)LR_K1=MPjlK6e*9^Ia;yrK20~{D-@KK(xAV z(@M}qr)%N*2X0J--{w;WA&j+f5AV7gC1nv!1=5u{?mY!?LgV-^1fq)ujh952We{Ep zzFtaaus!jjv{v zrhz)RVog^a%oApG(HDNRCYhDPika&Wka9PZsv=n~hkFjw6qBhwYHB#;v#{gDqyO4> zFrBDa!Qgr1mdBCZPHNHB5!WFZMz&t27keV*EN86bH72JkcraO!oz=z(Cy zFi!l!vtnA~o=Lq?*S|LxM<@dY?Ribb9$IwNKo2$SnS?N2nGAI1GM{!J=BBAS)C$K%v0QcS-%}nglon4W>RG*6u0ytBpe)iHCjyQ|udLl`iKfgTTQ6WW4LWpC)a^g8Sw5zBp4EexCd3C>6*NXvLDR$k{5 zz?B7^>a z2r_andf~SD=u%o$hF9!ghf37`^HDkmpWDu2eAKIcI7G?HYY|#=!rSrWD3FVtyQnsQ z2n4}PF*V%HVd&VRB&^m?GZlHYb}M;QYn;YeMzV-HfWYij%|Tfyd4B9TRjmuhL}O4Gg^2J|>e}zNLbhVop}XmRYOcnVTL( z^8RGS*&(X1PGi5H&x9P<;PNt5B*A9~3{Sv|pgf;d!yC$8q^R96$%&Z8Miiq&gvcZ_ zZ%zy@^D5mYI&ct9)CJB*LONZck?%2_mlfD7^ z7$T+h#%2Io3il|kJ>BMf!82|)G_|@m*A2#a8t?2i=oVl^wcHIrfb~5^_~j2OltjBU z%QtQy{ypz*@HqDu5Wvh)7noqoTy#|^G+&NR?lwpDh3eb=5p}#eQvX5#l3oCZklF^kd*^#? zrU7)@Y$#6Y9IOtE^?DuOr9mfhveBt}D1{f%u*lrD7@y%DuMMr7ivgmQ)j9F32edBJ zE4XQ9c}tINCM3B15V$!!y^NtrQJ*Jv0|wuit0<{!&?A|DJaxY}@F@^Xu4h1Y>ZK8< z=F*#JKa;ykOXI!yS!qaP@s%ctJX+Gkdwgh*G=bwsK~^p~p)jG7IlDT8ao{5c3S34O z1R9+5^O?S{XNKnAIJXxqsoShvf1US2T`2=13HMa1fNrp>GYwn`961bUmbPbSMX9H0l88PG&x{>(+A*u)Zj15iztVHUTI27`X~F^OVYh2Y z``gnja6R$x|zoe%TVr9vv0vtRkx z0dB|`v_Lc1Caj;UXFD;Z9M_k>tLfG97oIp^Y#t@dPG-7?_Z^22WjsYXnk7%o1;sIH z3ifX9G%6YBk{q zeVT21gii|VTSj?=1neW$I>^dZ$^mw8#&X2m{qA$Qx*m4WT$SD2Zfe||6WEpD!|Ef> zEDI^6&nNvDrNag)GU5PV#VKUQxUoAb3RNpvciv#cxOVk{gI(B%SD*r_&{?i8xWH?} zNDV$v>lxM@>=#+5)e`9zK2)6y@%2H%Axu@=R+XfR@CzvX zt6KV!1L+LGEQ{Bl_jj$O7f-=Z|~WeOare;b|14qJ}uy$c0W+mOmj<0z85l4 zkdj^=V3!2ApBk>ghl99ME9k}FiCE`c(%MfEZhiqDOYngr_0JRcMyXE%059_ta`yt@ z9{Gw7Y-jV-$m*3(U@|gFWMtHCTM>ErnhPeF+93Zt$Ecpp=93+vyQ_Y%%M;E3VV>yQ zY7Qww@&XE17F?o(WJ+guDo4hfqnn@CgVoYJ9FEJ(mZ5UMYfZwRuqZm0t}{>ROY!z+ zKPqdZV#^6@>+>0m7JT!$!BTv)13-D7KryF%?z728BWe+~Rc5g-Rb&<$)9xRqI7#_% z90FiCAl>L4pf=-;Oes?_)E3p{@b~6*CV2y8LriYvsaJXPed9W&OV)@9jIEQzuRkt^$n3(Un7u=yW8e#^)H}$Gkh|g z68}!zYcz0kH*8#cFZgofHjJhh_xudjpQh@8v(yK3cL`i7PEfGNah}ihXfO6VT4v&t z0K7)Kk0`PxiT<4hFncuCS&)1L6ayrS900SQ^JR|BdYAa9p-_PIig`fX)~z zpSjFhKCtyt^VN*6pd6F3&QfgTT2U3r0{BnU@yQg;0tD4YCj2mEBHk6e|4DiGd1^=Tyz?*St8s zw9)QOMU6%O;vlDaD;x0g%dGTPH5VCOv|Kz>ox8&0E&USAlZ~E(?uXT|KufUNJ_0MwYu&F9Ti`RVy=^KT3nqNC+Do}oiXM6 zMgh3dZ&80#dmt6a@h4oN9;lP`NY^Fx(VfW+33%h5n-?nSwFUPJcVOlq%8+|HU&T4# z_q`zfgyn%K^vjuwx$y#6XNF9LAkJ8?H6z9~m4&Wnopzn|C<8kWW^nWm3{ZwhZQ+sz zVT)=jaq5MPJa-v+2pM@`LBq-Rg)!#ANXyLkfN7b>FD1^MIbim5G?s2?g&X!5A6%!X zy=Xw4G5v6}#oYwRuyR9S`d3&^vnNv;qJ8T;=Yyx4TH9y32NsHf!munp>@boQDo%_N z1D}-|ITUscn|OQH7XY#`=es>EDNQ1*wd-`CU|VJ@3t^BjS>SdLoh6 z=tUUzfOgx;VDf)mL1R9lVzbA@{!tB$f^OcI_yZyIfmze^N3S_U(|BJGWwHj`}8UKrrHSP+BgcsF-f-0k;dIePMgg8jE)S-9PnWi2z+@3Ki zHX8j$rui>RT5eXb$c8T(H=`AUmX^IJ0Ba6$Ka!$iBt)!e)d9w69F0iGL{@4m`e7I~ zpaWH9?{mWdR0rhl|AnHhXwBt97R#Tg3_x2otMNmK-L9F$KB3$97ivpYx_Rqq{I8ZV8 z}WB>bw@13&$<-^|{!~Y3kOXm>winj)|<+3N(nbz^J+OL7i4%EG?YIgogez8gG7&o8_#8~f;y&6B9vT}%Ue z0!`by`8%w!iC`oq|4@HZIYtqmw>~W1pWx$xh z_x^Fxwz$+cr@@>@4iOu#N&u4r(>D+kM(qtLoas(9hraw;|{Htig_#F zEX-X=aW3lLGk<%Q<5N{-R(I;_zl2;=<=%t1d(dMvqUBxx$h8WIw@=GAZy&hc*yN=wS8ayxoV7aE1MZ&+RrZvjXO-@sz|%L!kv&az2Ui(=a+M{ zI}MIK`<@kDylY5RmM>=f>~w77klwdTEX@MF-zqvPsf;xy4mxd9iOHSLKw~u^*Yuan z)-bfDl{$PHEm?bs~G0bZZ9WpiO?W z`=J*{1--b!Mwf)hwI8ykO0RwUsG=4eU`)yg?9SNXwe6OVn5ZKrb`7*Wbl2f4zPxE8 zYdZ(zR+N6Ueo?Q7^fz)U&IuZ-h{KjSm@#VTIK=kw)am0ov6gJEr*C2+p;sq`xcS+_ z_hBq09VKV*E(mF2-76C7t+X6*(KjG*n?lyonmhlmj=)`YBK_5=lZ6Hb>9Q`vHoWpT zo%_TdRLqx>=R$#rJ79`MZf^bw~EuJwx2o_nro=dac~8aR=xc z-OUInL>-s!0gUQV%kXPIe*?{BV_fz?)V_ZO4t(WiL`7))O&mTf3Yg#1Oeb!>RT5~7 zQy)(Q{Z%mzOgFxA00#UFvE?;b2bM7uxCe&bQ<)YlP*Ka7;d7hr~I$I;79-46VGFQpO zB;XU&+K!fLs1Ej4s-0!W_OB-FHtNA3uHu*TA(mnw)pwd&zQpDl4PBc~FzxA+Ycz&4hQ=p*vcvB&qNiGJjH1dCub|8k z*Lqm2T=^gfI!kJl6~wHnty+;%F}wCFpPK}UXZ;wd$m*dWX^^oZIQ_SrV%*=S%&9?6 z1RQ-@a&L-0Z{9!;&(gElG7%u>UO)^C22xE!4RC0+&0#DJY>=(P)89@}*}!#tZV>(? zwAQ74#4}$=8p9|FeEdmSuet-86f+aABpAb1Vttw>d`9|xFu1r`bTWyN|0VAAx=O9GaIsScL|9tLI+Mh`mqkF=$jQ``P*xJ<#0Y0zV4lXq) z|2#SLv(`E(E%AzLdq9(*^f=~^@$~!smX|8$`#KZOIo)VKxqYbFFktxQN5Lp(DkW1q z+9XjfNb?&PX)2@ZGOX9I5e0yD14a{GM>h>#A70ytAe;I%h1XvFA@-yl&sVh333qB& zwNBNYHLbPTu^+6n&1BO|X1~CCQn)m&)>7XPv@0G`cG54h*72p%~4O_*qPXt~doPxG8KS zNc_0N1prO89MkDf;kBQh9vU90t2#GysqdV@OS&bn!%!0`cE6l+!v`Yvhzh?F-1O;w zt)0M;RF27vlV6$adv!kyp8-mA%Z5~~Tb>D4Xa*E3W@{bYc4raJ?y|8WeZka8r7knV z?C`74EIjsd2H0zfwTFuF#AZWmL4R@3k0q45v+qy~17i-W>vPhOoB)f$lFqdS^ZCc= zf8P1N_XuGP)b9KkoZE-3b|l8z{%)-7P$mdqtEiYL?`Ua&Gzu^Hry;Ay$SHQe#~n7& z-Hch~aVX~cTu10}`zU<{&sQ0cEA zbCVE4;)lbSTShflHec`OJ4S;Q__Y(?HnW#caQt7M;h6e${}7fMF0RsUZIsRaINRTQ zeFGQkHrUalY>)Ml>Oyfhr-4Pp?roAwD(3(#Q=zE4Gy}r`7WpNe)Bov675J$DNutxT zfHbY>A;|q{yym{QNeZ=W*xNkb23Scyn9I^c$s_m=g22DW&4!Cg-T-H_xpUPn1M(um z`M^NhX^Z6c*&L2$bn5Q+->o0w6>vto7h$|eyKU06Qma*M9hpmqvb@v%D#lBd!6%}> z=|8?qh79(@R)qPa;Yp+IQ!R8zo3Q;nhaIqEeRwhcPFV}9v2bGZ#f|wT3du9M9L>mo zEFQ|RJVXAyXz_xoyDulxvcp)VB70}m*v`ZRX??vydS=-9O;3Ni2b?^zWakmUlk9{m zXpTb2f}=fuo+HH4c5wV(1FjP1<^qc}YpLD@1bc%qUg1OD6I8sNXy8CZBXT1!3hwNe zTHk$8{#KFTEs<1$;&~eahMV&X7=FG19MSKPN z`qRFFy^n)>`dYKrbcMVksw?jDz7k;5bh*)xY8Ns}2`MPdHs5#~MzAb->|x3)~qDLIs8G<2UU3oLS%LZ1<*OifbO6zNxpc9d=3 zdU%hY%COkzytNU{v)bh6&C2Iq?13vBw5H3P|DQP}4EN~5>!}-cCo2ccf-j4K*^ zoNXAfLk^Cm`FXH~dBWp|&J$8*Kx4<+kv>hH>CdRs1|ee?ei8!e>0{&st0OnMP32ZR zEn#$!GSDLq?XzKS3`}ZJ>h9jTL*)Fg4WXJ1;e}C6(_OZCC2JmyU7%nSZW-G$8O-;V zq!HoXh{pwynwWe{2(yqFyI6-*m!iUUulq7NRd0n|v}e@vF1hx*4I|n;)gy7FJ zv8`>2^k&*L<}0^a_!kR5SEa!E$%g4U88msni%1zKs zIXm}t0l&1qeCeyId|<4$!68gzhrS$(BYGBBzr4PD)$(IMsO+}bSAXyB#hqM;Fd&Gh zAyjLx+N;?IDjR1v&It@GhJyplrxx9e>Zi{}r+ueCz7+}3Uq4MyIUuU1m{$yIt0)Nu zK7t6@Q^f4F@vhS60Xv+=JZ+x$hBu9&;OL>l;AfACn^VUDJR#o$XyoaE$y~<;qX`z@ zMEH*r*xlE`^}e#VZE`9C#o$$bmB(BzgU{cd!$&xw`Lw1cORl(mvCU(iT;GCQAFIqgI7@N9V zXf)9ecbf>%qKE2Qtjj3`R5{COQ_|4qKTqGj+&k@dH$1)T_T>JZMdbxn4UCQb3{(h{ z-2Zv7jEf4lO=Ebbc?}B}jmLs)e$TD2;-37lP6w&L<)NVjZdng;~BDnu|nwkykH zzV>i<(lRJAwe3`X$-Oc12%C@R4hhGAwjQ~4)>JFl#A^Uh$laGvJ=jrh+1cRm7l~jW z3dW$Uo=3ag0(us?^=8k`B7rf&TvUo*l0Ol^)L7@ozMwko!jW|K1l$5IwsP15^^&&K z#hjf*$kfFfbjvG^`9F2)t4-1Sj3*7FOub$y1OAFS!>@UvUp;L^cj3ysjGOskkKtM5 zdon;5GBuV7c(eVlMjo}|hs>UzmcP${_#w``?@X?P`}-Pq|LjBSaHntp z2e|n##{8%MSR3$#L;a2Q9Mh5v)b8Oym+8&JOxKEVUcr}xS__~FGtP;kpy3kJ8Z77K zbPP$(kn}hkl6^OR*oBCUCtqb4>I(LbOmTsu0-$A?J~w$zaHk9zITmW1+CvVMxdCzf zq1nRpdmri~W-8~z2SYi;0LpBa~mdul)_Mga+$VPaEMFu9JypV5c?ptf}B== zfDOtWNjn8z%p;C5(*^W~=m5a!Og9Qm#{lT-F(6zl{Aqd~083GUX>dgF-6iSr?-j9P z4#$rh84W5tQMvEPMW7qxc_29uh+ENk~ zMD3E>Lsc9}UGp;j48ecMjvteOp1H;(&&Gv(0z{Uhs;l z8@+qV!UVfYPPj)_4i+yx`1zHBO*QbcLn^rN+$?v~(ypK6KHmf)?$wM8$ob1Va}4EI zc&#fLDh`s=RY<$i&vLIab4u2{QdPs^vfO>+MMZ|NLnWmDfgk zH&94P0*d)MxtppooV5G@?hALf*0}rb;cx~;b!dXPsJ`#3a)Za0f#G#>XH)>-gj);u zySszx{_=X$e}X@a#pi=7x@|*DEEf@B)nPXn29W`MH`#*1HbK#I_V`%3^%KVL$TEFcPh?lO5E3M;7 zU*(4_xeG1%(Ae#Q^6}^yA98c>+=gVfr3SEu+*N?eS1gYbygD^|X|Pi?iG5i4^_YTr z!Nm_3qoSIJqRhC0bV^k2ETL+BU{hN9N>1PAD)A?u(dOip6J~>+t2}oZaV;`>X64`v z%h=(`!6}>K8mdy|H&ioFO6W^yN@q0h!7&YE9$OXEqMp<{UPq!c#}81;iH1pYxKAkG zwzP4C!Hf?*(!jlXXPMJbd&-=ZY*k>IQZ6}KLJZ_`id2i{hKpAw)p21dowkvZQtoPh zLxJxB1O4ENT7-?Q_*3*Kww4AxQU~*9^aEhk>N`izz!*;F%7%+`CS9v-`-}^Qn>6oY z4KSDx>5Z!9w)?@0o(;tV#xj}v0~H&W)&uIe-l+I&2w%|7*zlfCv#aTgD0n_)Y*L?| zR7^$UQ7Jn0FmSA5inx*7Jib4h`;j(dC42kw1yIbn%1`xxdiZi|_vnHLOYlQua$D$sr$Pm-6;dw`R9|LY|g2A^1Q~h*%JmaV+U#ltI#I~X2Tdhs%R&F$#jDLckU$# zPy+)^m+vuAfb!ld1G0lFE_)nev3quztI?r>t>uh5DwZNC%)jn8xt7Zaasl4;QK|gZ zwQ47|Vn>izTbtgPB(S4H7ZE5_y(ht?0-+dR-BRRg#Sju2X^@q6Sy^ugAWs!wkzWP3 zw<0&aFDq?#nJqRyFH!eu%(x5Fw zdd!u<*}3j;5x_*bTfmH!T)l_;S7~wvTJbUhGmeQLjy6voC&b){C%9>Qt;);EefrMy z{|DZk&0?{XT2!U)Y`YcN^Ygrsb-?1z<$%`QNv`32?XTkXcRzhIrCdf9EwruxZ|}a) z0ZeO$D(=4QE!|r|j?guluK^YUna?pVX}@Ju`E($VN&k3qn;5uPriP8Dfgc_80Fueh zdnD@hN??8y@mNQZn;+`+&@2R~CLrS7@om@6dklZ8Xgw2KSS^Sj1qW|(9u9T|jrx(z z`Wql)(te*0I6U^C57{F`(|L70P}w{K+n}qmhcg&puMPOK3Fh5I)T{d?ox9$a(#I=pZWoV$)pP86qo`yb zkG11u`&FaSDA=)r>jzr$H$PvlS6^(?u5hJdshsQVy#w&UailO#Mno4tM7Vv1QA7Qf zN-KLJ(rskux8NX;=F(t2uNo}#^iXN=fK~Cvwpo?TOR=m+&#_Zaz4Kb4M25jDtv+tq z4Vh`yz@RDL1y8MHY>YGC4ZMZz4EU0#myg?=R}6y{FPNG5;UXrrar^5O4CJ*J+h)5o za%U>IBr3}v7efi&ZBcfJ{F2|;pgGKKQVVVE_W^X_6p%pY+&ct!P`?0>yo4Q`!XfL)!!Y!3pE>Gt>9cIkO9{= zVF5^Ui?bFkS7)M))*LZ8gklEsuCyB_xbH==Ny0`9&;(D3jLLu@Msba)P@mI6^ni?t zdBA9L?%^^amHvrgaG$!W-ZG?E((q^B#k!2<*7i2pDbk{@L#W|>W#cb_*U*gsrG0;a zz*P#)fE+qbfll_;^FYI&=o5TithvV`@&i$QdO*J##&{b!uu1Ng8sIeEcPzgzS$3AN zG~oRCs^Ot6&!%8Dmf_ck0O$2Qvec^DU6FKgQzB6v<;nDHsuG0G2DLD2NBReJ8>Ue* z0glPE$X=_=uBN6@PBht#HC3xluJy<&U8}C;Fo_%V~J8Q%fPgqRt1dnvt-$|+<1gU@9^nO;d9ySl8?J`|OXoDH|e zGkp#WkT6I+g)5z?EHo)8BHv^9GBpFe0r0m#SU;0Zt0@DxejecZ8K9OSC-;ji40-_k zkkeHK?s=bw?16tCls)?Y)7$^RVgASej|WE|!=>hmcC@(g(%VEC`zb&;O_7@=X~e??$dp^ zuXm5ZXm)qi-c@U@y=u<6sykFsUJ4ljAK}A?56IGA#FamMfJpoB0Wt#)2K>$`8Q?4U z<)fprl<0@53Bp7036z z)lK(!6 zUyoVE_DQ@P3tPYt2__|gA+g8UPwAUk9H$mSDxm{jPQu`;RkbQ;RUVlu5A^Q3-rcFiiIV%1;Lm32@GsGi7PgzR6o^*scK^7zn{jDjbA6&J4#gjoSXL)$0OQi1ljZ`9JjUTr9cHC-PKqO=%|zrK|>Hz%2(4snyMJRO6Tn+JjP?us}& zBm^8Z)UhGK^|sK#n|-tU_jj>EHn716267)eF{zCL7O8?{bjSjR`pANmuw)ex-I z+TcH`(m*N3qs2LTw&iISu~R3m{XrLZ$IS{k*k&c-sk=VHR|}vM9&aw zV2UR?=Fm5U$-HFF9UtB^YaP(Of<#67vn)U;UtE((72D5jxFPG@p(efx9IR&`@bpP2 zWXpSR`J!uY2Oy#P&2!`FE>_^g5qoAn$)xV{g;i#th@M|7f1u6(C>Z5po=$~mX*RCU z1Dg;MvK9f3^fj3kS#3DDfikN*yJL$_h5>emOih|$*mkoDY1vE0m4!Lg-;)0EjvZDw{s(PK#U z(&4kw*&E5_llHUJIy5xHgj4y}^2RNW0HFt;*CM&o1nesypW&=8-{OVuq@EEcNZnNU zs~Kzry*eDvs!joixOge56fGrLc#b(k5D9OvuBXC=Qvh-ESXneeY7F02I_tyK0x4!b zN`|N}5tY*36uGwRs2^70%qJ~$j?<;WN#D1TLNU%-{rRnRE!0{bcKaVfqsG7jXT_dP z@~rl+ZsRs-zqzsT{i|JxdRvTe7>G(jLX^pyz=^1;8%`qINB+~)=U|}(W*-pgI(wIU z4OKJo%WJ1Uq(`apr~0db?B8Ah=U2iE(je_#d>fV_w2qDtZ=LkXD1s1t{gHPHOMQ6cP>4?;X1>W#{xvDvEl zd&a0(s8iO6CP;l-axcV@)%)qXiz25t7mrDhGZoVXB2n=@EOMr$w%4V6x$%hFX%b2^ zr?|smFX>iCYGLf`m^6fJ;9b~n#__1t6Jq@|Deo2^Mh@gzrK zZe*3iP=QvO&l)^j%Y5*t1y21n2=3GCDkzob+Ufgp{?FOd=yWb=9uQbI@YTcW?NOVC z`ZWzfA=J*`^#j;{yXF~2^2!(9Zi@`7l5SM9 z3qro;e}k*H5d?+Ee01A84a>8aI+L6J=5|RNq~jS-3u+6lVx+c&14Y2bPDwx;jQqx# z!7>tXd;S19xdOT~JKeVJM6ii{#dW%XCS%t<$kg#|1bM$uuPg+pEHHBp;jJ6HN<2m! zPUF8Gcs>gjX}9{zQ)O>yk`Z2o#+2JF6#R01%jlaP{HV+TP#PJ`kxl^Wcmn+F2bne* z=aMwM1fv1D9&8zEBV0DB83_*Jf7e&j2Qcx198J}q6?sYK)oDYJB|2l380*JI$XU~G z;HH4dk&@yf-|p5JQXnWU_j-2Nr*VC@h+hFV)lLq=D1|WNK+GN=j&KB-k4V?bpCaoa z5n2~}(6D{e?KfwPu?-!zLa_awbxN3zr+8LSBV#N>LzFpT z%f204owSroAT^uMNXh&i@IYm2AQ#|dMv2idU`Nkwk3|&S$M_vJL+nPy7Y@^}P?=Go z4mp2O=^#|Y_s5ew{A3UQ>Un5L7ybKa%pZQYyOHi>3{CQCzm~zG5*tCzY$W?-onsMv zF}W>CV1wnH8w$jh^ci!{!%;5!mz~!wdhI-w~tUPp?VlZ?CAm_I^m2MWP#^u)o(l$IJIQ zB}>hpPb4jr=3!5)6daPfhTxDi$-9QB=yD-Z z7|-@>dFFUjjNo&DedBpFv^p_dRHLBka)>8o77aFsb#0KRDrz>jZpZP9a7Qq-Z6sS% zo{}ER!d@VL+Ac9NJ+9EeeX_*qA48(W70QuN!6Ed^4`ctPOBJk2K9lpqg~?cLDc?JF zt7WML$p(HjQgcbMhcIk?;;|=%LkI;v`bObI^q|}Gg(%z<8hE6BMWY&XBqcA>+ZG-umIPLVG5YMWu{;(YT{6}SE0EHA7 z%9f4|iS5@uPCLpJV?H{p$nrW#pCLSylBe*UF$Dw%YyFi%A{xti_-NRmDVxELh4`95 z^BYacp%47Pk5sg|;HWUJ^cyjo|BzlX_K2WOg>|ks5jQt4p|B1cEeJK5juW}+G&D41 z)<0(+%VJS0BhA|h**8ZoWTlw#=#eH2dX{+|P<7i{!0)%K5tYPrH@W}BLyJirAl8Ur zkT5wIN%vXapf$(CWzI*z>`|NN($Fk-5rtbX;(WPW76wyp+k&R8t<7*~G?hh*LC_>5kKwhan6Cj@gY64flmbofuzfgFh!D3pdn<;4LQiSFySz5Ws zMKoSJm4#mqhTX;c`?-6eK$*#SNG>#MzN;xtfdZu#U+Z~VaWWpm*++m9@I9p>B+Bmx z0`WRxr70)ouL?m$@X61j8!-cr5A;h)LFk7oXczQwu3Oo05GI%VgF$3jU(7f~PO?xC z%XTC^sSFZluzG2CBzzQj8d&+*C(~gbwpmMN@Ya)=e%j-)PZ1aoWead|Cd>ODpIMy9 zI)JQB=sNb0>&(P|FmaW}{m=6s*!Oij)&!9>yc6F-|K89*1qU<0AILRl2S9MZnY(2% ze4C~2BbrOL=s1_d=J}f45k{&`VsIQFrQTycM*U zW9TZ%49p>OKY7YvZ$E~_PEnNl;SgNXZ(+VCas(`uJy74zRj&CRu!tB&vDjbt2_FUK zC=RWKY{|NcwiG3?W?PKpD`)If9lz0#0R`SC%;Q;z&Sse)+DmT{i>S$+Ug5b`blZR zcwz-&Ba<)3j|HYw9WJfLya|rYgL=-Rxjvy@F{52h3Sd%wv^^#)evJ@cBfaRp&r+1x z8l)eO^g|Iu{RHZk-UZ(CTI9?RZpb$%@#3&0mHR_>$ccJK9KNB1)2ZScHz$*`^1>)w zOLv#5q{t0@VgrfU3~VSrD6Mj37H(rv2u>i08xy=!gGi9G#~6O*jvS%Lu*RF7gfQoGZ(J1Dy9)xmIF zqGvhQfMHeUqRU@2O}cG8aJH#vtVGAtg0|RmLvh3?v@o((V6az*3{EH4B7JiGzj1QE zd7luY2;K&NEfUW`9@9_F}vjSPi(15LxYeU-m{vb zl&H}@Jm8x*`GP$x7~W%C*Wg6#gB}7I{c=G~FM1s4{~;ewbBJMEAHUyVCf@TNlQR&Q zlFON{4~x-(#hMc7VeITInJ8kjzFVW7U-k1`_q36DZb|eUm|*{HlfngtQ=gD zE_K|1e`V4zraxuucd)JUKI4@A-n97wbs8A7orWe@4I8)_iY9zRiGk@5SVIxl`)Nn6 z5=}H;&XhDHj8rv)>&v}5T;5i9UQ49fO1C|L<5aJ;Mv@d-+8(gKVIMP^gI$$_S^b$m ztH-=SwmWrt3E(cE6Fb-oy`-HP^Lrd`BBOE8^gs7L8upPU_!%|8P5%X;=VM@3D$bLB z(hUDug4=<%0B=$&p-Q;UW&_{t3hU5_ABD%N0V5i%bsX^Fut=$QRu`GXlh2LMe8Z-= zb}n@Gds}$8UFxjxvLHBa{`>;-ZcelDW#sd7JE?K}-v#)<@8C$ZhAhtcOqNdmD!3QH z2gWfZUiN!S8}E z^H0nT?ZNTHzuzC`{r)Eg;ov56U=NX{U+fI4taP{|as}+(p0u}k?=$-O`4u*TZ?p2x zP#3Qzesh}-X4q&jU4%J3z+l?XsgCdx$c zs9N8rn4bH!e7f4!wiF5p@43?nEWE{$zbivDM1Ptkmm4e;>m}7N=`_EUfyJDiFQ(YA z1>|JuPS47i&shWo%71HZ7l1oMYEWHEm(m=iQm@DOJ0lgbKxr!0<->)8N{*}uY^itxFW5p$)EDLH)w?bLN=a zKy%7ZeE$78Gf>Nq#lixOEN@O(?$U6{8PD&NiaU^FI66EZg(}(Dw?1FAj1=ho?p;;w zsgBnvnX=r33EfJmZ6M1x4$^$pc&9yEgn@IOX*eYN1j_@X-LZR!;^YSeU$C{6nX>Z# zKZuIP2*SO9Z(tk7f@e`^SoM&Q!nJ^+;JUcI=Hj`cn=?=|Q#ZNByi=VEx+X~|IV4m2 zmfA?7XUZhDN#?*#PbGyyRjN!@MW-a{OS!u{bVR9EWH%nPxcRueki_9~UkH^mRMwZ& zty*#g*#4z;YTF3YtCtQp(iMOp74Rf5e@8A<>wxF+Vi?S$R(Pr9HR4E-r~W>YueT1e z&l=F#KF&jWO!$X^g+07EC)6BW!=H5azq2EZX%&jBH_IwIzBJ)UAdaG8Fo4I!L9*VM zhrhp9qWDJ&CV54aS))R-_?l@!2My$@W4pOKQ3@)O!1v0$j(_yBk2(ce`G^O@yfl`? z>pz^J>m#rmK8lhv{^%Pk-Fk6vADymm6FTLghRO+W|qv7d#{4v&2E$f6E&_bZYCq|y~|MI?{I4kQ$K1o zBFv4Fv`?IaLQ+*4aqpS|PO|2N`~t@-HCJ?TCJIg-``` zV_DHmF$eFGLsJ`F7<=n+Fh3624@g3!}$8e$ffePe)*VlaaU!1 z!@7Ph8xN#u@IL=wx#cx!w>X~^hGvEHl}l9#RP(VscQ(ai-H+*&frII4-5uIO^IQ!G z+ezM@_|CR`qhfSN&+*vpGQ?I2o_2l}Uah!WXJ4z=@6;XYDt5!*>qiM)4#Tz7MQ6p~ zn1SI40#y2PWd?U%=pgT6ari*I*u%v8D>E!wJ_w$)lG-ggXw{w>EWP}8gFc~K1a>sP z(l08CzGX_1);_pe*lN!MC{F>CR+6OdmX~EU^Ox?CI_j;>L`^PgzeM2LmySx#ohKGO zYE69l&RkM-B~WzO6-!!SUO2yYoUf%AZMKWQIqK(eOnJuQUMo=UC#-bH+r4ZOpVViYS~`Kivy zQ^h!Aun5i5W&3L3`8~B5f?TSkcBhz&K7Z~&MYzpSH2dN{``Qg6uo{9K#>&pE0^%*= zw?S%m1DUV#_rxI|)#!Cb87vy@wOf3shHh7G!=iV}OCr-d*!=NO7UMb+ITbKdK(g#Id!svf#lTCkf+ zUHVV}e`ME6bEf1ZKZDHa)J(^3($FwgT}GHhUG>dRlvI(H*BlyyYF(D@%ouD*;-CcZ;HK z-y1>u!=ybAi6}0tDbA(`*P=yO^QG(OS%YwgTzh52-wP&NT2zlQ{TY4I*YP|;4|@Me z5x&W?ZrWc$r=5-MVjW^ZDp8Nn#w`xB5hd-Cgb1bXNCCgg={gFFK!scjo z=}&Y5w1y_bOu^}BZ2{?8epTu3I1GdDIJsa5pjvB*M863ij=e#anibl;U{zB#6owzw zL42d~@5Fb*Ua&r-A6%?9`Np~QGk*G~HwuO1oF|^B3Lh0|z@#P0GY>GFgmL8JNLb<- zHJc0l$Gx>6Meo9DVu+w=Um#TH&ub9D4|-AG+Zz)!1%jm3(do)KB%I0g4WIP@HccM< zuOZ(HoyIGLu`G;#(iKO#Wy$z1N7ZH~5vT6n@49kyjo`Ltg$SbhgM}Fr4`boUP|1Qb z(_jLEV>_>0A{$0E@;i7U7`UFX3J!xYCJ)@S<;}l9z6>q1V1p`2*=0*VC0me?nQwK` zvXO|%AqqvI!^k;E$Jh6}YRW?=L~`+A4Zkp){iZ1tqR5y$jaYJ==`$UaLMz&B8CT-= z4mvq;cj?2>2YwIZfy!oj@apb0{fAg@=PNL<47A><1J}G}%lrKbgIHmcOe*;mf9#;B zuf*3<)w7`YT%h*IfkQc0MFe`Us!8hLhvz*LCh;5cCO=0UJgL_+DiD|Jh~*>*FMaR8 zod}Gr!5iS^XlM-LkQK0m z_Am0%_Bo*V?L}tLokf|Cba-N@#YiFnys-}uPU5LYic&INxrJThGK|rL9?b<(nF-S! zk8M|1CmGGFLcgv-B!seTXc%GTC8sHNq`iz+ZWd%Mlo0FoN+nl-Y%IXdZ8E}&1dUa~a0o-u0=$Bw@?kAeS=S4 zg1g^zJ6LHtpW*>%v4;+YH7E~ZhSt|G8>0gXt=}oh|7*1zOgA`bs}@?PQyz=h*~Qm_ zw0A$YE{l~(6Ja8-jo>s5`o+#Xhf15jbTLO{V8DsdK6_DM7oPvf)X2g@aj~AwoeLL< z9}1G_Ps#aR*j0TF3Pe=Q6PLzh)c#f`EkJm(t5_Z<_#E0E^lL+%(p~oJ=}LR_MYk+S z@5)pL49_zq2XZ5+e;d7%3^uC?{saaU{Qj__t{mxF53egCPMfu`ae}Y8q7QZ8LI(wx z^&}OT3}p|N{u$S5uC*BD9Nm>xDbjeQ$lD18vm)y_*#Spbm2#Ty7XzLKCSH$YC=?PN z(^gsWVQ@kKlenylcn<;hOU&YljKE?uYpI&+!&!sfvc{xQ@q}k^f(68m55h}_vX%|)e>h@OaHelah&9CfC_lef68~vw>^KJU z0lV)R3;|;0z}NVXQ3gXcVF3OSKkD#gk}AckZJ&%led|;0lOGHoh|MOmlIPI@N)GR| zk&|3+ZRK0DLH+J!V)=sI`MJ{0WcGqGC3v*&MAlkz7`iX;t0e++;EqFJ@ zzdcRB!Y;#GkxVi+5nn^C_IsCqtPCuT>sKl@biX#T`oFAJ?D+eS%N1w0du)H70QBgW zEEy{>^WlkuC$Nda5EUOz>(TG?HNvTJJ0XS&mL#K=g-uk3q4I=A*c}h5s+r+U#*v;aVtME1^g`K0@6{q(Eb{ihF*^l zJeY6e1Y%C~_pGRV{EyZT%bS1u%z4ZoAm>BkJE1RW*Fp>v-*Cw=2mCcFfsCq7K}Sdy>yNU2O5!ksy#dBF~1Srh+zM99jis17{k#2%c5E-Pp96p zM7@&z_+)NI6G-!qSO9jJw|(=OP=8#br`_HbgSe$!NC?ZOW3w!fXXCWOPm@M$wrzL1 zLl?|(xPex~^I&KGgkzxH) zRnlq&Hy1JUag|_w;9splO)?%nSV4OruhA3jo(xLFz{4DQX5{ndTU3X-_+BOQW+&Xg zD`k{*PesY#ZeRlcZ#OL7OyYLbjDb4jCvY*>+X&Uc3hgQXPq~Smz3L~kB&37oB2I+; z(SfYLoM6cHkHVo87ZwsRu%{zcWAh|penTmPxcB4{qZKX*@77YXxqWDf7hdmG3ZXc} z6CKF#pQx7bxvzJtyqWMzyPh`pmNk1{?U%c)X#t)tZ^o_{cmVFx$hUBEo*Mh(7MXR~*(F zi1)7UM1uo7uf=Oy5GE=$SXb=rSC&}v28p4tdBO>JC2;#9^hrFrn5p4g-KJi{DF-nd z_V=Ev9K}QYdBcJ5^57cd$Is8#w#E$!N!A!DBpb^S8ho!8 zfVV+XF*wkzkTdHV&usIEAY)Z|LmiVJ!4#$NfYI)+$G0!+3e8rOE%gv9v>E)jHHJb* zGQn~YG2GMBp#QqE3S(V+z6VCn~^? zCA6STlw2dgv5SjL6Hkx@XUl2W@UVHq@%gu@vVCq@y%sFj?0_we7?d_lY-T;Grirl1 z25^}&md*9Nw*~s(qL-ae$Z>q8EZvDvsZftZRgewQ2qk#189lvG^MDxJ3$ z5$JUARBqy>SewX2Go&-B-xov1{d@#L7!^^eQZx#7E2`beL%Hva-4o+!o2fX8nay%2 zwfn|Ac>B!X;rji1=Xv~wGd@6hGf58{slEW}Z>m2AVHMKW{a9L#XZ$EV4S`zpl^upw z)r)`A7x`(g`|i>AFP`SjYK%P>5DvaRLGLNN;h;Jtm48rbX7L#iT;#I&S!Y=q6>@<1 zK8rWU?Fl2K7ZcJp)JGyd)QtL!d|Y$`ErB7SC?uf0b-u!Im^GYr}bK4utNF5>4}K1fH6|Et2D;u!T~$Zg8iG z8s44!5cy$-*YLVOX2y zBWr6>9G44R0v$|M@Xi$9B+OF^>V%M-!W?YGk&@3KMyG4q5&o-{CXC=kN-*Np~}_}D@;BO|gn=zYFyJPOmh(iNRl3clE2Q$R&4mUpd-?@`JZ zj)hp7E>vUK8A(#ol*xXF4V=`Hhy~!KH>}Uxd9mpZS5jU#%%7@i!(KSRggU#A|80g; zjFG)e3*vXU@y})!s5{6;=HcVmV%d+zv8gfnmKq7JaKVByRZzRa+8&f*^XL@Q9UdPO zCN?3&^gm=tz;}nfoi%MaZ_6t`yOsH2vEB!oU0mjl}>mSveD*aRqZ!w2Ml3C8yKG!$iEqBcG)nJWWGqEtlVSHT1j zXzMW?%~3CJ(v2O)k_bu)%<+sEZS}dB$B8UzcmB{?J%Tk>9a64E8Hhgk8G8~&RvnJH zw?j;=w|6ryj;B5A@r#EVSD~5j^Aawiy3yp#MzuMkZfua~s>6+-2eI=Fq?%xE6jf4A!|>I2HEZiQreAj?78 zMq9OQ2m3>rkvWY|#TtokMIvpUiaXAVkSk6Pu^=4jUxnOo%T@|OFu{iV3w>#CA!coDk@)#4ie=5`^|yCvki+{{>uUgHSH;;rQRP!jh3s1ssF z+L8oT_G+z<b89JhGhVOq-;w5R530;2>x18Yc88> z{HjHoFc2Vibd1!y>%)8*jnQJ__R^Lu6E&umZlt_#%?y3GxrZJ#KAU9px_j`(_jY9z zQdw&wPis7$fxW7^AX@9kvox9!qD%qCnjZb5_8fPgs6TJ94gOB(9sYx8apH7-hbVGC zxDq|{5s$S+ln4+2%hd2?M1u({%I5q=nXK=O$4}6{q2S)0?F5rLPKb}Uxgv07iN}T# zP-p|D2iKBYMWi?5nAaD&neZiO%UtDANEV$1;7U&Edljj3A(Af|45M|mTO43xHOa{g z$3oXtRtKneezw;mSVB*geAQ^MR)jybnV8WeBSQzH&1qQA%VVA-+eI^;24W*-a{3uK z71}?3Ap%1J8NX|0si%tU)z~XEU{G%HEf~O*1+2P@lgMRYc(302FE;JtI!S)w*3K?b zQKyu$q}Vvj3o5Vg+b)#8+>4F^UmWa@Z*OAw#}-wJj#S_e0+15U(ApqjlB&~ z9n3tTkAJf!(50dhr7!%n9bkVq!Q(fuRTDlluD38jO$fBO9DM}kM}*9z30a|C7ks|` zF@SMn(lpAZa?qiv{rhLqQT}wc1A3~-sMZr#+;}Mu=zR-X_^WgTyDl}v$ z4IBZ~ORe5#@JSVa!r5?aNtLZc#UrHQ@@7Vw(L7_?`O0&?j!c1{WA<|Ok2Z|*|2PKy zpI(>$QLZT-b7a#1$=A23FSMnwt(}sgw{qpVx;Ha5%_=hByBx@XDNvp<(`R~!BUeHY zn3m+?K$wB4ouQe%0;zsmJ8zy$xn_xS6LSKP)EP{G>)tn(bCUB)hG#y>8xFS#oL@MI zMc>{i)qSzK{RF1*MY!zWBc+3>GYL^#fTe!aH>s>QsB_g?1nyURNtW*fcI!(&=jW{* zc6Mr2T=%fM!N)J9m-%>`J||F7ggimLQt}&N-6$*yRU0MW1YMwiXdYT-(<5-bW%*|h z%J%VvFL6!EFt?xkoqONpX>GOtB)RxZ^5d@H@|jW28J@=`CK|!#6#%fOmS!f2n!)d!?%qrqX4) zM@W)=#AD#Sli0TP=?OS#2H<<*h>Ksxg3S?xJ*Zv{dZF#!zD!It-=tRaVTTk|80%kP zSkBYP#%i(nD*Wb#0n>aM%Hksw_*z-qf`@joLZXnx-?Kfa06@FgYr$)CPmpqotnFmn*N@BSB5}rrYv} zuRd!4!`uC}1*#a&9AQr6s5egtrh*L&M+c!>$rM17t&luWW9s@D>Nb1sla@%ds~3yV z^@A1Q@fbc!s*^OL^K!W>kd+Gmh9sbx?M&kAht&mls>!%332kz3v7IiptK8su=A@BW zI}K*LPj-+=TL$$BMpQW1WmWnd4VK?zG%fSohn*Dhvkiu)SiV)3MNM}<2MBp2iw?zY z-n%$%@PUNDi3r)hNRAnF*5`8ENsJPp-LvQ2{K+)F=E#%9=MpLcUkH&dS^$t2_zN?_ z@ekKl_YqgE(Y*24%AIV5oUp(4$z!e#BZVv=HY5plyRRr;u_-;wB;Shc>WwINVe_;| z$y~V=`)}h}V72G1#GUP<(MnVC%wvF4i^nT^bhpv@EP*s5#oyHCj`;$ z+s6SZ?gkr-D1K})6)2lijUbxs0mJ*0br#!w=S>gF0PW@Aw<>|&6AZrEljE!Vr?9K4 zg^P`oVD1J(n1QG#$kFI0#4~aF%ysFC3_$?7q+Flv=xgt)YZEhFY`vjHL8}8oabABN z3JywUplAM?`GFG*EK~T2xiEOULQ7l`QrS+3HwMV|WYCYMT7apCZgTw^!i;NdU~xL0 z+2{(MaH$pL>8x)pJ8*Njd{PfiySlq+N}#t^jg7^0?pwrzH^uFGc$`gz@M9TP%;uOu z#zSAwG}AyKR8VxuPb;6Xo_S$%zv!{SAvTHg(VWY3^kxrMlranB#f+mvUZMLj+m!5`>Ys9(&N|V&2nnN zH%6ikX|ZOfwtYf@%glrJJ^7@kXO-Zh8LjJetqa?yVVquvoRsI7@E8q%O-wQ*9vi%1 z6kGw5mdq51jl5c8_L~u^@1(Ie%0TuC8@FQ>6$lH-IB^mcB<8ZcoapIh6VaECn0)?e zBm~w+Ves4pM<2%-f$dSD-=)+-(ba40X%g)fVGb@TgvbfuV9?vdUd z;N>3ww1b&!YuZHH4Hw{}msjK36(u&E|J_zrs5+4M5sK3JAP{c>8ARd)N1k>!06O~F z-j2kT^dneO=+t9>Q_VRSfjYk}#3(rc&AcW2P5wZs%@T5s8p}UFm>8})83ji{JD^S0 z9a9;R^lC?y-If*NPj=a+eoNSc9!I3NuIP&U!*j2lovdd=ngfCoXx+!GAFbg?kPvYz z?aMd|H*4*i)ua$%w66PiayxxhEhjA}nR}y^Pwll30%=jdP!6M6f`iCJPkwTFM|3sZ zW$K=47V#CScKfqn>=`ZYT$M04;8?cG_=KDqB*)|`1?!@;4Xb`KX(L6vVv)gcp=sz3GOO)etUIB6KRc-K37{!pxx=>@#!RI z$@=w?>M;m_7xWuM&J6Qnzw6ateA4o{rFW^4GL)m};RmwfE09Ba?+ z(v1qz?%=il^k&r0@;auda;A%orF$l^tEbuZRNw%E2-wCO9hx{NyUfslpexqut#5S{_x3<5ITG@2+_gS|H{L$u<5x7#2f*jK{NF+UPdKmj{HsjqP7vlc1&_C8# zyvk`sLeI>_IJ4d%AnMlH*emej;~e>l~KaZi7_IUtM^Dm^K>8L*97`da7wE z=20I8?7bQ43i{-~0UeJr8pn+$LnlRZx~<)#zN-fzB(J|dkH^C6YV{IbHF&g+tN94p z+%`Y6OpbF+>T(GszNVyji;YPTjB~6vu1H^A{5kVUVbW`*OToxIDcb|(N2P8H z?LAuUu|yK2m7`>sz8ZL~u+DZIc&!v`+un9xX1l*elHWNJ1%HDu zx(8cM%eW={$Tg8#l}yMmT5)t!r;fU=t0j^^#84)iaDs8-%)E+oWAlQ|&06`_^%iy& zzqi&MA)BbE=!MrlvnsU;9>sR@--CwpD5uQiyi=lIAfJ4tW@!uVFV023R=+h1Apr)> zaiSBu5Q_kM4{K-VSGB0TgAAI#)I|DCh){YXG8X7YXjy{G5 zq;#L}P4N-sYQ?cEah=?lV89jfsXNw0Ng2MbwvhH13$=eaUIDdQOQPLe((&hy6iqfuR zEWf>feEInZbDXXFYqjEi-o?UruI4&?AcCrRWmUI9aQ68F`1>wuv2Esmov=rnbs{Uj zNCuoFI~@`c1};#g6V>fcBD$82h@J*r5_xPd7`znhYB|wV_|j~!V^?%SIc5Rx+a~Y6 zH5l{AM~nqzUcC-fx@OD(#l>w0axCK6YZh?PuwGc%Q}Xk31MywT?m7!8p-u^ciNn2_ z9b~_|;Z_^XE<0ZAzjXp(Tv1)!<_V(32H$#1?@dUOekAI&$wP?ND2~uQdSDxQ>2)BtqQY9N^%_hhAJN&5e$#y}o^67R|9EI`rNmm6pJ@b^&J%G*k0pg?tL$)8K`?g zwY9;=#{*B=WT>&z;sAGbt0!57up3}Ue@-2Yz{6;8=GWU2S58Rl85Ujc>z@hJ-<2Bf zY?ai{NYJz~lzV8t9lzmT8lZ16C3dIr@ry6L+@R6j(l&RCIa=Di;6RDFTyk4_sh8TLzCR6<}J*XsSWt?@Ec{3^dhz zRliy-Mi>nmY|#Q;RELWCTo$YsUk%EPqm{Jy^>oW&gEUGBt1%(3 z`F^fQY8kb95sU}nh%cbqNu;Wo$N@WmDBJfo^G7d>2KJ78e!%Ip3KZOvW&Ap4M79SK zlT@dd^yVKF6`zT4$j+mjFQu*|yf~=C>#a9%r-!p*{3%u~4S4A`*y8b$8iuIr0~aN} zUpb5y+bv-U=}>KR!GbZgi&Yvtgv_Ei#lGC)iXq_G82zN^+rJ*+# z)%k7T9Gw{4up#Nx#eQpYC>8B@58Zg9&e=_E^(CN`u>EB)(xwGNwi(1CBojp*s})G< z*iL1Q0uJ|l>;4R7#0ml0S7vwttkLNLCoI*9Z^Rrw5JmHUoG5V{U{uP;Arb51CkM@m z43DTOoeah^^NfCq@7%Ylls;cR9gdvOyxP7-1+6RPe;i3Z^Y?MM>2Lmh!l15ZIsug( z+-!ekLiJ)Sa!*$%b7mC$)#tb`=xdd-M$VXjtk&(;YgZ!o)!pcBUq#Xo`SYiXN`Vhg zw~Re))9V}i**?9o<3>~Dw#P>z;^HL1Y>-Rr3|Z^#{>7SH#>1(^jAw9C^SQm#0B7bE zd)`|VhI^$>r^d;%?WAlJ8;yGM{Mq6+(&c?ryFoqF$qJqr%2V;_yT^ou=@7f__7)ud zfO1=u`?mhq#-d+p2Ymgo^*<_YXncqvMM+kB^1nzKk0k+Y?28QtSYS3TYX=q0F8o-4 zk+OJahO&vTA;g|&Y?j?m5z`BJ}tmMhnR?nVh2-;C!)uQsZOH<9Cd#cT5 z(mB1c%hap={Gj9XWaz*Q2wd_`FY;BN_o7aq;sKXf@E=C7B<2qDTb?$lbTrL7>T-m8 zw6n2TCGeT_c1GV=NL8+Bs`DWx4ju9oH~B9}Rgi+XZUw{+U3LpD_mx2$DmIuyS3xl} ztb(9N1Dz@F5kc*4Z-nwe*`BYe61}V>III!~#SKF`HJ>gi;8I1$#D8sWyD7J@hlLeW zeP(-(lm!>cYbD~*HElra4#ITo zaaP&&b_H5SL%YrS?0YFj|L;(ljA{=r0zKE;V|SU=v8Ai6BkbqKIc3+KgNyq%+in8$ z((tgbsA@X((x5{5xhAoN`^TdNTg|_ea;eyQ&6YR3GOKGow}T5W=i6UoRedT(oh}S_YyGuZ>%h`mDDqa9$t)2~)V#Qfjje_BygL!% z?m9h>HA-sh#%2ny4)BFxY7u?~_ifhjZ8UQh&C7-_~+>(jT64--h2vp!ruE+zb}gaJ`vjn{r^` z`&!+qa`X46^$TaA7ydQnyZejy`!-2AEv>)ejej{pt5K1>Y)T1OtyR5NE45td*W)>? zxcV04GT47RbOxMh9l7X$XBnnuIk+Gt9tK$qvF`mQ=CzvJE5+cvWi4#)>@${ORm$hH zsqCe*Q0=MlSKNMG#y*q}@$e|id+TT-gU77YbJts|rBB)Q_k(bW%lgp8dmri+8CWCVxcxrCq$8KFOFdbg&D8ymj>)1>>06i}60YaJ8!0_bl zqc*Rb$U=G5Jg35Yk9hW8aj=Ro@a~HG{fX%6^ltsy!qddN%E`MV-pa4xby#Kj8sRRu zTn4OsWdMp_j_mPxEcX$3LI9Zm!`M4U*V(r3zD$*-HzvFBJnfd(|##kVw>3m6;lOs z9K3r$&_bwYIV+yT8oB4N8ufkmByH$#1*Upl0Ke148>lk5E`+nQGbB8`fVz64aa&p% zjJA#rO%9_?p^a&U05$=^i0H#q9$6yim6`GW=(N`pkH0JiSEIplE$^fmb0VImtLtf0 z=h~Wz>mS<0ujm+;r+BBEJ7;itQ{-R~g^8Sjf>9AzOzO1ZTy*|~&Yf3)oJX)gQNsoY zW1pLQZR>Q`XlV(o4YGcggOjs!WCX>%4PP#cw`Mlfzs7VhX5B#pmQmF3H0qmBkW)8j z!JaMZyK1bf))jAePfy?hfkCmOv$J1taEtN5)v3nM0@-ra4?rSu!~intdERI^9>k#u z_YDLjBs3~RW?*Fn1|I$n5^cRECT4L;f^W~uW1rxYwe+diZ;71@tBr<2xz~UNK4)@I z%Qo8+Rx82CW0hDQt;Bba4JXcwOPBsP@tXbTL=H#M5yDrtHrs9GKRG#7_m3nSY)#sv zFK1XZNgFrqp)08&A&ZEas26F4Nng@&@pK>CIXF1FXJ&TFFVY@}r;WnAcFJzsA0J$M z*5AfHentEB>m4sjyKRH*Mi=N76Y2W>g6@y{0GTT>?Q4_BzzK8Jk=sy3Vu&%LZasQ+ z)?qTa41wB8`!eO6bmN^Q^mU_HxY#pfEo>_2jo4ffXbBeKp>RwGpJy-9 zL~1Qx-Zqcz7G63np7T3S5dHDBDxVi$;8vgmXQ7fkBi*u25{lH+j9n3B#bHoFgr7 zxj#4DEBS%RU{$FsWR%wXy@NzjP58<{q{``vyEt)>HH7Dq1)BvGI#5|CzM8?z8)REO z@Py5#E2wUyAT@s=JB1OCmmtuT&LFr*LIxh6)6YtyrWc_qJ{5KFk3c3hcCm2%@m)sC zU@T9XGLd8xa4?^)(uWL0VDdEQh81O|4JW1DdMj+&6J3yyyC!2b&6Gt^M~DadhpKig ze_10Btf7AK)cw1VMXuNgbY$Zh8O(kI4m=cc9}Eq>Ip;5hzlQ&6G!eNDIhX!y6i(E_ zy7N6Q*ngb%-f@0a((y|qpfNoIhJ;ig%VMcqGpZ*XKh0pKxkMND+o0!nxgx+5Ddv5C zyw=~nBvcIj;NEMiaoB7KZ8KN@`5TqJjhlUxOKyCGz|3%NUf$N>;nxo~sm@}i9ftOM zGj&3UA}NFn6;p}~E?;CwNPw3wGAYXQj^c1XQ2!Uc0e5w87AjDbAjypn1>V8^{so(N zo$kPbR1(TalAkaR8sGp`sdYj=ZtDNOX1UH9oQ_VeSlFm1Ku@DA2bxQDvB#%{C-b~^ z;7Ee9c8IdP!Ozp0nSGt_h|TaSnmGUHE$)oIuB_G%kd%CUN)#?n6u^}M@6ZxfKcnYp z$^rj^54yoQCB8xp!M72+v#`N(m>Gbwz>H@ROjB-@7`YI);~udVcXQCV#4!{zq+?Z` z&^0FoVcW9ko;xvhd-A=}E;hrL+!#pFstJ2Ux2AT;6hjADhgwlFmt=#i)kkEJBS7*X`vgTe(*k`nrSh!qK2(HkWc2!ju@UcjZiS$;GmJ-D(1L|5cc+& zaG;i!@$X49DqCdtCfmjzYLnmbt~yZ4)3m@gK~qdJ(`8RWHXsRRjmkus+@c*W(|0M# zMQKkT*~+Hu9WJQ^>bg@-RaL?sFCM>N_a6ww3%|U)BCOr}DFLZlt=8 zYDtJ8tKmt9=pvdzb^zkvYBe-LEg_EWX0CjyitdXs12!&>RLe@2?9W(mCSVrEW}Kby zrKwOuvb177e=Mk9W&FF`j3zBmF?l5-K{NseWT?bs3A;F<-qB^qgc8FjrERE#M-_q$ zx*bct(v+{1GSoC6g9i#9Da!}qG0mAB!wFOF9`eZg&qW%$dYuM0@Dc$1K_l2yRn>NF zEOrh~NfM%!-E&%h&fbVmamum$H;znx8J{lhBep-p zoK_K^HJ#+U%?sfpNskz8>fs|zQ{{6rkkP)MoIbY$=Wh|6COJ|NJP?6Z0lL4uDB+b; zAC}Qnwi{(Jr0gsADr{aJY~l>MF0o5Y7cVxXmk^}P;W-J4G>MA(Z41Qv_?(_94HmQg zmhxbXFWqS6YM>p5Vk6(}mx#|hn(~bu1bdAPQsE$C0cn)G9p3QK$iw!6xj9jK0v#Ya=aRTwNnG*6kRT4pOrrg8HR|CzR8ApZ`P z*xV@p(6&QS1-8AW?NEp_kQ>WQbj-_Dw>ElV%_mF=A$$)M>)(=QD)#! zB<0CFW1VNQZA(|m*C*u|WWMv+{*{64zF;=Rz=~JY_;#T#5CHcvdAGBhzq4<$hY%|=vBhw@m@FTA{+nfqrFbH#HSQ)D?7;G zoXPWtwz?-*)q&h!+7+8vs0{*oR~eM;9_vz06YY+!uIJH>GM*krK(4iFD&U7!tvNa<}6ON^wM;4FZJ*su+4$5 ziI6>MD8FAh7%hQjjoR zxV3Vf;|L4ME?=s!-Xyq(!!5C~7*{}}0|uboMi}fZd9&p7|J?{;6iNuS>hH5&flULk zwXNgQC7B%R-;JXhD%FSu=*Jsbx*n#70P?uSx@Q6~FbK*2F1(yS&W64R2@409`;7L# zJ|p~R2{AWzxmeqYH~i4DQv$*Pg|MWGNQi-FpO<}F8C4ES^iUmW*U#7lSd<}q-HiF~ zKS6dw*MWHL`0_6@uevY=rvL8*n#U74qmfh*N~9(7$j{fR=93Geq)qM)+R;@WyzLu# zTKZ^-G7UW�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 Tfr_BR)eXyfTU$eKEGPSiH)|mOnBcdH; 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%0A5GtEsj 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/quantsim_config_file.png b/releases/1.32.2/_images/quantsim_config_file.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d5c7a83e90b61fd8f7d496dceb1761da3121b2 GIT binary patch literal 23721 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/tf_quant_analyzer_min_max_range_weights.png b/releases/1.32.2/_images/tf_quant_analyzer_min_max_range_weights.png new file mode 100644 index 0000000000000000000000000000000000000000..b75360801d914619a19f06e0b8aab7eddeef0123 GIT binary patch literal 173555 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 k|Nr$weEFqpYv+U%$s&> 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
he|rTtE(JDL_!x&NK~6PTnvgu7xtFuB*F;>2RAy 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

R>zhjCsx79OQ1z%&4tZXjGf-$}t% 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

R#cwt+iB0i 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

#N@~k7s%F@s2ECV*s=?C=kXn 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 XlDlQKmM4D_{@Au<*XGB{IxhbQnF;4o literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/tf_quant_analyzer_pdf.png b/releases/1.32.2/_images/tf_quant_analyzer_pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..a6082f1b6a24931abadc3e0d72e0a3fa95d7798a GIT binary patch literal 103950 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 O(^9)~@r^1b=)VAf`-wXM literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/tf_quant_analyzer_per_op_quant_enabled.png b/releases/1.32.2/_images/tf_quant_analyzer_per_op_quant_enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..8f82187664f99ca0d6f9a3dcb0c18f07fd1e46a2 GIT binary patch literal 208315 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

&ARB2_ESlEvPO^Ca7=Z0&dUA6tMY_6jJ`!= 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 H>%jj9(7{{J literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/vis_1.png b/releases/1.32.2/_images/vis_1.png new file mode 100644 index 0000000000000000000000000000000000000000..78ace7ce935578cb01b6f0bf590cbfb9d8228768 GIT binary patch literal 14614 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 z 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/vis_3.png b/releases/1.32.2/_images/vis_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a00c69beb2ce1ea51146361f662126e2774200a7 GIT binary patch literal 223470 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

UCV#yvO;4}cKX^mG|58JvF)P0drVnIg*Q^@% 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%0AS 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 ATmS$7 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/vis_7.png b/releases/1.32.2/_images/vis_7.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc338648d15a54ce628771070ade6a454c14ccc GIT binary patch literal 50987 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/weight_svd.png b/releases/1.32.2/_images/weight_svd.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2b548d5e8ca38bf368313945d0227b451966e6 GIT binary patch literal 58733 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/winnow_1.png b/releases/1.32.2/_images/winnow_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbb3bfe3b044d16715603a5f51e2184c1a0ba3f GIT binary patch literal 26858 zcmdqJc{J4j|2I5sT0}{yNRm)W%DxPWN+=Uqick?DOALmwlq?}jgpfg&$=I^*L}Xtw z*^PZ0`@S#tbLjJ3&V66!{H}AZbNz95>cq_Z{aT;f>-l&*U+xbSWM~dC9zq}xG_rSZ zDIpNMz2M*4f!*-Q$@GiA5QuXK*;_Z2F<-_D9A7f4;YMt>+Kn-XLnYIueApeiH|lRh zEcwJz(Y-6Cmp-e-SabL@$K%9rUR^AV-^0?)n6Auy7<$`T!=6^B%dGBXm0zhBpl|f+ zY6df1x%YS=@$A9m^D+}g)>p(sJ7&~V)I9nE`|eG!40q)&%>9YWRmmFdnp-h@scwl1 z6ICe`3CB9v$3NeLK-_p7cU*H9jPdB$5V!c%U`S4`1076XA=&eg7xFD7Toa z^WQRGx%oQ-+GZ{$@|twn%>L@|%v-GQ%GomhZ3%;ck9&n(yD}WDbl0oD#>2QmobVgj zG~CC+3=oKmhmfT6FJFqn;2vDTv}dv%zOT=SKpc{>M#=y4qc+OaZmFQO0Uf&w5pj5A z%%CHa$8Iy@R^yAYds`dbTN|_uZ;CcLinv$vs1WR5tC0m68&^7ZvlFgr=&xq9XvM#w z%AYQwzU|n8h`5D*ix(2iTB1d1s7=*!H!qzL&PvG%GhW$RirGInb+6+->d28J+D>N& zHxxA7hvmEmXMHWmT&Z z^qtSR-+*Rh7fK_x_bXZNWULEbQ@_{XLBu$&uwWH4+;dt#TjSg6INsX01D8`MTC{#m zGv%f%^;Nq~OObzdcGCUF->$}SnZ{TrH>3FM_xO{M%G_1oCkPtBhtY;nyNE*G+;C?Zb|pxyY4>r|(W~*GcEr z&UuUU%Hs_YGO4)AsG(jVdGk@?jbJ}pTa%PRi|Lx>KYnXHUA<&0Wm1!0=1e-(%VDxy zOy6jhfVar#A&~+G!ynmx8u1N#3=id25kDq~?65u2a*brGMbDGQ-HGu_R!8pJFV7fvWKMN%S#51?Zhd;#NKa3n@+>^uadSm3X11SY zD|-)XEUV-N?L8C7i58z1nX^Kj?Wf$0pOqeta19*4Dx7ci(bCfX=toW_6h60mxqPJV zNm>E{|ESyN_;v2Yi%PNv?uPpgeX5`gX8df3?by3eH-#r-OrMX7lUD}a^4wxqsW_}@ zaXGwOH?*WSe#cJLlcXO`zLQ*^HnsVaZ|{9ZL}{0}uN}=ax`EiMJ4LS8rKhHyPmfcu zDk9uT$T{hrG5w)CFSRuByyqnvl>U8pr2R;#KzS)&iyAabw-%k18D7gHIWHpo$=;3U zgF>g-<`->;?5XK}9hogSP=hqO+RPk2cE`u(%P=a3uiM#-{Hl11yY)d6yYCySPE zmzUg^&g?PRl9|CNbR}6^JBs#h5KgDGX(X-UJ>N;n8`e23SA>)Xx#H7ek8i8jQp2CF zUW2R;-D!c=NA9yX5-yf2W?amVLtHw!jU;5i59o$c)_@; zKj?$()sR-AV$j?@Xh<`Cw zz^-CAF=!riw&LUyhO-I!9&7i>2Hm_?)$_DydB^LefiM;P6

|r(oDKxfurea00XH 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 JreGfQ{{WbI7ApV% literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_modules/aimet_common/bias_correction.html b/releases/1.32.2/_modules/aimet_common/bias_correction.html new file mode 100644 index 0000000..cb5e389 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_common/bias_correction.html @@ -0,0 +1,1264 @@ + + + + + + aimet_common.bias_correction — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +

+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_common.bias_correction

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+"""  holds common code for bias correction """
+
+from aimet_common.defs import ActivationType
+from aimet_common.utils import AimetLogger
+from aimet_common.connected_graph.operation import Op
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Utils)
+
+CONV_OP_TYPES = ['Conv1d', 'Conv2D', 'DepthwiseConv2dNative', 'Conv', 'ConvTranspose', 'Conv3d']
+LINEAR_OP_TYPES = ['Dense', 'Gemm', 'MatMul']
+BN_OP_TYPES = ['FusedBatchNormV3', 'FusedBatchNorm', 'BatchNormalization', 'BatchNorm3d']
+
+
[docs]class ConvBnInfoType: + """ + Type for hoding convs with bn info and activation types + Activation types supported are Relu and Relu6 + """ + def __init__(self, + input_bn=None, + output_bn=None, + in_activation_type: ActivationType = ActivationType.no_activation, + out_activation_type: ActivationType = ActivationType.no_activation): + """ + :param input_bn: Reference to Input BatchNorm to layer + :param output_bn: Reference to Output BatchNorm to layer + :param in_activation_type: Type of Activation + :param out_activation_type: Type of Activation + """ + + self.input_bn = input_bn + self.output_bn = output_bn + self.in_activation_type = in_activation_type + self.out_activation_type = out_activation_type
+ + +class ConvBnPatternHandler: + """ + common handler for matched patterns for bias correction and batchnorm fold. + """ + + def __init__(self): + self.conv_linears_with_bn_dict = {} + + def get_conv_linear_bn_info_dict(self): + """ + returns the dictionary created + :return: dictionary of convs/linears with bn and activation info + """ + return self.conv_linears_with_bn_dict + + def __call__(self, *args, **kwargs): + """ + custom pattern match handler that keeps a dictionary of convs/linears with bn and activation info. + """ + + _, op_subset = args + + bn_activation_info = ConvBnInfoType() + + activation_type = ActivationType.no_activation + conv_op = None + bn_op = None + + for op in op_subset: + if op.type in CONV_OP_TYPES + LINEAR_OP_TYPES: + conv_op = op + op_key = get_op_dict_key(conv_op) + if op_key in self.conv_linears_with_bn_dict.keys(): + bn_activation_info = self.conv_linears_with_bn_dict[op_key] + elif op.type in BN_OP_TYPES: + bn_op = op + elif op.type in ['Relu6', 'Clip']: + activation_type = ActivationType.relu6 + elif op.type in ['Relu']: + activation_type = ActivationType.relu + + if len(op_subset) >= 2: + if op_subset[0].type in BN_OP_TYPES: + bn_activation_info.input_bn = bn_op + bn_activation_info.in_activation_type = activation_type + # we do not match linear layers with preceding bn for bias correction + elif op_subset[0].type in CONV_OP_TYPES + LINEAR_OP_TYPES: + bn_activation_info.output_bn = bn_op + bn_activation_info.out_activation_type = activation_type + # in tf linear layer has two ops together [flatten/reshape -- dense] , check for len 3 + elif len(op_subset) >= 3 and op_subset[1].type in ['Dense']: + bn_activation_info.output_bn = bn_op + bn_activation_info.out_activation_type = activation_type + op_key = get_op_dict_key(conv_op) + self.conv_linears_with_bn_dict[op_key] = bn_activation_info + + +def get_op_dict_key(op: Op): + """ + Returns the object to be used as a key in the conv/linear BN dict. + For torch and tensorflow models, returns op.get_module(). For onnx models, returns the original op. + + :param op: connected graph layer to be used as a dictionary key + :return: object (op or op.get_module()) to be used as a key in the conv/linear BN dict + """ + module = op.get_module() + # ONNX NodeProto objects are not hashable, return the original Op object instead + if module.__hash__ is None: + return op + return module +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_common/defs.html b/releases/1.32.2/_modules/aimet_common/defs.html new file mode 100644 index 0000000..cd94f27 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_common/defs.html @@ -0,0 +1,1549 @@ + + + + + + aimet_common.defs — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_common.defs

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Common type definitions that are used across aimet """
+import io
+from enum import Enum
+from typing import Union, Callable, Any, Optional, Dict, List
+from decimal import Decimal
+
+from aimet_common.layer_database import Layer
+import aimet_common.libpymo as libpymo
+
+
+# supported quantization schemes
+
[docs]class QuantScheme(Enum): + """ Enumeration of Quant schemes""" + + post_training_tf = 1 + """ For a Tensor, the absolute minimum and maximum value of the Tensor are used to compute the Quantization + encodings. """ + post_training_tf_enhanced = 2 + """ For a Tensor, searches and selects the optimal minimum and maximum value that minimizes the Quantization Noise. + The Quantization encodings are calculated using the selected minimum and maximum value. """ + training_range_learning_with_tf_init = 3 + """ For a Tensor, the encoding values are initialized with the post_training_tf scheme. Then, the encodings are + learned during training. """ + training_range_learning_with_tf_enhanced_init = 4 + """ For a Tensor, the encoding values are initialized with the post_training_tf_enhanced scheme. Then, the encodings + are learned during training. """ + training_range_learning = 5 + post_training_percentile = 6 + """ For a Tensor, adjusted minimum and maximum values are selected based on the percentile value passed. + The Quantization encodings are calculated using the adjusted minimum and maximum value."""
+ +MAP_QUANT_SCHEME_TO_PYMO = {QuantScheme.post_training_tf: libpymo.QuantizationMode.QUANTIZATION_TF, + QuantScheme.post_training_tf_enhanced: + libpymo.QuantizationMode.QUANTIZATION_TF_ENHANCED, + QuantScheme.training_range_learning_with_tf_init: + libpymo.QuantizationMode.QUANTIZATION_TF, + QuantScheme.training_range_learning_with_tf_enhanced_init: + libpymo.QuantizationMode.QUANTIZATION_TF_ENHANCED, + QuantScheme.post_training_percentile: + libpymo.QuantizationMode.QUANTIZATION_PERCENTILE} +MAP_ROUND_MODE_TO_PYMO = {'nearest': libpymo.RoundingMode.ROUND_NEAREST, + 'stochastic': libpymo.RoundingMode.ROUND_STOCHASTIC} + +RANGE_LEARNING_SCHEMES = {QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init} + + +
[docs]class ActivationType(Enum): + """ Enums to identify activation type""" + no_activation = 0 + """ No activation """ + + relu = 1 + """ ReLU activation """ + + relu6 = 2 + """ ReLU6 activation """
+ + +
[docs]class CostMetric(Enum): + """ Enumeration of metrics to measure cost of a model/layer """ + + mac = 1 + """ MAC: Cost modeled for compute requirements """ + + memory = 2 + """ Memory: Cost modeled for space requirements """
+ + +
[docs]class CompressionScheme(Enum): + """ Enumeration of compression schemes supported in aimet """ + + weight_svd = 1 + """ Weight SVD """ + + spatial_svd = 2 + """ Spatial SVD """ + + channel_pruning = 3 + """ Channel Pruning """
+ + +class RankSelectScheme(Enum): + """ Enumeration of rank selection schemes supported in aimet """ + + greedy = 1 + """ Greedy scheme""" + + tar = 2 + """ TAR scheme """ + + +class LayerCompRatioPair: + """ + Models a pair of (layer: nn.Module, CompRatio: Decimal) + """ + + def __init__(self, layer: Layer, comp_ratio: Union[Decimal, None]): + """ + Constructor + :param layer: Reference to layer + :param comp_ratio: Comp-ratio as a floating point number between 0 and 1 + """ + self.layer = layer + self.comp_ratio = comp_ratio + + def __str__(self): + return 'LayerCompRatioPair: layer={}, comp-ratio={}'.format(self.layer.name, self.comp_ratio) + + +class LayerCompRatioEvalScore: + """ + Models data element with (layer: nn.Module, CompRatio: Decimal, EvalScore: Decimal) attributes + """ + + def __init__(self, layer: Layer, comp_ratio: Union[Decimal, None], eval_score: Optional[Union[Decimal, None]]): + """ + Constructor + :param layer: Reference to layer + :param comp_ratio: Comp-ratio as a floating point number between 0 and 1 + :param eval_score: Eval score as floating point number + """ + self.layer = layer + self.comp_ratio = comp_ratio + self.eval_score = eval_score + + def __str__(self): + return 'LayerCompRatioEvalScore: layer={}, comp-ratio={}, eval_score={}'. \ + format(self.layer.name, self.comp_ratio, self.eval_score) + + +class TarPerRankIndexData: + """ + TAR based algo stats require a combination of + (layer: nn.Module, CompRatio: Decimal, EvalScore:Decimal) per rank index to be stored + """ + + def __init__(self, layer: Layer, comp_ratio: Union[Decimal, None], eval_score: Union[Decimal, None]): + """ + Constructor + :param layer: Reference to layer + :param comp_ratio: Comp-ratio as a floating point number between 0 and 1 + :param eval_score: Eval score as a floating point number + """ + self.layer = layer + self.comp_ratio = comp_ratio + self.eval_score = eval_score + + def __str__(self): + return 'TarPerRankIndexData: layer={}, comp-ratio={}, eval-score={}'.format(self.layer.name, self.comp_ratio, + self.eval_score) + + +
[docs]class TarRankSelectionParameters: + """ + Configuration parameters for the TAR compression-ratio selection algorithm + + :ivar num_rank_indices: Number of rank indices for ratio selection. + + """ + def __init__(self, num_rank_indices: int): + + # Sanity check + if num_rank_indices < 2: + raise ValueError("Error: num_rank_indices={}. Need at least 2 candidates for " + "TAR based compression-ratio selection".format(num_rank_indices)) + + self.num_rank_indices = num_rank_indices
+ + +EvalFunction = Callable[[Any, Optional[int], bool], float] + + +
[docs]class GreedySelectionParameters: + """ + Configuration parameters for the Greedy compression-ratio selection algorithm + + :ivar target_comp_ratio: Target compression ratio. Expressed as value between 0 and 1. + Compression ratio is the ratio of cost of compressed model to cost of the original model. + :ivar num_comp_ratio_candidates: Number of comp-ratio candidates to analyze per-layer + More candidates allows more granular distribution of compression at the cost + of increased run-time during analysis. Default value=10. Value should be greater than 1. + :ivar use_monotonic_fit: If True, eval scores in the eval dictionary are fitted to a monotonically increasing + function. This is useful if you see the eval dict scores for some layers are not monotonically increasing. + By default, this option is set to False. + :ivar saved_eval_scores_dict: Path to the eval_scores dictionary pickle file that was + saved in a previous run. This is useful to speed-up experiments when trying + different target compression-ratios for example. aimet will save eval_scores + dictionary pickle file automatically in a ./data directory relative to the + current path. num_comp_ratio_candidates parameter will be ignored when this option is used. + """ + + def __init__(self, + target_comp_ratio: float, + num_comp_ratio_candidates: int = 10, + use_monotonic_fit: bool = False, + saved_eval_scores_dict: Optional[str] = None): + + self.target_comp_ratio = target_comp_ratio + + # Sanity check + if num_comp_ratio_candidates < 2: + raise ValueError("Error: num_comp_ratio_candidates={}. Need more than 1 candidate for " + "Greedy compression-ratio selection".format(num_comp_ratio_candidates)) + + self.num_comp_ratio_candidates = num_comp_ratio_candidates + self.use_monotonic_fit = use_monotonic_fit + self.saved_eval_scores_dict = saved_eval_scores_dict
+ + +class GreedyCompressionRatioSelectionStats: + """ Statistics for the greedy compression-ratio selection algorithm """ + + def __init__(self, eval_scores_dict: Dict[str, Dict[Decimal, float]]): + """ + Constructor + :param eval_scores_dict: Dictionary of {layer_name: {compression_ratio: eval_score}} + """ + self.eval_scores_dictionary = eval_scores_dict + + def __str__(self): + stream = io.StringIO(newline='\n') + stream.write('\nGreedy Eval Dict\n') + layer_dict = self.eval_scores_dictionary + for layer in layer_dict: + stream.write(' Layer: {}\n'.format(layer)) + + for ratio in sorted(layer_dict[layer]): + stream.write(' Ratio={}, Eval score={}\n'.format(ratio, layer_dict[layer][ratio])) + + return stream.getvalue() + + +class TarCompressionRatioSelectionStats: + """ Statistics for the TAR compression-ratio selection algorithm """ + + def __init__(self, layers_comp_ratio_eval_score_per_rank_index): + """ + Constructor + :param layers_comp_ratio_eval_score_per_rank_index: List of [layer_name: compression_ratio: eval_score] params + """ + self.layers_comp_ratio_eval_score_per_rank_index = layers_comp_ratio_eval_score_per_rank_index + + def __str__(self): + stream = io.StringIO(newline='\n') + stream.write('\nTar Eval table\n') + for data_to_print in self.layers_comp_ratio_eval_score_per_rank_index: + stream.write(' Layer: {}\n'.format(data_to_print.layer)) + stream.write(' Ratio={}, Eval score={}\n'.format((data_to_print.comp_ratio), + (data_to_print.eval_score))) + + return stream.getvalue() + + +class CompressionStats: + """ Statistics generated during model compression """ + + class LayerStats: + """ Statistics for every layer in the model that was compressed """ + + def __init__(self, name: str, comp_ratio: Decimal): + self.name = name + self.compression_ratio = comp_ratio + + def __init__(self, base_accuracy: float, comp_accuracy: float, + mem_comp_ratio: Decimal, mac_comp_ratio: Decimal, + per_layer_stats: List[LayerStats], + comp_ratio_select_stats: Union[GreedyCompressionRatioSelectionStats, None]): + + self.baseline_model_accuracy = format(base_accuracy, '.6f') + self.compressed_model_accuracy = format(comp_accuracy, '.6f') + self.memory_compression_ratio = format(mem_comp_ratio, '.6f') + self.mac_compression_ratio = format(mac_comp_ratio, '.6f') + self.per_layer_stats = per_layer_stats + self.compression_ratio_selection_stats = comp_ratio_select_stats + + def __str__(self): + + stream = io.StringIO(newline='\n') + stream.write('**********************************************************************************************\n') + stream.write('Compressed Model Statistics\n') + stream.write('Baseline model accuracy: {}, Compressed model accuracy: {}\n' + .format(self.baseline_model_accuracy, + self.compressed_model_accuracy)) + stream.write('Compression ratio for memory={}, mac={}\n'.format(self.memory_compression_ratio, + self.mac_compression_ratio)) + stream.write('\n') + stream.write('**********************************************************************************************\n') + + stream.write('\nPer-layer Stats\n') + for layer in self.per_layer_stats: + stream.write(' Name:{}, compression-ratio: {}\n'.format(layer.name, + layer.compression_ratio)) + stream.write('\n') + stream.write('**********************************************************************************************\n') + + stream.write('{}\n'.format(self.compression_ratio_selection_stats)) + stream.write('**********************************************************************************************\n') + + return stream.getvalue() + + +class AdaroundConstants: + """ Constants used for Adarounding """ + + GAMMA = -0.1 + ZETA = 1.1 + + +class QuantizationDataType(Enum): + """ Enumeration of tensor quantizer data types supported """ + undefined = 0 + int = 1 + float = 2 + +class SupportedKernelsAction(Enum): + """ Enumeration to specify the action to apply during supported_kernels validation""" + allow_error = 1 + warn_on_error = 2 + assert_on_error = 3 + + +class QuantDtypeBwInfo: + """ + QuantDtypeBwInfo holds activation dtype/bw and param dtype/bw + """ + + + def __init__(self, act_dtype: QuantizationDataType, act_bw: int, + param_dtype: QuantizationDataType = QuantizationDataType.undefined, param_bw: int = 0): + """ + Data class to hold dtype and bw info + :param act_dtype: Activation datatype of type QuantizationDataType + :param act_bw: Activation bitwidth of type int + :param param_dtype: Param datatype of type QuantizationDataType + :param param_bw: Param bitwidth of type int + """ + self.act_dtype = act_dtype + self.act_bw = act_bw + self.param_dtype = param_dtype + self.param_bw = param_bw + self._validate_inputs() + + def __repr__(self): + return f'(activation:({self.act_dtype}, {self.act_bw}) param:({self.param_dtype}, {self.param_bw})' + + def __str__(self): + return f'activation:({self.act_dtype}, {self.act_bw}) param:({self.param_dtype}, {self.param_bw})' + + def __eq__(self, other): + return self.act_dtype == other.act_dtype and self.act_bw == other.act_bw and \ + self.param_dtype == other.param_dtype and self.param_bw == other.param_bw + + def _validate_inputs(self): + """ + Validate inputs + """ + if self.param_dtype and self.param_bw: + if self.param_dtype == QuantizationDataType.float and self.param_bw not in [16, 32]: + raise ValueError( + 'float param_dtype can only be used when param_bw is set to 16, not ' + str(self.param_bw)) + + if self.act_dtype == QuantizationDataType.float and self.act_bw not in [16, 32]: + raise ValueError( + 'float act_dtype can only be used when act_bw is set to 16, not ' + str(self.act_bw)) + + def is_same_activation(self, dtype: QuantizationDataType, bw: int): + """ + helper function to check if activation of the object is same as input + :param bw: bitwidth to verify against + :param dtype: dtype to verify against + """ + return bw == self.act_bw and dtype == self.act_dtype + + def is_same_param(self, dtype: QuantizationDataType, bw: int): + """ + helper function to check if param of the object is same as input + :param bw: bitwidth to verify against + :param dtype: dtype to verify against + """ + return bw == self.param_bw and dtype == self.param_dtype + + def get_activation(self) -> tuple: + """ getter method for activation candidate""" + return self.act_dtype, self.act_bw + + def get_param(self) -> tuple: + """ getter method for param candidate""" + return self.param_dtype, self.param_bw +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_common/utils.html b/releases/1.32.2/_modules/aimet_common/utils.html new file mode 100644 index 0000000..62e2ea8 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_common/utils.html @@ -0,0 +1,1629 @@ + + + + + + aimet_common.utils — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_common.utils

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2018-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+""" Utility classes and functions that are used by NightlyTests files as well as
+    common to both PyTorch and TensorFlow. """
+
+import sys
+from contextlib import contextmanager
+import json
+import logging
+import logging.config
+import logging.handlers
+import math
+import os
+import signal
+import subprocess
+import threading
+import time
+from enum import Enum
+from typing import Callable, Dict, List, Optional, TextIO, Union, Any
+import multiprocessing
+import yaml
+from tqdm import tqdm
+from bokeh.server.server import Server
+from bokeh.application import Application
+
+SAVE_TO_YAML = False
+
+try:
+    # The build system updates Product, Version and Feature set information in the package_info file.
+    from aimet_common.package_info import Product, Version_Info, Postfix
+
+except ImportError:
+    # Default values for Product, Version and Feature set information.
+    Product = 'AIMET'
+    Version_Info = ''
+    Postfix = ''
+
+
+class ModelApi(Enum):
+    """ Enum differentiating between Pytorch or Tensorflow """
+    pytorch = 0
+    tensorflow = 1
+    keras = 2
+    onnx = 3
+
+
+
[docs]class CallbackFunc: + """ + Class encapsulating callback function, and it's argument(s) + """ + def __init__(self, func: Callable, func_callback_args=None): + """ + :param func: Callable Function + :param func_callback_args: Arguments passed to the callable function as-is. + """ + self.func = func + self.args = func_callback_args
+ + +class SingletonType(type): + """ SingletonType is used as a metaclass by other classes for which only one instance must be created. + + A metaclass inherits from "type' and it's instances are other classes. + """ + _instances = {} + + def __call__(cls, *args, **kwargs): + """ This function overrides the behavior of type's __call__ function. + + The overriding behavior is needed so that only one instance of the derived + class is created. The argument cls is a class variable (similar to self for instances). + + Using AimetLogger class as an example, when AimetLogger() is called, SingletonType + (the metaclass) class's __call__ is called which in turn calls AimetLogger's __call__ + creating an instance of AimetLogger. The creation happens only once, making + aimetLooger a singleton. + """ + if cls not in cls._instances: + cls._instances[cls] = super(SingletonType, cls).__call__(*args, **kwargs) + return cls._instances[cls] + + +class AimetLogger(metaclass=SingletonType): + """ The aimet Logger class. Multiple Area Loggers have been defined. + Each Area Logger could be set at a different logging level. """ + _logger = None + + class LogAreas(Enum): + """ Defines the LogAreas used in aimet. """ + Quant = 'Quant' + Svd = 'Svd' + Test = 'Test' + Utils = 'Utils' + CompRatioSelect = 'CompRatioSelect' + ChannelPruning = 'ChannelPruning' + Winnow = 'Winnow' + ConnectedGraph = 'ConnectedGraph' + CrosslayerEqualization = 'CrossLayerEqualization' + MixedPrecision = 'MixedPrecision' + AutoQuant = 'AutoQuant' + Nas = 'Nas' + NasPipeline = 'NasPipeline' + DeviceFramework = 'DeviceFramework' + BatchNormFolding = "BatchNormFolding" + ModelPreparer = "ModelPreparer" + LayerOutputs = 'LayerOutputs' + QuantAnalyzer = 'QuantAnalyzer' + SeqMse = 'SeqMse' + + def __init__(self): + self._logger = logging.getLogger() + + dir_name = os.path.dirname(__file__) + rel_path = "default_logging_config.json" + abs_file_path = os.path.join(dir_name, rel_path) + + with open(abs_file_path, encoding='utf-8') as logging_configuration_file: + try: + config_dict = json.loads(logging_configuration_file.read()) + except: # pylint: disable=raise-missing-from + raise ValueError("Logging configuration file: default_logging_config.json contains invalid format") + + logging.config.dictConfig(config_dict) + + # Validate JSON file default_logging_config.json for correct Logging Areas + #TODO This results in a pylint error: Instance of 'RootLogger' has no 'loggerDict' member. + # Need to fix this issue and then remove the pylint disablement. + configured_items = list(logging.root.manager.loggerDict.items()) # pylint: disable=no-member + + log_areas_list = list() + for x in AimetLogger.LogAreas: + log_areas_list.append(x.value) + + configured_areas_list = list() + for name, _ in configured_items: + configured_areas_list.append(name) + + for area in log_areas_list: + if area not in configured_areas_list: + raise ValueError(" ERROR: LogArea: {} NOT configured".format(area)) + + log_package_info() + + @staticmethod + def get_area_logger(area): + """ Returns a specific Area logger. """ + AimetLogger() + area_logger = logging.getLogger(area.value) + return area_logger + + @staticmethod + def set_area_logger_level(area, level): + """ Sets a logging level for a single area logger. """ + area_logger = logging.getLogger(area.value) + area_logger.setLevel(level) + + @staticmethod + def set_level_for_all_areas(level): + """ Sets the same logging level for all area debuggers. """ + for area in AimetLogger.LogAreas: + AimetLogger.set_area_logger_level(area, level) + +def log_with_error_and_assert_if_false(condition: bool, logger: logging.Logger, error_msg: str): + """ + If condition is false, log an error and assert with the same error message. + + :param condition: Condition to check + :param logger: Logger to log error with + :param error_msg: Error message string + """ + if not condition: + logger.error(error_msg) + assert condition, error_msg + +def round_up_to_multiplicity(multiplicity: int, num: int, max_allowable_num: int): + """ + Function to round a number to the nearest multiplicity given the multiplicity + :param multiplicity: multiplicity for rounding + :param num: input number to be rounded + :param max_allowable_num: maximum value for num allowed + :return: number rounded up to nearest multiplicity + """ + larger_multiple = math.ceil(float(num) / float(multiplicity)) * multiplicity + if larger_multiple >= max_allowable_num: + return max_allowable_num + return int(larger_multiple) + + +def round_down_to_multiplicity(multiplicity: int, num: int): + """ + Function to round a number to the nearest multiplicity given the multiplicity + :param multiplicity: multiplicity for rounding + :param num: input number to be rounded + :return: number rounded down to nearest multiplicity + """ + if num - multiplicity <= 0: + return num + + if num % multiplicity == 0: + num = num - 1 + lower_multiple = math.floor(float(num) / float(multiplicity)) * multiplicity + return int(lower_multiple) + + +# Depending on pytorch or tensorflow, the ordering of dimensions in tensor/product shapes will be different. +# In pytorch, the number of channels is always index 1 +# In tensorflow, the number of channels is always the last dimension in the shape +api_channel_index_dict = {ModelApi.pytorch: 1, ModelApi.tensorflow: -1} + + +def kill_process_with_name_and_port_number(name: str, port_number: int): + """ Kill a process that is associated with a port number displayed by the command: ps -x """ + + logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Utils) + p = subprocess.Popen(['ps', '-x'], stdout=subprocess.PIPE) # pylint: disable=consider-using-with + out, _ = p.communicate() + + for line in out.splitlines(): + str_line = line.decode() + port_num_str = str(port_number) + if name in str_line and '--port=' + port_num_str in str_line: + pid = int(line.split(None, 1)[0]) + logger.info("Killing Bokeh server with process id: %s", format(pid)) + os.kill(pid, signal.SIGKILL) + break + + +def start_bokeh_server_session(port: int = None): + """ + start a bokeh server programmatically. Used for testing purposes. + :param port: Port number. If not specified, bokeh server will listen on an arbitrary free port. + :return: Returns the Bokeh Server URL and the process object used to create the child server process + """ + manager = multiprocessing.Manager() + d = manager.dict() + server_started = manager.Event() + + def start_bokeh_server(port: int = None): + os.setsid() + + # If port is 0, server automatically finds and listens on an arbitrary free port. + port = port or 0 + try: + server = Server({'/': Application()}, port=port) + server.start() + d['port'] = server.port + server_started.set() + server.run_until_shutdown() + except Exception as e: + d['exception'] = e + raise + + proc = multiprocessing.Process(target=start_bokeh_server, args=(port,)) + + proc.start() + server_started.wait(timeout=10) + + if 'port' not in d: + if proc: + proc.terminate() + + if 'exception' in d: + e = d['exception'] + raise RuntimeError(f'Bokeh server failed with the following error: {e}') + + raise RuntimeError('Bokeh Server failed with an unknown error') + + port = d['port'] + address = f'http://localhost:{port}' + + return address, proc + + +def log_package_info(): + """ + Log the Product, Version and Postfix. + :return: + """ + + # The Product is always a non-empty string. + if Version_Info != '' and Postfix != '': + # Log Product-Version-Postfix + logging.info("%s-%s-%s", Product, Version_Info, Postfix) + elif Version_Info != '' and Postfix == '': + # Log Product-Version + logging.info("%s-%s", Product, Version_Info) + else: + # If Version is empty, the Postfix is not logged. + # Log Product. + logging.info("%s", Product) + + +def save_json_yaml(file_path: str, dict_to_save: dict): + """ + Function which saves encoding in YAML and JSON file format + :param file_path: file name to use to generate the yaml and json file + :param dict_to_save: dictionary to save + """ + encoding_file_path_json = file_path + with open(encoding_file_path_json, 'w') as encoding_fp_json: + json.dump(dict_to_save, encoding_fp_json, sort_keys=True, indent=4) + + if SAVE_TO_YAML: + encoding_file_path_yaml = file_path + '.yaml' + with open(encoding_file_path_yaml, 'w') as encoding_fp_yaml: + yaml.dump(dict_to_save, encoding_fp_yaml, default_flow_style=False, allow_unicode=True) + + +class TqdmStreamHandler(logging.StreamHandler): + """ + Logging handler for tqdm. + """ + def emit(self, record): + with tqdm.external_write_mode(file=self.stream): + super().emit(record) + + + +class Spinner(tqdm): + """ + Simple spinner that displays what's being performed under the hood. + This is helpful for providing a cue to the users that something is in + progress (not blocked) when showing a progress bar is not always possible, + e.g. when there is no loop, when the loop resides in the library, etc. + + NOTE: Being a subclass of tqdm, we should use AimetLogger when spinner is + activated to keep the standard output look as neat as it should be. + + Typical usage:: + >>> def do_something(): + ... do_part_1() + ... logger.info("Part 1 done") + ... do_part_2() + ... logger.info("Part 2 done") + ... do_part_3() + ... logger.info("Part 3 done") + ... + ... with Spinner("Doing task A"): + ... do_something() + Part 1 done + Part 2 done + Part 3 done + / Doing task A <- Spinning at the bottom until the end of with block + + This can also be used in a nested manner:: + >>> with Spinner("Doing task A"): + ... with Spinner("Part 1 in progress..."): + ... do_part_1() + ... with Spinner("Part 2 in progress..."): + ... do_part_2() + ... with Spinner("Part 3 in progress..."): + ... do_part_3() + / Doing task A <- Two spinners spinning independently + - Part 1 in progress... <- Two spinners spinning independently + """ + prefixes = ["/", "-", "\\", "|"] + + def __init__(self, title: str, refresh_interval: float = 0.5): + """ + :param title: Title that the spinner will display. + :param refresh_interval: Time interval (unit: sec) of refreshing the spinner. + """ + def refresh_in_loop(): + while not self._stop.is_set(): + with self._lock: + self._index = (self._index + 1) % len(self.prefixes) + self.refresh(nolock=True) + time.sleep(refresh_interval) + + self._index = 0 + self._stop = threading.Event() + self._refresh_thread = threading.Thread(target=refresh_in_loop) + self._messages = [ + f"{prefix} {title}" for prefix in self.prefixes + ] + + super().__init__() + + def __str__(self): + return self._messages[self._index] + + def __enter__(self): + self._refresh_thread.start() + return super().__enter__() + + def __exit__(self, *args, **kwargs): # pylint: disable=arguments-differ + self._stop.set() + self._refresh_thread.join() + super().__exit__(*args, **kwargs) + + +class Handle: + """ Removable handle. """ + + def __init__(self, cleanup_fn): + self._cleanup_fn = cleanup_fn + self._removed = False + + def remove(self): + """ Run clean up function """ + if not self._removed: + self._cleanup_fn() + self._removed = True + + def __enter__(self): + return self + + def __exit__(self, *_): + self.remove() + + +def convert_configs_values_to_bool(dictionary: Dict): + """ + Recursively traverse all key value pairs in dictionary and set any string values representing booleans to + booleans. + :param dictionary: Dictionary to set values to True or False if applicable + """ + for key, value in dictionary.items(): + if value == 'True': + dictionary[key] = True + elif value == 'False': + dictionary[key] = False + elif isinstance(value, List): + for item in value: + if isinstance(item, Dict): + convert_configs_values_to_bool(item) + elif isinstance(value, Dict): + convert_configs_values_to_bool(value) + else: + pass + + +@contextmanager +def profile(label: str, file: Union[str, os.PathLike, TextIO] = None, new_file: bool = False, logger: Optional[logging.Logger] = None, + cleanup: Callable[[], Any] = None): + """ + Profile a block of code and save profiling information into a file. + + :param label: String label associated with the block of code to profile (shows up in the profiling print) + :param file: File path and name or a file-like object to send output text to (Default: stdout) + :param new_file: True if a new file is to be created to hold profiling info, False if an existing file should be + appended to. This flag is only valid when ``file`` is a path, not a file-like object. + :param logger: If logger is provided, profiling string will also be printed with INFO logging level + :param cleanup: If provided, this will be called before ending profiling. This can be useful for synchronizing cuda streams. + """ + should_close = False + if isinstance(file, (str, os.PathLike)): + mode = 'w' if new_file else 'a' + file = open(file, mode) # pylint: disable=consider-using-with + should_close = True + elif file is None: + file = sys.stdout + + assert hasattr(file, 'write') + + try: + with Spinner(label): + start = time.perf_counter() + yield + if cleanup: + cleanup() + end = time.perf_counter() + + profiling_string = f'{label}: {end - start:.2f}s' + + if logger: + logger.info(profiling_string) + + print(profiling_string, file=file) + finally: + if should_close: + file.close() +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/adaround/adaround_weight.html b/releases/1.32.2/_modules/aimet_tensorflow/adaround/adaround_weight.html new file mode 100644 index 0000000..9c78abb --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/adaround/adaround_weight.html @@ -0,0 +1,1540 @@ + + + + + + aimet_tensorflow.adaround.adaround_weight — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.adaround.adaround_weight

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Top level API for Adaptive Rounding - Post-Training Quantization (PTQ) """
+
+import os
+import json
+import shutil
+from typing import List, Tuple, Callable, Union, Dict
+import numpy as np
+from tqdm import tqdm
+import tensorflow as tf
+
+# Import AIMET specific modules
+import aimet_common.libpymo as libpymo
+from aimet_common.utils import AimetLogger
+from aimet_common.defs import QuantScheme
+from aimet_common.quantsim_config.json_config_importer import JsonConfigImporter, ConfigDictKeys, ConfigDictType
+from aimet_tensorflow.utils import graph_saver
+from aimet_tensorflow.utils.common import get_ordered_ops
+from aimet_tensorflow.utils.op.conv import WeightTensorUtils
+from aimet_tensorflow.quantsim_config.quantsim_config import MAP_TF_PARAM_NAME_TO_QUANTSIM_NAME
+from aimet_tensorflow.adaround.activation_sampler import ActivationSampler
+from aimet_tensorflow.adaround.adaround_loss import AdaroundHyperParameters
+from aimet_tensorflow.adaround.adaround_optimizer import AdaroundOptimizer
+from aimet_tensorflow.adaround.adaround_wrapper import AdaroundWrapper
+
+AdaroundSupportedOps = ('Conv2D', 'DepthwiseConv2dNative', 'MatMul', 'Conv2DBackpropInput')
+
+ActFuncMap = {'Relu': tf.nn.relu, 'Relu6': tf.nn.relu6, 'Tanh': tf.nn.tanh, 'Sigmoid': tf.nn.sigmoid,
+              'Softmax': tf.nn.softmax}
+
+tf_op_type_to_onnx_type_dict = {
+        "Conv2D": "Conv",
+        "DepthwiseConv2dNative": "Conv",
+        "MatMul": "Gemm",
+    }
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+WORKING_DIR = '/tmp/adaround/'
+
+
+
[docs]class AdaroundParameters: + """ + Configuration parameters for Adaround + """ + def __init__(self, data_set: tf.data.Dataset, num_batches: int, default_num_iterations: int = 10000, + default_reg_param: float = 0.01, default_beta_range: Tuple = (20, 2), default_warm_start: float = 0.2): + """ + :param data_set: TF Data set + :param num_batches: Number of batches + :param default_num_iterations: Number of iterations to adaround each layer. Default 10000 + :param default_reg_param: Regularization parameter, trading off between rounding loss vs reconstruction loss. + Default 0.01 + :param default_beta_range: Start and stop beta parameter for annealing of rounding loss (start_beta, end_beta). + Default (20, 2) + :param default_warm_start: warm up period, during which rounding loss has zero effect. Default 20% (0.2) + """ + self.data_set = data_set + self.num_batches = num_batches + self.num_iterations = default_num_iterations + self.reg_param = default_reg_param + self.beta_range = default_beta_range + self.warm_start = default_warm_start + + def __eq__(self, other: "AdaroundParameters"): + return self.data_set == other.data_set and\ + self.num_batches == other.num_batches and\ + self.num_iterations == other.num_iterations and\ + self.reg_param == other.reg_param and\ + self.beta_range == other.beta_range and\ + self.warm_start == other.warm_start
+ + +class Adaround: + """ + Weight-rounding mechanism for Post Training Quantization (PTQ) + """ + @classmethod + def apply_adaround(cls, session: tf.compat.v1.Session, starting_op_names: List[str], output_op_names: List[str], + params: AdaroundParameters, path: str, filename_prefix: str, default_param_bw: int = 4, + default_quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + default_config_file: str = None) -> tf.compat.v1.Session: + """ + Returns Tf session - model with optimized weight rounding of every op (Conv and Linear) and also saves the + corresponding quantization encodings to a separate JSON-formatted file that can then be imported by + QuantSim for inference or QAT + + :param session: Tf session with model to adaround + :param starting_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :param params: Parameters for adaround + :param path: path where to store parameter encodings + :param filename_prefix: Prefix to use for filename of the encodings file + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. Default 4 + :param default_quant_scheme: Quantization scheme. Supported options are QuantScheme.post_training_tf or + QuantScheme.post_training_tf_enhanced. Default QuantScheme.post_training_tf_enhanced + :param default_config_file: Default configuration file for model quantizers + :return: Tf session with Adarounded weight and saves corresponding parameter encodings JSON file + at provided path + """ + # pylint: disable=too-many-arguments + if not os.path.exists(WORKING_DIR): + os.makedirs(WORKING_DIR) + + param_encodings,\ + session_soft_rounded_weight = cls._apply_adaround_helper(session, + starting_op_names, + output_op_names, + params, + default_param_bw, + default_quant_scheme, + default_config_file) + + # Export quantization encodings to JSON-formatted file at provided path + cls.export_encoding_to_json(path, filename_prefix, param_encodings) + + if os.path.exists(WORKING_DIR): + logger.info('Deleting temporary working directory %s', WORKING_DIR) + shutil.rmtree(WORKING_DIR) + + logger.info('Completed Adarounding Model') + + return session_soft_rounded_weight + + @classmethod + def _apply_adaround_helper( # pylint: disable=too-many-locals + cls, + session: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + params: AdaroundParameters, + param_bw: int, + quant_scheme: QuantScheme, + config_file: str, + ) -> Tuple[Dict, tf.compat.v1.Session]: + """ + Helper for apply_adaround(). + + NOTE: Soft rounding is only used for op-wise optimization procedure as we need gradients + for the rounding to be learned and after that we switch to hard rounding (i.e. using + true fixed point numbers) to be used for collecting later layers activations data. + + When optimization is fully converged (i.e. wrapper.alpha is always exact 0 or 1), there + is no difference between soft rounding and hard rounding. + + :param session: Tf session with model to adaround. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param params: Parameters for adaround. + :param param_bw: bitwidth (4-31) to use for quantizing layer parameters. + :param quant_scheme: Quantization scheme. + :param config_file: configuration file. + :return: Dictionary containing encoding for adarounded parameters, + TF session with soft rounding weights. + """ + # Create copies which will have model's weights quantized with hard and soft rounding. + session_hard_rounded_weight = graph_saver.save_and_load_graph(WORKING_DIR, session) + session_soft_rounded_weight = graph_saver.save_and_load_graph(WORKING_DIR, session) + + # Get parameters from config file. + configs, strict_symmetric, unsigned_symmetric, enable_per_channel = Adaround.get_config_dict_keys(config_file) + + # Optimization Hyper parameters + opt_params = AdaroundHyperParameters(params.num_iterations, params.reg_param, params.beta_range, + params.warm_start) + # Activation sampler + act_sampler = ActivationSampler(params.data_set) + + # Get Adaround supported ops based on occurrence in the model + ordered_ops = cls._get_ordered_list_of_ops(session.graph, starting_op_names, output_op_names) + + param_encodings = {} + for op in tqdm(ordered_ops): + logger.info("Started Optimizing weight rounding of op: %s", op.name) + + # Using name, get corresponding op from session with soft and hard rounded weights. + hard_rounded_op = session_hard_rounded_weight.graph.get_operation_by_name(op.name) + soft_rounded_op = session_soft_rounded_weight.graph.get_operation_by_name(op.name) + + # Collect input and output activations data + all_inp_data, all_out_data = act_sampler.sample_activation(op, hard_rounded_op, session, + session_hard_rounded_weight, starting_op_names, + params.num_batches) + is_symmetric = cls.get_is_symmetric_flag_for_op_param(configs, op.type, + param_name="weight", + framework_to_onnx_type_dict=tf_op_type_to_onnx_type_dict) + + + # Find next following activation function + act_func = cls._get_act_func(op) + + # Perform Adaround optimization in separate graph + graph = tf.Graph() + with graph.as_default(): + output_height, output_width, output_channels = None, None, None + if op.type == 'Conv2DBackpropInput': + output_height, output_width, output_channels = \ + cls.get_conv2d_transpose_output_tensor_shape(op.get_attr("data_format").decode('utf-8'), + all_out_data) + wrapper = AdaroundWrapper(session, op, param_bw, quant_scheme, is_symmetric, + strict_symmetric, unsigned_symmetric, enable_per_channel, output_height, + output_width, output_channels) + hard_rounded_weight, soft_rounded_weight = AdaroundOptimizer().adaround_wrapper(wrapper, act_func, + all_inp_data, + all_out_data, + opt_params) + + # Update param encodings dictionary + cls._update_param_encodings_dict(param_encodings, op, wrapper.encoding, is_symmetric) + + # Update with hard and soft rounded weights + WeightTensorUtils.update_tensor_for_op(session_hard_rounded_weight, hard_rounded_op, hard_rounded_weight) + WeightTensorUtils.update_tensor_for_op(session_soft_rounded_weight, soft_rounded_op, soft_rounded_weight) + + # Close intermediate session + session_hard_rounded_weight.close() + + return param_encodings, session_soft_rounded_weight + + @staticmethod + def get_config_dict_keys(config_file: str) -> Tuple[ConfigDictType, bool, bool, bool]: + """ + Get config dictionary keys from config file. Config file will default if no provided one. + :param config_file: configuration file. + :return: Config dictionary, strict symmetric flag, unsigned symmetric flag, enable per channel flag. + """ + configs = JsonConfigImporter.import_json_config_file(config_file) + strict_symmetric = configs[ConfigDictKeys.DEFAULTS].get(ConfigDictKeys.STRICT_SYMMETRIC, False) + unsigned_symmetric = configs[ConfigDictKeys.DEFAULTS].get(ConfigDictKeys.UNSIGNED_SYMMETRIC, False) + + # Read per-channel quantization field. Default = False + per_channel_enabled = configs[ConfigDictKeys.DEFAULTS].get(ConfigDictKeys.PER_CHANNEL_QUANTIZATION, False) + + return configs, strict_symmetric, unsigned_symmetric, per_channel_enabled + + @staticmethod + def _get_ordered_list_of_ops(graph: tf.Graph, input_op_names: List[str], output_op_names: List[str]) \ + -> List[tf.Operation]: + """ + Get Adaround supported ops based on occurrence in the model + :param graph: Model represented as TF data flow graph + :param input_op_names: List of input op names + :param output_op_names: List of output op names of the model + :return: List of Adaround supported ops + """ + # Get all the ops in the model based on occurrence + list_of_ordered_ops = get_ordered_ops(graph, input_op_names, output_op_names) + + ordered_ops = [] + + for op in list_of_ordered_ops: + if op.type in AdaroundSupportedOps: + ordered_ops.append(op) + + return ordered_ops + + @staticmethod + def _get_act_func(op: tf.Operation) -> Union[Callable, None]: + """ + Gets immediate following activation function else returns None + :param op: Tf op + :return: Callable Tf activation function or None + """ + act_func = None + consumer_ops = op.outputs[0].consumers() + + if not consumer_ops: + return act_func + + # op -> act_func + if consumer_ops[0].type in ActFuncMap: + act_func = ActFuncMap[consumer_ops[0].type] + + # op -> bias_add -> act_func + elif consumer_ops[0].type in ['Add', 'BiasAdd']: + if consumer_ops[0].outputs[0].consumers() and consumer_ops[0].outputs[0].consumers()[0].type in ActFuncMap: + act_func = ActFuncMap[consumer_ops[0].outputs[0].consumers()[0].type] + + logger.info("op: %s 's next following act func: %s", op.name, act_func) + return act_func + + @classmethod + def export_encoding_to_json(cls, path: str, filename_prefix: str, param_encodings: Dict): + """ + Save Adadrounded op's parameter encodings to JSON file + :param path: path where to store param encodings + :param filename_prefix: filename to store exported weight encodings in JSON format + :param param_encodings: Parameter encodings dictionary + """ + # export encodings to JSON file + os.makedirs(os.path.abspath(path), exist_ok=True) + encoding_file_path = os.path.join(path, filename_prefix + '.encodings') + with open(encoding_file_path, 'w') as encoding_fp: + json.dump(param_encodings, encoding_fp, sort_keys=True, indent=4) + + @staticmethod + def _update_param_encodings_dict(encoding_dict: Dict, op: tf.Operation, + encoding: Union[libpymo.TfEncoding, List[libpymo.TfEncoding]], + is_symmetric: bool): + """ + Add op's parameter encoding to dictionary to be used for exporting + :param encoding_dict: Encoding dictionary + :param op: Tf op + :param encoding: Encoding + :param is_symmetric: Symmetric vs Asymmetric boolean + """ + tensor_name = op.inputs[1].name + # Wrap Per Tensor encoding in a list for list comprehension + encoding = encoding if isinstance(encoding, list) else [encoding] + encoding_dict[tensor_name] = [{'min': enc.min, + 'max': enc.max, + 'scale': enc.delta, + 'offset': int(enc.offset), + 'bitwidth': enc.bw, + 'is_symmetric': str(is_symmetric)} for enc in encoding] + + @staticmethod + def get_is_symmetric_flag_for_op_param(configs: ConfigDictType, tf_op_type: str, param_name: str, + framework_to_onnx_type_dict: dict) -> bool: + """ + NOTE: Checks config file in reverse order of specificity. + + Returns is_symmetric flag for op's param if it is set in config file else returns + False. First check all ops of specific types, second check all params of specific + and lastly check for default types. If not specified, it will return default is + symmetric False. + + :param configs: Dictionary containing configs. + :param tf_op_type: TensorFlow operation type. + :param param_name: Parameter name. + :param framework_to_onnx_type_dict: Dictionary mapping framework type to ONNX type. + :return: is_symmetric flag for given op's param. + """ + assert param_name in MAP_TF_PARAM_NAME_TO_QUANTSIM_NAME.keys(), "param name is invalid." + + # third level of specificity which applies to specific op_type's parameters. + try: + onnx_type = framework_to_onnx_type_dict[tf_op_type] + return configs[ConfigDictKeys.OP_TYPE] \ + [onnx_type] \ + [ConfigDictKeys.PARAMS] \ + [param_name] \ + [ConfigDictKeys.IS_SYMMETRIC] + except KeyError: + pass + + # Second level of specificity which applies to all parameters only. + try: + return configs[ConfigDictKeys.PARAMS] \ + [param_name] \ + [ConfigDictKeys.IS_SYMMETRIC] + except KeyError: + pass + + # First level of specificity which applies to all the ops and parameters. + try: + return configs[ConfigDictKeys.DEFAULTS] \ + [ConfigDictKeys.PARAMS] \ + [ConfigDictKeys.IS_SYMMETRIC] + except KeyError: + pass + + # Default is_symmetric False. + return False + + @staticmethod + def get_conv2d_transpose_output_tensor_shape(data_format: str, output_data: np.ndarray): + """ + Get output height, width, and channels from output_data for use in adarounding conv2d transpose op. + :param data_format: Data format for the op (NHWC or NCHW) + :param output_data: numpy array containing sampled output of the op + :return: Tuple containing output height, width, and channels of the op + """ + if data_format == 'NHWC': + output_height = output_data.shape[1] + output_width = output_data.shape[2] + output_channels = output_data.shape[3] + else: + output_height = output_data.shape[2] + output_width = output_data.shape[3] + output_channels = output_data.shape[1] + return output_height, output_width, output_channels +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/auto_quant.html b/releases/1.32.2/_modules/aimet_tensorflow/auto_quant.html new file mode 100644 index 0000000..5de58f8 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/auto_quant.html @@ -0,0 +1,1969 @@ + + + + + + aimet_tensorflow.auto_quant — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_tensorflow.auto_quant

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+"""Automatic Post-Training Quantization"""
+import contextlib
+from dataclasses import dataclass
+import os
+from typing import Any, Callable, Dict, List, Optional, Tuple
+import tensorflow as tf
+from tqdm import tqdm
+
+import jinja2
+from bokeh.resources import CDN
+
+from aimet_tensorflow.adaround.adaround_weight import Adaround, AdaroundParameters
+from aimet_tensorflow.cross_layer_equalization import equalize_model
+from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
+from aimet_tensorflow.quantsim import QuantizationSimModel
+from aimet_tensorflow.utils.graph_saver import load_model_from_meta
+from aimet_tensorflow.utils.common import (
+    create_input_feed_dict,
+    deepcopy_tf_session,
+    iterate_tf_dataset,
+)
+from aimet_tensorflow.cache import TfSessionSerializationProtocol
+
+from aimet_common.auto_quant import Diagnostics
+from aimet_common.cache import Cache
+from aimet_common.defs import QuantScheme
+from aimet_common.utils import AimetLogger, Spinner
+from aimet_common.quantsim import validate_quantsim_inputs
+
+
+tf.compat.v1.disable_eager_execution()
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.AutoQuant)
+
+
+cache = Cache()
+
+
+# The number of samples to be used for performance evaluation.
+# NOTE: None means "all".
+NUM_SAMPLES_FOR_PERFORMANCE_EVALUATION = None
+
+
+
[docs]class AutoQuant: + """ + Integrate and apply post-training quantization techniques. + + AutoQuant includes 1) batchnorm folding, 2) cross-layer equalization, + and 3) Adaround. + These techniques will be applied in a best-effort manner until the model + meets the evaluation goal given as allowed_accuracy_drop. + """ + + def __init__( # pylint: disable=too-many-arguments + self, + allowed_accuracy_drop: float, + unlabeled_dataset: tf.compat.v1.data.Dataset, + eval_callback: Callable[[tf.compat.v1.Session, Optional[int]], float], + default_param_bw: int = 8, + default_output_bw: int = 8, + default_quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + default_rounding_mode: str = 'nearest', + default_config_file: str = None, + ) -> None: + """ + :param allowed_accuracy_drop: Maximum allowed accuracy drop. + :param unlabeled_dataset: An unlabeled dataset for encoding computation. + By default, this dataset will be also used for Adaround unless + otherwise specified by `self.set_adaround_params`. + :param eval_callback: A function that maps a tf session and the number of samples + to the evaluation score. This callback is expected to return a + scalar value representing the model performance evaluated + against exactly `N` samples, where `N` is the number of samples + passed as the second argument of this callback. + NOTE: If `N` is None, the model is expected to be evaluated against + the whole evaluation dataset. + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs andoutputs. + :param default_quant_scheme: Quantization scheme. Supported values are + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced. + :param default_rounding_mode: Rounding mode. Supported options are 'nearest' or 'stochastic' + :param default_config_file: Path to configuration file for model quantizers + """ + if allowed_accuracy_drop < 0: + raise ValueError( + "`allowed_accuracy_drop` must be a positive value. Got {:.2f}" + .format(allowed_accuracy_drop) + ) + + validate_quantsim_inputs(default_quant_scheme, + default_rounding_mode, + default_output_bw, + default_param_bw) + + self.allowed_accuracy_drop = allowed_accuracy_drop + self.eval_callback = eval_callback + self.default_param_bw = default_param_bw + self.default_output_bw = default_output_bw + self.default_quant_scheme = default_quant_scheme + self.default_rounding_mode = default_rounding_mode + self.default_config_file = default_config_file + + self._unlabeled_dataset = unlabeled_dataset + self._unlabled_dataset_length = None + + self._adaround_params = None + + @property + def adaround_params(self): + """Returns the adaround parameter.""" + # If adaround_params is manually set, return it. + if self._adaround_params is not None: + return self._adaround_params + # Otherwise, return the default adaround params if the length of the + # dataset if known. + if self._unlabled_dataset_length is not None: + return AdaroundParameters(self._unlabeled_dataset, + self._unlabled_dataset_length) + return None + + def _evaluate_model_performance(self, sess: tf.compat.v1.Session) -> float: + """ + Evaluate the model performance. + + :param sess: tf.Session associated with the model to evaluate. + :return: Evaluation score. + """ + return self.eval_callback(sess, NUM_SAMPLES_FOR_PERFORMANCE_EVALUATION) + +
[docs] def set_adaround_params(self, adaround_params: AdaroundParameters) -> None: + """ + Set Adaround parameters. + If this method is not called explicitly by the user, AutoQuant will use + `unlabeled_dataset` (passed to `__init__`) for Adaround. + + :param adaround_params: Adaround parameters. + """ + self._adaround_params = adaround_params
+ + def _create_quantsim_and_encodings( # pylint: disable=too-many-arguments + self, + sess: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + quant_scheme: QuantScheme = None, + rounding_mode: str = None, + default_output_bw: int = None, + default_param_bw: int = None, + config_file: str = None, + encoding_path: str = None, + ) -> QuantizationSimModel: + """ + Create a QuantizationSimModel and compute encoding. If `encoding_path` is not None, + it is prioritized over other arguments (`default_output_bw`, `defalt_param_bw`, ...). + + NOTE: Input session is not mutated. + + :param sess: The input model as session to add quantize ops to. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param quant_scheme: Quantization scheme. Defaults to self.default_quant_scheme. + :param rounding_mode: Rounding mode. Defaults to self.default_rounding_mode. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs andoutputs. + Defaults to self.default_output_bw. + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + Defaults to self.default_param_bw. + :param config_file: Path to configuration file for model quantizers. + Defaults to self.default_config_file. + :param encoding_path: Path to parameter encodings file. + :return: Quantsim model. + """ + kwargs = dict( + quant_scheme=(quant_scheme or self.default_quant_scheme), + rounding_mode=(rounding_mode or self.default_rounding_mode), + default_output_bw=(default_output_bw or self.default_output_bw), + default_param_bw=(default_param_bw or self.default_param_bw), + config_file=(config_file or self.default_config_file), + ) + with deepcopy_tf_session(sess) as sess: # pylint: disable=redefined-argument-from-local + sim = QuantizationSimModel(sess, starting_op_names, output_op_names, **kwargs) + + if encoding_path: + sim.set_and_freeze_param_encodings(encoding_path) + + def forward_pass_callback(sess: tf.compat.v1.Session, _: Any = None): + output_ops = [ + sess.graph.get_operation_by_name(op_name) + for op_name in output_op_names + ] + + count = 0 + iterator = iterate_tf_dataset(self._unlabeled_dataset) + for inputs in tqdm(iterator, total=self._unlabled_dataset_length): + feed_dict = create_input_feed_dict(sess.graph, starting_op_names, inputs) + sess.run(output_ops, feed_dict=feed_dict) + count += 1 + + self._unlabled_dataset_length = count + + sim.compute_encodings(forward_pass_callback, None) + + return sim + + def _apply_batchnorm_folding( # pylint: disable=no-self-use + self, + sess: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + ) -> Tuple[tf.compat.v1.Session, List[Tuple[tf.Operation, tf.Operation]]]: + """ + Apply batchnorm folding. + + NOTE: Input session is not mutated. + + :param sess: tf.Session associated with the model to apply cle. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :return: Output session and folded pairs. + """ + # NOTE: We don't apply caching to batchnorm folding because caching is + # likely going to have an adverse effect on the performance. + # Since a tf.Operation contains a reference to the graph it belongs + # to, serializing a subset of operations of a tf.Graph requires + # serializing the whole graph, making the serialization cost very + # likely to exceed the evaluation cost. + with deepcopy_tf_session(sess) as sess: # pylint: disable=redefined-argument-from-local + return fold_all_batch_norms(sess, starting_op_names, output_op_names) + + @cache.mark("cle", TfSessionSerializationProtocol()) + def _apply_cross_layer_equalization( # pylint: disable=no-self-use + self, + sess: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + ) -> tf.compat.v1.Session: + """ + Apply cross-layer equalization. + + NOTE: Input session is not mutated. + + :param sess: tf.Session associated with the model to apply batchnorm folding. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :return: Output session. + """ + with deepcopy_tf_session(sess) as sess: # pylint: disable=redefined-argument-from-local + return equalize_model(sess, starting_op_names, output_op_names) + + def _apply_adaround( + self, + sess: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + results_dir: str, + ) -> Tuple[tf.compat.v1.Session, str]: + """ + Apply adaround. + + :param sess: tf.Session associated with the model to apply adaround. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param results_dir: Directory to save the results of AdaRound. + :return: Output session and the path to the parameter encoding file. + """ + # NOTE: We dont need to make a deepcopy of model here, since Adaround.apply_adaround + # internally creates and returns a deepcopy of model. + if self.adaround_params is None: + raise RuntimeError + + filename_prefix = "adaround" + adaround_encoding_path = os.path.join(results_dir, + "{}.encodings".format(filename_prefix)) + _apply_adaround_cached =\ + cache.mark("adaround", TfSessionSerializationProtocol())\ + (Adaround.apply_adaround) + + sess = _apply_adaround_cached(sess, + starting_op_names, + output_op_names, + self.adaround_params, + path=results_dir, + filename_prefix=filename_prefix, + default_param_bw=self.default_param_bw, + default_quant_scheme=self.default_quant_scheme, + default_config_file=self.default_config_file) + + return sess, adaround_encoding_path + +
[docs] def apply( + self, + fp32_sess: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + results_dir: str = "/tmp", + cache_id: str = None, + ) -> Tuple[tf.compat.v1.Session, float, str]: + """ + Apply post-training quantization techniques. + + :param fp32_sess: tf.Session associated with the model to apply PTQ techniques. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param results_dir: Directory to save the results. + :return: Tuple of (best session, eval score, encoding path). + """ + result = self._apply_helper(self._auto_quant_main, + fp32_sess, + starting_op_names, + output_op_names, + results_dir, + cache_id) + return result["model"],\ + result["accuracy"],\ + result["encoding_path"]
+ + def _apply_helper( + self, + auto_quant_main_fn: Callable, + fp32_sess: tf.compat.v1.Session, + starting_op_names: List[str], + output_op_names: List[str], + results_dir: str = "/tmp", + cache_id: str = None, + ) -> Dict[str, Any]: + """ + Helper for self.apply(). + + :param fp32_sess: tf.Session associated with the model to apply PTQ techniques. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param results_dir: Directory to save the results. + :return: The best ptq result as a dictionary. + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + if cache_id is None: + cache_dir = None + else: + cache_dir = os.path.join(results_dir, ".auto_quant_cache", cache_id) + + with cache.enable(cache_dir): + _logger.info("Starting AutoQuant") + + fp32_acc = self._evaluate_model_performance(fp32_sess) + target_acc = fp32_acc - self.allowed_accuracy_drop + + _logger.info("Target eval score: %f", target_acc) + _logger.info("FP32 eval score (W32A32): %f", fp32_acc) + + eval_manager = _EvalManager( + quantsim_factory=self._create_quantsim_and_encodings, + eval_func=self._evaluate_model_performance, + starting_op_names=starting_op_names, + output_op_names=output_op_names, + results_dir=results_dir, + ) + + ret = auto_quant_main_fn(fp32_sess, target_acc, + starting_op_names, output_op_names, + eval_manager, results_dir) + + acc = ret["accuracy"] + _logger.info("Best eval score: %f", acc) + + if acc < target_acc: + _logger.info( + "AutoQuant is unable to match the target accuracy. " + "Consider Quantization Aware Training." + ) + + eval_manager.export_diagnostics() + + return ret + + def _auto_quant_main( + self, + fp32_sess: tf.compat.v1.Session, + target_acc: float, + starting_op_names: List[str], + output_op_names: List[str], + eval_manager: "_EvalManager", + results_dir: str = "/tmp", + ) -> Dict[str, Any]: + """ + Helper function of apply(). + + :param fp32_sess: Model to apply PTQ techniques. + :param target_acc: Target eval score. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param eval_manager: _Evalmanager object. + :param results_dir: Directory to save the results. + :return: The best ptq result as a dictionary. + """ + with eval_manager.analysis_session("Weight Quantization Sensitivity") as s: + acc = s.eval(fp32_sess, default_output_bw=32) + s.diagnostics.add( + f"Weight-quantized eval score (W{self.default_param_bw}A32): {acc:f}" + ) + + with eval_manager.analysis_session("Activation Quantization Sensitivity") as s: + acc = s.eval(fp32_sess, default_param_bw=32) + s.diagnostics.add( + f"Activation-quantized eval score (W32A{self.default_output_bw}): {acc:f}" + ) + + # Batchnorm Folding + with eval_manager.ptq_session("Batchnorm Folding") as s: + sess, folded_pairs = self._apply_batchnorm_folding(fp32_sess, + starting_op_names, + output_op_names) + for conv, bn in folded_pairs: + s.diagnostics.add(f"{conv} was merged with {bn}.") + s.set_ptq_result(sess=sess, applied_techniques=["batchnorm_folding"]) + + best_result = eval_manager.get_best_ptq_result() + if best_result.accuracy >= target_acc: + return best_result.as_dict() + + # Cross-Layer Equalization + with eval_manager.ptq_session("Cross-Layer Equalization") as s: + sess = self._apply_cross_layer_equalization(fp32_sess, + starting_op_names, + output_op_names) + s.set_ptq_result(sess=sess, applied_techniques=["cross_layer_equalization"]) + + best_result = eval_manager.get_best_ptq_result() + if best_result.accuracy >= target_acc: + return best_result.as_dict() + + # AdaRound + with eval_manager.ptq_session("AdaRound") as s: + sess, encoding_path = self._apply_adaround(best_result.load_model(), + starting_op_names, + output_op_names, + results_dir) + s.set_ptq_result(sess=sess, + encoding_path=encoding_path, + applied_techniques=[*best_result.applied_techniques, "adaround"]) + + return eval_manager.get_best_ptq_result().as_dict()
+ + +@dataclass +class PtqResult: + """ + Evaluation results. + :param tag: Identifier string of the evaluation result. + :param model_path: Path to the serialized model. + :param encoding_path: Path to the encoding file. + :param accuracy: Accuracy of the model. + """ + meta_path: str + checkpoint_path: str + encoding_path: str + accuracy: float + applied_techniques: List[str] + + def load_model(self) -> tf.compat.v1.Session: + """ + Load model. + :return: Loaded model. + """ + return load_model_from_meta(self.meta_path, self.checkpoint_path) + + def as_dict(self): + """Convert to dictionary""" + return dict(model=self.load_model(), + accuracy=self.accuracy, + encoding_path=self.encoding_path, + applied_techniques=self.applied_techniques) + + +class _EvalManager: + """ + Evaluation manager for AutoQuant. + """ + def __init__(self, + quantsim_factory: Callable, + eval_func: Callable[[tf.compat.v1.Session], float], + starting_op_names: List[str], + output_op_names: List[str], + results_dir: str): + """ + :param quantsim_factory: A factory function that returns QuantizationSimModel. + :param eval_func: Evaluation function. + :param dummy_input: Dummy input to the model. Assumed to be located on the same device as the model. + :param dummy_input_on_cpu: Dummy input to the model in CPU memory. + :param results_dir: Base directory to save the temporary serialized model. + """ + self._quantsim_factory = quantsim_factory + self._eval_func = eval_func + self._starting_op_names = starting_op_names + self._output_op_names = output_op_names + self._results_dir = results_dir + + os.makedirs(self._results_dir, exist_ok=True) + + self._all_sessions: List[_EvalSession] = [] + self._ptq_sessions: List[_PtqSession] = [] + + def get_best_ptq_result(self) -> PtqResult: + """ + Get the results with the highest evaluation score among the ptq results evaluated so far. + :return: The best evaluation result so far. + """ + if not self._ptq_sessions: + raise RuntimeError + + ptq_results = [sess.ptq_result for sess in self._ptq_sessions] + return max(ptq_results, key=lambda ptq_result: ptq_result.accuracy) + + def analysis_session(self, title: str) -> "_EvalSession": + """ + Return a session for analysis only. + :param title: Title of the session. + :return: Analysis session. + """ + return self._get_session(title, _EvalSession) + + def ptq_session(self, title: str) -> "_PtqSession": + """ + Return a session for analysis only. + :param title: Title of the session. + :return: PTQ session. + """ + sess = self._get_session(title, _PtqSession) + self._ptq_sessions.append(sess) + return sess + + def _get_session(self, title: str, session_cls: type): + """ + Session factory. + :param title: Title of the session. + :session_cls: Class of the session. + :return: Session object. + """ + session = session_cls(title, + self._quantsim_factory, + self._eval_func, + self._starting_op_names, + self._output_op_names, + results_dir=os.path.join(self._results_dir, ".trace")) + self._all_sessions.append(session) + return session + + def export_diagnostics(self) -> str: + """ + Export diagnostics in html format. + :return: Diagnostics string in html format. + """ + loader = jinja2.FileSystemLoader(os.path.dirname(os.path.abspath(__file__))) + env = jinja2.Environment(loader=loader) + template = env.get_template("auto_quant_diagnostics_template.html") + + if any(sess.diagnostics.contains_bokeh() for sess in self._all_sessions): + head = CDN.render() + else: + head = "" + + body = { + sess.title: sess.diagnostics + for sess in self._all_sessions + if not sess.diagnostics.is_empty() + } + + html = template.render(head=head, body=body) + filename = os.path.join(self._results_dir, "diagnostics.html") + with open(filename, "w") as f: + f.write(html) + return html + + +class _EvalSession: + """ + Evaluation session for AutoQuant. + + Each session object contains a title and diagnostics produced during the session. + The collected diagnostics will be exported into a html file by _EvalManager. + """ + def __init__( + self, + title: str, + quantsim_factory: Callable, + eval_func: Callable[[tf.compat.v1.Session], float], + starting_op_names: List[str], + output_op_names: List[str], + results_dir: str + ): + """ + :param title: Title of the session. + :param quantsim_factory: A factory function that returns QuantizationSimModel. + :param eval_func: Evaluation function. + :param dummy_input: Dummy input to the model. Assumed to be located on the same device as the model. + :param dummy_input_on_cpu: Dummy input to the model in CPU memory. + :param results_dir: Base directory to save the temporary serialized model. + """ + self._title = title + self._quantsim_factory = quantsim_factory + self._eval_func = eval_func + self._starting_op_names = starting_op_names + self._output_op_names = output_op_names + self._results_dir = results_dir + self._spinner = None + + os.makedirs(self._results_dir, exist_ok=True) + + self._diagnostics = Diagnostics() + + # Map session title to file name. + # e.g. title: "Cross-Layer Equalization" -> filename: "cross_layer_equalization" + self._filename = self._title.lower().replace("-", " ") + self._filename = "_".join(self._filename.split()) + + @property + def title(self): + """Getter of self._title.""" + return self._title + + @property + def diagnostics(self): + """Getter of self._diagnostics.""" + return self._diagnostics + + def eval(self, sess: tf.compat.v1.Session, **kwargs): + """ + Evaluate the model. + :param sess: tf.Session associated with the model to evaluate. + :param **kwargs: Additional arguments to the quantsim factory. + :return: Eval score. + """ + sim = self._quantsim_factory(sess, + self._starting_op_names, + self._output_op_names, + **kwargs) + acc = self._eval_func(sim.session) + return acc + + def __enter__(self): + self._spinner = Spinner(self._title) + self._spinner.__enter__() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + try: + if self._spinner is not None: + self._spinner.__exit__(exc_type, exc_val, exc_tb) + finally: + if exc_val is not None: + raise exc_val + + +class _PtqSession(_EvalSession): + """ + PTQ session. + + Each PTQ session object should call `set_ptq_result` exactly once + inside a with-as block. + """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._ptq_result = None + + @property + def ptq_result(self) -> PtqResult: + """Getter of self._ptq_result.""" + if self._ptq_result is None: + raise RuntimeError + return self._ptq_result + + def set_ptq_result( + self, + applied_techniques: List[str], + sess: tf.compat.v1.Session = None, + sim: QuantizationSimModel = None, + acc: float = None, + **kwargs + ) -> None: + """ + Set the result of PTQ. Should be called exactly once inside a with-as block. + + Exactly one among model and (sim, acc) pair should be specified. + 1) If sim and acc is specified, save them as the result of this session. + 2) If model is specified, evaluate the quantized accuracy of the model and save the result. + + :param sess: Result of PTQ. + :param sim: Result of PTQ. The quamtization encoding (compute_encodings()) is + assumed to have been computed in advance. + :param acc: Eval score. + :param **kwargs: Additional arguments to the quantsim factory. + :return: None + """ + if sim is None: + assert acc is None + assert sess is not None + sim = self._quantsim_factory(sess, + self._starting_op_names, + self._output_op_names, + **kwargs) + acc = self._eval_func(sim.session) + else: + assert acc is not None + assert sess is None + + self._set_ptq_result(sim, acc, applied_techniques) + + def _set_ptq_result( + self, + sim: QuantizationSimModel, + acc: float, + applied_techniques: List[str], + ) -> PtqResult: + """ + Set the result of PTQ. Should be called exactly once inside a with-as block. + + :param sim: Result of PTQ. The quamtization encoding (compute_encodings()) is + assumed to have been computed in advance. + :param acc: Eval score. + :return: PtqResult object. + """ + if self._ptq_result is not None: + raise RuntimeError( + "sess.eval() can be called only once per each _EvalSession instance." + ) + + meta_path, checkpoint_path, encoding_path = self._export(sim) + self._ptq_result = PtqResult( + meta_path=meta_path, + checkpoint_path=checkpoint_path, + encoding_path=encoding_path, + accuracy=acc, + applied_techniques=applied_techniques, + ) + return self._ptq_result + + def _export(self, sim: QuantizationSimModel) -> Tuple[str, str, str]: + """ + Export quantsim. + :param sim: QuantizationSimModel object to export. + :return: The paths where model and encoding are saved + """ + sim.export(path=self._results_dir, filename_prefix=self._filename) + checkpoint_path = os.path.join(self._results_dir, self._filename) + meta_path = f"{checkpoint_path}.meta" + encoding_path = f"{checkpoint_path}.encodings" + _logger.info("The results of %s is saved in %s, %s, and %s.", + self._title, checkpoint_path, meta_path, encoding_path) + return meta_path, checkpoint_path, encoding_path + + def __exit__(self, exc_type, exc_val, exc_tb): + """Raises error if set_ptq_result is not called.""" + super().__exit__(exc_type, exc_val, exc_tb) + + if self._ptq_result is None: + raise RuntimeError + + _logger.info("Session finished: %s. (eval score: %f)", + self._title, self._ptq_result.accuracy) + + +@contextlib.contextmanager +def spy_auto_quant(auto_quant: AutoQuant): + """ + Install a spy that collects the handles to the ptq result of + each stage of AutoQuant. + + Typical usage:: + >>> auto_quant = AutoQuant(...) + ... with auto_quant_spy(auto_quant) as spy: + ... _ = auto_quant.apply(...) + ... + ... for result in spy.get_all_ptq_results(): + ... print(result.applied_techniques) + ... print(result.accuracy) + ... print(result.encoding_path) + ... model = result.load_model() + ... ... + """ + # pylint: disable=protected-access + class Spy: + """ + Spy that collects the handles to the ptq result of + each stage of AutoQuant. + """ + def __init__(self): + self._eval_manager = None + + def get_all_ptq_results(self) -> List[PtqResult]: + """Return handles to the results of AutoQuant""" + if self._eval_manager is None: + return [] + return [sess.ptq_result for sess in self._eval_manager._ptq_sessions] + + spy = Spy() + + _auto_quant_main = auto_quant._auto_quant_main + + def _auto_quant_main_wrapper(fp32_sess, target_acc, starting_op_names, + output_op_names, eval_manager, results_dir="/tmp"): + spy._eval_manager = eval_manager + return _auto_quant_main(fp32_sess, target_acc, starting_op_names, + output_op_names, eval_manager, results_dir) + + try: + setattr(auto_quant, "_auto_quant_main", _auto_quant_main_wrapper) + yield spy + finally: + setattr(auto_quant, "_auto_quant_main", _auto_quant_main) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/batch_norm_fold.html b/releases/1.32.2/_modules/aimet_tensorflow/batch_norm_fold.html new file mode 100644 index 0000000..24f8d51 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/batch_norm_fold.html @@ -0,0 +1,1787 @@ + + + + + + aimet_tensorflow.batch_norm_fold — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.batch_norm_fold

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" TF Code to fold batch-norm layers """
+
+from typing import List, Tuple, Union, Set
+import numpy as np
+import tensorflow as tf
+
+from aimet_common.graph_searcher import GraphSearcher
+from aimet_common.bias_correction import ConvBnPatternHandler
+from aimet_common.graph_pattern_matcher import PatternType
+from aimet_common.quantsim import compute_min_max_given_delta_offset
+from aimet_common.utils import AimetLogger
+import aimet_common.libpymo as libpymo
+
+from aimet_tensorflow.common.connectedgraph import ConnectedGraph
+from aimet_tensorflow.common.operation import OpWithMetaInfoType, Op
+from aimet_tensorflow.quantsim import QuantizationSimModel
+from aimet_tensorflow.utils.op.conv import WeightTensorUtils, BiasUtils
+from aimet_tensorflow.utils.op.fusedbatchnorm import BNUtils
+from aimet_tensorflow.utils.graph_saver import save_and_load_graph
+from aimet_tensorflow.utils.op.conv import get_weight_tensor_with_shape
+from aimet_tensorflow.utils.common import get_ordered_conv_linears, get_ordered_ops
+from aimet_tensorflow.quantizer_info import QuantizerInfo
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.BatchNormFolding)
+
+# save required information for performing bn fold on candidate bns as
+# <PairTypes> that includes :
+# tf.Operation type  : op which bn needs to be folded into.
+# OpWithMetaInfoType : bn op will store the input and output tensors along with tf.Operation
+# bool : Flag indicating if bn op can be folded upstream or downstream.
+PairType = Tuple[tf.Operation, Union[OpWithMetaInfoType, Op], bool]
+
+
+def _conv_bn_select_custom_pattern_init():
+    """
+    initialize the patterns we want to use to pick layers for bn based bias correction
+    :return: patterns and associated actions to be performed upon match
+    """
+
+    patterns_with_callbacks = []
+
+    # the types we want to handle
+    conv_layer_types = ['Conv2D', 'DepthwiseConv2dNative']
+    preceeding_linear_op_types = ['Flatten', 'Reshape']
+
+    # handler when pattern match
+    layer_select_handler = ConvBnPatternHandler()
+
+    # Linear layer combinations
+    for preceeding_linear_op_type in preceeding_linear_op_types:
+        # BN -> Linear
+        patterns_with_callbacks.append(PatternType(pattern=['FusedBatchNormV3', preceeding_linear_op_type, 'Dense'],
+                                                   action=layer_select_handler))
+
+        patterns_with_callbacks.append(PatternType(pattern=['FusedBatchNorm', preceeding_linear_op_type, 'Dense'],
+                                                   action=layer_select_handler))
+        # note: we cannot perform linear -> BN on TF
+
+    # conv layer combinations
+    for conv in conv_layer_types:
+
+        # BN -> Conv / Conv -> BN
+        patterns_with_callbacks.append(PatternType(pattern=[conv, 'FusedBatchNormV3'],
+                                                   action=layer_select_handler))
+
+        patterns_with_callbacks.append(PatternType(pattern=['FusedBatchNormV3', conv],
+                                                   action=layer_select_handler))
+
+        patterns_with_callbacks.append(PatternType(pattern=[conv, 'FusedBatchNorm'],
+                                                   action=layer_select_handler))
+
+        patterns_with_callbacks.append(PatternType(pattern=['FusedBatchNorm', conv],
+                                                   action=layer_select_handler))
+
+    return patterns_with_callbacks, layer_select_handler
+
+
+def _find_conv_bn_pairs(conn_graph: ConnectedGraph):
+    """
+    uses searcher to choose convs/ linears with bn and activation info.
+    :param conn_graph: tf.compat.v1.Session type
+    :return: dictionary of conv/linear layers with associated bn op / activation info
+    """
+    # create a list of patterns and corresponding handlers or actions to be applied for selecting
+    # layers for bias correction.
+    # layer_select_handler is an instance of custom handler created for bias correction.
+    patterns_with_callback, layer_select_handler = _conv_bn_select_custom_pattern_init()
+
+    # graph searcher looks for patterns and applies actions when matching patterns are found
+    graph_searcher = GraphSearcher(conn_graph, patterns_with_callback)
+    graph_searcher.find_all_patterns_in_graph_apply_actions()
+
+    # use custom handler instance and fetch the selected layer info for bias correction
+    convs_linears_bn_activation_info_dict = layer_select_handler.get_conv_linear_bn_info_dict()
+
+    return convs_linears_bn_activation_info_dict
+
+
+def find_all_batch_norms_to_fold(sess: tf.compat.v1.Session, start_op_names: Union[List[str], str],
+                                 output_op_names: Union[List[str], str], return_bn_conn_op=False) -> Tuple[List[PairType], Set[tf.Operation]]:
+    """
+    uses searcher to choose layers for bias correction
+    :param sess: tf.compat.v1.Session type
+    :param start_op_names: list of strings with names of starting ops in the model
+    :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops
+    :param return_bn_conn_op: Return bn op as connected graph op instead of tf tensor
+    (to ignore training ops for example).  If None, all ops in the model are considered valid.
+
+    :return: List of conv/linear layers with associated bn op / activation info
+    """
+    if isinstance(start_op_names, str):
+        start_op_names = [start_op_names]
+
+    if isinstance(output_op_names, str):
+        output_op_names = [output_op_names]
+
+    conn_graph = ConnectedGraph(sess.graph, start_op_names, output_op_names)
+    bn_conv_linear_pairs, marked_bn_set = _find_all_batch_norms_to_fold(conn_graph, start_op_names, output_op_names,
+                                                                        return_bn_conn_op)
+    return bn_conv_linear_pairs, marked_bn_set
+
+
+def _get_bias_tensor(sess: tf.compat.v1.Session, conv: tf.Operation) -> libpymo.TensorParams():
+    """
+    Get bias tensor in given conv op.
+    Packs bias in the format required for BN fold
+    (libpymo.TensorParams()).
+    :param sess: current session
+    :param conv: conv op
+    :return: return bias param in libpymo.TensorParams() format.
+    """
+    # Bias tensor
+    bias_tensor = libpymo.TensorParams()
+    with sess.graph.as_default():
+        if not BiasUtils.is_bias_none(conv):
+            bias_tensor.shape = BiasUtils.get_shape(conv)
+            bias_tensor.data = BiasUtils.get_bias_as_numpy_data(sess, conv)
+
+    return bias_tensor
+
+
+def _get_weight_tensor_transpose_reshape(sess: tf.compat.v1.Session, conv: tf.Operation) -> libpymo.TensorParams():
+    """
+    Get weight tensor from conv op
+    Converts to right format - performs transpose and reshape.
+    Packs it to the format required for BN fold (libpymo.TensorParams()).
+    :param sess: current session
+    :param conv: conv op
+    :return: return weight tensor in libpymo.TensorParams() format.
+    """
+    # Weight tensor libpymo format
+    weight_tensor = libpymo.TensorParams()
+    wt_tensor, shape = get_weight_tensor_with_shape(sess, conv)
+
+    # linear array to be sent for bn fold
+    weight_tensor.data = wt_tensor.reshape(-1)
+    weight_tensor.shape = shape
+
+    return weight_tensor
+
+
+def _get_bn_params(sess: tf.compat.v1.Session, bn: tf.Operation) -> libpymo.BNParams():
+    """
+    helper to populate BN params from given BN op, required for fold
+
+    :param sess: tf.compat.v1.Session type
+    :param bn: BatchNorm or a FusedBatch Norm op
+    :return: bn_params
+    """
+    with sess.graph.as_default():
+        # create BNParams type and populate
+        bn_params = libpymo.BNParams()
+        bn_params.beta = BNUtils.get_beta_as_numpy_data(sess, bn).reshape(-1)
+        bn_params.gamma = BNUtils.get_gamma_as_numpy_data(sess, bn).reshape(-1)
+        bn_params.runningMean = BNUtils.get_moving_mean_as_numpy_data(sess, bn).reshape(-1)
+
+        if bn.type == 'Identity':
+            # can't find a way to read epsilon if BN type is Identity
+            epsilon = 0.001
+        else:
+            epsilon = BNUtils.get_epsilon(bn)
+
+        var = BNUtils.get_moving_variance_as_numpy_data(sess, bn).reshape(-1)
+        sigma = np.sqrt(var + epsilon)
+        bn_params.runningVar = sigma
+    return bn_params
+
+# pylint: disable=too-many-locals
+def _fold_given_auto_selected_batch_norms(sess: tf.compat.v1.Session, layer_pairs: List[PairType]) -> tf.compat.v1.Session:
+    """
+    Fold a given set of batch_norm layers into conv layers
+
+    :param sess: tf.compat.v1.Session
+    :param layer_pairs: pair of conv and bn layers
+    :return: new session with updated graph
+    """
+    with sess.graph.as_default():
+        for pair in layer_pairs:
+            conv_linear, bn, fold_backward = pair
+            assert conv_linear.type in ['Conv2D', 'DepthwiseConv2dNative', 'MatMul']
+            #  check flag
+            is_bias_valid = False
+            if not BiasUtils.is_bias_none(conv_linear):
+                is_bias_valid = True
+
+            bn_params = _get_bn_params(sess, bn.op)
+            weight_tensor = _get_weight_tensor_transpose_reshape(sess, conv_linear)
+            bias_tensor = _get_bias_tensor(sess, conv_linear)
+
+            bias = libpymo.fold(bn_params, weight_tensor, bias_tensor, is_bias_valid, fold_backward)
+
+            # converting back to TF format [kh, kw, Nic, Noc] before updating weight tensor value
+            if conv_linear.type == 'DepthwiseConv2dNative':
+                # Depthwise conv layers in TF have outputs(Noc) set to 1.
+                # we send in format [Nic, Noc, kh, kw]
+                numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 0, 1))
+            elif conv_linear.type == 'MatMul':
+                # o, i - convert to i , o
+                numpy_weight_reshaped = np.reshape(weight_tensor.data,
+                                                   [weight_tensor.shape[0], weight_tensor.shape[1]]).transpose(1, 0)
+            else:
+                # conv2D case
+                # we sent in format [Noc, Nic, kh, kw]
+                numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 1, 0))
+
+            WeightTensorUtils.update_tensor_for_op(sess, conv_linear, numpy_weight_reshaped)
+
+            # remove bn op
+            BNUtils.skip_bn_op(sess, bn.op, bn.in_tensor, bn.out_tensor)
+
+            # update bias tensor, even in case there was no existing bias add op in given conv2D op.
+            bias_tensor_shape = [weight_tensor.shape[0]]
+            numpy_bias_reshaped = np.reshape(bias, bias_tensor_shape)
+            BiasUtils.update_bias_for_op(sess, conv_linear, numpy_bias_reshaped)
+
+        # we edited the graph, so we should load and save for the metagraph associated with the session to be updated
+        after_bn_fold_sess = save_and_load_graph('./temp_bn_fold', sess)
+
+    return after_bn_fold_sess
+
+
+
[docs]def fold_given_batch_norms(sess: tf.compat.v1.Session, input_op_names: Union[str, List[str]], + output_op_names: Union[str, List[str]], + layer_pairs: List[Tuple[tf.Operation, tf.Operation, bool]]) -> tf.compat.v1.Session: + + """ + Api to fold custom set of bn layers in a model + + :param sess: active tensorflow session + :param input_op_names: starting op in model or a list of starting ops in the model + :param layer_pairs: List of tuple with conv and bn op layers as tf.Operation and + a flag to indicate fold upstream or downstream + :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops + (to ignore training ops for example). + :return: updated_session after fold + + """ + # check for valid types + if not isinstance(input_op_names, (str, List)): + logger.error('start op names must be passed as a string or a List of strings') + + # if passed start op name is a single string, create a list + if isinstance(input_op_names, str): + input_op_names = [input_op_names] + + connected_graph = ConnectedGraph(sess.graph, input_op_names, output_op_names) + + conn_tf_n_op_map = {} + for op in connected_graph.get_all_ops().values(): + if op.type in ['FusedBatchNormV3', 'FusedBatchNorm']: + conn_tf_n_op_map[op.get_module()] = op + + layer_pairs_internal_format = [] + for layer_pair in layer_pairs: + conv_op, bn_op, is_bn_op_second = layer_pair + layer_pairs_internal_format.append((conv_op, conn_tf_n_op_map[bn_op].get_tf_op_with_io_tensor(), is_bn_op_second)) + + # invoke internal api + new_sess = _fold_given_auto_selected_batch_norms(sess, layer_pairs_internal_format) + + # save and load graph + after_fold_sess = save_and_load_graph('./temp_graph', new_sess) + + return after_fold_sess
+ + +
[docs]def fold_all_batch_norms(sess: tf.compat.v1.Session, input_op_names: Union[str, List[str]], + output_op_names: Union[str, List[str]])\ + -> Tuple[tf.compat.v1.Session, List[Tuple[tf.Operation, tf.Operation]]]: + """ + Fold all batch_norm layers in a model into corresponding conv layers + + :param sess: active tf.compat.v1.Session + :param input_op_names: Name of the starting op in the given graph or a list of names in case of multi-input model + :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops + (to ignore training ops for example). If None, all ops in the model are considered valid. + :return: A new session with edited graph and a list of pairs of layers [(Conv/Linear, BN layer that got folded)] + + """ + # check for valid types + if not isinstance(input_op_names, (str, List)): + logger.error('start op names must be passed as a string or a List of strings') + + # if passed start op name is only a string - create a list for connected graph + if isinstance(input_op_names, str): + input_op_names = [input_op_names] + + # if passed output op name is only a string - create a list for connected graph + if isinstance(output_op_names, str): + output_op_names = [output_op_names] + + bn_conv_linear_pairs, bns_to_fold = find_all_batch_norms_to_fold(sess, input_op_names, output_op_names) + + after_fold_sess = _fold_given_auto_selected_batch_norms(sess, bn_conv_linear_pairs) + + # When returning the pairs, we want the second element of the pair to be the BN + pairs_to_return = [] + + # tf.Operation type conv , pair[1] nis of type OpWithMetaInfoType + # bn op is stored as OpWithMetaInfoType, get the op from it. + # pair[0] is always conv op and bn op is pair[1] + for pair in bn_conv_linear_pairs: + pairs_to_return.append((pair[0], pair[1].op)) + + # Convert the standalone BNs which are not folded + bn_converted = convert_standalone_batchnorms(after_fold_sess, input_op_names, output_op_names, bns_to_fold) + if bn_converted: + logger.info("%d BatchNorms' weights got converted", len(bn_converted)) + + # we edited the graph, so we should load and save for the metagraph associated with the session to be updated + after_fold_sess = save_and_load_graph('./temp_bn_fold', after_fold_sess) + + return after_fold_sess, pairs_to_return
+ + +def convert_standalone_batchnorms(sess, input_op_names: Union[str, List[str]], + output_op_names: Union[str, List[str]], bns_folded: List) -> List[tf.Operation]: + + """ + Converts the weights of standalone batch norms remaining in the model after BN folding. + + :param sess: TF session in which the graph is loaded + :param input_op_names: Name of the starting op in the given graph or a list of names in case of multi-input model + :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops + (to ignore training ops for example). If None, all ops in the model are considered valid. + :param bns_folded: list of batch norms which got folded + :return: list of BatchNorms whose weights is converted + """ + + list_of_ordered_ops = get_ordered_ops(sess.graph, input_op_names, output_op_names) + + converted_bns = [] + # look for bn layers which are not folded + for op in list_of_ordered_ops: + if op.type in ['FusedBatchNormV3', 'FusedBatchNorm', 'BatchNormalization'] and op not in bns_folded: + convert_batchnorm_parameters(sess, op) + converted_bns.append(op) + logger.debug("%s weights got converted", op) + return converted_bns + + +def convert_batchnorm_parameters(sess, op): + """ + Convert the weights of BN such that it works as y = weights * x + bias + + :param sess: TF Session in which the graph is loaded + :param op: bn_op which whose weights need to be converted + """ + bn_params = _get_bn_params(sess, op) + weight = np.array(bn_params.gamma) / np.array(bn_params.runningVar) + bias = np.array(bn_params.beta) - np.array(bn_params.runningMean) * weight + BNUtils.modify_bn_params_to_weight_bias_form(sess, op, weight, bias) + + +
[docs]def fold_all_batch_norms_to_scale(sim: QuantizationSimModel, + starting_op_names: List[str], + output_op_names: List[str]): + """ + Fold all batch_norm layers in a model into the quantization scale parameter + of the corresponding conv layers + + :param sim: tf quantized model + :param starting_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + """ + assert sim.session is not None + assert sim.connected_graph is not None + + connected_graph = sim.connected_graph + bn_conv_linear_pairs, _ = _find_all_batch_norms_to_fold(connected_graph, starting_op_names, output_op_names) + _fold_given_auto_selected_batch_norms_scale(sim, bn_conv_linear_pairs)
+ + +def _fold_given_auto_selected_batch_norms_scale(sim: QuantizationSimModel, layer_pairs: List[PairType]): + """ + Fold a given set of batch_norm layers into conv layers. + + NOTE: Need to retrieve operation(s) by name since TensorFlow graph associated with Connected graph + and sim.session are different (after save and load step). + + :param sim: QuantizationSimModel object. + :param layer_pairs pairs of conv and bn layers. + """ + sess = sim.session + with sess.graph.as_default(): + for pair in layer_pairs: + conv_linear, bn, fold_backward = pair + + bn_tf_op = sess.graph.get_operation_by_name(bn.op.name) + assert bn_tf_op.type in ['FusedBatchNormV3', 'Identity'], "Only Fused BN is supported." + bn_params = _get_bn_params(sess, bn_tf_op) + + conv_linear_tf_op = sess.graph.get_operation_by_name(conv_linear.name) + is_bias_valid = False + if not BiasUtils.is_bias_none(conv_linear_tf_op): + is_bias_valid = True + + # _fold_to_weight() using FP32 weights and bias (if exists). + weight_tensor = _get_weight_tensor_transpose_reshape(sess, conv_linear_tf_op) + bias_tensor = _get_bias_tensor(sess, conv_linear_tf_op) + bias = libpymo.fold(bn_params, weight_tensor, bias_tensor, is_bias_valid, fold_backward) + # converting back to TF format [kh, kw, Nic, Noc] before updating weight tensor value + if conv_linear_tf_op.type == 'DepthwiseConv2dNative': + # Depthwise conv layers in TF have outputs(Noc) set to 1. + # we send in format [Nic, Noc, kh, kw] + numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 0, 1)) + elif conv_linear_tf_op.type == 'MatMul': + # o, i - convert to i, o + numpy_weight_reshaped = np.reshape(weight_tensor.data, + [weight_tensor.shape[0], weight_tensor.shape[1]]).transpose((1, 0)) + else: + # conv2D case + # we sent in format [Noc, Nic, kh, kw] + numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 1, 0)) + WeightTensorUtils.update_tensor_for_op(sess, conv_linear_tf_op, numpy_weight_reshaped) + BiasUtils.update_bias_for_op(sess, conv_linear_tf_op, np.reshape(bias, [weight_tensor.shape[0]])) + + # fold to scale + conv_linear_w_quantizer, conv_linear_a_quantizer, bn_a_quantizer = \ + _find_quantizers(sim, conv_linear_tf_op, bn_tf_op, is_bias_valid) + _fold_pair_scale(conv_linear_w_quantizer, conv_linear_a_quantizer, bn_a_quantizer, bn_params) + + # remove bn op + _delete_bn_from_model(sess, bn, is_bias_valid) + + # we edited the graph, so we should load and save for the metagraph associated with the session to be updated + updated_sess = save_and_load_graph('./temp_bn_fold_to_scale', sess) + sim.session = updated_sess + + +def _delete_bn_from_model(sess: tf.compat.v1.Session, + bn_op: OpWithMetaInfoType, + is_bias_valid: bool): + """ + Delete BN and BN_quantized ops from the session.graph. + If BN's previous conv doesn't have bias, is_bias_valid must + be False. In that case, need to find the correct BN's input tensor. + + Note: supports only Fused BN op types (FusedBatchNormV3, Identity). + + :param sess: TensorFlow session. + :param bn_op: BN op with meta info. + :param is_bias_valid: False if BN's preceding Conv doesn't have bias, True otherwise. + """ + bn_tf_op = sess.graph.get_operation_by_name(bn_op.op.name) + bn_in_tensor = sess.graph.get_tensor_by_name(bn_op.in_tensor.name) + bn_out_tensor = sess.graph.get_tensor_by_name(bn_op.out_tensor.name) + + # Find BNs correct input tensor. + if not is_bias_valid: + # bias was not present and was added between conv and quant op + bn_in_tensor = bn_in_tensor.consumers()[0].outputs[0].consumers()[0].outputs[0] + else: + bn_in_tensor = bn_in_tensor.consumers()[0].outputs[0] + assert bn_in_tensor.op.type == 'QcQuantize', 'BNs preceding op must be of type QcQuantize.' + + # Find BNs correct output tensor. + bn_out_tensor = bn_out_tensor.consumers()[0].outputs[0] + assert bn_out_tensor.op.type == 'QcQuantize', 'BNs output op must be of type QcQuantize.' + + # Detach BN and following BN_quantized ops from the graph. + BNUtils.skip_bn_op(sess, bn_tf_op, bn_in_tensor, bn_out_tensor) + + +def _fold_pair_scale(conv_linear_w_quantizer: QuantizerInfo, + conv_linear_a_quantizer: QuantizerInfo, + bn_a_quantizer: QuantizerInfo, + bn_params: libpymo.BNParams): + """ + Fold a batch_norm layer into conv_linear's scale + + :param conv_linear_w_quantizer: conv or Linear op weight quantizer. + :param conv_linear_a_quantizer: conv or Linear op activation quantizer + :param bn_a_quantizer: BN op activation quantizer + :param bn_params: bn_params + """ + if all(quantizer is None for quantizer in [conv_linear_w_quantizer, conv_linear_a_quantizer, bn_a_quantizer]): + raise RuntimeError + + encodings = conv_linear_w_quantizer.get_encoding() + if encodings is None: + raise RuntimeError + + if isinstance(encodings, libpymo.TfEncoding): + encodings = [encodings] + + gamma = np.array(bn_params.gamma) + sigma = np.array(bn_params.runningVar) + + new_encodings = [] + for old_encoding, c in zip(encodings, gamma/sigma): + new_encoding = libpymo.TfEncoding() + new_encoding.bw = old_encoding.bw + new_encoding.offset = old_encoding.offset + new_encoding.delta = old_encoding.delta * abs(c) + new_encoding.min, new_encoding.max = \ + compute_min_max_given_delta_offset(new_encoding.delta, + new_encoding.offset, + new_encoding.bw, + conv_linear_w_quantizer.use_symmetric_encoding, + conv_linear_w_quantizer.use_strict_symmetric) + new_encodings.append(new_encoding) + + conv_linear_w_quantizer.set_encoding(new_encodings) + + # Copy batchnorm's output quantizers to conv output quantizers + conv_linear_a_quantizer.enabled = bn_a_quantizer.enabled + + if bn_a_quantizer.get_encoding() is not None: + encoding = libpymo.TfEncoding() + bn_encoding = bn_a_quantizer.get_encoding() + encoding.delta = bn_encoding.delta + encoding.max = bn_encoding.max + encoding.min = bn_encoding.min + encoding.offset = bn_encoding.offset + encoding.bw = bn_encoding.bw + conv_linear_a_quantizer.set_op_mode(int(libpymo.TensorQuantizerOpMode.quantizeDequantize)) + conv_linear_a_quantizer.set_encoding(encoding) + + bn_a_quantizer.enabled = False + + +def _find_all_batch_norms_to_fold(conn_graph: ConnectedGraph, + start_op_names: List[str], + output_op_names: List[str], + return_bn_conn_op: bool = False) -> Tuple[List, Set]: + """ + Find all possible batch norm layers that can be folded. And returns a list of pairs such that (bn, layer) + means bn will be forward-folded into layer and (layer, bn) means bn will be backward-folded into layer + + :param conn_graph: Connected graph associated with the model. + :param start_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :param return_bn_conn_op: Return bn op as connected graph op instead of tf tensor if True. + :return: A list of (layer, bn) pairs and a list of (bn, layer) pairs, + where `bn` can be folded into to `layer', + A set of bn ops which can be folded. + """ + conv_linear_bn_activation_info_dict = _find_conv_bn_pairs(conn_graph) + + # get all ordered conv/linear ops + ordered_conv_linear_op = get_ordered_conv_linears(conn_graph.graph, start_op_names, output_op_names) + + # get the in out tensor for bns found, we need this on TF to remove the bns after fold. + bn_conv_linear_pairs = [] + + # track BNs added for fold + bn_picked_for_folding = set() + + for conv_linear_op in ordered_conv_linear_op: + if conv_linear_op in conv_linear_bn_activation_info_dict.keys(): + bn_info = conv_linear_bn_activation_info_dict[conv_linear_op] + if bn_info.output_bn: + if bn_info.output_bn not in bn_picked_for_folding: + fold_backward = True + if return_bn_conn_op: + bn_conv_linear_pairs.append((conv_linear_op, bn_info.output_bn, fold_backward)) + else: + bn_conv_linear_pairs.append((conv_linear_op, bn_info.output_bn.get_tf_op_with_io_tensor(), + fold_backward)) + bn_picked_for_folding.add(bn_info.output_bn) + elif bn_info.input_bn: + if bn_info.input_bn not in bn_picked_for_folding: + fold_backward = False + if return_bn_conn_op: + bn_conv_linear_pairs.append((conv_linear_op, bn_info.input_bn, fold_backward)) + else: + bn_conv_linear_pairs.append((conv_linear_op, bn_info.input_bn.get_tf_op_with_io_tensor(), + fold_backward)) + bn_picked_for_folding.add(bn_info.input_bn) + return bn_conv_linear_pairs, bn_picked_for_folding + + +def _find_quantizers(sim: QuantizationSimModel, + conv_linear_tf_op: tf.Operation, + bn_tf_op: tf.Operation, + is_bias_valid: bool) -> Tuple[QuantizerInfo, QuantizerInfo, QuantizerInfo]: + """ + Find quantizers. + + :param sim: QuantizationSimModel object + :param conv_linear_tf_op: Conv/Linear tf operation. + :param bn_tf_op: BN tf operation + :param is_bias_valid: is bias valid. + :return: conv/linear weight quantizer, conv/linear activation quantizer, bn activation quantizer. + """ + if is_bias_valid: + bias_add_op = conv_linear_tf_op.outputs[0].consumers()[0] + assert bias_add_op.type == 'BiasAdd' + conv_linear_a_quantizer_op = bias_add_op.outputs[0].consumers()[0] + assert conv_linear_a_quantizer_op.type == 'QcQuantize' + conv_linear_a_quantizer_name = conv_linear_a_quantizer_op.name + else: + next_op = conv_linear_tf_op.outputs[0].consumers()[0] + if next_op.type == 'BiasAdd': # did bias get added between conv -> quant op? + next_op = next_op.outputs[0].consumers()[0] + assert next_op.type == 'QcQuantize' + conv_linear_a_quantizer_name = next_op.name + + bn_a_quantizer_name = bn_tf_op.name + "_quantized" + conv_linear_w_quantizer_name = conv_linear_tf_op.inputs[1].op.inputs[0].op.name + "_quantized" + + conv_linear_w_quantizer = sim.quantizer_config(conv_linear_w_quantizer_name) + conv_linear_a_quantizer = sim.quantizer_config(conv_linear_a_quantizer_name) + bn_a_quantizer = sim.quantizer_config(bn_a_quantizer_name) + + return conv_linear_w_quantizer, conv_linear_a_quantizer, bn_a_quantizer +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/bias_correction.html b/releases/1.32.2/_modules/aimet_tensorflow/bias_correction.html new file mode 100644 index 0000000..bccf6e5 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/bias_correction.html @@ -0,0 +1,1704 @@ + + + + + + aimet_tensorflow.bias_correction — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.bias_correction

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019-2021, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Code to perform bias correction for layers """
+
+from typing import List, Union, Tuple, Dict
+import numpy as np
+import tensorflow as tf
+
+import aimet_common.libpymo as libpymo
+from aimet_common.bias_correction import ConvBnInfoType
+from aimet_common.defs import ActivationType, QuantScheme
+from aimet_common.utils import AimetLogger
+from aimet_common.graph_searcher import GraphSearcher
+from aimet_common.bias_correction import ConvBnPatternHandler
+from aimet_common.graph_pattern_matcher import PatternType
+
+from aimet_tensorflow.quantsim import QuantizationSimModel
+from aimet_tensorflow.utils.graph_saver import save_model_to_meta, save_and_load_graph, load_model_from_meta
+from aimet_tensorflow.utils.common import create_input_feed_dict, iter_first_x, get_ordered_conv_linears
+from aimet_tensorflow.utils.op.fusedbatchnorm import BNUtils
+from aimet_tensorflow.utils.op.conv import get_weight_tensor_with_shape, BiasUtils
+from aimet_tensorflow.common.connectedgraph import ConnectedGraph
+
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+
+
[docs]class QuantParams: + """ + Quant Params to be passed in by user + + """ + + def __init__(self, + quant_mode='tf_enhanced', + round_mode='nearest', + use_cuda=True, + ops_to_ignore=None): + """ + Constructor + + :param quant_mode: Indicates which quantization algorithm should be used, either + 'tf' or 'tf_enhanced'. Defaults to 'tf_enhanced' + :param round_mode: The round scheme to used. One of: 'nearest' or 'stochastic'. Default is 'nearest'. + :param use_cuda: flag to indicate if GPU is to be used + :param ops_to_ignore: ops to be ignored + """ + self.quant_mode = quant_mode + self.round_mode = round_mode + self.ops_to_ignore = ops_to_ignore + self.use_cuda = use_cuda
+ + +
[docs]class BiasCorrectionParams: + """ + Input for bias correction to be passed by the user + + :param batch_size: input batch size to be used + :param num_quant_samples: samples to be used for quantization + :param num_bias_correct_samples: samples to be used for bias correction + :param input_op_names: list of input op names of the given model + :param output_op_names: list of output op names of the given model + + """ + + def __init__(self, + batch_size: int, + num_quant_samples: int, + num_bias_correct_samples: int, + input_op_names: List[str], + output_op_names: List[str]): + + self.batch_size = batch_size + self.num_quant_samples = num_quant_samples + self.num_bias_correct_samples = num_bias_correct_samples + self.input_op_names = input_op_names + self.output_op_names = output_op_names
+ + +class BiasCorrection: + """ + class for bias correction in tensorflow + """ + + @staticmethod + def _get_output_data(sess: tf.compat.v1.Session, input_op_names: List[str], output_op_name: str, + batch_data: Union[np.ndarray, Tuple[np.ndarray], List[np.ndarray]]) -> np.ndarray: + """ + Function to get output values of a layer + :param sess: tf.compat.v1.Session containing the layer to evaluate + :param input_op_names: List of names of input ops to the session graph + :param output_op_name: Name of the output layer to evaluate + :param batch_data: Batch of data to feed into model input + :return: Output of layer for all batches of images + """ + + feed_dict = create_input_feed_dict(sess.graph, input_op_names, batch_data) + tf_op = sess.graph.get_operation_by_name(output_op_name) + assert tf_op.outputs + assert tf_op.outputs[0].consumers() + assert tf_op.outputs[0].consumers()[0].outputs + biasadd_tensor = tf_op.outputs[0].consumers()[0].outputs[0] # Replace with a get BiasAdd utils later + output_data = sess.run(biasadd_tensor, feed_dict=feed_dict) + return output_data + + @staticmethod + def _call_mo_correct_bias(corrected_model: tf.compat.v1.Session, layer_name: str, + bias_correction: libpymo.BiasCorrection, + bias_shape: int, is_bias_none: bool): + """ + helper to perform bias correction using cpp backend + :param corrected_model: active tensorflow session with corrected model as tf.compat.v1.Session + :param layer_name: name of the layer to be bias corrected + :param bias_correction: bias correction inputs + :param bias_shape: shape of bias associated with the layer + :param is_bias_none: True if bias for a layer is None + :return: None, updates bias for the given layer + """ + + bias_tensor = libpymo.TensorParamBiasCorrection() + + layer_to_be_corrected = corrected_model.graph.get_operation_by_name(layer_name) + + with corrected_model.graph.as_default(): + assert(layer_to_be_corrected.type in ['Conv2D', 'DepthwiseConv2dNative', 'MatMul']) + + if is_bias_none: + bias_tensor.data = np.zeros(bias_shape) + else: + # read bias from given op + bias_tensor.data = BiasUtils.get_bias_as_numpy_data(corrected_model, layer_to_be_corrected) + + # perform bias correction + bias_correction.correctBias(bias_tensor) + + # this api updates bias or adds bias add to layer if not present + BiasUtils.update_bias_for_quantized_op(corrected_model, layer_to_be_corrected, np.array(bias_tensor.data), + is_bias_none) + + @staticmethod + def _get_quantized_model(corrected_model: tf.compat.v1.Session, quant_params: QuantParams, input_op_names: List[str], + output_op_names: List[str], num_quant_samples: int, batch_size: int, + data_set: tf.data.Dataset) -> QuantizationSimModel: + """ + api to get quantized session + :param corrected_model: active tensorflow session with corrected model as tf.compat.v1.Session + :param quant_params: quantization params from user + :param input_op_names: names of the input nodes of the given model + :param output_op_names: names of the output nodes of the given model + :param num_quant_samples: number of dataset samples to use during quantization + :param batch_size: batch size to use for dataset samples + :return: quantized sim model + """ + + def bias_correction_callback(session: tf.compat.v1.Session, iterations: int): + dataset_samples_quant_itr = iter_first_x(data_set, iterations) + output_ops = [] + for output_op_name in output_op_names: + output_ops.append(session.graph.get_operation_by_name(output_op_name)) + for data in dataset_samples_quant_itr: + feed_dict = create_input_feed_dict(session.graph, input_op_names, data) + for output_op in output_ops: + output_op.outputs[0].eval(session=session, feed_dict=feed_dict) + + save_model_to_meta(corrected_model, './bias_correction/temp') + + # Allocate the quantizer and quantize the network using the default 8 bit params/activations + quantsim = QuantizationSimModel(corrected_model, input_op_names, output_op_names, + quant_params.quant_mode, quant_params.round_mode) + + # Disable all output quantizers + # pylint:disable = protected-access + for quantize_op in quantsim._activation_quantizers: + if quantsim._activation_quantizers[quantize_op].enabled: + quantsim._activation_quantizers[quantize_op].enabled = False + + n_batches_quantization = int(np.ceil(num_quant_samples / batch_size)) + quantsim.compute_encodings(bias_correction_callback, forward_pass_callback_args=n_batches_quantization) + + return quantsim + + + # pylint: disable=too-many-locals + @staticmethod + def bias_correction_per_layer(reference_model: tf.compat.v1.Session, + corrected_model: tf.compat.v1.Session, + bias_correct_params: BiasCorrectionParams, + layer_name_to_be_corrected: str, + data_set: tf.data.Dataset) -> tf.compat.v1.Session: + """ + Helper function to perform empirical bias correction per layer. + + :param reference_model: active tensorflow session for reference model + :param corrected_model: active tensorflow session for corrected model + :param bias_correct_params: bias correction params + :param layer_name_to_be_corrected: name of layer on which bias correction is to be performed + :param quant_params: Quantization specific params from user + :return: None, updates corrected model in-place. + + """ + + ref_layer = reference_model.graph.get_operation_by_name(layer_name_to_be_corrected) + + bias_correction = libpymo.BiasCorrection() + logger.info('Correcting layer %s', ref_layer.name) + + n_batches_bias_correction = int(np.ceil(bias_correct_params.num_bias_correct_samples / + bias_correct_params.batch_size)) + + reduced_dataset_iter = iter_first_x(data_set, n_batches_bias_correction) + + for batch_input in reduced_dataset_iter: + # reference model without corrected nodes + reference_output_batch = BiasCorrection._get_output_data(reference_model, + bias_correct_params.input_op_names, + ref_layer.name, + batch_input) + + quantized_model_output_batch = BiasCorrection._get_output_data(corrected_model, + bias_correct_params.input_op_names, + ref_layer.name, + batch_input) + + + + if ref_layer.type == 'MatMul': + extended_shape = np.concatenate((reference_output_batch.shape, np.array([1, 1]))) + reference_output_batch = reference_output_batch.reshape(extended_shape) + quantized_model_output_batch = quantized_model_output_batch.reshape(extended_shape) + + # we need to reshape from tensorflow shape NxHxWxC to NxCxHxW + bias_correction.storePreActivationOutput(np.ascontiguousarray(reference_output_batch.transpose(0, 3, 1, 2))) + bias_correction.storeQuantizedPreActivationOutput(np.ascontiguousarray( + quantized_model_output_batch.transpose(0, 3, 1, 2))) + + bias_shape = None + is_bias_none = False + # get shape for bias if the layer does not have bias + if BiasUtils.is_bias_none(ref_layer): + is_bias_none = True + if ref_layer.type == 'MatMul': + bias_shape = reference_output_batch.shape[1] + elif ref_layer.type in ['Conv2D', 'DepthwiseConv2dNative']: + # for conv2d or depthwise conv2d + bias_shape = reference_output_batch.shape[3] + + # bias is to be corrected in the corrected model graph + BiasCorrection._call_mo_correct_bias(corrected_model, ref_layer.name, bias_correction, bias_shape, + is_bias_none) + + logger.info('Completed empirical bias correction for layer %s', ref_layer.name) + + @staticmethod + def _get_quantized_weights(weight_tensor, quant_params): + """ + helper function to get quantized dequantized weights + :param weight_tensor: weight tensor + :param quant_params: quantization params such as mode, rounding etc + :return: quantized de-quantized weight tensor + """ + + q_wt_tensor = weight_tensor + + quant_mode = libpymo.QuantizationMode.QUANTIZATION_TF_ENHANCED + if quant_params.quant_mode == QuantScheme.post_training_tf or quant_params.quant_mode == 'tf': + quant_mode = libpymo.QuantizationMode.QUANTIZATION_TF + + round_mode = libpymo.RoundingMode.ROUND_NEAREST + if quant_params.round_mode == 'stochastic': + round_mode = libpymo.RoundingMode.ROUND_STOCHASTIC + + bitwidth = 8 + + # use tensorQuantizerForPython to get quantizeDequantize weights + encoding_analyzer = libpymo.EncodingAnalyzerForPython(quant_mode) + encoding_analyzer.updateStats(weight_tensor, quant_params.use_cuda) + encoding, is_encoding_valid = encoding_analyzer.computeEncoding(bitwidth, False, False, False) + + if is_encoding_valid: + tensor_quantizer = libpymo.TensorQuantizationSimForPython() + q_wt_tensor = tensor_quantizer.quantizeDequantize(weight_tensor, encoding, round_mode, quant_params.use_cuda) + + return q_wt_tensor + + + @staticmethod + def _get_conv_linear_params(model, layer_to_be_corrected): + """ + Extract weights and bias of given conv/linear layer + :param model: tf.compat.v1.Session type + :param layer_to_be_corrected: conv/linear layer as tf.Operation + :return: bias, weight and quantized weights as TensorParamBiasCorrection types + """ + + bias_tensor = libpymo.TensorParamBiasCorrection() + + # get weight tensor + weight_tensor, _ = get_weight_tensor_with_shape(model, layer_to_be_corrected) + + if weight_tensor is None: + logger.error('Weight tensor extraction failed for layer {%s}', layer_to_be_corrected.name) + + bias_tensor.data = BiasUtils.get_bias_as_numpy_data(model, layer_to_be_corrected) + bias_tensor.shape = BiasUtils.get_shape(layer_to_be_corrected) + + return bias_tensor, weight_tensor + + @staticmethod + def _get_bn_params(model, bn_layer) -> libpymo.BnParamsBiasCorr(): + """ + get bn params for bn based bias correction + :param model: tf.compat.v1.Session type + :param bn_layer: tf.Operation type + :return: bn params as libpymo.BnParamsBiasCorr() type + """ + + bn_params = libpymo.BnParamsBiasCorr() + bn_params.beta = BNUtils.get_beta_as_numpy_data(model, bn_layer).reshape(-1) + bn_params.gamma = BNUtils.get_gamma_as_numpy_data(model, bn_layer).reshape(-1) + + return bn_params + + @staticmethod + def analytical_bias_correction_per_layer(corrected_model: tf.compat.v1.Session, layer: tf.Operation, + preceeding_bn_layer_info: ConvBnInfoType, quant_params: QuantParams, + is_first_conv: bool = False) -> tf.compat.v1.Session: + """ + Perform bn based bias correction (analytical bc). + + :param corrected_model: active tensorflow session for corrected model + :param layer: conv/linear layer to be corrected + :param preceeding_bn_layer_info: corresponding preceeding bn/ activation info + :param quant_params: Quantization specific params from user + :param is_first_conv: flag to indicate if it's the first conv layer + :return: None, updates corrected_model in place + + """ + + layer = corrected_model.graph.get_operation_by_name(layer.name) + # get bn param and quantized weights from conv for this layer + bias_tensor, weight_tensor = BiasCorrection._get_conv_linear_params(corrected_model, layer) + quantized_weight = BiasCorrection._get_quantized_weights(weight_tensor, quant_params) + + bn_params = libpymo.BnParamsBiasCorr() + activation_type = libpymo.ActivationType.noActivation + + if preceeding_bn_layer_info: + input_tf_bn_op_name = preceeding_bn_layer_info.input_bn.get_module().name + bn_op = corrected_model.graph.get_operation_by_name(input_tf_bn_op_name) + bn_params = BiasCorrection._get_bn_params(corrected_model, bn_op) + if preceeding_bn_layer_info.in_activation_type == ActivationType.relu: + activation_type = libpymo.ActivationType.relu + elif preceeding_bn_layer_info.in_activation_type == ActivationType.relu6: + activation_type = libpymo.ActivationType.relu6 + elif preceeding_bn_layer_info.in_activation_type == ActivationType.no_activation: + activation_type = libpymo.ActivationType.noActivation + else: + assert(0, 'Unknown activation type', preceeding_bn_layer_info.in_activation_type) + else: + if is_first_conv: + # for the first conv layer case, we use gamma = 1 and beta = 0 + shape = weight_tensor.shape[1] + bn_params.gamma = np.ones(shape) + bn_params.beta = np.zeros(shape) + else: + assert 0, "layer info is None and is not first conv layer" + + # need to invoke cpp api for bn based bias correction + biasCorrection = libpymo.BnBasedBiasCorrection() + + biasCorrection.correctBias(bias_tensor, quantized_weight, weight_tensor, bn_params, activation_type) + + # this api updates bias or adds bias add to layer if not present + layer = corrected_model.graph.get_operation_by_name(layer.name) + BiasUtils.update_bias_for_quantized_op(corrected_model, layer, np.array(bias_tensor.data)) + logger.info('Completed analytical bias correction for layer %s', layer.name) + + @staticmethod + def _conv_bn_select_custom_pattern_init(): + """ + initialize the patterns we want to use to pick layers for bn based bias correction. + :return: patterns and associated actions to be performed upon match + """ + + patterns_with_callbacks = [] + + # the types we want to handle + conv_layer_types = ['Conv2D', 'DepthwiseConv2dNative'] + activation_types = ['Relu', 'Relu6'] + + # add the patterns we are interested in along with a handler + layer_select_handler = ConvBnPatternHandler() + + # conv layer combinations + for conv in conv_layer_types: + + for activation in activation_types: + patterns_with_callbacks.append(PatternType(pattern=['FusedBatchNormV3', activation, conv], + action=layer_select_handler)) + + patterns_with_callbacks.append(PatternType(pattern=['FusedBatchNormV3', conv], + action=layer_select_handler)) + + return patterns_with_callbacks, layer_select_handler + + @staticmethod + def find_all_convs_bn_with_activation(model, start_op_names: Union[List[str], str], + output_op_names: Union[List[str], str]): + """ + uses searcher to choose convs/ linears with bn and activation info. + :param model: tf.compat.v1.Session type + :param start_op_names: list of strings with names of starting ops in the model + :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops + (to ignore training ops for example). + :return: dictionary of conv/linear layers with associated bn op / activation info + """ + + if isinstance(start_op_names, str): + start_op_names = [start_op_names] + + if isinstance(output_op_names, str): + output_op_names = [output_op_names] + + conn_graph = ConnectedGraph(model.graph, start_op_names, output_op_names) + + # create a list of patterns and corresponding handlers or actions to be applied for selecting + # layers for bias correction. + # layer_select_handler is an instance of custom handler created for bias correction. + patterns_with_callback, layer_select_handler = BiasCorrection._conv_bn_select_custom_pattern_init() + + # graph searcher looks for patterns and applies actions when matching patterns are found + graph_searcher = GraphSearcher(conn_graph, patterns_with_callback) + graph_searcher.find_all_patterns_in_graph_apply_actions() + + # use custom handler instance and fetch the selected layer info for bias correction + convs_bn_activation_info_dict = layer_select_handler.get_conv_linear_bn_info_dict() + + return convs_bn_activation_info_dict + + @staticmethod + def refresh_op_ref(sess, conv_bn_dict): + """ + Updates the conv op references saved in user passed in conv bn dictionary. + + :param reference_model: active tf.compat.v1.Session for the model. + :param conv_bn_dict: Dict of conv and bn with activation info + :return: dict of conv and bn with updated conv references + + """ + conv_linears_with_bn_dict = {} + for conv in conv_bn_dict.keys(): + refreshed_conv = sess.graph.get_operation_by_name(conv.name) + bn_activation_info = conv_bn_dict[conv] + conv_linears_with_bn_dict[refreshed_conv] = bn_activation_info + + return conv_linears_with_bn_dict + + @staticmethod + def correct_bias(reference_model: tf.compat.v1.Session, bias_correct_params: BiasCorrectionParams, + quant_params: QuantParams, data_set: tf.data.Dataset, + conv_bn_dict: Union[Dict[tf.Operation, ConvBnInfoType], None] = None, + perform_only_empirical_bias_corr: bool = True): + """ + Top level function for bias correction + + :param reference_model: active tf.compat.v1.Session for the model to be corrected. + :param bias_correct_params: input params for bias correction + :param quant_params: QuantParams type with params for quantization simulation for bias correction. + :param data_set: input data set + :param conv_bn_dict: 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. + :param perform_only_empirical_bias_corr: a flag to indicate only empirical bias correction is to be performed. + :return: updated session with corrected bias for given ops + + """ + + # one time initialization of all layers with bias param + reference_model = BiasUtils.initialize_model_with_bias(reference_model, bias_correct_params.input_op_names, + bias_correct_params.output_op_names) + + # Create a copy of the model as reference model + corrected_model = save_and_load_graph('./temp_meta_path', reference_model) + + # get all ordered convs/ linears and skip gradient ops + ordered_conv_linears = get_ordered_conv_linears(reference_model.graph, bias_correct_params.input_op_names, + bias_correct_params.output_op_names) + + # Get conv2D, depthwise with preceding BN ops info for analytical bias correction + # if user has not passed any dictionary + if conv_bn_dict is None: + convs_bn_activation_info_dict = BiasCorrection.find_all_convs_bn_with_activation(reference_model, + bias_correct_params.input_op_names, + bias_correct_params.output_op_names) + else: + convs_bn_activation_info_dict = BiasCorrection.refresh_op_ref(reference_model, conv_bn_dict) + + # Quantize model + quantsim = BiasCorrection._get_quantized_model(corrected_model, quant_params, + bias_correct_params.input_op_names, + bias_correct_params.output_op_names, + bias_correct_params.num_quant_samples, + bias_correct_params.batch_size, + data_set) + + # Perform analytical bias correction for first conv layer + # we always perform empirical bias correction for linear layers + if ordered_conv_linears: + if not perform_only_empirical_bias_corr and ordered_conv_linears[0].type not in ['MatMul']: + first_conv = ordered_conv_linears.pop(0) + BiasCorrection.analytical_bias_correction_per_layer(quantsim.session, + first_conv, + None, + quant_params, + is_first_conv=True) + + # for each candidate layer in an ordered list of conv/lieanr ops + # find the corresponding bn and activation info + for layer in ordered_conv_linears: + + # if this layer is in selected patterns of convs with preceding BN op and + # if empirical flag is false + # perform analytical Bias correction + if layer in convs_bn_activation_info_dict.keys() and not perform_only_empirical_bias_corr: + + preceding_bn_layer_info = convs_bn_activation_info_dict[layer] + + BiasCorrection.analytical_bias_correction_per_layer(quantsim.session, + layer, + preceding_bn_layer_info, + quant_params) + else: + # stand-alone convs/ linears or when perform_only_empirical_bias_corr is set to True + # perform empirical bias correction + BiasCorrection.bias_correction_per_layer(reference_model, + quantsim.session, + bias_correct_params, + layer.name, + data_set) + logger.info('Completed bias correction') + # Remove quantization nodes and save bias correction model + # pylint:disable = protected-access + quantsim._remove_quantization_nodes_and_save_graph('./temp_meta_path', 'bias_corrected_model') + corrected_model = load_model_from_meta(meta_path=str('./temp_meta_path' + '/' + 'bias_corrected_model' + + '.meta')) + return corrected_model +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/bn_reestimation.html b/releases/1.32.2/_modules/aimet_tensorflow/bn_reestimation.html new file mode 100644 index 0000000..8cc9bc3 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/bn_reestimation.html @@ -0,0 +1,1405 @@ + + + + + + aimet_tensorflow.bn_reestimation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.bn_reestimation

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+"""BatchNorm Re-estimation"""
+
+from typing import List, Tuple, Dict
+import numpy as np
+import tensorflow as tf
+
+from aimet_common.utils import Handle, AimetLogger
+from aimet_tensorflow.utils.op.fusedbatchnorm import BNUtils
+from aimet_tensorflow.common.graph_eval import initialize_uninitialized_vars
+from aimet_tensorflow.quantsim import QuantizationSimModel
+from aimet_tensorflow.utils.common import create_input_feed_dict, iterate_tf_dataset
+from aimet_tensorflow.utils.op.bn_mutable import get_active_bn_ops
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+# pylint: disable=too-many-locals
+def _get_all_tf_bn_vars_list(sim: QuantizationSimModel) -> Tuple[List[tf.Variable],
+                                                                 List[tf.Variable],
+                                                                 List[tf.Variable],
+                                                                 List[tf.Variable]]:
+    """
+    find tf variables list to access BNs mean, variance, momentum and is_training
+
+    :param sim: tf quantized model
+    :return: tf.variable lists to access bn layers's mean, var, momentum, is_training
+    """
+    conn_graph = sim.connected_graph
+    bn_conn_graph_ops = tuple(get_active_bn_ops(conn_graph))
+
+    with sim.session.graph.as_default():
+        tf_global_vars = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.GLOBAL_VARIABLES)
+
+    mean_tf_var_names = []
+    variance_tf_var_names = []
+    is_training_tf_var_names = []
+    momentum_tf_var_names = []
+
+    for bn_conn_graph_op in bn_conn_graph_ops:
+        tf_op = bn_conn_graph_op.internal_ops[0]
+        assert tf_op.type in ['Identity'], 'Fused Batch Norm with training tensor is only supported.'
+        bn_mean_tf_var_name = tf_op.inputs[0].op.inputs[3].name
+        bn_var_tf_var_name = tf_op.inputs[0].op.inputs[4].name
+
+        bn_cond_1_tf_op = BNUtils.get_cond_1_identity_op(tf_op)
+        bn_momentum_tf_var_name = bn_cond_1_tf_op.inputs[0].op.inputs[1].name
+        bn_training_tf_var_name = tf_op.inputs[0].op.inputs[0].op.inputs[0].name
+
+        mean_tf_var_names.append(bn_mean_tf_var_name)
+        variance_tf_var_names.append(bn_var_tf_var_name)
+        momentum_tf_var_names.append(bn_momentum_tf_var_name)
+        is_training_tf_var_names.append(bn_training_tf_var_name)
+
+    mean_tf_vars = []
+    variance_tf_vars = []
+    is_training_tf_vars = []
+    momentum_tf_vars = []
+
+    for v in tf_global_vars:
+        if v.name in mean_tf_var_names:
+            mean_tf_vars.append(v)
+
+        if v.name in variance_tf_var_names:
+            variance_tf_vars.append(v)
+
+        if v.name in momentum_tf_var_names:
+            momentum_tf_vars.append(v)
+
+        if v.name in is_training_tf_var_names:
+            is_training_tf_vars.append(v)
+
+    return mean_tf_vars, variance_tf_vars, momentum_tf_vars, is_training_tf_vars
+
+
+def _reset_bn_stats(sess: tf.compat.v1.Session,
+                    bn_mean_checkpoints: Dict[tf.Variable, np.ndarray],
+                    bn_variance_checkpoints: Dict[tf.Variable, np.ndarray]) -> Handle:
+    """
+    Reset all BNs statistics to the initial values.
+
+    :param sess: tf session
+    :param bn_mean_checkpoints: Dict for original BN mean
+    :param bn_variance_checkpoints: Dict for original BN variance
+    :return: Handle that restores the original BN statistics upon handle.remove().
+    """
+    def cleanup():
+        """
+        Restore all BNs stats
+        """
+        with sess.graph.as_default():
+            sess.run([tf.compat.v1.assign(v, bn_mean_checkpoints[v]) for v in bn_mean_checkpoints])
+            sess.run([tf.compat.v1.assign(v, bn_variance_checkpoints[v]) for v in bn_variance_checkpoints])
+
+    try:
+        with sess.graph.as_default():
+            sess.run([tf.compat.v1.assign(v, np.zeros(v.shape, dtype=v.dtype.as_numpy_dtype))
+                      for v in bn_mean_checkpoints])
+            sess.run([tf.compat.v1.assign(v, np.ones(v.shape, dtype=v.dtype.as_numpy_dtype))
+                      for v in bn_variance_checkpoints])
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise
+
+
+def _reset_momentum(sess: tf.compat.v1.Session,
+                    momentum_checkpoints: Dict[tf.Variable, np.float32]) -> Handle:
+    """
+    Set all BNs momentum to 0.0.
+
+    :param sess: tf session
+    :param momentum_checkpoints: Dict for original BN momentum[tf.Variable --> original_values]
+    :return: Handle that restores the original BN statistics upon handle.remove().
+    """
+    def cleanup():
+        """
+        Restore BNs momentum
+        """
+        with sess.graph.as_default():
+            sess.run([tf.compat.v1.assign(v, momentum_checkpoints[v]) for v in momentum_checkpoints])
+    try:
+        with sess.graph.as_default():
+            sess.run([tf.compat.v1.assign(v, 0.0) for v in momentum_checkpoints])
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise
+
+
+def _set_bn_in_train_mode(sess: tf.compat.v1.Session,
+                          is_training_checkpoints: Dict[tf.Variable, bool]) -> Handle:
+    """
+    Set BNs in training mode.
+
+    :param sess: tf session
+    :param is_training_checkpoints: Dict for original BNs is_training flag.
+    :return: Handle that sets all mutable BNs to eval mode upon handle.remove().
+    """
+    def cleanup():
+        """
+        Set all the BNs to eval mode.
+        """
+        with sess.graph.as_default():
+            sess.run([tf.compat.v1.assign(k, False) for k in is_training_checkpoints])
+
+    try:
+        # Set all the BNs to train mode
+        with sess.graph.as_default():
+            sess.run([tf.compat.v1.assign(k, True) for k in is_training_checkpoints])
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise
+
+
+def _get_tf_vars_and_orig_values(sim: QuantizationSimModel) -> Tuple[Dict[tf.Variable, np.ndarray],
+                                                                     Dict[tf.Variable, np.ndarray],
+                                                                     Dict[tf.Variable, np.float32],
+                                                                     Dict[tf.Variable, bool]]:
+    """
+    save original values for all BNs mean, variance, momentum and is_training tf Variables.
+
+    :param sim: QuantizationSimModel object.
+    :return: Dictionary [tf.Variable] --> original_value for all BNs mean, variance, momentum and is_training.
+    """
+    # setup tf variable list to access
+    mean_tf_vars, variance_tf_vars, momentum_tf_vars, is_training_tf_vars = _get_all_tf_bn_vars_list(sim)
+
+    with sim.session.graph.as_default():
+        mean_checkpoints = dict(zip(mean_tf_vars, sim.session.run(list(mean_tf_vars))))
+        variance_checkpoints = dict(zip(variance_tf_vars, sim.session.run(list(variance_tf_vars))))
+        momentum_checkpoints = dict(zip(momentum_tf_vars, sim.session.run(list(momentum_tf_vars))))
+        is_training_checkpoints = dict(zip(is_training_tf_vars, sim.session.run(list(is_training_tf_vars))))
+
+    return mean_checkpoints, variance_checkpoints, momentum_checkpoints, is_training_checkpoints
+
+
+DEFAULT_NUM_BATCHES = 100
+
+
+
[docs]def reestimate_bn_stats(sim: QuantizationSimModel, + start_op_names: List[str], + output_op_names: List[str], + dataset: tf.compat.v1.data.Dataset, + num_batches: int = DEFAULT_NUM_BATCHES) -> Handle: + """ + Reestimate BatchNorm statistics (running mean and var). + + :param sim: QuantizationSimModel object. + :param start_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :param dataset: Training dataset + :param num_batches: The number of batches to be used for reestimation + :returns: Handle that undos the effect of BN reestimation upon handle.remove() + """ + # setup tf variable list to access + mean_checkpoints, variance_checkpoints, momentum_checkpoints, is_training_checkpoints = \ + _get_tf_vars_and_orig_values(sim) + + sess = sim.session + # Set all the BNs in training mode + with _set_bn_in_train_mode(sess, is_training_checkpoints), _reset_momentum(sess, momentum_checkpoints): + handle = _reset_bn_stats(sess, mean_checkpoints, variance_checkpoints) + try: + with sess.graph.as_default(): + output_tensors = [sess.graph.get_tensor_by_name(name + ':0') for name in output_op_names] + update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) + assert update_ops, "GraphKeys.UPDATE_OPS can not be empty." + + # GraphKeys.UPDATE_OPS is collection of moving mean and variance for BN layers. During training mode + # moving mean and variance need to be updated and added as a control dependency. + with tf.compat.v1.control_dependencies(update_ops): + output_tensors_dependencies = [] + for output_tensor in output_tensors: + output_tensor = tf.compat.v1.identity(output_tensor) + output_tensors_dependencies.append(output_tensor) + initialize_uninitialized_vars(sess) + + # BN statistics accumulation buffer + sum_mean = {v: np.zeros(v.shape, dtype=v.dtype.as_numpy_dtype) for v in mean_checkpoints} + sum_var = {v: np.zeros(v.shape, dtype=v.dtype.as_numpy_dtype) for v in variance_checkpoints} + + batches = 0 + iterator = iterate_tf_dataset(dataset) + for _ in range(num_batches): + try: + data = next(iterator) + batches += 1 + except StopIteration: + break + feed_dict = create_input_feed_dict(sess.graph, start_op_names, data) + sess.run(output_tensors_dependencies, feed_dict=feed_dict) + for v in mean_checkpoints: + sum_mean[v] += sess.run(v) + for v in variance_checkpoints: + sum_var[v] += sess.run(v) + + # Override BN stats with the reestimated stats. + with sess.graph.as_default(): + sess.run([tf.compat.v1.assign(v, sum_mean[v] / batches) for v in mean_checkpoints]) + sess.run([tf.compat.v1.assign(v, sum_var[v] / batches) for v in variance_checkpoints]) + + return handle + except: + handle.remove() + raise
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/compress.html b/releases/1.32.2/_modules/aimet_tensorflow/compress.html new file mode 100644 index 0000000..e601179 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/compress.html @@ -0,0 +1,1238 @@ + + + + + + aimet_tensorflow.compress — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_tensorflow.compress

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Top-level API for aimet compression library """
+
+from typing import Union, Tuple, List
+import tensorflow as tf
+
+from aimet_common.defs import CostMetric, CompressionScheme, EvalFunction, CompressionStats
+from aimet_common.bokeh_plots import BokehServerSession
+
+from aimet_tensorflow.utils.graph_saver import wrapper_func, save_and_load_graph
+from aimet_tensorflow.defs import SpatialSvdParameters, ChannelPruningParameters
+from aimet_tensorflow.compression_factory import CompressionFactory
+
+
+
[docs]class ModelCompressor: + """ aimet model compressor: Enables model compression using various schemes """ + + # pylint: disable=too-many-arguments + +
[docs] @staticmethod + def compress_model(sess: tf.compat.v1.Session, working_dir: str, eval_callback: EvalFunction, eval_iterations, + input_shape: Union[Tuple, List[Tuple]], + compress_scheme: CompressionScheme, cost_metric: CostMetric, + parameters: Union[SpatialSvdParameters, + ChannelPruningParameters], + trainer=None, visualization_url=None) -> Tuple[tf.compat.v1.Session, CompressionStats]: + """ + Compress a given model using the specified parameters + + :param sess: Model, represented by a tf.compat.v1.Session, to compress + :param working_dir: File path to save compressed TensorFlow meta file + :param eval_callback: Evaluation callback. Expected signature is evaluate(model, iterations, use_cuda). + Expected to return an accuracy metric. + :param eval_iterations: Iterations to run evaluation for + :param trainer: Training Class: Contains a callable, train_model, which takes model, layer which is being fine + tuned and an optional parameter train_flag as a parameter + None: If per layer fine tuning is not required while creating the final compressed model + :param input_shape: tuple or list of tuples of input shapes to the model (channels_last format) + :param compress_scheme: Compression scheme. See the enum for allowed values + :param cost_metric: Cost metric to use for the compression-ratio (either mac or memory) + :param parameters: Compression parameters specific to given compression scheme + :param trainer: Training function + None: If per layer fine tuning is not required while creating the final compressed model + :param visualization_url: url the user will need to input where visualizations will appear + :return: A tuple of the compressed model session, and compression statistics + """ + + # If no url is passed in, then do not create a bokeh server session + if not visualization_url: + bokeh_session = None + else: + # create a bokeh session to publish visualizations to the server document for compression + bokeh_session = BokehServerSession(url=visualization_url, session_id="compression") + + if parameters.multiplicity < 1: + raise ValueError('Rounding Multiplicity should be greater than 1') + + if compress_scheme == CompressionScheme.spatial_svd: + # wrapper_func saves and reloads the graph before evaluation + # In TF after making changes to the graph you must save and reload, then evaluate + eval_callback = wrapper_func(eval_callback) + + algo = CompressionFactory.create_spatial_svd_algo(sess, working_dir, eval_callback, eval_iterations, + input_shape, cost_metric, parameters, bokeh_session) + elif compress_scheme == CompressionScheme.channel_pruning: + algo = CompressionFactory.create_channel_pruning_algo(sess, working_dir, eval_callback, input_shape, + eval_iterations, cost_metric, parameters, + bokeh_session) + else: + raise ValueError("Compression scheme not supported: {}".format(compress_scheme)) + + compressed_layer_db, stats = algo.compress_model(cost_metric, trainer) + + # TODO: this is a temporary fix, needs to be resolved + # In TF after making changes to the graph you must save and reload, then evaluate + updated_model = save_and_load_graph('./saver', compressed_layer_db.model) + compressed_layer_db.model.close() + + return updated_model, stats
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/cross_layer_equalization.html b/releases/1.32.2/_modules/aimet_tensorflow/cross_layer_equalization.html new file mode 100644 index 0000000..16e821d --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/cross_layer_equalization.html @@ -0,0 +1,1977 @@ + + + + + + aimet_tensorflow.cross_layer_equalization — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.cross_layer_equalization

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Auto Mode TF Cross Layer Equalization """
+
+from typing import Tuple, List, Union, Dict
+from enum import Enum
+import numpy as np
+import tensorflow as tf
+
+from aimet_common.utils import AimetLogger
+import aimet_common.libpymo as libpymo
+from aimet_tensorflow.common.connectedgraph import ConnectedGraph
+from aimet_tensorflow.common.operation import Op
+from aimet_tensorflow.batch_norm_fold import fold_all_batch_norms
+from aimet_tensorflow.utils.graph_saver import save_and_load_graph
+from aimet_tensorflow.utils.op.conv import WeightTensorUtils, BiasUtils
+import aimet_tensorflow.utils.op.relu as ReluUtils
+from aimet_tensorflow.utils.op.fusedbatchnorm import BNUtils
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.CrosslayerEqualization)
+
+ScaleFactor = Union[np.ndarray, Tuple[np.ndarray]]
+
+ClsSet = Union[Tuple[tf.Operation, tf.Operation],
+               Tuple[tf.Operation, tf.Operation, tf.Operation]]
+
+# TODO below Enum is common with PyTorch impl. Move to a common file
+class ClsLayerType(Enum):
+    """Enum class to represent CLS layer types"""
+    Unsupported = 0
+    Conv = 1  # Overloaded for conv and ConvTranspose
+    DepthwiseConv = 2
+
+class GraphSearchUtils:
+
+    """ Implements graph search utils required by CLE feature"""
+
+    def __init__(self, model: tf.Graph, start_op_names: Union[str, List[str]], output_op_names: Union[str, List[str]]):
+        if isinstance(start_op_names, str):
+            start_op_names = [start_op_names]
+
+        if isinstance(output_op_names, str):
+            output_op_names = [output_op_names]
+
+        self._connected_graph = ConnectedGraph(model, start_op_names, output_op_names)
+
+    def find_and_replace_relu6_with_relu(self, sess: tf.compat.v1.Session) -> tf.compat.v1.Session:
+        """
+        finds and replaces Relu6 ops with Relu
+        :return: updated session
+        """
+        for op in self._connected_graph.get_all_ops().values():
+            if op.type in ['Relu6']:
+                # send the session here, so we make the update on sess.graph (active graph)
+                ReluUtils.replace_relu6_with_relu(sess, op.get_module())
+
+        # in the end update the session
+        after_relu_replace_sess = save_and_load_graph('./replace_relu6_with_relu', sess)
+
+        return after_relu_replace_sess
+
+    @staticmethod
+    def find_downstream_layer_groups_to_scale(op, layer_groups, visited_nodes, current_group=None):
+        """
+        Populates all the layer groups eligible for cross layer scaling
+        :param op: starting  op
+        :param layer_groups: layer_groups as empty list
+        :param visited_nodes: all the ops that have been visited
+        :param current_group: op groups
+        :return: None. Updates layer_groups[] if groups are found.
+        """
+
+        if not current_group:
+            current_group = []
+
+        if op in visited_nodes:
+            return
+
+        visited_nodes.append(op)
+        logger.debug("Visiting node: {%s}", op.dotted_name)
+
+        # If current node is Conv2D, add to the current group
+        if op.type in ['Conv2D', 'DepthwiseConv2dNative']:
+            current_group.append(op)
+
+        # Terminating condition for current group
+        if not (op.type in ['Conv2D', 'DepthwiseConv2dNative', 'Relu', 'PReLU', 'Pad', 'Identity']):
+            if (len(current_group) > 1) and (current_group not in layer_groups):
+                layer_groups.append(current_group)
+                node_set = [op.dotted_name for op in current_group]
+                logger.debug("Added new set of nodes: {%s}", node_set)
+            current_group = []
+
+        if op.output:
+            for consumer in op.output.consumers:
+                GraphSearchUtils.find_downstream_layer_groups_to_scale(consumer, layer_groups, visited_nodes,
+                                                                       current_group)
+
+        # Reached a leaf.. See if the current group has something to grab
+        if (len(current_group) > 1) and (current_group not in layer_groups):
+            layer_groups.append(current_group)
+            node_set = [op.dotted_name for op in current_group]
+            logger.debug("Added new set of nodes: {%s}", node_set)
+
+    def find_layer_groups_to_scale_as_conn_ops(self) -> List[List[Op]]:
+        """
+        :return: List of groups of layers. Each group can be independently equalized
+        """
+
+        # Find the input node(s) in the graph
+        input_nodes = []
+        for op in self._connected_graph.get_all_ops().values():
+            if op.inputs and op.inputs[0].is_model_input:
+                input_nodes.append(op)
+
+        layer_groups = []
+        visited_nodes = []
+
+        for op in input_nodes:
+            self.find_downstream_layer_groups_to_scale(op=op, layer_groups=layer_groups,
+                                                       visited_nodes=visited_nodes)
+
+        return layer_groups
+
+    def find_layer_groups_to_scale(self):
+        """
+        Find layer groups for scaling as tf ops
+        :return: groups for scaling as tf ops
+        """
+
+        layer_groups_as_conn_graph_ops = self.find_layer_groups_to_scale_as_conn_ops()
+        layer_groups_as_tf_ops, tf_op_to_conn_graph_op_map = self.convert_conn_graph_ops_to_tf_op(layer_groups_as_conn_graph_ops)
+
+        return tf_op_to_conn_graph_op_map, layer_groups_as_tf_ops
+
+    @staticmethod
+    def convert_conn_graph_ops_to_tf_op(op_groups: List[List[Op]]) -> \
+            List[List[tf.Operation]]:
+        """
+         Helper function to get op list as tf.Operation type to be usable for updating/scaling weights and biases
+         using generic apis for tensor updates.
+        :param op_groups: list of op groups as TfOperation type of used by Connected Graph
+        :return: lis of op groups as tf.Operation  (standard TF op type)
+        """
+        tf_op_to_conn_graph_op_map = {}
+        layer_groups_as_tf_ops = []
+        for ops in op_groups:
+            curr_group = []
+            for op in ops:
+                tf_op_to_conn_graph_op_map[op.get_module()] = op
+                curr_group.append(op.get_module())
+            layer_groups_as_tf_ops.append(curr_group)
+
+        return layer_groups_as_tf_ops, tf_op_to_conn_graph_op_map
+
+    @staticmethod
+    def convert_layer_group_to_cls_sets(layer_group: List[tf.Operation]):
+        """
+        Helper function to convert a layer group to a list of cls sets
+        :param layer_group: Given layer group to generate cls sets
+        :return: List of cls sets
+
+        Supported layer combinations for CLS are:
+        1. Conv + Conv
+        2. DepthwiseConv + Conv
+        3. Conv + DepthwiseConv + Conv
+        Can be rewritten as,
+        Conv
+            -> Conv
+            -> DepthwiseConv
+                -> Conv
+        DepthwiseConv
+            -> Conv
+        If a combination is partially supported, the cls_set is completely omitted and restarted from the next
+        supported layer
+        For example: Consider Conv + DepthwiseConv + Depthwise(unsupported)
+        - Since Depthwise(unsupported) is the last layer encountered, we need to omit all the three layers and restart
+        the cls sets from the next supported layer.
+
+        """
+
+        # pylint: disable=too-many-branches
+        def convert_to_cls_layer_type(layer: tf.Operation) -> Tuple[ClsLayerType, tf.Operation]:
+            """
+            Given the layer, check if its supported in CLS
+            :param layer: layer to check
+            :return: Tuple of ClsLayerType and the layer
+            """
+            if layer.type in ['Conv', 'Conv2D', 'ConvTranspose', 'Conv2DTranspose']:
+                layer_type = ClsLayerType.Conv
+            elif layer.type == 'DepthwiseConv2dNative':
+                layer_type = ClsLayerType.DepthwiseConv
+            else:
+                layer_type = ClsLayerType.Unsupported
+
+            return layer_type, layer
+
+        def get_next_layer() -> Union[Tuple[ClsLayerType, Union[tf.Operation, None]]]:
+            """
+            :return: Tuple of ClsLayerType and the next layer in layer_group
+            """
+            if not layer_group:
+                return ClsLayerType.Unsupported, None
+            layer = layer_group.pop(0)
+            return convert_to_cls_layer_type(layer)
+
+        # TODO below code is common with PyTorch impl. Move to a common file
+        cls_sets = []
+        first_layer_to_scale = (ClsLayerType.Unsupported, None)
+        while layer_group:
+            while layer_group and first_layer_to_scale[0] is ClsLayerType.Unsupported:
+                first_layer_to_scale = get_next_layer()
+                if first_layer_to_scale[0] is ClsLayerType.Unsupported:
+                    logger.info('Layer %s is not supported. Ignoring for cls', first_layer_to_scale[1])
+
+            second_layer_to_scale = get_next_layer()
+            if first_layer_to_scale[0] == ClsLayerType.Conv:
+                if second_layer_to_scale[0] == ClsLayerType.Conv:
+                    cls_sets.append((first_layer_to_scale[1], second_layer_to_scale[1]))
+                    first_layer_to_scale = second_layer_to_scale
+                elif second_layer_to_scale[0] == ClsLayerType.DepthwiseConv:
+                    if layer_group:
+                        # do not pop third layer yet, determine its type and then pop it
+                        third_layer_to_scale = convert_to_cls_layer_type(layer_group[0])
+                        if third_layer_to_scale[0] == ClsLayerType.Conv:
+                            cls_sets.append(
+                                (first_layer_to_scale[1], second_layer_to_scale[1], third_layer_to_scale[1]))
+                            # adding third_layer_to_scale for the next round of CLS set determination
+                            first_layer_to_scale = get_next_layer()
+                        else:
+                            # unsupported combination encountered
+                            first_layer_to_scale = second_layer_to_scale
+                else:
+                    logger.info('Layer %s is not supported. Ignoring for cls', second_layer_to_scale[1])
+                    first_layer_to_scale = (ClsLayerType.Unsupported, None)
+            elif first_layer_to_scale[0] == ClsLayerType.DepthwiseConv:
+                if second_layer_to_scale[0] == ClsLayerType.Conv:
+                    cls_sets.append((first_layer_to_scale[1], second_layer_to_scale[1]))
+                first_layer_to_scale = second_layer_to_scale
+            else:
+                logger.info('Layer %s is not supported. Ignoring for cls', first_layer_to_scale[1])
+                first_layer_to_scale = second_layer_to_scale
+
+        return cls_sets
+
+    @staticmethod
+    def is_relu_activation_present_in_cls_sets(cls_sets: List[ClsSet],
+                                               tf_op_to_conn_graph_op_map: Dict) -> List[bool]:
+        """
+        check if there is Relu activations between cls sets
+        :param cls_sets: cls conv op pairs
+        :param tf_op_to_conn_graph_op_map: Map of tf-op => connected graph op
+        :return: list of relu activation preset flags(True or False)
+        corresponding to input cls_sets list
+        """
+        is_relu_activation_in_cls_sets = []
+        for cls_set in cls_sets:
+            # We need to check activation functions for all layers but the last one in the set
+            # Because we are only interested in checking activation functions between the layers we will scale
+            cls_set = cls_set[:-1]
+
+            is_relu_activation_in_cls_set = ()
+            for conv_op in cls_set:
+                conn_graph_conv_op = tf_op_to_conn_graph_op_map[conv_op]
+                is_relu_activation_in_cls_set += (ReluUtils.does_conv_have_relu_activation(conn_graph_conv_op), )
+
+            if len(is_relu_activation_in_cls_set) == 1:
+                is_relu_activation_in_cls_set = is_relu_activation_in_cls_set[0]
+
+            is_relu_activation_in_cls_sets.append(is_relu_activation_in_cls_set)
+
+        return is_relu_activation_in_cls_sets
+
+    @staticmethod
+    def map_op_names_to_ops(sess: tf.compat.v1.Session) -> Dict[str, tf.Operation]:
+        """
+        After the fold and cls , the graph is updated, so are the ops
+        So, we need a way to map ops we stored on graph we began with, to perform
+        high bias fold operation on latest ops in the updated graph.
+        :param sess: active tf.compat.v1.Session (tf.compat.v1.Session type)
+        :return: a dictionary of op names mapped to ops in the given new session.
+        Note : only stores infor pertaining to bn and conv ops required by high bias fold.
+        """
+
+        tf_names_op_dict = {}
+        with sess.graph.as_default():
+            op_list = sess.graph.get_operations()
+            for op in op_list:
+                if op.type in ['Conv2D', 'DepthwiseConv2dNative', 'FusedBatchNormV3']:
+                    tf_names_op_dict[op.name] = op
+
+        return tf_names_op_dict
+
+
+
[docs]class ClsSetInfo: + """ + This class hold information about the layers in a CLS set, along with corresponding scaling factors + for CLS set layers + """ + +
[docs] class ClsSetLayerPairInfo: + """ + Models a pair of layers that were scaled using CLS. And related information. + + :param layer1: layer as tf.Operation + :param layer2: layer as tf.Operation + :param scale_factor: scale factors as np.ndarray + :param relu_activation_between_layers: list of flags per layer set indicating\ + if they have Relu activations in-between. + + """ + def __init__(self, layer1: tf.Operation, layer2: tf.Operation, + scale_factor: np.ndarray, relu_activation_between_layers): + + self.layer1 = layer1 + self.layer2 = layer2 + self.scale_factor = scale_factor + self.relu_activation_between_layers = relu_activation_between_layers
+ + def __init__(self, cls_pair_1: ClsSetLayerPairInfo, cls_pair_2: ClsSetLayerPairInfo = None): + if cls_pair_2: + self.cls_pair_info_list = [cls_pair_1, cls_pair_2] + else: + self.cls_pair_info_list = [cls_pair_1] + +
[docs] @staticmethod + def map_cls_sets_to_new_session(tf_names_op_dict: Dict[str, tf.Operation], cls_set_info_list): + """ + Helper function to updates ops stored during cls to be used by high bias fold with updated session. + + :param tf_names_op_dict: map of tf op names to ops + :param cls_set_info_list: list of ClsSetInfo type + :return: None /cls_set_info_list updated in-place + + """ + for cls_set_info in cls_set_info_list: + for cls_pair_info in cls_set_info.cls_pair_info_list: + # refresh the ops, so we can perform high bias fold with info saved during cls. + cls_pair_info.layer1 = tf_names_op_dict[cls_pair_info.layer1.name] + cls_pair_info.layer2 = tf_names_op_dict[cls_pair_info.layer2.name]
+ + +class CrossLayerScaling: + """ implements auto mode cross-layer-scaling technique to a model """ + + @staticmethod + def scale_cls_sets(sess: tf.compat.v1.Session, cls_sets: List[ClsSet]) -> List[ScaleFactor]: + + """ + Scale multiple CLS sets + + :param sess: Current session + :param cls_sets: List of CLS sets + :return: Scaling factors calculated and applied for each CLS set in order + + """ + scale_factor_list = [] + for cls_set in cls_sets: + scale_factor = CrossLayerScaling.scale_cls_set(sess, cls_set) + scale_factor_list.append(scale_factor) + return scale_factor_list + + @staticmethod + def scale_cls_set(sess: tf.compat.v1.Session, cls_set: ClsSet) -> ScaleFactor: + """ + Scale a CLS set + :param sess: Current session + :param cls_set: Either a pair or regular conv layers or a triplet of depthwise separable layers + :return: Scaling factor calculated and applied + """ + + if len(cls_set) == 3: + scale_factor = CrossLayerScaling.scale_cls_set_with_depthwise_layers(sess, cls_set) + else: + scale_factor = CrossLayerScaling.scale_cls_set_with_conv_layers(sess, cls_set) + + return scale_factor + + @staticmethod + def scale_cls_set_with_conv_layers(model: tf.compat.v1.Session, cls_set: Tuple[tf.Operation, tf.Operation]) -> np.ndarray: + """ + API to invoke equalize layer params (update for weights and bias is in place) + This function is currently supported for Conv+Conv, DepthwiseConv2D+Conv combinations only + :param model: active tf.compat.v1.Session + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized + :return: Scaling factor S_12 for each conv layer pair: numpy array + """ + + with model.graph.as_default(): + assert len(cls_set) == 2, "Two layers need to be present in the cls_set" + assert cls_set[0].type in ['DepthwiseConv2dNative', 'Conv2D'], "unsupported type for cls_set[0]" + assert cls_set[1].type == "Conv2D", "unsupported type for cls_set[1]" + + # Create structs for holding layer weights and bias parameters + prev_layer_params = libpymo.EqualizationParams() + curr_layer_params = libpymo.EqualizationParams() + + # send as [Noc, Nic, kh, kw], TF format is [kh, kw, Nic, Noc] + weight_shape = WeightTensorUtils.get_tensor_shape(cls_set[0]) + if cls_set[0].type == "Conv2D": + prev_layer_params.weight = WeightTensorUtils.get_tensor_as_numpy_data(model, cls_set[0]). \ + transpose((3, 2, 0, 1)).reshape(-1) + prev_layer_params.weightShape = [weight_shape[3], weight_shape[2], weight_shape[0], weight_shape[1]] + elif cls_set[0].type == "DepthwiseConv2dNative": + assert weight_shape[3] == 1, "Only depth_multiplier=1 is supported for DepthwiseConv2DNative" + prev_layer_params.weight = WeightTensorUtils.get_tensor_as_numpy_data(model, cls_set[0]). \ + transpose((2, 3, 0, 1)).reshape(-1) + prev_layer_params.weightShape = [weight_shape[2], weight_shape[3], weight_shape[0], weight_shape[1]] + else: + assert False, "unsupported layer encountered" + + prev_layer_params.isBiasNone = BiasUtils.is_bias_none(cls_set[0]) + + # send as [Noc, Nic, kh, kw], TF format is [kh, kw, Nic, Noc] + curr_layer_params.weight = WeightTensorUtils.get_tensor_as_numpy_data(model, cls_set[1]). \ + transpose((3, 2, 0, 1)).reshape(-1) + weight_shape = WeightTensorUtils.get_tensor_shape(cls_set[1]) + curr_layer_params.weightShape = [weight_shape[3], weight_shape[2], weight_shape[0], weight_shape[1]] + + if not BiasUtils.is_bias_none(cls_set[0]): + prev_layer_params.bias = BiasUtils.get_bias_as_numpy_data(model, cls_set[0]).reshape(-1) + else: + prev_layer_params.isBiasNone = True + + scaling_factor = libpymo.scaleLayerParams(prev_layer_params, curr_layer_params) + + # convert received formats back to TF + # TF format is [kh, kw, Nic, Noc] + if cls_set[0].type == "Conv2D": + numpy_weight_reshaped = np.reshape(prev_layer_params.weight, prev_layer_params.weightShape). \ + transpose((2, 3, 1, 0)) + elif cls_set[0].type == "DepthwiseConv2dNative": + numpy_weight_reshaped = np.reshape(prev_layer_params.weight, prev_layer_params.weightShape). \ + transpose((2, 3, 0, 1)) + else: + assert False, "unsupported layer encountered" + + WeightTensorUtils.update_tensor_for_op(model, cls_set[0], numpy_weight_reshaped) + + numpy_weight_reshaped = np.reshape(curr_layer_params.weight, curr_layer_params.weightShape). \ + transpose((2, 3, 1, 0)) + WeightTensorUtils.update_tensor_for_op(model, cls_set[1], numpy_weight_reshaped) + + if not BiasUtils.is_bias_none(cls_set[0]): + numpy_bias_reshaped = np.reshape(prev_layer_params.bias, BiasUtils.get_shape(cls_set[0])) + BiasUtils.update_bias_for_op(model, cls_set[0], numpy_bias_reshaped) + + return scaling_factor + + @staticmethod + def scale_cls_set_with_depthwise_layers(model: tf.compat.v1.Session, + cls_set: Tuple[tf.Operation, + tf.Operation, + tf.Operation]) -> [np.ndarray, np.ndarray]: + """ + API to invoke equalize layer params for the combination of conv+depthwiseConv+conv layer params + - update for weights and bias is in place + :param model: active tf.compat.v1.Session + :param cls_set: Consecutive Conv layers whose weights and biases need to be equalized. + Second Conv layer is a depth-wise conv and third conv layer is point-wise conv + :return: Scaling factors S_12 and S_23 : numpy arrays + + DepthwiseConv2D layer is handled the following way, Assume the depthwise layer has the following dimensions + [Dimensions: (kh, kw, Nic, Noc) example:(3, 3, 96, 2)], following operations are done on it, + 1. Pre-process + a. Merge the last two dimensions and transpose [(Nic*Noc, kh, kw, 1), (192, 3, 3, 1)] + - implementation is converting to [(Nic, Noc, kh, kw), (96, 2, 3, 3)] which would give same res after next step + b. Convert to a 1D array [(Nic*Noc*kh*kw), (192*3*3)] + 2. Perform scaling + 3. Bring it back to original dimensions, current dimensions [(Nic*Noc*kh*kw), (192*3*3)] + a. reshape to [(Noc, Nic, kh, kw), (2, 96, 3, 3)] + b. reorder the dimensions [(kh, kw, Nic, Noc), (3, 3, 96, 2)] + """ + + # make sure you define the session and graph scope before making any graph updates. + with model.graph.as_default(): + assert len(cls_set) == 3, "Three layers need to be present in the cls_set" + assert cls_set[0].type == "Conv2D", "unsupported type for cls_set[0]" + assert cls_set[1].type == "DepthwiseConv2dNative", "unsupported type for cls_set[1]" + assert cls_set[2].type == "Conv2D", "unsupported type for cls_set[2]" + + # Create structs for holding layer weights and bias parameters + prev_layer_params = libpymo.EqualizationParams() + curr_layer_params = libpymo.EqualizationParams() + next_layer_params = libpymo.EqualizationParams() + + # send as [Noc, Nic, kh, kw], TF format is [kh, kw, Nic, Noc] + prev_layer_params.weight = WeightTensorUtils.get_tensor_as_numpy_data(model, cls_set[0]). \ + transpose((3, 2, 0, 1)).reshape(-1) + weight_shape = WeightTensorUtils.get_tensor_shape(cls_set[0]) + prev_layer_params.weightShape = [weight_shape[3], weight_shape[2], weight_shape[0], weight_shape[1]] + prev_layer_params.isBiasNone = BiasUtils.is_bias_none(cls_set[0]) + + # depthwise layer outputs is set to 1 in TF + # send as [Nic, Noc, kh, kw], TF format is [kh, kw, Nic, Noc] + curr_layer_params.weight = WeightTensorUtils.get_tensor_as_numpy_data(model, cls_set[1]). \ + transpose((2, 3, 0, 1)).reshape(-1) + weight_shape = WeightTensorUtils.get_tensor_shape(cls_set[1]) + + # depthwise layer outputs is set to 1 in TF + # send as [Nic, Noc, kh, kw], TF format is [kh, kw, Nic, Noc] + curr_layer_params.weightShape = [weight_shape[2] * weight_shape[3], weight_shape[0], weight_shape[1], 1] + assert weight_shape[3] == 1, "Only depth_multiplier=1 is supported for DepthwiseConv2D" + curr_layer_params.isBiasNone = BiasUtils.is_bias_none(cls_set[1]) + + # send as [Noc, Nic, kh, kw] , TF format is [kh, kw, Nic, Noc] + next_layer_params.weight = WeightTensorUtils.get_tensor_as_numpy_data(model, cls_set[2]). \ + transpose((3, 2, 0, 1)).reshape(-1) + weight_shape = WeightTensorUtils.get_tensor_shape(cls_set[2]) + next_layer_params.weightShape = [weight_shape[3], weight_shape[2], weight_shape[0], weight_shape[1]] + + if not BiasUtils.is_bias_none(cls_set[0]): + prev_layer_params.bias = BiasUtils.get_bias_as_numpy_data(model, cls_set[0]).reshape(-1) + else: + prev_layer_params.isBiasNone = True + + if not BiasUtils.is_bias_none(cls_set[1]): + curr_layer_params.bias = BiasUtils.get_bias_as_numpy_data(model, cls_set[1]).reshape(-1) + else: + curr_layer_params.isBiasNone = True + + scaling_params = libpymo.scaleDepthWiseSeparableLayer(prev_layer_params, curr_layer_params, + next_layer_params) + + # convert received formats (in [Noc, Nic, kh, kw] format) back to the TF format ([kh, kw, Nic, Noc]) + numpy_weight_reshaped_0 = np.reshape(prev_layer_params.weight, prev_layer_params.weightShape). \ + transpose((2, 3, 1, 0)) + WeightTensorUtils.update_tensor_for_op(model, cls_set[0], numpy_weight_reshaped_0) + + # depthwise layer + weight_shape_1 = WeightTensorUtils.get_tensor_shape(cls_set[1]) + numpy_weight_reshaped_1 = np.reshape(curr_layer_params.weight, (weight_shape_1[3], weight_shape_1[2], + weight_shape_1[0], weight_shape_1[1])) + numpy_weight_reshaped_1 = np.transpose(numpy_weight_reshaped_1, (2, 3, 1, 0)) + WeightTensorUtils.update_tensor_for_op(model, cls_set[1], numpy_weight_reshaped_1) + + # conv layer + numpy_weight_reshaped_2 = np.reshape(next_layer_params.weight, next_layer_params.weightShape). \ + transpose((2, 3, 1, 0)) + WeightTensorUtils.update_tensor_for_op(model, cls_set[2], numpy_weight_reshaped_2) + + if not BiasUtils.is_bias_none(cls_set[0]): + assert [len(prev_layer_params.bias)] == BiasUtils.get_shape(cls_set[0]), \ + "Unsupported dimension encountered" + numpy_bias_reshaped = np.reshape(prev_layer_params.bias, BiasUtils.get_shape(cls_set[0])) + BiasUtils.update_bias_for_op(model, cls_set[0], numpy_bias_reshaped) + + if not BiasUtils.is_bias_none(cls_set[1]): + assert [len(curr_layer_params.bias)] == BiasUtils.get_shape(cls_set[1]), \ + "Unsupported dimension encountered" + numpy_bias_reshaped = np.reshape(curr_layer_params.bias, BiasUtils.get_shape(cls_set[1])) + BiasUtils.update_bias_for_op(model, cls_set[1], numpy_bias_reshaped) + + return scaling_params.scalingMatrix12, scaling_params.scalingMatrix23 + + @staticmethod + def create_cls_set_info_list(cls_sets: List[ClsSet], scale_factors: List[ScaleFactor], + is_relu_activation_in_cls_sets): + """ + Binds information from there separate lists into one [ClsInfoSet] data-structure + + :param cls_sets: List of CLS sets + :param scale_factors: Scale-factors for each cls-set + :param is_relu_activation_in_cls_sets: Information if there is relu activation in each cls-set + :return: List of ClsSetInfo + """ + cls_set_info_list = [] + assert len(cls_sets) == len(scale_factors) == len(is_relu_activation_in_cls_sets) + + for index, cls_set in enumerate(cls_sets): + + if isinstance(scale_factors[index], tuple): + # If we are dealing with a triplet of layers, then we should have 2 scale factors and 2 relu flags + # Assert that this is true + assert len(cls_set) == 3 + assert len(scale_factors[index]) == len(is_relu_activation_in_cls_sets[index]) == 2 + + cls_pair_1 = ClsSetInfo.ClsSetLayerPairInfo(cls_set[0], cls_set[1], scale_factors[index][0], + is_relu_activation_in_cls_sets[index][0]) + cls_pair_2 = ClsSetInfo.ClsSetLayerPairInfo(cls_set[1], cls_set[2], scale_factors[index][1], + is_relu_activation_in_cls_sets[index][1]) + cls_set_info = ClsSetInfo(cls_pair_1, cls_pair_2) + + else: + cls_pair = ClsSetInfo.ClsSetLayerPairInfo(cls_set[0], cls_set[1], scale_factors[index], + is_relu_activation_in_cls_sets[index]) + cls_set_info = ClsSetInfo(cls_pair) + + cls_set_info_list.append(cls_set_info) + + return cls_set_info_list + + @staticmethod + def scale_model(sess: tf.compat.v1.Session, input_op_names: Union[str, List[str]], output_op_names: Union[str, List[str]])\ + -> (tf.compat.v1.Session, List[ClsSetInfo]): + """ + Uses cross-layer scaling to scale all applicable layers in the given model + + :param sess: Session containing graph to scale + :param input_op_names: Names of starting ops in the model + :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops + (to ignore training ops for example). If None, all ops in the model are considered valid. + :return: updated session, CLS information for each CLS set + + """ + + if isinstance(input_op_names, str): + input_op_names = [input_op_names] + + if isinstance(output_op_names, str): + output_op_names = [output_op_names] + + # Find layer groups + graph_search = GraphSearchUtils(sess.graph, input_op_names, output_op_names) + tf_op_to_conn_graph_op_map, layer_groups_as_tf_ops = graph_search.find_layer_groups_to_scale() + + # Find cls sets from the layer groups + cls_sets = [] + for layer_group in layer_groups_as_tf_ops: + cls_set = graph_search.convert_layer_group_to_cls_sets(layer_group) + cls_sets += cls_set + + # Scale the CLS sets + scale_factors = CrossLayerScaling.scale_cls_sets(sess, cls_sets) + + # Find if there were relu activations between layers of each cls set + is_relu_activation_in_cls_sets = graph_search.is_relu_activation_present_in_cls_sets(cls_sets, + tf_op_to_conn_graph_op_map) + + # Convert to a list of cls-set-info elements + cls_set_info_list = CrossLayerScaling.create_cls_set_info_list(cls_sets, scale_factors, + is_relu_activation_in_cls_sets) + + # save and load the updated graph after scaling + after_cls_sess = save_and_load_graph('./temp_cls', sess) + + return after_cls_sess, cls_set_info_list + + +class HighBiasFold: + """ + Class to apply the high-bias-fold technique to a given model + """ + + ActivationIsReluForFirstModule = bool + ScaleForFirstModule = np.ndarray + + @staticmethod + def get_bn_params_for_bias_fold(sess: tf.compat.v1.Session, bn_op: tf.Operation, scaling_parameter: np.ndarray): + """ + + :param sess: active tf.compat.v1.Session + :param bn_op: tf Operation type fused batchnorm op. + :param scaling_parameter: scaling param as np.ndarray + :return: bn_params as BNParamsHighBiasFold type. + """ + + bn_params = libpymo.BNParamsHighBiasFold() + # Scaling gamma and beta parameter of batch norm layer + gamma = BNUtils.get_gamma_as_numpy_data(sess, bn_op).reshape(-1) + bn_params.gamma = np.divide(gamma, scaling_parameter) + beta = BNUtils.get_beta_as_numpy_data(sess, bn_op).reshape(-1) + bn_params.beta = np.divide(beta, scaling_parameter) + + return bn_params + + @staticmethod + def _refresh_layer_set_info_before_hbf(sess: tf.compat.v1.Session, + folded_pairs: List[Tuple[tf.Operation, tf.Operation]], + cls_set_info_list: List[ClsSetInfo])\ + -> (List[ClsSetInfo], Dict[str, tf.Operation]): + """ + As the tensorflow session gets updated, info on op references need to be refreshed. + :param folded_pairs: bn conv op pairs saved during batchnorm fold. + :param cls_set_info_list: conv layer info saved during cross layer scaling + :return: refreshes both data sets to reflect references on new tf.compat.v1.Session. + """ + + bn_dict = {} + dict_names_to_tf_ops = GraphSearchUtils.map_op_names_to_ops(sess) + + # update info saved during batchnorm fold + for conv_bn in folded_pairs: + # get the new op ref from it's name + bn_dict[conv_bn[0].name] = dict_names_to_tf_ops[conv_bn[1].name] + + # update info saved during cls + ClsSetInfo.map_cls_sets_to_new_session(dict_names_to_tf_ops, cls_set_info_list) + + return cls_set_info_list, bn_dict + + @staticmethod + def bias_fold(sess: tf.compat.v1.Session, folded_pairs: List[Tuple[tf.Operation, tf.Operation]], + cls_set_info_list: List[ClsSetInfo]) -> tf.compat.v1.Session: + + """ + Folds bias values greater than 3 * sigma to next layer's bias + + :param sess: Current session + :param folded_pairs: Key: Conv/Linear layer Value: Corresponding folded BN layer + :param cls_set_info_list: List of info elements for each cls set + :return: updated session after graph updates from hbf + + """ + + with sess.graph.as_default(): + + # refresh the references saved during bn fold and cls. + cls_set_info_list, bn_layers = HighBiasFold._refresh_layer_set_info_before_hbf(sess, folded_pairs, + cls_set_info_list) + + if not bn_layers: + logger.error('High Bias folding is not supported for models without BatchNorm Layers') + return sess + + for cls_set_info in cls_set_info_list: + + for cls_pair_info in cls_set_info.cls_pair_info_list: + + # check if we have a corresponding bn layer + if cls_pair_info.layer1.name in bn_layers.keys(): + + # check if bias present in given conv2D(s) + if BiasUtils.is_bias_none(cls_pair_info.layer1) or BiasUtils.is_bias_none(cls_pair_info.layer2): + continue + + prev_layer_params = libpymo.LayerParams() + curr_layer_params = libpymo.LayerParams() + + scaling_parameter = cls_pair_info.scale_factor + + prev_layer_bn_params =\ + HighBiasFold.get_bn_params_for_bias_fold(sess, + bn_layers[cls_pair_info.layer1.name], + scaling_parameter) + + prev_layer_params.activationIsRelu = cls_pair_info.relu_activation_between_layers + prev_layer_params.bias =\ + BiasUtils.get_bias_as_numpy_data(sess, cls_pair_info.layer1).reshape(-1) + prev_bias_shape = BiasUtils.get_shape(cls_pair_info.layer1) + + weight_shape = WeightTensorUtils.get_tensor_shape(cls_pair_info.layer1) + prev_layer_params.weightShape = [weight_shape[3], weight_shape[2], weight_shape[0], + weight_shape[1]] + + curr_layer_params.bias =\ + BiasUtils.get_bias_as_numpy_data(sess, cls_pair_info.layer2).reshape(-1) + curr_bias_shape = BiasUtils.get_shape(cls_pair_info.layer2) + + weight_shape = WeightTensorUtils.get_tensor_shape(cls_pair_info.layer2) + + # Handle depthwise layer case + # for a depthwise layer num outputs is set to 1 in TF + # send as [Nic, Noc, kh, kw], TF format is [kh, kw, Nic, Noc] + if cls_pair_info.layer2.type in ['DepthwiseConv2dNative']: + c_wt = WeightTensorUtils.get_tensor_as_numpy_data( + sess, cls_pair_info.layer2).transpose((2, 3, 0, 1)) + curr_layer_params.weight = c_wt.reshape(-1) + curr_layer_params.weightShape = [weight_shape[2], weight_shape[3], weight_shape[0], + weight_shape[1]] + + else: + # send as [Noc, Nic, kh, kw], TF format is [kh, kw, Nic, Noc] + c_wt = WeightTensorUtils.get_tensor_as_numpy_data( + sess, cls_pair_info.layer2).transpose((3, 2, 0, 1)) + curr_layer_params.weight = c_wt.reshape(-1) + curr_layer_params.weightShape = [weight_shape[3], weight_shape[2], weight_shape[0], + weight_shape[1]] + + libpymo.updateBias(prev_layer_params, curr_layer_params, prev_layer_bn_params) + + BiasUtils.update_bias_for_op(sess, cls_pair_info.layer1, np.reshape(prev_layer_params.bias, + prev_bias_shape)) + + BiasUtils.update_bias_for_op(sess, cls_pair_info.layer2, np.reshape(curr_layer_params.bias, + curr_bias_shape)) + else: + logger.info("skipping layer: {%s}", cls_pair_info.layer1.name) + + # save and load the updated graph after high bias fold update + aftr_hbf_sess = save_and_load_graph('./temp_hbf', sess) + + return aftr_hbf_sess + + +
[docs]def equalize_model(sess: tf.compat.v1.Session, start_op_names: Union[str, List[str]], + output_op_names: Union[str, List[str]]) -> tf.compat.v1.Session: + """ + High-level API to perform Cross-Layer Equalization (CLE) on the given model. The model is equalized in place. + + :param sess: tf.compat.v1.Session with model to equalize + :param start_op_names: Names of starting ops in the given model + :param output_op_names: List of output op names of the model, used to help ConnectedGraph determine valid ops + (to ignore training ops for example). + :return: updated session after bn fold, cls and hbf. + + """ + + if not isinstance(start_op_names, (str, List)): + logger.error('start op names must be passed as a string or a List of strings') + + if isinstance(start_op_names, str): + start_op_names = [start_op_names] + + # fold batchnorm layers + after_bn_fold_sess, folded_pairs = fold_all_batch_norms(sess, start_op_names, output_op_names) + + # replace any ReLU6 layers with ReLU + graph_util = GraphSearchUtils(after_bn_fold_sess.graph, start_op_names, output_op_names) + after_relu_replace_sess = graph_util.find_and_replace_relu6_with_relu(after_bn_fold_sess) + + # perform cross-layer scaling on applicable layer sets + after_cls_sess, cls_set_info_list = CrossLayerScaling.scale_model(after_relu_replace_sess, start_op_names, + output_op_names) + + # high-bias fold + after_hbf_sess = HighBiasFold.bias_fold(after_cls_sess, folded_pairs, cls_set_info_list) + + return after_hbf_sess
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/defs.html b/releases/1.32.2/_modules/aimet_tensorflow/defs.html new file mode 100644 index 0000000..b8c88f0 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/defs.html @@ -0,0 +1,1318 @@ + + + + + + aimet_tensorflow.defs — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_tensorflow.defs

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2018-2020, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Common type definitions that are used across aimet """
+
+from enum import Enum
+from typing import List, Optional, Union
+
+from dataclasses import dataclass
+import tensorflow as tf
+
+from aimet_common.defs import GreedySelectionParameters
+
+
+
[docs]class ModuleCompRatioPair: + """ + Pair of tf.Operation and a compression-ratio + + :ivar module: Module of type tf.Operation + :ivar comp_ratio: Compression ratio. Compression ratio is the ratio of cost of compressed model + to cost of the original model. + """ + + def __init__(self, module: tf.Operation, comp_ratio: float): + self.module = module + self.comp_ratio = comp_ratio
+ + +
[docs]class SpatialSvdParameters: + """ Configuration parameters for spatial svd compression """ + +
[docs] class ManualModeParams: + """ + Configuration parameters for manual-mode spatial svd compression + """ + + def __init__(self, list_of_module_comp_ratio_pairs: List[ModuleCompRatioPair]): + """ + :param list_of_module_comp_ratio_pairs: List of (module, comp-ratio) pairs + """ + self.list_of_module_comp_ratio_pairs = list_of_module_comp_ratio_pairs
+ +
[docs] class AutoModeParams: + """ + Configuration parameters for auto-mode compression + """ + + def __init__(self, greedy_select_params: GreedySelectionParameters, + modules_to_ignore: Optional[List[tf.Operation]] = None): + """ + :param greedy_select_params: Params for greedy comp-ratio selection algorithm + :param modules_to_ignore: List of modules to ignore (None indicates nothing to ignore) + """ + self.greedy_params = greedy_select_params + self.modules_to_ignore = [] if modules_to_ignore is None else modules_to_ignore
+ +
[docs] class Mode(Enum): + """ Mode enumeration """ + + manual = 1 + """ Manual mode """ + + auto = 2 + """ Auto mode """
+ + def __init__(self, input_op_names: List[str], output_op_names: List[str], mode: Mode, + params: Union[ManualModeParams, AutoModeParams], multiplicity=1): + """ + :param input_op_names: list of input op names to the model + :param output_op_names: List of output op names of the model + :param mode: Either auto mode or manual mode + :param params: Parameters for the mode selected + :param multiplicity: The multiplicity to which ranks/input channels will get rounded. Default: 1 + """ + self.input_op_names = input_op_names + self.output_op_names = output_op_names + self.mode = mode + self.mode_params = params + self.multiplicity = multiplicity
+ + +
[docs]class ChannelPruningParameters: + """ Configuration parameters for channel pruning compression """ + +
[docs] class ManualModeParams: + """ + Configuration parameters for manual-mode channel pruning compression + """ + + def __init__(self, list_of_module_comp_ratio_pairs: List[ModuleCompRatioPair]): + """ + :param list_of_module_comp_ratio_pairs: List of (module, comp-ratio) pairs + """ + self.list_of_module_comp_ratio_pairs = list_of_module_comp_ratio_pairs
+ +
[docs] class AutoModeParams: + """ + Configuration parameters for auto-mode compression + """ + + def __init__(self, greedy_select_params: GreedySelectionParameters, + modules_to_ignore: Optional[List[tf.Operation]] = None): + """ + :param greedy_select_params: Params for greedy comp-ratio selection algorithm + :param modules_to_ignore: List of modules to ignore (None indicates nothing to ignore) + """ + self.greedy_params = greedy_select_params + self.modules_to_ignore = [] if modules_to_ignore is None else modules_to_ignore
+ +
[docs] class Mode(Enum): + """ Mode enumeration """ + + manual = 1 + """ Manual mode: User specifies comp-ratio per layer """ + + auto = 2 + """ Auto mode: aimet computes optimal comp-ratio per layer """
+ + def __init__(self, input_op_names: List[str], output_op_names: List[str], data_set: tf.data.Dataset, + batch_size: int, num_reconstruction_samples: int, allow_custom_downsample_ops: bool, mode: Mode, + params: Union[ManualModeParams, AutoModeParams], multiplicity=1): + """ + + :param input_op_names: list of input op names to the model + :param output_op_names: List of output op names of the model + :param data_set: data set + :param batch_size: batch size + :param num_reconstruction_samples: number of samples to be used for reconstruction + :param allow_custom_downsample_ops: If set to True, DownSampleLayer and UpSampleLayer will be added as required + :param mode: indicates whether the mode is manual or auto + :param params: ManualModeParams or AutoModeParams, depending on teh value of mode + :param multiplicity: The multiplicity to which ranks/input channels will get rounded. Default: 1 + """ + + # pylint: disable=too-many-arguments + self.input_op_names = input_op_names + self.output_op_names = output_op_names + self.data_set = data_set + self.batch_size = batch_size + self.num_reconstruction_samples = num_reconstruction_samples + self.allow_custom_downsample_ops = allow_custom_downsample_ops + self.mode = mode + self.mode_params = params + self.multiplicity = multiplicity
+ + +class ParameterInfo: + """ Store information required for parameter quantization """ + def __init__(self, param_type: str, op_with_param_name: List): + self.param_type = param_type + self.op_with_param_name = op_with_param_name + +@dataclass +class Tensorflow2Version: + """ + Enumeration for checking TensorFlow version for import statements + """ + + v2_4_3 = '2.4.3' + + v2_10_1 = '2.10.1' +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/batch_norm_fold.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/batch_norm_fold.html new file mode 100644 index 0000000..58f346c --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/batch_norm_fold.html @@ -0,0 +1,2150 @@ + + + + + + aimet_tensorflow.keras.batch_norm_fold — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.batch_norm_fold

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+#pylint: disable=too-many-lines
+""" Utility for batch norm fold in tf 2.x """
+from typing import Iterable, Optional, Tuple, Union, List, Dict, Set
+import numpy as np
+import tensorflow as tf
+import tensorflow.keras.backend as K
+from packaging import version  # pylint: disable=wrong-import-order
+
+if version.parse(tf.version.VERSION) >= version.parse("2.10"):
+    # Ignore pylint errors as keras module is not available in TF 2.4
+    from keras.layers.core.tf_op_layer import TFOpLambda # pylint: disable=import-error
+    from keras.engine.functional import Functional # pylint: disable=import-error
+else:
+    # Ignore pylint errors due to conditional imports
+    from tensorflow.python.keras.engine.functional import Functional # pylint: disable=ungrouped-imports
+    from tensorflow.python.keras.layers.core import TFOpLambda # pylint: disable=ungrouped-imports
+
+# pylint: disable=wrong-import-position
+from aimet_common.defs import QuantScheme, MAP_ROUND_MODE_TO_PYMO
+
+import aimet_common.libpymo as libpymo
+from aimet_common.utils import AimetLogger
+from aimet_tensorflow.keras.model_preparer import _KerasModelPreparer
+from aimet_tensorflow.keras.quant_sim.qc_quantize_wrapper import QcQuantizeWrapper
+from aimet_tensorflow.keras.quant_sim.tensor_quantizer import ParamPerTensorQuantizer
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+from aimet_tensorflow.keras.utils import common
+from aimet_tensorflow.keras.utils.model_connection_utils import ModelLayerConnections, ModelLayerConnectionsProperties
+from aimet_tensorflow.keras.utils.quantizer_utils import get_wrappers_bias_quantizer, get_wrappers_weight_quantizer
+from aimet_tensorflow.keras.utils.weight_tensor_utils import WeightTensorUtils
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Utils)
+
+LayerType = Union[
+    tf.keras.layers.Conv2D,
+    tf.keras.layers.Dense,
+    tf.keras.layers.Conv2DTranspose,
+    tf.keras.layers.DepthwiseConv2D
+]
+_supported_layers = LayerType.__args__
+
+PairType = Union[Tuple[LayerType, tf.keras.layers.BatchNormalization, bool],
+                 Tuple[tf.keras.layers.BatchNormalization, LayerType, bool]]
+
+BatchNormType = tf.keras.layers.BatchNormalization
+_supported_batchnorms = BatchNormType
+
+# Todo: search for more types of convolution
+LinearType = tf.keras.layers.Dense
+ConvType = Union[tf.keras.layers.Conv1D,
+                 tf.keras.layers.Conv2D,
+                 tf.keras.layers.DepthwiseConv2D,
+                 tf.keras.layers.Conv2DTranspose]
+_supported_convs = ConvType.__args__
+
+FlattenType = Union[tf.keras.layers.Flatten, tf.keras.layers.Reshape]
+
+MAP_PYMO_TO_ROUND_MODE = {v: k for k, v in MAP_ROUND_MODE_TO_PYMO.items()}
+def _check_layer_to_find_pattern(cur_layer: tf.keras.layers.Layer,
+                                 conv_linear_with_bn_dict: Dict[Union[ConvType, LinearType],
+                                                                List[Union[None, BatchNormType]]],
+                                 layer_out_node_ref: Dict,
+                                 has_seen: List[Union[None, ConvType, BatchNormType, FlattenType]]):
+    """
+    find all paths in the model considering all inputs.
+
+    :param cur_layer: layer to investigate for finding a pattern
+    :param conv_linear_with_bn_dict: dictionary to store possible conv_bn pairs,
+        key: Dense or Conv layer & Value: list of BNS;
+        first index in this list shows bn_in and the second index shows bn_out
+    :param layer_out_node_ref: dictionary includes layer_ref as a key, outbound nodes as value
+    :param has_seen: for storing the layer which is useful for finding pattern in the next layers;
+        index 0 is for conv op, index 2 is for bn op and index 3 is for storing flatten/reshape op
+    """
+
+    # pylint: disable=too-many-branches
+    if isinstance(cur_layer, _supported_convs):
+        if has_seen[1] is not None:
+            conv_linear_with_bn_dict[cur_layer] = [has_seen[1], None]
+            has_seen[1] = None
+        if (cur_layer.activation is tf.keras.activations.linear) and \
+                (cur_layer in layer_out_node_ref) and len(layer_out_node_ref[cur_layer]) == 1:
+            has_seen[0] = cur_layer
+    elif isinstance(cur_layer, BatchNormType):
+        if has_seen[0] is not None:
+            if has_seen[0] in conv_linear_with_bn_dict:
+                conv_linear_with_bn_dict[has_seen[0]][1] = cur_layer
+            else:
+                conv_linear_with_bn_dict[has_seen[0]] = [None, cur_layer]
+            has_seen[0] = None
+        if (cur_layer in layer_out_node_ref) and len(layer_out_node_ref[cur_layer]) == 1:
+            has_seen[1] = cur_layer
+    elif isinstance(cur_layer, (tf.keras.layers.Flatten, tf.keras.layers.Reshape)):
+        if (cur_layer in layer_out_node_ref) and len(layer_out_node_ref[cur_layer]) == 1:
+            if has_seen[1]:
+                has_seen[2] = cur_layer
+            else:
+                has_seen[1] = None
+        if has_seen[0]:
+            has_seen[0] = None
+    elif isinstance(cur_layer, LinearType):
+        if has_seen[1] is not None and has_seen[2] is not None:
+            conv_linear_with_bn_dict[cur_layer] = [has_seen[1], None]
+        has_seen[2] = None
+        has_seen[1] = None
+    else:
+        has_seen[0] = None
+        has_seen[1] = None
+        has_seen[2] = None
+
+
+def _add_children_layer_before_parent_layer(cur_layer: tf.keras.layers.Layer, node_layer_map: Dict,
+                                            layer_out_node_map: Dict,
+                                            visited_layers: Set[tf.keras.layers.Layer],
+                                            reversed_ordered_layers: List[tf.keras.layers.Layer]):
+    """
+    Function to use topological sorting for finding all the layers which are accessible
+    from the specific input_layer in the opposite order of occurrence.
+
+    :param cur_layer:layer that we want to find path from
+    :param node_layer_map: dictionary includes node_ref as a key, in_layers and out_layer as value
+    :param layer_out_node_map: dictionary includes layer_ref as a key, outbound nodes as value
+    :param visited_layers: Set of all layers that have been visited
+    :param reversed_ordered_layers: List of layers in the opposite order of occurrence
+        for the layers that we have visited so far
+    """
+
+    # Mark the current layer as visited.
+    visited_layers.add(cur_layer)
+
+    if cur_layer in layer_out_node_map:
+        # Recur for all the layers adjacent to this layer
+        for next_node in layer_out_node_map[cur_layer]:
+            next_layer = node_layer_map[next_node][1]
+            if next_layer not in visited_layers:
+                _add_children_layer_before_parent_layer(next_layer, node_layer_map,
+                                                        layer_out_node_map, visited_layers,
+                                                        reversed_ordered_layers)
+            reversed_ordered_layers.append(cur_layer)
+    else:
+        reversed_ordered_layers.append(cur_layer)
+
+
+def _get_ordered_layers(node_layer_map: Dict,
+                        layer_out_node_map: Dict) -> List[tf.keras.layers.Layer]:
+    """
+    Function to return the list with all the layers in which layers come before parent layer.
+
+    :param node_layer_map: dictionary includes node_ref as a key, in_layers and out_layer as value
+    :param layer_out_node_map: dictionary includes layer_ref as a key, outbound nodes as value
+    :return: ordered_layers: List of all layers in the order of occurrence
+    """
+    # to find the input layers of the model
+    input_layers = common.find_input_layers(node_layer_map)
+
+    #  Set of all layers that have been visited (to cut short duplicate traversals)
+    visited_layers = set()
+
+    # List of all layers in the opposite of order of occurrence
+    reversed_ordered_layers = []
+
+    for input_layer in input_layers:
+        _add_children_layer_before_parent_layer(input_layer, node_layer_map, layer_out_node_map,
+                                                visited_layers, reversed_ordered_layers)
+
+    # reverse the list because layers are in reverse order
+    ordered_layers = reversed_ordered_layers[::-1]
+
+    # # filter ordered ops for only valid ops
+    # ordered_ops = [op for op in ordered_ops if op in valid_ops]
+
+    return ordered_layers
+
+
+def _get_ordered_conv_linears(node_layer_map: Dict,
+                              layer_out_node_map: Dict) -> List[Union[ConvType, LinearType]]:
+    """
+    helper to select a list of conv_linears in the order of occurence
+
+    :param node_layer_map: dictionary includes node_ref as a key, in_layers and out_layer as value
+    :param layer_out_node_map: dictionary includes layer_ref as a key, outbound nodes as value
+    :return: return List of conv/linear layer refs
+    """
+    # get ordered layers list in node_layer map dictionary
+    list_of_ordered_layers = _get_ordered_layers(node_layer_map, layer_out_node_map)
+
+    # look for conv layers
+    ordered_conv_linears = []
+    for layer in list_of_ordered_layers:
+        if isinstance(layer, _supported_layers):
+            ordered_conv_linears.append(layer)
+    return ordered_conv_linears
+
+
+def _fill_conv_linear_bn_dict(cur_layer: tf.keras.layers.Layer, node_layer_ref: Dict,
+                              layer_out_node_ref: Dict,
+                              has_seen: List[Union[None, ConvType, BatchNormType, FlattenType]],
+                              visited_layer: Set[tf.keras.layers.Layer],
+                              conv_linear_with_bn_dict: Dict[Union[ConvType, LinearType],
+                                                             List[Union[None, BatchNormType]]]):
+    """
+    fill conv_linear_bn_dict for the model
+
+    :param cur_layer: dictionary includes node_ref as a key, in_layers and out_layer as value
+    :param node_layer_ref: dictionary includes node_ref as a key, in_layers and out_layer as value
+    :param layer_out_node_ref: dictionary includes layer_ref as a key, outbound nodes as value
+    :paramm has_seen: for storing the layer which is useful for finding pattern in the next layers;
+        index 0 is for conv op, index 2 is for bn op and index 3 is for storing flatten/reshape op
+    :param visited_layer: to store all the layers that have been visited so far in the dictionary
+    :param conv_linear_with_bn_dict: dictionary of all possible conv_bn pairs,
+        key: Dense or Conv layer & Value: list of BNS;
+        first index in this list shows bn_in and the second index shows bn_out
+    """
+
+    # Mark the current layer as visited to prevent passing from one layer more than once
+    visited_layer.add(cur_layer)
+
+    _check_layer_to_find_pattern(cur_layer, conv_linear_with_bn_dict, layer_out_node_ref, has_seen)
+
+    if cur_layer in layer_out_node_ref:
+        for next_node in layer_out_node_ref[cur_layer]:
+            next_layer = node_layer_ref[next_node][1]
+            if next_layer not in visited_layer:
+                _fill_conv_linear_bn_dict(next_layer, node_layer_ref, layer_out_node_ref, has_seen,
+                                          visited_layer, conv_linear_with_bn_dict)
+            else:
+                has_seen[0] = None
+                has_seen[1] = None
+                has_seen[2] = None
+
+
+def _find_possible_convs_linears_bn(node_layer_map: Dict, layer_out_node_map: Dict)\
+        -> Dict[Union[ConvType, LinearType], List[Union[None, BatchNormType]]]:
+    """
+    find all possible convs_linears_bn by traversing all paths in the model considering all inputs
+
+    :param node_layer_map:  dictionary includes node_ref as a key, in_layers and out_layer as value
+    :param layer_out_node_map: dictionary includes layer_ref as a key, outbound nodes as value
+    :return: return dictionary of all possible conv_bn pairs,
+        key: Dense or Conv layer & Value: list of BNS;
+        first index in this list shows bn_in and the second index shows bn_out
+    """
+
+    input_layers = common.find_input_layers(node_layer_map)
+    visited_layer = set()
+    conv_linear_with_bn_dict = {}
+
+    for input_layer in input_layers:
+        _fill_conv_linear_bn_dict(input_layer, node_layer_map, layer_out_node_map,
+                                  [None, None, None], visited_layer, conv_linear_with_bn_dict)
+
+    return conv_linear_with_bn_dict
+
+
+def _get_bn_params(bn: tf.keras.layers.BatchNormalization) -> libpymo.BNParams():
+    """
+    helper to populate BN params from given BN Layer, required for fold
+
+    :param bn: BatchNorm Layer
+    :return: return bn params in libpymo.TensorParams() format.
+    """
+    if bn.gamma is None:
+        _logger.warning("Gamma for BatchNormalization '%s' is None. Setting to ones.", bn.name)
+        # Batch Normalization layers can having missing gammas with two different cases. One is that the 'gamma' attribute
+        # is set to None. The second is if `scale` is set to False upon creation of the layer which turns off gamma.
+        with tf.name_scope(bn.name):
+            weights_with_gamma_and_before_rebuild = [np.ones_like(bn.beta)] + bn.get_weights()
+            bn.scale = True
+            bn.build(bn.input.shape)
+            bn.set_weights(weights_with_gamma_and_before_rebuild)
+            bn.gamma = next(filter(lambda w: 'gamma' in w.name, bn.weights))
+
+    bn_params = libpymo.BNParams()
+
+    bn_params.gamma = bn.gamma.numpy().reshape(-1)
+    bn_params.beta = bn.beta.numpy().reshape(-1)
+    bn_params.runningMean = bn.moving_mean.numpy().reshape(-1)
+    bn_params.runningVar = bn.moving_variance.numpy().reshape(-1)
+    epsilon = bn.epsilon
+    var = bn.moving_variance.numpy()
+    var_with_epsilon = var + epsilon
+    sigma = np.sqrt(var_with_epsilon)
+    bn_params.runningVar = sigma
+
+    return bn_params
+
+
+def _get_bias_tensor(conv_linear: LayerType) -> libpymo.TensorParams():
+    """
+    Get bias tensor in given conv layer.
+
+    Packs bias in the format required for BN fold
+    (libpymo.TensorParams()).
+    :param conv_linear: conv Layer
+    :return: return bias param in libpymo.TensorParams() format.
+    """
+
+    bias_tensor = libpymo.TensorParams()
+    if conv_linear.bias is not None:
+        bias_tensor.data = conv_linear.bias.numpy().reshape(-1)
+        bias_tensor.shape = np.array(conv_linear.bias.shape)
+
+    return bias_tensor
+
+
+def _get_weight_tensor_transpose_reshape(conv_linear: LayerType) -> libpymo.TensorParams():
+    """
+    Get weight tensor from conv layer.
+
+    Converts to right format - performs transpose and reshape.
+    Packs it to the format required for BN fold (libpymo.TensorParams()).
+    :param conv_linear: conv layer
+    :return: return weight tensor in libpymo.TensorParams() format.
+    """
+
+    # Weight tensor libpymo format
+    weight_tensor = libpymo.TensorParams()
+
+    # linear array to be sent for bn fold
+    weight = conv_linear.get_weights()[0]
+    shape = weight.shape
+
+    if isinstance(conv_linear, tf.keras.layers.DepthwiseConv2D):
+        # Depthwise conv layers in TF have outputs(Noc) set to 1.
+        # we will use format [Nic, Noc, kh, kw] -
+        # to be compatible with cpp backend.
+        weight = np.transpose(weight, (2, 3, 0, 1))
+        # [Nic, Noc, kh, kw]
+        shape = np.array([shape[2], shape[3], shape[0], shape[1]])
+    elif isinstance(conv_linear, tf.keras.layers.Dense):
+        shape = np.concatenate((np.array([1, 1]), shape))
+        weight = np.transpose(weight, (1, 0))
+        # [Noc, Nic, kh, kw]
+        shape = np.array([shape[3], shape[2], shape[0], shape[1]])
+    elif isinstance(conv_linear, tf.keras.layers.Conv2DTranspose):
+        weight = np.transpose(weight, (2, 3, 0, 1))
+        # [Noc, Nic, kh, kw]
+        shape = np.array([shape[2], shape[3], shape[0], shape[1]])
+    elif isinstance(conv_linear, tf.keras.layers.Conv2D):
+        weight = np.transpose(weight, (3, 2, 0, 1))
+        # [Noc, Nic, kh, kw]
+        shape = np.array([shape[3], shape[2], shape[0], shape[1]])
+    else:
+        _logger.error("_get_weight_tensor_transpose_reshape(): Operation type unsupported")
+
+    weight_tensor.data = weight.reshape(-1)
+    weight_tensor.shape = shape
+
+    return weight_tensor
+
+
+class PassThroughOp(tf.keras.layers.Layer):
+    """
+    This is a pass-through op, used for purpose of making an op a no-op
+    """
+
+    # pylint: disable=arguments-differ
+    @staticmethod
+    def call(inputs):
+        """
+        This is a function to return input as an output
+        :param inputs: input to pass through
+        """
+        return inputs
+
+# pylint: disable=too-many-branches, protected-access, too-many-locals, too-many-nested-blocks
+@common.to_functional
+def _delete_bn_from_functional(model: tf.keras.Model,
+                               bn_layers_to_remove: List[tf.keras.layers.BatchNormalization]) -> tf.keras.Model:
+    """
+    This function is used to remove ALL batch normalization layers from a functional model passed via the
+    bn_layers_to_remove parameter. Removing in place is not possible for functional models as the layers inbound and
+    outbound connections are immutable. This function returns a new model with the batch normalization layers removed.
+
+    :param model: Model to remove bn_layers from
+    :param bn_layers_to_remove: List of batch normalization layers to remove from the model
+    :return: A new model with the batch normalization layers removed
+    """
+
+    # In order to do this, we first need to know the original models inbound and outbound connections to each layer.
+    # We then need to create a new model with the same inbound and outbound connections, but with the batch normalization
+    # layers removed. This is done by rerouting the inbound nodes of the batch normalization layers to the inbound nodes
+    # of the next layer. This can be seen in the following diagram:
+    #
+    # Original model flow ------------------------->
+    #   ______________        ______________        ______________
+    #  |             |       |             |       |             |
+    #  |    Conv     |  -X-> |  Batch Norm |  -X-> |    ReLU     |
+    #  |_____________|       |_____________|     ^ |_____________|
+    #  New model flow   \                       /
+    #                    \                     /
+    #                     \___________________/
+
+
+    def wrapped_bn_layer_in_bns_to_remove(layer: tf.keras.layers.Layer) -> bool:
+        return isinstance(layer, QcQuantizeWrapper) and layer._layer_to_wrap in bn_layers_to_remove
+
+    tf.keras.backend.clear_session() # clear session to not have tensor name conflicts
+
+    # Step 1: Get the inbound and outbound connections for each layer in the model
+    model_layer_connections = ModelLayerConnections.get_model_layers_connection_properties(model)
+
+    for inp in model.inputs:
+        model_layer_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].update({inp.name: inp})
+
+    # Step 2: Create a new model with the batch normalization layers removed by iterating through the layers in the model
+    # and using the inbound and outbound connections to rerouting around the batch normalization layers.
+    batch_norms_replaced_with_names = {}
+    model_outputs = []
+    for current_layer in model.layers:
+        if isinstance(current_layer, tf.keras.layers.InputLayer):
+            continue
+
+        # Determine input tensors of the given layer
+        layer_input = [model_layer_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS][layer_aux]
+                       for layer_aux in model_layer_connections[ModelLayerConnectionsProperties.INBOUND_NODES][current_layer.name]]
+
+        layer_input = layer_input[0] if len(layer_input) == 1 else layer_input
+
+        # Reroute around batch normalization layers if the layer is in the list of layers to remove
+        if current_layer in bn_layers_to_remove or wrapped_bn_layer_in_bns_to_remove(current_layer):
+            _logger.debug("Removing Batch Normalization layer %s", current_layer.name)
+
+            for outbound_node in current_layer._outbound_nodes:  # pylint: disable=protected-access
+                # Find and replace the Batch Normalization output layers input that holds the Batch Normalization layer
+                # node and replace it with the input layers of the Batch Normalization layer.
+                # For example, if ReLU's inputs are [conv1_bn] and conv1_bn's inputs are [conv1], then we replace
+                # ReLU's inputs with [conv1]
+
+                all_batch_norms_inbound_layers_names = \
+                    [inbound_node.inbound_layers.name for inbound_node in current_layer._inbound_nodes]
+
+                # Go through all the outbound layers of the batch normalization layer and replace the batch normalization
+                # layer name with the input layer names of the batch normalization layer.
+                batch_norms_outbound_layers_new_inbound_layers_names = \
+                    [outlayer.replace(current_layer.name, *all_batch_norms_inbound_layers_names)
+                     for outlayer in model_layer_connections[ModelLayerConnectionsProperties.INBOUND_NODES][outbound_node.outbound_layer.name]]
+
+                # Keras Batch Norm only supports one input tensors. Meaning there is one singular layer coming into it.
+                # Hence, 'inbound_nodes[0]'.
+                batch_norms_replaced_with_names[current_layer.name] = current_layer._inbound_nodes[0].inbound_layers.name
+
+                model_layer_connections[ModelLayerConnectionsProperties.INBOUND_NODES].update(
+                    {outbound_node.outbound_layer.name: batch_norms_outbound_layers_new_inbound_layers_names})
+
+                # The above updates our dict for the mapping of the inputs, but we need to also update what Keras thinks
+                # the inputs are. This is done by updating the inbound nodes of the output layer of the Batch Normalization.
+                # THIS IS ONLY FOR MAPPING THE INPUTS TO BUILD A NEW MODEL. The original models underlying structure is
+                # not changed.
+                outbound_node.outbound_layer._inbound_nodes = current_layer.inbound_nodes  # pylint: disable=protected-access
+
+        # Otherwise, treat like a normal layer
+        else:
+            # For layers that have multiple inputs, order matters for what is fed into the layer. For example, if we have
+            # an Add layer with inputs from a ReLU and a Batch Norm, the order they go into the Add matters. Furthermore,
+            # if the Batch Norm is deleted, then it needs to be replaced with it's folded layer in the same order.
+
+            KERAS_SYMBOLIC_TENSORS_INDEX = 0
+            # Check if we need to change layer_input order. If there is just one input, there is no order.
+            # Special case when there is a Lambda layer with multiple inputs is handled seperately
+            if isinstance(layer_input, List) and not isinstance(current_layer, TFOpLambda):
+                # Original models keras symbolic tensor order
+                original_keras_symbolic_tensors_order = model_layer_connections[ModelLayerConnectionsProperties.CALL_ARGS][
+                    current_layer.name][KERAS_SYMBOLIC_TENSORS_INDEX]
+
+                # Special case for Lambda layers. Lambda layers can be thought of as z = x + y. Unfortunately, their call
+                # args for the keras symbolic tensors will ONLY have the x portion. In our layer_input we have both x and y.
+                # This statement is added to wrap the x portion of the original call args and check if it's a batch norm
+                # folded out.
+                if not isinstance(original_keras_symbolic_tensors_order, List):
+                    original_keras_symbolic_tensors_order = [original_keras_symbolic_tensors_order]
+
+                # Check if a Batch Norm that was deleted is in the original keras symbolic order.
+                name_of_bn_replaced = [
+                    tensor._keras_history.layer.name
+                    for tensor in original_keras_symbolic_tensors_order
+                    if tensor._keras_history.layer.name in batch_norms_replaced_with_names
+                ]
+
+                # If a Batch Norm is found, then the keras symbolic tensor order is slightly updated to replace the
+                # Batch Norm with the folded layer. Otherwise, we can just use the original keras symbolic tensor order.
+                if name_of_bn_replaced:
+
+                    updated_keras_symbolic_tensors_order = []
+                    for keras_symbolic_tensor in original_keras_symbolic_tensors_order:
+                        if (name_of_bn := keras_symbolic_tensor._keras_history.layer.name) in name_of_bn_replaced: #pylint: disable=superfluous-parens
+                            updated_keras_symbolic_tensors_order.append(
+                                model_layer_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS][
+                                    batch_norms_replaced_with_names[name_of_bn]
+                                ]
+                            )
+                        else:
+                            updated_keras_symbolic_tensors_order.append(keras_symbolic_tensor)
+
+                    # Dictionary of the keras symbolic tensor name to the order.
+                    ordered_inputs = {k.name: v for v, k in enumerate(updated_keras_symbolic_tensors_order)}
+
+                    # Sort layer_input based on the above dictionary.
+                    layer_input = sorted(layer_input, key=lambda current_input, oi=ordered_inputs: oi[current_input.name])
+
+            # Since we are rerouting around the batch normalization layers, we need to temporarily remove the inbound
+            # and outbound nodes of the batch normalization layers so that the model can be built correctly and not
+            # duplicate the non batch normalization layers inbound/outbound nodes.
+            current_layer._inbound_nodes = []  # pylint: disable=protected-access
+            # Special case for when there is a Lambda operation with multiple inputs. For example, z = x + y.
+            if isinstance(current_layer, TFOpLambda):
+                kmp = _KerasModelPreparer.get_instance_for_common_layer_passthrough_functions(model_layer_connections)
+                x = kmp._handle_normal_keras_layer(current_layer)  # pylint: disable=protected-access
+                # Updating the Model layer connections
+                kmp._update_output_tensors_in_model_layers_connections(  # pylint: disable=protected-access
+                    current_layer, x, model
+                )
+            else:
+                x = current_layer(layer_input)
+            current_layer._outbound_nodes = []  # pylint: disable=protected-access
+
+            # Set new output tensor (in this case, it will be the same as the original model)
+            model_layer_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].update({current_layer.name: x})
+
+        # Save tensor in output list if it is output in the initial model
+        if current_layer.name in model.output_names:
+            model_outputs.append(x)
+
+    return tf.keras.Model(inputs=model.inputs, outputs=model_outputs)
+
+
+def _delete_bn_from_sequential(layer: tf.keras.layers.Layer,
+                               bn: tf.keras.layers.BatchNormalization):
+
+    """
+    This is the function for removing batch normalization layers that are layers of sequential model
+
+    :param layer: model to obtain bn_layer that we want to remove
+    :param bn: batch normalization layer that needs to be removed
+    """
+
+    layers_after_bn = []
+    visited = False
+    idx = None
+    # pylint: disable=protected-access
+    for index, inner_layer in enumerate(layer.layers):
+        if visited:
+            layers_after_bn.append(inner_layer)
+
+        elif inner_layer == bn:
+            visited = True
+            idx = index
+
+        elif inner_layer.submodules:
+            _delete_bn_for_non_subclassed_model(inner_layer, bn)
+
+    if visited and idx is not None:
+        # pylint: disable=protected-access
+        for _ in range(len(layer.layers) - idx):
+            layer.pop()
+        for layer_to_add in layers_after_bn:
+            layer.add(layer_to_add)
+
+
+def _delete_bn_for_non_subclassed_model(model: Union[tf.keras.Model, tf.keras.layers.Layer],
+                                        bn_layer: tf.keras.layers.BatchNormalization):
+    """
+    Remove bn layer for those model which are not part of model subclassing
+
+    :param model: model to delete bn layers from
+    :param bn_layer: bn layer that should be removed
+    """
+
+    if isinstance(model, tf.keras.Sequential):
+        _delete_bn_from_sequential(model, bn_layer)
+
+    # We are expecting to find sequential model in functional model
+    # or model subclassing in the elif statement
+    elif isinstance(model, (tf.keras.layers.Layer, tf.keras.Model)):
+        for layer in model.layers:
+            if layer.submodules:
+                _delete_bn_for_non_subclassed_model(layer, bn_layer)
+
+
+def _delete_bn_from_model_subclassing(module_to_name_map: Dict[tf.keras.layers.Layer,
+                                                               Tuple[tf.keras.Model, str]],
+                                      bn_layer: tf.keras.layers.BatchNormalization):
+    """
+    Remove bn layer which is part of model subclassing api
+    or model inheriting from tf.keras.layers.Layer
+
+    :param module_to_name_map: model to remove bn from
+    :param bn_layer: bn layer that should be removed
+    """
+
+    parent_ref, module_name = module_to_name_map[bn_layer]
+    op = PassThroughOp()
+    setattr(parent_ref, module_name, op)
+
+# pylint: disable=inconsistent-return-statements
+def _delete_all_bns_from_model(model: Union[tf.keras.Model, tf.keras.layers.Layer],
+                               bn_layers: List[tf.keras.layers.BatchNormalization]) -> Optional[tf.keras.Model]:
+    """
+    Remove all bn layers for a given model.
+
+    :param model: Model to have the bn layers removed from
+    :param bn_layers: bn layers that should be removed
+    :return: new model with bn layers removed, if model is functional else None
+    """
+    if bn_layers:
+        # QuantizationSimModel's model will fall into this case.
+        if isinstance(model, Functional) and not isinstance(model, tf.keras.Sequential) or any(isinstance(l, QcQuantizeWrapper) for l in model.layers):
+            return _delete_bn_from_functional(model, bn_layers)
+
+        module_to_name_map = common.module_to_name_map(model)
+
+        for bn_layer in bn_layers:
+            if bn_layer in module_to_name_map:
+                _delete_bn_from_model_subclassing(module_to_name_map, bn_layer)
+            else:
+                _delete_bn_for_non_subclassed_model(model, bn_layer)
+
+
+def _find_all_batch_norms_to_fold(model: tf.keras.Model) -> Tuple[List[PairType], List[PairType], Set[tf.keras.layers.BatchNormalization]]:
+    """
+    uses searcher to choose layers for bias correction
+
+    :param model: model to obtain conv_linear pairs for
+    :return: List of conv/linear layers with associated bn op / activation info and
+            a Set of all the batch norms which are marked for folding.
+    """
+
+    node_layer_map = common.create_node_to_layer_map(model)
+    layer_out_node_map = common.create_layer_to_out_node_map(model)
+
+    possible_convs_linears_bn = _find_possible_convs_linears_bn(node_layer_map, layer_out_node_map)
+
+    # get all ordered convs/ linears layers
+    ordered_conv_linears = _get_ordered_conv_linears(node_layer_map, layer_out_node_map)
+
+    bn_picked_for_folding = set()
+    def get_pairs(conv_is_first=False) -> List:
+        index = 1 if conv_is_first else 0
+
+        pairs_list = []
+        for conv_linear in ordered_conv_linears:
+            if conv_linear in possible_convs_linears_bn and (bn_info := possible_convs_linears_bn[conv_linear]):
+                if bn_info[index] and bn_info[index] not in bn_picked_for_folding:
+                    pairs_list.append((conv_linear, bn_info[index]) if conv_is_first else (bn_info[index], conv_linear))
+                    bn_picked_for_folding.add(bn_info[index])
+
+        return pairs_list
+
+    conv_bn_pairs = get_pairs(conv_is_first=True)
+    bn_conv_pairs = get_pairs(conv_is_first=False)
+
+    return conv_bn_pairs, bn_conv_pairs, bn_picked_for_folding
+
+
+
[docs]def fold_all_batch_norms(model: tf.keras.Model) \ + -> Tuple[List[Tuple[LayerType, BatchNormType]], tf.keras.Model]: + """ + Fold all batch_norm layers in a model into corresponding conv/linear layers + + :param model: model to find all batch norms for + :return: A tuple of List of conv/linear layers with associated bn op / activation info and a new model with the + Batch Normalization layers folded + """ + + conv_bn_pairs, bn_conv_pairs, folded_bns = _find_all_batch_norms_to_fold(model) + + # Potential new model is returned in case the model is a functional model + potential_new_model = _fold_given_batch_norms(model, conv_bn_pairs, bn_conv_pairs) + model = potential_new_model if potential_new_model else model + + # Convert the standalone BNs which are not folded + bn_converted = convert_standalone_batchnorms(model, folded_bns) + if bn_converted: + _logger.info("%d BatchNorms' weights got converted", len(bn_converted)) + model.compile() + _logger.warning("A new model is returned with the Batch Normalization layers removed for Keras models. " + "Please use this new model for the rest of the AIMET flow.") + + return conv_bn_pairs + [(conv, bn) for bn, conv in bn_conv_pairs], model
+ + +def convert_standalone_batchnorms(model: tf.keras.Model, folded_bns: set) -> List[tf.keras.layers.BatchNormalization]: + """ + Converts the weights of standalone batch norms remaining in the model after BN folding + :param model: keras model on which batch norm folding is being performed + :param folded_bns: list of batch norms which got folded + :return: list of BatchNorms whose weights is converted + """ + + bn_converted = [] + for layer in model.layers: + if isinstance(layer, tf.keras.layers.BatchNormalization) and layer not in folded_bns: + convert_batchnorm_parameters(layer) + _logger.debug("%s weights got converted", layer.name) + bn_converted.append(layer) + return bn_converted + + +def convert_batchnorm_parameters(bn: tf.keras.layers.BatchNormalization): + """ + Convert the weights of BN such that it works as y = weights * x + bias + :param bn: Batch Norm layer whose weights need to be converted + """ + bn_params = _get_bn_params(bn) + + # inv :: 1/ Sqrt(var + eps) + inv = tf.math.rsqrt(bn.moving_variance.numpy() + bn.epsilon) + weight = np.array(bn_params.gamma) * np.array(inv) + bias = np.array(bn_params.beta) - np.array(bn_params.runningMean) * weight + + new_bn_weights = [weight.data, bias.data, + np.zeros(shape=bn.moving_mean.shape, dtype=np.float32), + np.ones(shape=bn.moving_variance.shape, dtype=np.float32)] + bn.trainable = False + bn.set_weights(new_bn_weights) + bn.epsilon = 0 + + +# pylint: disable=protected-access +
[docs]def fold_all_batch_norms_to_scale(sim: QuantizationSimModel) -> List[Tuple[QcQuantizeWrapper, QcQuantizeWrapper]]: + """ + Fold all batch_norm layers in a model into the quantization scale parameter + of the corresponding conv layers + + :param sim: QuantizationSimModel to be folded + :return: A list of pairs of layers [(Conv/Linear, BN layer that got folded)] + """ + + assert sim.model is not None, "QuantizationSimModel attribute 'model' is None." + + model = sim._model_without_wrappers + + quant_wrappers = { + quant_wrapper._layer_to_wrap: quant_wrapper + for quant_wrapper in sim.quant_wrappers() + } + + conv_bn_pairs, bn_conv_pairs, _ = _find_all_batch_norms_to_fold(model) + conv_bn_pairs = [ + (quant_wrappers[conv], quant_wrappers[bn]) for conv, bn in conv_bn_pairs + ] + bn_conv_pairs = [ + (quant_wrappers[bn], quant_wrappers[conv]) for bn, conv in bn_conv_pairs + ] + + old_model_without_wrappers = tf.keras.models.clone_model(model) + conv_bn_pairs_without_wrappers, _, _ = _find_all_batch_norms_to_fold(old_model_without_wrappers) + old_model_without_wrappers.set_weights(WeightTensorUtils.get_all_sim_models_layer_to_wrap_weights(sim.model)) + + # We fold both the sim.model and sim._model_without_wrappers because we rebuild the QuantizationSimModel during + # export and this utilizes the sim._model_without_wrappers to achieve this. + bn_fold_sim_model = _fold_given_batch_norms(sim.model, conv_bn_pairs, bn_conv_pairs) + sim.model = bn_fold_sim_model if bn_fold_sim_model else sim.model + + bn_fold_model = _fold_given_batch_norms(old_model_without_wrappers, conv_bn_pairs_without_wrappers, []) + sim._model_without_wrappers = bn_fold_model if bn_fold_model else old_model_without_wrappers + + return conv_bn_pairs + [(conv, bn) for bn, conv in bn_conv_pairs]
+ +
[docs]def fold_given_batch_norms(model: tf.keras.Model, layer_pairs: List[PairType]) -> Optional[tf.keras.Model]: + """ + Fold a given set of batch_norm layers into conv_linear layers + + :param model: Either a Keras Model or a QuantizationSimModel's model + :param layer_pairs: Tuple of conv, bn layers and is_batch_norm_second flag + :return: new model with batch norm layers folded if model is a functional model, else None + """ + # pylint: disable=protected-access + conv_bn_paris = [] + bn_conv_pairs = [] + + def is_batchnorm(layer: tf.keras.layers.Layer) -> bool: + if isinstance(layer, QcQuantizeWrapper): + layer = layer._layer_to_wrap + return isinstance(layer, _supported_batchnorms) + + def is_conv_linear(layer: tf.keras.layers.Layer) -> bool: + if isinstance(layer, QcQuantizeWrapper): + layer = layer._layer_to_wrap + return isinstance(layer, _supported_layers) + + for x, y in layer_pairs: + if is_batchnorm(x): + assert is_conv_linear(y) + bn = x + conv = y + bn_conv_pairs.append((bn, conv)) + else: + assert is_conv_linear(x) + assert is_batchnorm(y) + conv = x + bn = y + conv_bn_paris.append((conv, bn)) + + return _fold_given_batch_norms(model, conv_bn_paris, bn_conv_pairs)
+ +def _fold_given_batch_norms(model: tf.keras.Model, + conv_bn_pairs: Iterable[Tuple[tf.keras.layers.Layer, tf.keras.layers.Layer]], + bn_conv_pairs: Iterable[Tuple[tf.keras.layers.Layer, tf.keras.layers.Layer]]) -> \ + Optional[tf.keras.Model]: + """ + Fold a given set of batch_norm layers into conv layers + + :param model: Model + :param conv_bn_pairs: List of (conv, bn) pairs to fold + :param bn_conv_pairs: List of (bn, conv) pairs to fold + """ + for bn, conv in bn_conv_pairs: + if isinstance(conv, QcQuantizeWrapper): + raise RuntimeError(f"Forward folding to scale is not possible. Got {conv.name}") + + bn_layers = [] + + def _fold(conv, bn, fold_backward): + is_wrapped = isinstance(conv, QcQuantizeWrapper) or isinstance(bn, QcQuantizeWrapper) + try: + if is_wrapped: + assert isinstance(conv, QcQuantizeWrapper) and isinstance(bn, QcQuantizeWrapper) + bn._layer_to_wrap.trainable = False + _fold_to_scale(conv, bn) + bn_layers.append(bn._layer_to_wrap) + else: + bn.trainable = False + _fold_to_weight(conv, bn, fold_backward=fold_backward) + except _BatchNormFoldingNotSupported as e: + bn_name = bn._layer_to_wrap.name if is_wrapped else bn.name + conv_name = conv._layer_to_wrap.name if is_wrapped else conv.name + _logger.warning( + "Failed to fold %s to %s. [Reason] %s", bn_name, conv_name, str(e) + ) + else: + bn_layers.append(bn._layer_to_wrap if is_wrapped else bn) + + for conv, bn in conv_bn_pairs: + _fold(conv, bn, fold_backward=True) + + for bn, conv in bn_conv_pairs: + _fold(conv, bn, fold_backward=False) + + return _delete_all_bns_from_model(model, bn_layers) + +class _BatchNormFoldingNotSupported(RuntimeError): + pass + +def _fold_to_scale(conv_wrapper: QcQuantizeWrapper, bn_wrapper: QcQuantizeWrapper): + """ + Fold BatchNorm into the scale and bias of the given layer. + + :param conv_wrapper: QcQuantizeWrapper that wraps conv or linear layer + :param bn_wrapper: QcQuantizeWrapper that wraps the Batch Norm layer + """ + # pylint: disable=protected-access, too-many-statements, too-many-locals + conv = conv_wrapper._layer_to_wrap + bn = bn_wrapper._layer_to_wrap + + weight_quantizer = get_wrappers_weight_quantizer(conv_wrapper.param_quantizers) + bias_quantizer = get_wrappers_bias_quantizer(conv_wrapper.param_quantizers) + + # Checking QuantScheme as aimet_tensorflow.keras does not have LearnedGridTensorQuantizer + if weight_quantizer.quant_scheme not in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init]: + raise _BatchNormFoldingNotSupported( + "BatchNorm folding to scale supports training_range_learning_with_tf_init or " + "training_range_learning_with_tf_enhanced_init only. " + f"got {weight_quantizer.quant_scheme}" + ) + + output_quantizer = conv_wrapper.output_quantizers[0] + + if output_quantizer.is_enabled(): + raise _BatchNormFoldingNotSupported( + "BatchNorm should belong to the same supergroup with the layer to be folded to." + ) + + if bias_quantizer: + if bias_quantizer.is_enabled(): + raise _BatchNormFoldingNotSupported( + "Can't fold BatchNorm to scale if bias quantizer is enabled." + ) + + enc_min = weight_quantizer._encoding_min + enc_max = weight_quantizer._encoding_max + + if not weight_quantizer.is_encoding_valid(): + raise RuntimeError + + with bn_wrapper._quantize_params(): + _fold_to_weight(conv, bn, fold_backward=True) + + gamma = bn.gamma + sigma = K.sqrt(bn.moving_variance + bn.epsilon) + + for i, c in enumerate(gamma/sigma): + c = float(c) + if c >= 0: + enc_max[i].assign(enc_max[i] * c) + enc_min[i].assign(enc_min[i] * c) + else: + enc_max_before_reassign = enc_max[i] + enc_max[i].assign(enc_min[i] * c) + enc_min[i].assign(enc_max_before_reassign * c) + + + # Copy batchnorm's output quantizers to conv output quantizers + for conv_output_quantizer, bn_output_quantizer in \ + zip(conv_wrapper.output_quantizers, bn_wrapper.output_quantizers): + if bn_output_quantizer.encoding is not None: + conv_output_quantizer._encoding_min.assign(bn_output_quantizer._encoding_min) + conv_output_quantizer._encoding_max.assign(bn_output_quantizer._encoding_max) + conv_output_quantizer._is_encoding_valid = True + + tensor_quantizers = conv_output_quantizer._tensor_quantizer if isinstance(conv_output_quantizer._tensor_quantizer, List) else [conv_output_quantizer._tensor_quantizer] + for tensor_quantizer in tensor_quantizers: + tensor_quantizer.isEncodingValid = True + + if bn_output_quantizer.is_enabled(): + conv_output_quantizer.enable() + else: + conv_output_quantizer.disable() + + + + bn_output_quantizer.disable() + + if bias_quantizer is None: + bias_quantizer = ParamPerTensorQuantizer(conv, + conv.bias.name.split(':')[0], + weight_quantizer.quant_scheme, + MAP_PYMO_TO_ROUND_MODE[weight_quantizer.round_mode], + weight_quantizer.bitwidth, + weight_quantizer.data_type, + weight_quantizer.is_symmetric, + weight_quantizer.use_strict_symmetric, + weight_quantizer.use_unsigned_symmetric, + enabled=False) + tensor_quantizers = bias_quantizer._tensor_quantizer if isinstance(bias_quantizer._tensor_quantizer, List) else [bias_quantizer._tensor_quantizer] + for tensor_quantizer in tensor_quantizers: + tensor_quantizer.isEncodingValid = True + conv_wrapper.param_quantizers.append(bias_quantizer) + + +def _fold_to_weight(conv_linear: LayerType, bn: BatchNormType, fold_backward: bool): + """ + Fold BatchNorm into the weight and bias of the given layer. + + :param conv_linear: Conv or linear layer to fold BN into. + :param bn: BatchNorm to fold. + :param fold_backward: To fold backwards or not + """ + + is_bias_valid = conv_linear.bias is not None + + bn_params = _get_bn_params(bn) + weight_tensor = _get_weight_tensor_transpose_reshape(conv_linear) + bias_tensor = _get_bias_tensor(conv_linear) + + # Updated weight and bias + bias = libpymo.fold(bn_params, weight_tensor, bias_tensor, is_bias_valid, fold_backward) + + if isinstance(conv_linear, tf.keras.layers.DepthwiseConv2D): + # Depthwise conv layers in TF have outputs(Noc) set to 1. + # we send in format [Nic, Noc, kh, kw] + numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 0, 1)) + + elif isinstance(conv_linear, tf.keras.layers.Dense): + # o, i - convert to i , o + numpy_weight_reshaped = np.reshape( + weight_tensor.data, + [weight_tensor.shape[0], weight_tensor.shape[1]]).transpose(1, 0) + + elif isinstance(conv_linear, tf.keras.layers.Conv2DTranspose): + # we sent in format [Noc, Nic, kh, kw] + numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 0, 1)) + + else: + # conv2D case + # we sent in format [Noc, Nic, kh, kw] + numpy_weight_reshaped = np.reshape(weight_tensor.data, weight_tensor.shape).transpose((2, 3, 1, 0)) + + # update bias tensor, even in case there was no existing bias add op in given conv2D op. + bias_tensor_shape = [weight_tensor.shape[0]] + numpy_bias_reshaped = np.reshape(bias, bias_tensor_shape) + + if not is_bias_valid: + conv_linear.use_bias = True + conv_linear.bias = conv_linear.add_weight(name=f"{conv_linear.name}/bias", + shape=(weight_tensor.shape[0],), + dtype=conv_linear.dtype, + trainable=True) + conv_linear.set_weights([numpy_weight_reshaped.data, numpy_bias_reshaped]) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/bn_reestimation.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/bn_reestimation.html new file mode 100644 index 0000000..03bdc3f --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/bn_reestimation.html @@ -0,0 +1,1254 @@ + + + + + + aimet_tensorflow.keras.bn_reestimation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.bn_reestimation

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+"""BatchNorm Reestimation"""
+from typing import List, Dict
+import numpy as np
+import tensorflow as tf
+from aimet_common.utils import Handle, AimetLogger
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Utils)
+
+def _get_bn_submodules(model: tf.keras.Model) -> List[tf.keras.layers.Layer]:
+    bn_layers = []
+    for layer in model.submodules:
+        if isinstance(layer, tf.keras.layers.BatchNormalization):
+            bn_layers.append(layer)
+    return bn_layers
+
+
+def _reset_bn_stats(bn_layers: List[tf.keras.layers.Layer], bn_mean_checkpoints: Dict, bn_var_checkpoints: Dict, bn_momentum_checkpoints: Dict) -> Handle:
+    """
+    reset bn stats
+    :param bn_layers: keras bn_layers
+    :param bn_mean_checkpoints: Dict for original bn mean
+    :param bn_var_checkpoints: Dict for original bn var
+    :param bn_momentum_checkpoints: Dict for original bn momentum
+    :return:
+    """
+
+    def cleanup():
+        """
+        Restore Bn stats
+        """
+        for layer in bn_layers:
+            move_mean = bn_mean_checkpoints[layer.name]
+            move_var = bn_var_checkpoints[layer.name]
+            gamma, beta, _, _ = layer.get_weights()
+            layer.set_weights([gamma, beta, move_mean, move_var])
+            layer.momentum = bn_momentum_checkpoints[layer.name]
+
+    try:
+        for layer in bn_layers:
+            layer.momentum = 0.0
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise ValueError('exception for reset_bn_stats')  # pylint: disable=raise-missing-from
+
+# pylint: disable=too-many-locals
+
[docs]def reestimate_bn_stats(model: tf.keras.Model, bn_re_estimation_dataset: tf.data.Dataset, + bn_num_batches: int = 100) -> Handle: + """ + + top level api for end user directly call + + :param model: tf.keras.Model + :param bn_re_estimation_dataset: Training dataset + :param bn_num_batches: The number of batches to be used for reestimation + :returns: Handle that undos the effect of BN reestimation upon handle.remove() + """ + + bn_layers = _get_bn_submodules(model) + + # save checkpoints + bn_mean_ori = {layer.name: layer.moving_mean.numpy() for layer in bn_layers} + bn_var_ori = {layer.name: layer.moving_variance.numpy() for layer in bn_layers} + bn_momentum_ori = {layer.name: layer.momentum for layer in bn_layers} + # 1. switch to re-estimation mode and setup remove + handle = _reset_bn_stats(bn_layers, bn_mean_ori, bn_var_ori, bn_momentum_ori) + + # 2. mean &var initialization + mean_sum_dict = {layer.name: np.zeros(layer.moving_mean.shape, dtype=layer.moving_mean.dtype.as_numpy_dtype) for layer in bn_layers} + var_sum_dict = {layer.name: np.zeros(layer.moving_variance.shape, dtype=layer.moving_variance.dtype.as_numpy_dtype) for layer in bn_layers} + + # 3 per batch forward for BN re-estimation, accumulate into mean&var buffers + bn_dataset_iterator = iter(bn_re_estimation_dataset) + for batch_index in range(bn_num_batches): + try: + batch_data = next(bn_dataset_iterator) + model(batch_data, training=True) + for layer in bn_layers: + mean_sum_dict[layer.name] += layer.moving_mean.numpy() + var_sum_dict[layer.name] += layer.moving_variance.numpy() + if batch_index == bn_num_batches - 1: + break + except tf.errors.OutOfRangeError: + logger.info("tf.errors.OutOfRangeError:: End of dataset.") + break + + # 4 average mean&var buffers, Override BN stats with the reestimated stats + for layer in bn_layers: + move_mean = mean_sum_dict[layer.name]/bn_num_batches + move_var = var_sum_dict[layer.name]/bn_num_batches + gamma, beta, _, _ = layer.get_weights() + layer.set_weights([gamma, beta, move_mean, move_var]) + + return handle
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/compress.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/compress.html new file mode 100644 index 0000000..2ec0e80 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/compress.html @@ -0,0 +1,1233 @@ + + + + + + aimet_tensorflow.keras.compress — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.compress

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Top-level API for aimet compression library """
+
+from typing import Union, Tuple, Callable
+import tensorflow as tf
+
+from aimet_common.defs import CostMetric, CompressionScheme, EvalFunction, CompressionStats
+from aimet_common.bokeh_plots import BokehServerSession
+
+from aimet_tensorflow.utils.graph_saver import keras_wrapper_func, keras_save_and_load_graph, keras_remove_hanging_nodes
+from aimet_tensorflow.defs import SpatialSvdParameters
+from aimet_tensorflow.keras.compression_factory import CompressionFactory
+
+
+
[docs]class ModelCompressor: + """ aimet model compressor: Enables model compression using various schemes """ + + # pylint: disable=too-many-arguments + +
[docs] @staticmethod + def compress_model(model: tf.keras.Model, eval_callback: EvalFunction, eval_iterations, + compress_scheme: CompressionScheme, cost_metric: CostMetric, + parameters: Union[SpatialSvdParameters], + trainer: Callable = None, visualization_url: str = None) -> Tuple[tf.keras.Model, CompressionStats]: + """ + Compress a given model using the specified parameters + + :param model: Model, represented by a tf.keras.Model, to compress + :param eval_callback: Evaluation callback. Expected signature is evaluate(model, iterations, use_cuda). + Expected to return an accuracy metric. + :param eval_iterations: Iterations to run evaluation for. + :param compress_scheme: Compression scheme. See the enum for allowed values + :param cost_metric: Cost metric to use for the compression-ratio (either mac or memory) + :param parameters: Compression parameters specific to given compression scheme + :param trainer: Training function + None: If per layer fine-tuning is not required while creating the final compressed model + :param visualization_url: url the user will need to input where visualizations will appear + :return: A tuple of the compressed model session, and compression statistics + """ + + # If no url is passed in, then do not create a bokeh server session + if not visualization_url: + bokeh_session = None + else: + # create a bokeh session to publish visualizations to the server document for compression + bokeh_session = BokehServerSession(url=visualization_url, session_id="compression") + + if parameters.multiplicity < 1: + raise ValueError('Rounding Multiplicity should be greater than 1') + + # wrapper_func saves and reloads the graph before evaluation + # In Keras after making changes to the graph you must save and reload, then evaluate + eval_callback = keras_wrapper_func(eval_callback) + + if compress_scheme == CompressionScheme.spatial_svd: + algo = CompressionFactory.create_spatial_svd_algo(model, eval_callback, eval_iterations, + cost_metric, parameters, bokeh_session) + elif compress_scheme == CompressionScheme.weight_svd: + raise NotImplementedError("Not yet implemented for: {}".format(compress_scheme)) + elif compress_scheme == CompressionScheme.channel_pruning: + raise NotImplementedError("Not yet implemented for: {}".format(compress_scheme)) + else: + raise ValueError("Compression scheme not supported: {}".format(compress_scheme)) + + compressed_layer_db, stats = algo.compress_model(cost_metric, trainer) + + # In keras after making changes to the model you must save and reload, then evaluate + tmp_dir = './data/saved_model' + updated_model = keras_save_and_load_graph(tmp_dir, compressed_layer_db.model) + + # Remove the hanging nodes + updated_model = keras_remove_hanging_nodes(updated_model) + + return updated_model, stats
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/cross_layer_equalization.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/cross_layer_equalization.html new file mode 100644 index 0000000..793f6f8 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/cross_layer_equalization.html @@ -0,0 +1,1618 @@ + + + + + + aimet_tensorflow.keras.cross_layer_equalization — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.cross_layer_equalization

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+"""Cross Layer Equalization"""
+
+import typing
+
+import numpy as np
+import tensorflow as tf
+
+import aimet_common.libpymo as libpymo
+from aimet_common.utils import AimetLogger
+from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+from aimet_tensorflow.keras.graphsearchtuils import GraphSearchUtils, ClsSet
+from aimet_tensorflow.keras.utils import model_transform_utils
+from aimet_tensorflow.keras.utils.weight_tensor_utils import WeightTensorUtils
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.CrosslayerEqualization)
+
+BatchNormFoldedPair = typing.Union[typing.Tuple[tf.keras.layers.Conv2D,
+                                                tf.keras.layers.BatchNormalization],
+                                   typing.Tuple[tf.keras.layers.Dense,
+                                                tf.keras.layers.BatchNormalization]]
+
+ScaleFactor = typing.Union[np.ndarray, typing.Tuple[np.ndarray, np.ndarray]]
+ReluFlag = typing.Union[bool, typing.Tuple[bool, bool]]
+
+Convs = typing.Union[tf.keras.layers.Conv2D,
+                     tf.keras.layers.DepthwiseConv2D,
+                     tf.keras.layers.Conv2DTranspose]
+
+_supported_convs = Convs.__args__
+
+
[docs]class ClsSetInfo: + """ + This class hold information about the layers in a CLS set, along with corresponding scaling factors + and other information like if there is a ReLU activation function between the CLS set layers + """ + +
[docs] class ClsSetLayerPairInfo: + """ + Models a pair of layers that were scaled using CLS. And related information. + """ + + def __init__(self, layer1: tf.keras.layers.Conv2D, layer2: tf.keras.layers.Conv2D, scale_factor: np.ndarray, + relu_activation_between_layers: bool): + """ + :param layer1: Layer whose bias is folded + :param layer2: Layer to which bias of previous layer's bias is folded + :param scale_factor: Scale Factor found from Cross Layer Scaling to scale BN parameters + :param relu_activation_between_layers: If the activation between layer1 and layer2 is Relu + """ + self.layer1 = layer1 + self.layer2 = layer2 + self.scale_factor = scale_factor + self.relu_activation_between_layers = relu_activation_between_layers + + def __eq__(self, other): + if isinstance(self, other.__class__): + return self.layer1 == other.layer1 and \ + self.layer2 == other.layer2 and \ + np.allclose(self.scale_factor, other.scale_factor) and \ + self.relu_activation_between_layers == other.relu_activation_between_layers + return False
+ + def __init__(self, cls_pair_1: ClsSetLayerPairInfo, cls_pair_2: ClsSetLayerPairInfo = None): + """ + Constructor takes 2 pairs if Depth-wise separable layer is being folded + :param cls_pair_1: Pair between two conv or conv and depth-wise conv + :param cls_pair_2: Pair between depth-wise conv and point-wise conv + """ + if cls_pair_2: + self.cls_pair_info_list = [cls_pair_1, cls_pair_2] + else: + self.cls_pair_info_list = [cls_pair_1] + + def __eq__(self, other): + if isinstance(self, other.__class__): + return self.cls_pair_info_list == other.cls_pair_info_list + + return False
+ +class CrossLayerScaling: + """ + Code to apply the cross-layer-scaling technique to a model + """ + + @staticmethod + def scale_cls_set_with_conv_layers( + cls_set: typing.Tuple[tf.keras.layers.Conv2D, tf.keras.layers.Conv2D]) -> np.ndarray: + """ + API to invoke equalize layer params (update for weights and bias is in place) + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized + :return: Scaling factor S_12 for each conv layer pair: numpy array + """ + + for layer in cls_set: + # NOTE: DepthwiseConv2D and Conv2DTranspose is subclass of Conv2D + # The check below covers all of Conv2D, DepthwiseConv2D and Conv2DTranspose class + if not isinstance(layer, tf.keras.layers.Conv2D): + raise ValueError("Only Conv or Transposed Conv layers are supported for CLE") + + scaling_factor, prev_layer_params, curr_layer_params = CrossLayerScaling.call_mo_scale(cls_set) + + prev_layer, curr_layer = cls_set + weight_and_bias_0 = CrossLayerScaling._unpack_equalization_params(prev_layer, prev_layer_params, + unpack_bias=True) + prev_layer.set_weights(weight_and_bias_0) + + weight_and_bias_1 = CrossLayerScaling._unpack_equalization_params(curr_layer, curr_layer_params, + unpack_bias=False) + curr_layer.set_weights(weight_and_bias_1) + + return scaling_factor + + @staticmethod + def call_mo_scale(cls_set: typing.Tuple[tf.keras.layers.Conv2D, tf.keras.layers.Conv2D]) \ + -> typing.Tuple[np.ndarray, libpymo.EqualizationParams, libpymo.EqualizationParams]: + """ + Invokes scale API in model optimization library + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized + :return: Scaling factor, prev and current layer updated parameters + """ + prev_layer_params = CrossLayerScaling._pack_equalization_params(cls_set[0], pack_bias=True) + curr_layer_params = CrossLayerScaling._pack_equalization_params(cls_set[1], pack_bias=False) + + scaling_factor = libpymo.scaleLayerParams(prev_layer_params, curr_layer_params) + return scaling_factor, prev_layer_params, curr_layer_params + + @staticmethod + def scale_cls_set_with_depthwise_conv_layers( + cls_set: typing.Tuple[tf.keras.layers.Conv2D, + tf.keras.layers.DepthwiseConv2D, + tf.keras.layers.Conv2D]) -> typing.Tuple[np.ndarray, np.ndarray]: + """ + API to invoke equalize layer params (update for weights and bias is in place) + :param cls_set: Consecutive Conv layers whose weights and biases need to be equalized. + Second Conv layer is a depth-wise conv and third conv layer is point-wise conv + :return: Scaling factors S_12 and S_23 : numpy arrays + """ + + for layer in cls_set: + if not isinstance(layer, _supported_convs): + raise ValueError("Only Conv or Transposed Conv layers are supported for CLE") + + scaling_params, prev_layer_params, curr_layer_params, next_layer_params = \ + CrossLayerScaling.call_mo_scale_depthwise_separable_layer(cls_set) + + prev_layer, curr_layer, next_layer = cls_set + weight_and_bias_0 = CrossLayerScaling._unpack_equalization_params(prev_layer, + prev_layer_params, + unpack_bias=True) + prev_layer.set_weights(weight_and_bias_0) + + weight_and_bias_1 = CrossLayerScaling._unpack_equalization_params(curr_layer, + curr_layer_params, + unpack_bias=True) + curr_layer.set_weights(weight_and_bias_1) + + weight_and_bias_2 = CrossLayerScaling._unpack_equalization_params(next_layer, + next_layer_params, + unpack_bias=False) + next_layer.set_weights(weight_and_bias_2) + + return scaling_params.scalingMatrix12, scaling_params.scalingMatrix23 + + @staticmethod + def call_mo_scale_depthwise_separable_layer( + cls_set: typing.Tuple[tf.keras.layers.Conv2D, + tf.keras.layers.DepthwiseConv2D, + tf.keras.layers.Conv2D]) -> typing.Tuple[libpymo.RescalingParamsVectors, + libpymo.EqualizationParams, + libpymo.EqualizationParams, + libpymo.EqualizationParams]: + """ + Invokes scale API in model optimization library + :param cls_set: Consecutive Conv layers whose weights and biases need to be equalized + :return: Scaling factors, prev, current and next layer updated parameters + """ + + prev_layer_params = CrossLayerScaling._pack_equalization_params(cls_set[0], pack_bias=True) + curr_layer_params = CrossLayerScaling._pack_equalization_params(cls_set[1], pack_bias=True) + next_layer_params = CrossLayerScaling._pack_equalization_params(cls_set[2], pack_bias=False) + + scaling_params = libpymo.scaleDepthWiseSeparableLayer(prev_layer_params, curr_layer_params, next_layer_params) + return scaling_params, prev_layer_params, curr_layer_params, next_layer_params + + @staticmethod + def _pack_equalization_params(layer: tf.keras.layers.Conv2D, pack_bias: bool) -> libpymo.EqualizationParams: + equalization_params = libpymo.EqualizationParams() + + param_tensors = layer.get_weights() + + weight_tensor = param_tensors[0] + weight_tensor = WeightTensorUtils.transpose_from_tf_to_libpymo_format(weight_tensor, layer) + + equalization_params.weight = weight_tensor.reshape(-1) + equalization_params.weightShape = np.array(weight_tensor.shape) + + if pack_bias: + if layer.use_bias: + equalization_params.bias = param_tensors[1] + else: + equalization_params.isBiasNone = True + + return equalization_params + + @staticmethod + def _unpack_equalization_params(layer: tf.keras.layers.Conv2D, + equalization_params: libpymo.EqualizationParams, + unpack_bias: bool) -> typing.List: + + weight_tensor = np.reshape(equalization_params.weight, equalization_params.weightShape) + weight_tensor = WeightTensorUtils.transpose_from_libpymo_to_tf_format(weight_tensor, layer) + + if layer.use_bias: + if unpack_bias: + bias_tensor = np.reshape(equalization_params.bias, equalization_params.weightShape[0]) + else: + _, bias_tensor = layer.get_weights() + + param_tensors = [weight_tensor, bias_tensor] + else: + param_tensors = [weight_tensor] + + return param_tensors + + @staticmethod + def scale_cls_sets(cls_sets: typing.List[ClsSet]) -> \ + typing.List[typing.Union[np.ndarray, typing.Tuple[np.ndarray, np.ndarray]]]: + """ + Scale each cls set + :param cls_sets: Cls sets to scale + :return: List of scale factors corresponding to each scaled cls set + """ + scale_factor_list = [] + for cls_set in cls_sets: + if len(cls_set) == 3: + scale_factor = CrossLayerScaling.scale_cls_set_with_depthwise_conv_layers(cls_set) + else: + scale_factor = CrossLayerScaling.scale_cls_set_with_conv_layers(cls_set) + scale_factor_list.append(scale_factor) + return scale_factor_list + + @staticmethod + def create_cls_set_info_list(cls_sets: typing.List[ClsSet], + scale_factors: typing.List[ScaleFactor], + is_relu_activation_in_cls_sets: typing.List[ReluFlag]) -> typing.List[ClsSetInfo]: + """ + Binds information from there separate lists into one [ClsInfoSet] data structure + :param cls_sets: List of CLS sets + :param scale_factors: List of scale factors for each cls set + :param is_relu_activation_in_cls_sets: List of ReLU flag whether there is ReLU activation in each cls set + :return: List of ClsSetInfo + """ + assert len(cls_sets) == len(scale_factors) == len(is_relu_activation_in_cls_sets) + + cls_set_info_list = [] + for cls_set, scale_factor, has_relu_activation in zip(cls_sets, + scale_factors, + is_relu_activation_in_cls_sets): + # Depthwise separable convolution layer case (triplet of layers) + # Should have two scale factors and ReLU flags + if isinstance(scale_factor, tuple): + assert len(cls_set) == 3 + assert len(scale_factor) == len(has_relu_activation) == 2 + + prev_layer, curr_layer, next_layer = cls_set + cls_pair_1 = ClsSetInfo.ClsSetLayerPairInfo(prev_layer, curr_layer, + scale_factor[0], has_relu_activation[0]) + cls_pair_2 = ClsSetInfo.ClsSetLayerPairInfo(curr_layer, next_layer, + scale_factor[1], has_relu_activation[1]) + cls_set_info = ClsSetInfo(cls_pair_1, cls_pair_2) + + # Standard convolution layer case (tuple of layers) + # Should have one scale factor and ReLU flag + else: + prev_layer, curr_layer = cls_set + cls_pair = ClsSetInfo.ClsSetLayerPairInfo(prev_layer, curr_layer, + scale_factor, has_relu_activation) + cls_set_info = ClsSetInfo(cls_pair) + + cls_set_info_list.append(cls_set_info) + + return cls_set_info_list + + @staticmethod + def scale_model(model: tf.keras.Model) -> typing.List[ClsSetInfo]: + """ + Uses cross-layer scaling to scale all applicable layers in the given model + :param model: tf.keras.Model + :return: CLS information for each CLS set + """ + + # Find layer groups + graph_search_util = GraphSearchUtils(model) + layer_groups = graph_search_util.find_layer_groups_to_scale() + + # Find cls sets from the layer groups + cls_sets = [] + for layer_group in layer_groups: + cls_set = GraphSearchUtils.convert_layer_group_to_cls_sets(layer_group) + cls_sets += cls_set + + # Scale the CLS sets + scale_factors = CrossLayerScaling.scale_cls_sets(cls_sets) + + # Find if there were ReLU activations between layers of each cls set + is_relu_activation_in_cls_sets = graph_search_util.is_relu_activation_present_in_cls_sets(cls_sets) + + # Convert to a list of cls set info elements + cls_set_info_list = CrossLayerScaling.create_cls_set_info_list(cls_sets, + scale_factors, + is_relu_activation_in_cls_sets) + + return cls_set_info_list + + +class HighBiasFold: + """ + Code to apply the high-bias-fold technique to a model + """ + + @staticmethod + def bias_fold(cls_set_info_list: typing.List[ClsSetInfo], + bn_layers: typing.Dict[tf.keras.layers.Conv2D, tf.keras.layers.BatchNormalization]): + """ + Folds bias values greater than 3 * sigma to next layer's bias + :param cls_set_info_list: List of info elements for each cls set + :param bn_layers: Key: Conv/Linear layer Value: Corresponding folded BN layer + """ + if not bn_layers: + _logger.info('High Bias folding is not supported for models without BatchNorm Layers') + return + + for cls_set_info in cls_set_info_list: + for cls_pair_info in cls_set_info.cls_pair_info_list: + if (not cls_pair_info.layer1.use_bias) or (not cls_pair_info.layer2.use_bias) or \ + (cls_pair_info.layer1 not in bn_layers): + continue + + prev_layer_params, curr_layer_params = HighBiasFold.call_mo_high_bias_fold(cls_pair_info, bn_layers) + + layer1 = cls_pair_info.layer1 + layer1_weight_tensor, _ = layer1.get_weights() + layer1_bias_tensor = np.array(prev_layer_params.bias) + layer1.set_weights([layer1_weight_tensor, layer1_bias_tensor]) + + layer2 = cls_pair_info.layer2 + layer2_weight_tensor, _ = layer2.get_weights() + layer2_bias_tensor = np.array(curr_layer_params.bias) + layer2.set_weights([layer2_weight_tensor, layer2_bias_tensor]) + + @staticmethod + def call_mo_high_bias_fold(cls_pair_info: ClsSetInfo.ClsSetLayerPairInfo, + bn_layers: typing.Dict[tf.keras.layers.Conv2D, tf.keras.layers.BatchNormalization]) \ + -> typing.Tuple[libpymo.LayerParams, libpymo.LayerParams]: + """ + Invokes high bias fold MO API + :param cls_pair_info: Pair of layers that were scaled using CLS and related information + :param bn_layers: Key: Conv/Linear layer Value: Corresponding folded BN layer + :return: Updated layer params + """ + + bn_layer = bn_layers[cls_pair_info.layer1] + prev_layer_bn_params = HighBiasFold._pack_bn_params_high_bias_fold(bn_layer, cls_pair_info.scale_factor) + + prev_layer_params, curr_layer_params = HighBiasFold._pack_layer_params(cls_pair_info) + + libpymo.updateBias(prev_layer_params, curr_layer_params, prev_layer_bn_params) + return prev_layer_params, curr_layer_params + + @staticmethod + def _pack_bn_params_high_bias_fold(bn_layer: tf.keras.layers.BatchNormalization, + scaling_parameter: np.ndarray) -> libpymo.BNParamsHighBiasFold: + """ + Helper method to pack BatchNormalization parameter for high bias fold + :param bn_layer: Target batch normalization layer + :param scaling_parameter: Scaling parameters for each channel obtained from cross layer scaling + :return: Packed BNParamsHighBiasFold + """ + bn_params = libpymo.BNParamsHighBiasFold() + + # Note: In BatchNormFold, we initialize gamma and beta to 1 and 0 respectively to work as Identity + # So if the original value was set, use it for High Bias Fold + if hasattr(bn_layer, "original_gamma") and hasattr(bn_layer, "original_beta"): + gamma, beta = bn_layer.original_gamma, bn_layer.original_beta + else: + gamma, beta, _, _ = bn_layer.get_weights() + + if len(scaling_parameter) != len(gamma) or len(scaling_parameter) != len(beta): + raise ValueError("High Bias absorption is not supported for networks with fold-forward BatchNorms") + + bn_params.gamma = np.divide(gamma, scaling_parameter) + bn_params.beta = np.divide(beta, scaling_parameter) + + return bn_params + + @staticmethod + def _pack_layer_params(cls_pair_info: ClsSetInfo.ClsSetLayerPairInfo) \ + -> typing.Tuple[libpymo.LayerParams, libpymo.LayerParams]: + """ + Helper method to pack information of previous and current layer + :param cls_pair_info: Pair of layers that were scaled using CLS and related information + :return: Packed layer parameter tuple + """ + # Pack parameters for previous layer + prev_layer_params = libpymo.LayerParams() + + prev_layer = cls_pair_info.layer1 + prev_layer_params.activationIsRelu = cls_pair_info.relu_activation_between_layers + + _, prev_layer_bias_tensor = prev_layer.get_weights() + prev_layer_params.bias = prev_layer_bias_tensor + + # Pack parameters for current layer + curr_layer_params = libpymo.LayerParams() + + curr_layer = cls_pair_info.layer2 + curr_layer_weight_tensor, curr_layer_bias_tensor = curr_layer.get_weights() + curr_layer_weight_tensor = WeightTensorUtils.transpose_from_tf_to_libpymo_format(curr_layer_weight_tensor, + curr_layer) + + curr_layer_params.bias = curr_layer_bias_tensor + curr_layer_params.weight = curr_layer_weight_tensor.reshape(-1) + curr_layer_params.weightShape = np.array(curr_layer_weight_tensor.shape) + + return prev_layer_params, curr_layer_params + + +
[docs]def equalize_model(model: tf.keras.Model) -> tf.keras.Model: + """ + High-level API to perform Cross-Layer Equalization (CLE) on the given model + :param model: tf.keras.Model + :return: CLE applied tf.keras.Model + """ + # replace any ReLU6 layers with ReLU + model_for_cle, _ = model_transform_utils.replace_relu6_with_relu(model) + + folded_pairs, model_for_cle = fold_all_batch_norms(model_for_cle) + + equalize_bn_folded_model(model_for_cle, folded_pairs) + + return model_for_cle
+ + +def equalize_bn_folded_model(model: tf.keras.Model, + folded_pairs: typing.List[BatchNormFoldedPair]): + """ + Perform Cross-Layer Scaling (CLS) and High Bias Folding (HBF) on a batchnorm-folded model in-place + :param model: BatchNorm-folded model to equalize + :param folded_pairs: List of pairs of folded layers + """ + bn_dict = {} + for conv_or_linear, bn in folded_pairs: + bn_dict[conv_or_linear] = bn + + # perform cross-layer scaling on applicable layer sets + cls_set_info_list = CrossLayerScaling.scale_model(model) + + # high-bias fold + HighBiasFold.bias_fold(cls_set_info_list, bn_dict) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/layer_output_utils.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/layer_output_utils.html new file mode 100644 index 0000000..5dfef17 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/layer_output_utils.html @@ -0,0 +1,1281 @@ + + + + + + aimet_tensorflow.keras.layer_output_utils — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.layer_output_utils

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" This module contains utilities to capture and save intermediate layer-outputs of a model. """
+
+import os
+from typing import Union, List, Tuple
+import re
+from collections import OrderedDict
+import json
+import numpy as np
+import tensorflow as tf
+from aimet_tensorflow.keras.quantsim import QcQuantizeWrapper, QcQuantizableMultiHeadAttention
+from aimet_common.layer_output_utils import SaveInputOutput
+from aimet_common.utils import AimetLogger
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.LayerOutputs)
+
+
[docs]class LayerOutputUtil: + """ Implementation to capture and save outputs of intermediate layers of a model (fp32/quantsim) """ + + def __init__(self, model: tf.keras.Model, save_dir: str = "./KerasLayerOutput"): + """ + Constructor for LayerOutputUtil. + + :param model: Keras (fp32/quantsim) model. + :param save_dir: Directory to save the layer outputs. + """ + # Freeze the model weights and state + model.trainable = False + + # Get intermediate model for layer-outputs + self.intermediate_model = self._get_intermediate_model(model) + + # Get actual Layer output name to modified layer output name dict + self.original_name_to_modified_name_mapper = self._get_original_name_to_modified_name_mapper(model) + + # Saving the actual layer output name to modified layer output name (valid file name to save) in a json file + os.makedirs(save_dir, exist_ok=True) + with open(os.path.join(save_dir, "LayerOutputNameMapper.json"), 'w', encoding='utf-8') as fp: + json.dump(self.original_name_to_modified_name_mapper, fp=fp, indent=4) + + # Identify the axis-layout used for representing an image tensor + axis_layout = 'NHWC' if tf.keras.backend.image_data_format() == 'channels_last' else 'NCHW' + + # Utility to save model inputs and their corresponding layer-outputs + self.save_inp_out_obj = SaveInputOutput(save_dir, axis_layout=axis_layout) + + @classmethod + def _get_layer_output_name(cls, layer: Union[QcQuantizeWrapper, QcQuantizableMultiHeadAttention, tf.keras.layers.Layer]): + """ + This function returns the actual layer output name for a given layer + :param layer: Keras model layer. + :return: Actual layer output name for the layer + """ + if isinstance(layer, QcQuantizeWrapper): + return layer.original_layer.output.name + return layer.output.name + + @classmethod + def _get_intermediate_model(cls, model: tf.keras.Model): + """ + This function instantiates the feature extraction model for per layer outputs + :param model: Keras model. + :return: Intermediate keras model for feature extraction + """ + outputs = [layer.output for layer in model.layers] + intermediate_model = tf.keras.models.Model(inputs=model.inputs, outputs=outputs) + intermediate_model.trainable = False + return intermediate_model + + @classmethod + def _get_original_name_to_modified_name_mapper(cls, model: tf.keras.Model): + """ + This function captures the per-layer output name and modifies it to make a valid file name + (by removing non-word characters) so that the layer output can be easily saved with the modified name. + :param model: Keras model. + :return: Actual layer name to modified layer name dict + """ + original_name_to_modified_name_mapper = OrderedDict() + for layer in model.layers: + layer_output_name = cls._get_layer_output_name(layer) + + # Replace all non-word characters with "_" to make it a valid file name for saving the results + # For Eg.: "conv2d/BiasAdd:0" gets converted to "conv2d_BiasAdd_0" + modified_layer_output_name = re.sub(r'\W+', "_", layer_output_name) + + original_name_to_modified_name_mapper[layer_output_name] = modified_layer_output_name + + return original_name_to_modified_name_mapper + + def get_outputs(self, input_batch: Union[tf.Tensor, List[tf.Tensor], Tuple[tf.Tensor]]): + """ + This function captures layer-outputs and renames them as per the AIMET exported model. + :param input_batch: Batch of inputs for which we want to obtain layer-outputs. + :return: layer-output name to layer-output batch dict + """ + # Run in inference mode + outs = self.intermediate_model(input_batch, training=False) + output_pred = [out.numpy() for out in outs] + + return dict(zip(self.original_name_to_modified_name_mapper.values(), output_pred)) + +
[docs] def generate_layer_outputs(self, input_batch: Union[tf.Tensor, List[tf.Tensor], Tuple[tf.Tensor]]): + """ + This method captures output of every layer of a model & saves the inputs and corresponding layer-outputs to disk. + + :param input_batch: Batch of Inputs for which layer output need to be generated + :return: None + """ + layer_output_batch_dict = self.get_outputs(input_batch) + + # Skip constant scalar layer-outputs + const_scalar_layer_name = [] + for layer_name, layer_output in layer_output_batch_dict.items(): + if not isinstance(layer_output, np.ndarray): + const_scalar_layer_name.append(layer_name) + for layer_name in const_scalar_layer_name: + logger.info("Skipping constant scalar output of layer %s", layer_name) + _ = layer_output_batch_dict.pop(layer_name) + + self.save_inp_out_obj.save(np.array(input_batch), layer_output_batch_dict) + + logger.info("Layer Outputs Saved")
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/model_preparer.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/model_preparer.html new file mode 100644 index 0000000..8352c8a --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/model_preparer.html @@ -0,0 +1,1970 @@ + + + + + + aimet_tensorflow.keras.model_preparer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.model_preparer

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Implementation to automatically prepare keras models for AIMET by converting them to a functional model """
+import inspect
+import logging
+from typing import Any, Dict, List, Set, Union, Optional
+import re
+import numpy as np
+import tensorflow as tf
+
+import tensorflow.keras.backend as K
+from packaging import version  # pylint: disable=wrong-import-order
+
+if version.parse(tf.version.VERSION) >= version.parse("2.10"):
+    # Ignore pylint errors as keras module is not available in TF 2.4
+    from keras.engine.base_layer_utils import is_subclassed  # pylint: disable=import-error
+    from keras.engine.functional import Functional  # pylint: disable=import-error
+    from keras.engine.keras_tensor import KerasTensor  # pylint: disable=import-error
+    from keras.layers.core.tf_op_layer import TFOpLambda  # pylint: disable=import-error
+    from keras.layers.merging.base_merge import _Merge as MergeLayersParentClass  # pylint: disable=import-error
+else:
+    # Ignore pylint errors due to conditional imports
+    from tensorflow.python.keras.engine.base_layer_utils import is_subclassed  # pylint: disable=ungrouped-imports
+    from tensorflow.python.keras.engine.keras_tensor import KerasTensor  # pylint: disable=ungrouped-imports
+    from tensorflow.python.keras.engine.functional import Functional  # pylint: disable=ungrouped-imports
+    from tensorflow.python.keras.layers.core import TFOpLambda  # pylint: disable=ungrouped-imports
+    # pylint: disable=ungrouped-imports
+    from tensorflow.python.keras.layers.merge import \
+        _Merge as MergeLayersParentClass
+
+# pylint: disable=wrong-import-position
+from aimet_tensorflow.keras.utils.model_connection_utils import ModelLayerConnections, ModelLayerConnectionsProperties
+from aimet_tensorflow.keras.utils.model_transform_utils import replace_separable_conv_with_depthwise_pointwise, \
+    replace_relu6_with_relu
+from aimet_common.utils import AimetLogger
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.ModelPreparer)
+
+regex_for_camel_case_to_snake_case = re.compile(r'(?<!^)(?=[A-Z])')
+_TEMP_MODEL_NAME = "temp_aimet_intermediate_model"
+
+"""
+This file contains the implementation to automatically prepare keras models for AIMET by converting them to a functional model.
+"""
+
+
+class _KerasModelPreparer:
+
+    def __init__(
+        self,
+        original_model: Optional[tf.keras.Model] = None,
+        input_layer: Optional[tf.keras.layers.InputLayer] = None
+    ):
+        self.model_outputs = []  # Both normal init and "passthrough" init utilize this
+        if original_model:
+            self.input_layer = self._format_input_layer(original_model, input_layer)
+
+            if self._inherits_from_keras_model(original_model):
+                _logger.debug("This model inherits from tf.keras.Model. Need to connect model.")
+                self.original_model = self._connect_inherited_model(original_model, input_layer, is_original_model=True)
+
+            else:
+                self.original_model = original_model
+
+            # Used to fix weight names at end of unwrapping
+            # Originally set to the name of the original model's class in the case that there is an inherited model
+            self.class_names = self._get_class_names_in_model(self.original_model)
+
+            self.model_layers_connections = \
+                ModelLayerConnections.get_model_layers_connection_properties(self.original_model)
+            self._set_prepared_models_input_layer()
+
+            self.original_models_last_layer = self.original_model.layers[-1]
+
+            self.prepared_model = None
+            self.custom_objects = None
+            self.original_weights_in_prepared_model_order = None
+
+    @classmethod
+    def get_instance_for_common_layer_passthrough_functions(
+            cls, model_layers_connections: ModelLayerConnectionsProperties.TYPE
+    ):
+        """
+        Special function to __init__ for classes outside _KerasModelPreparer that want access to useful
+        functions like _handle_normal_keras_layer. ONLY use this for internal use. For normal Keras Model Preparer,
+        please utilize the prepare_model function.
+
+        :param model_layers_connections: Dictionary of Model Layer Connections for the functions to use.
+        :return: A slim instance of _KerasModelPreparer
+        """
+
+        self = cls(original_model=None, input_layer=None)
+        self.model_layers_connections = model_layers_connections
+        return self
+
+    def _get_original_models_weights_in_functional_model_order(self) -> List[np.ndarray]:
+        """
+        Map the original model's weights to the functional model's weights.
+
+        :return: A list of the original model's weights in the order of the functional model's weights
+        """
+        # Make the original model's weights into a dictionary for quick lookup by name
+        # The original subclassed layers names are removed to match the new functional model's names
+        original_model_weights = {}
+        for weight in self.original_model.weights:
+            # pop out class_names of weight name
+            weight_name = weight.name
+            for class_name in self.class_names:
+                weight_name = weight_name.replace(class_name + '/', '')
+            original_model_weights[weight_name] = weight.numpy()
+
+        # Get the functional model's weights in order as a dictionary for quick lookup where the key is the weight name
+        # and the position of the weight's order is the value
+        prepared_model_weight_order = {
+            weight.name: position
+            for position, weight in enumerate(self.prepared_model.weights)
+        }
+
+        # Using the functional model's weights order, get the original model's weights in the same order. The lambda
+        # here uses the weight's name to get position in the functional model's weights order and the sorts the
+        # original model's weights by that position.
+        self.original_weights_in_prepared_model_order = [
+            weight for _, weight in
+            sorted(original_model_weights.items(), key=lambda weight_info: prepared_model_weight_order[weight_info[0]])
+        ]
+
+        return self.original_weights_in_prepared_model_order
+
+    def _set_prepared_models_weights(self):
+        """
+        Set the functional model's weights to the original model's weights in the correct order
+        """
+
+        assert self.prepared_model, (
+            "The prepared model must be created before setting weights. Please call "
+                "prepare_model() before calling set_weights()."
+        )
+
+        try:
+            self.prepared_model.set_weights(self._get_original_models_weights_in_functional_model_order())
+        except ValueError:
+            _logger.error(
+                "Could not copy weights from original model to the prepared model. This can occur when "
+                "custom sublayers are defined not in the same order as the sublayers call method. Please ensure that "
+                "the sublayers internal layers are defined in the same order as the sublayers call method.")
+            raise
+
+        _logger.debug("Functional model weights copied.")
+        _logger.info("Model prepared for AIMET in Functional API format.")
+
+    @staticmethod
+    def _format_input_layer(
+            original_model: tf.keras.Model,
+            input_layer: Union[tf.keras.layers.InputLayer, List[tf.keras.layers.InputLayer], dict]
+    ) -> tf.keras.layers.Layer:
+        """
+        This function formats the input layer by either using the original models input layer or the user provided
+        input layer. This function will also raise an error if the model needs a defined input layer to be prepared
+        for AIMET.
+
+        :param original_model: The original model to be copied
+        :param input_layer: The input layer to be used for the functional model
+        :return: The input layer
+        """
+        if hasattr(original_model, "input"):
+            input_layer = original_model.input
+        elif isinstance(input_layer, tf.keras.layers.InputLayer):
+            _logger.info("Input layer explicitly passed in")
+            return input_layer
+        else:
+            _logger.info("Input layer not found. Using input layer passed in.")
+            if input_layer is None:
+                raise ValueError(
+                    "The top layer of this model is subclassed. Please provide an input layer via the "
+                    "\'input_layer\' parameter."
+                )
+
+        if isinstance(input_layer, dict):  # Keras allows passing in tensors via tensor_name : tensor
+            input_layer = list(input_layer.values())
+            if len(input_layer) == 1:
+                return input_layer[0]
+
+        return input_layer
+
+    @staticmethod
+    def _get_class_names_in_model(model: Union[tf.keras.Model, tf.keras.layers.Layer]) -> Set[str]:
+        """
+        Helper function to get the class name for a nested layer.
+
+        :param model: the 'layer' or 'model' to get the class name
+        :return: A set containing the class name
+        """
+        return {
+            regex_for_camel_case_to_snake_case.sub("_", name).lower()
+            for name in (model.name, model.__class__.__name__)
+        }
+
+    @staticmethod
+    def _is_nested_layer(layer: tf.keras.layers.Layer) -> bool:
+        """
+        Checks if the given layer is a nested layer.
+
+        :param layer: The layer to check
+        :return: True if the layer is a nested layer, False otherwise
+        """
+        keras_defined_subclassed_layer = is_subclassed(layer)
+        # pylint: disable=use-a-generator
+        is_aimet_defined_subclassed = keras_defined_subclassed_layer and any(
+            [isinstance(v, tf.keras.layers.Layer) for v in layer.__dict__.values()]
+        )  # check if the subclass is holding subclassed layer attributes. we only care if this is the case.
+
+        return (
+            is_aimet_defined_subclassed or
+            _KerasModelPreparer._is_functional_model(layer) or
+            _KerasModelPreparer._is_sequential_model(layer)
+        )
+
+    @staticmethod
+    def _is_functional_model(layer: tf.keras.layers.Layer) -> bool:
+        """
+        Checks if the given layer is a functional layer.
+
+        :param layer: The layer to check
+        :return: True if the layer is a functional layer, False otherwise
+        """
+        return isinstance(layer, Functional) and not isinstance(layer, tf.keras.Sequential)
+
+    @staticmethod
+    def _is_sequential_model(layer: tf.keras.layers.Layer) -> bool:
+        """
+        Checks if the given layer is a sequential layer.
+
+        :param layer: The layer to check
+        :return: True if the layer is a sequential layer, False otherwise
+        """
+        return isinstance(layer, tf.keras.Sequential)
+
+    def _set_prepared_models_input_layer(self):
+        """
+        This function sets the input layer of the model to the input layer of the functional model.
+        """
+
+        def set_input_layer_factory(input_layer: Union[tf.keras.layers.InputLayer, List[tf.keras.layers.InputLayer]]):
+            if isinstance(input_layer, list):
+                for inp in input_layer:
+                    self.model_layers_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].update(
+                        {inp.name: inp}
+                    )
+            else:
+                self.model_layers_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].update(
+                    {input_layer.name: input_layer}
+                )
+
+        try:
+            set_input_layer_factory(self.input_layer)
+        except AttributeError:
+            # For models that are not connected
+            _logger.info("Model is not connected. Setting input layer to input layer passed in.")
+
+            input_layer_name = [inp.name for inp in self.input_layer] if isinstance(self.input_layer, list) else \
+                [self.input_layer.name]
+            self.model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES].update(
+                {self.original_model.layers[0].name: [*input_layer_name]}
+            )
+
+            set_input_layer_factory(self.input_layer)
+
+    def _get_layer_input(self, layer: tf.keras.layers.Layer) -> tf.keras.layers.Layer:
+        """
+        Helper function to get the input layer of a layer.
+
+        :param layer: The layer to get the input layer of
+        :return: The input layer of the layer
+        """
+        try:
+            layer_input = [
+                self.model_layers_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS][layer_aux]
+                for layer_aux in
+                self.model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES][layer.name]
+            ]
+
+            if len(layer_input) == 1:
+                layer_input = layer_input[0]
+        except KeyError:
+            layer_input = self._get_most_recently_added_output_tensor()
+            self.model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES].update(
+                {layer.name: [layer_input.name]}
+            )
+            _logger.warning(
+                "Could not find input tensor for layer: %s. Using %s as input, the most recent output tensor.",
+                layer.name, layer_input.name
+            )
+
+        return layer_input
+
+    @staticmethod
+    def _is_tf_or_keras_tensor_input(arg: Any) -> bool:
+        """
+        Helper function to check if a given argument is a valid Keras tensor.
+
+        :param arg: The argument in question
+        :return: True if it is valid, False if not
+        """
+        if arg is not None:
+            if isinstance(arg, List):
+                return all(isinstance(x, KerasTensor) for x in arg) or all(isinstance(x, tf.Tensor) for x in arg)
+            return isinstance(arg, (KerasTensor, tf.Tensor))
+        return False
+
+    def _get_updated_call_args(self, layer: tf.keras.layers.Layer) -> List[Union[KerasTensor, List[KerasTensor], Any]]:
+        """
+        Helper function to get the call arguments of a layer.
+
+        :param layer: The layer to get the call arguments of
+        :return: The call arguments of the layer
+        """
+
+        def _is_tf_tensor(arg_in_question: Any) -> bool:
+            return isinstance(arg_in_question, tf.Tensor)
+
+        try:
+            original_call_args = self.model_layers_connections[ModelLayerConnectionsProperties.CALL_ARGS][layer.name]
+        except KeyError:
+            _logger.warning("Could not find call args for layer: '%s'. Using keras tensor only as input.", layer.name)
+            return [self._get_layer_input(layer)]
+
+        updated_call_args = []
+        found_keras_tensor = False
+        for arg in original_call_args:
+            if self._is_tf_or_keras_tensor_input(arg):
+
+                if found_keras_tensor and _is_tf_tensor(arg):
+                    updated_call_args.append(arg)
+
+                elif not found_keras_tensor:
+                    layer_input = self._get_layer_input(layer)
+                    if isinstance(layer_input, List):
+                        updated_call_args.extend(layer_input)
+                    else:
+                        updated_call_args.append(layer_input)
+                    found_keras_tensor = True
+
+            else:
+                updated_call_args.append(arg)
+
+        assert found_keras_tensor, f"No keras tensor found in call args of layer {layer.name}"
+        return updated_call_args
+
+    def _get_call_kwargs(self, layer: tf.keras.layers.Layer) -> Dict[Union[KerasTensor, List[KerasTensor]], Any]:
+        """
+        Helper function to get call keyword arguments for a given layer.
+
+        :param layer: The layer to get the call keyword arguments of
+        :return: The call keyword arguments of the layer
+        """
+        if original_call_kwargs := \
+                self.model_layers_connections[ModelLayerConnectionsProperties.CALL_KWARGS][layer.name]:
+            call_kwargs = {}
+            for key, value in original_call_kwargs.items():
+                # The Keras tensor is already in the call args, so we don't need to add it again. call_kwargs are for
+                # keyword arguments that are not Keras tensors such as 'axis', 'training', etc.
+                if self._is_tf_or_keras_tensor_input(value):
+                    continue
+                call_kwargs[key] = value
+        else:
+            _logger.debug("No kwargs for layer: '%s'", layer.name)
+            return {}
+        return call_kwargs
+
+    def _update_output_tensors_in_model_layers_connections(
+            self,
+            layer: tf.keras.layers.Layer,
+            new_output_tensor: KerasTensor,
+            model: tf.keras.Model
+    ):
+        """
+        Helper function to update the output tensors in the model layers connections dictionary.
+
+        :param layer: The layer to update the output tensors of
+        :param new_output_tensor: The new output tensor to update with
+        :param model: The model currently being checked. Used to add model outputs
+        """
+        if layer.name != new_output_tensor.name:
+            new_name = new_output_tensor.name
+            old_name_of_inputs = self.model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES].pop(
+                layer.name
+            )
+            self.model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES].update(
+                {new_name: old_name_of_inputs}
+            )
+
+            # Replace values in model_layers_connections[NetworkDictProperties.INBOUND_NODES] with new_name
+            for value in self.model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES].values():
+                if layer.name in value:
+                    idx = value.index(layer.name)
+                    value[idx] = new_name
+
+            self.model_layers_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].update(
+                {new_name: new_output_tensor}
+            )
+        else:
+            # Set new output tensor (in this case, it will be the same as the original model)
+            self.model_layers_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].update(
+                {layer.name: new_output_tensor}
+            )
+
+        # Save tensor in output list if it is output in the initial model
+        # TODO: Update so that the last conditional is only checked when it's not the last layer.
+        if model.output_names and layer.name in model.output_names:
+            _logger.debug("Layer '%s' added as output layer", layer.name)
+            self.model_outputs.append(new_output_tensor)
+
+    def _get_most_recently_added_output_tensor(self) -> KerasTensor:
+        """
+        Helper function to get the most recently added output tensor from the model layers connections.
+
+        :return: The most recently added output tensor
+        """
+        return next(reversed(self.model_layers_connections[ModelLayerConnectionsProperties.OUTPUT_TENSORS].items()))[-1]
+
+    @staticmethod
+    def _get_temporary_model(layer: tf.keras.layers.Layer, layer_input: tf.keras.layers.Layer) -> tf.keras.Model:
+        """
+        Helper function to create a temporary functional model from a layer.
+
+        :param layer: The layer to create the temporary model from
+        :param layer_input: The input layer of the layer
+        :return: The temporary model
+        """
+
+        def verify_weights(original_layer_weights: Set[tf.Variable], temp_model_weights: Set[tf.Variable]):
+            if missing_weights := original_layer_weights.difference(temp_model_weights):
+                raise ValueError(f"""
+    The number of weights in the temporary model for unwrapping layer '{layer.name}' does not match the
+    number of weights of the original layer. The missing weight(s) are {missing_weights}. This occurs when the Keras 
+    Symbolic tensor passed into the layers call function does not interact with a layer defined inside of the nested 
+    layer. Please refer to the documentation for more information.
+
+    This is the call function that is causing this error:
+    {inspect.getsource(layer.call)}
+    """)
+
+        layer_input = layer_input if isinstance(layer_input, List) else [layer_input]
+        temp_inputs = [
+            tf.keras.layers.Input(shape=inp.shape[1:], name=inp.name.split(':')[0] + "_temp_input")
+            for inp in layer_input
+        ]
+        if len(temp_inputs) == 1:
+            temp_inputs = temp_inputs[0]
+
+        try:
+            if _KerasModelPreparer._inherits_from_keras_model(layer):
+                temp_model = _KerasModelPreparer._connect_inherited_model(layer, temp_inputs)
+            else:
+                temp_model = tf.keras.Model(inputs=temp_inputs,
+                                            outputs=layer.call(temp_inputs, training=False),
+                                            name=_TEMP_MODEL_NAME)
+            _logger.debug("Model created for layer '%s'", layer.name)
+        except TypeError as e:
+            if "call() got an unexpected keyword argument 'training'" in e.__str__():
+                _logger.error(
+                    "Model preparer calls subclassed layers call functions with the parameter 'training=False', "
+                    "in the case that the layer behaves differently during evaluation. Please add **kwargs to your "
+                    "call function for layer '%s.'",
+                    layer.name
+                )
+            raise
+
+        temp_model.summary(print_fn=_logger.debug)
+        verify_weights({w.name for w in layer.weights}, {w.name for w in temp_model.weights})
+
+        return temp_model
+
+    @staticmethod
+    def _update_temporary_model_layers_connections_inbound_nodes(
+            temp_model_model_layers_connections: ModelLayerConnectionsProperties.TYPE,
+            temp_model: tf.keras.Model,
+            layer_input: tf.keras.layers.Layer
+    ):
+        """
+        Helper function to update the inbound nodes of the temporary model layers connections dictionary.
+
+        :param temp_model_model_layers_connections: The temporary model layers connections dictionary
+        :param temp_model: The temporary model
+        :param layer_input: The input layer of the layer
+        """
+        temp_model_input_names = [inp.name for inp in temp_model.input] if isinstance(temp_model.input, List) else \
+            [temp_model.input.name]
+        layer_inputs_name = [
+            inp.name for inp in (layer_input if isinstance(layer_input, List) else [layer_input])
+        ]  # pylint: disable=superfluous-parens
+
+        for layers_name, input_tensor_name in temp_model_model_layers_connections[
+                ModelLayerConnectionsProperties.INBOUND_NODES].items():
+            for idx, current_input_name in enumerate(input_tensor_name):
+                if current_input_name in temp_model_input_names:
+                    if len(layer_inputs_name) == 1:  # Special case where the same input is feed in multiple times
+                        temp_model_model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES][layers_name][
+                            idx] = layer_inputs_name[0]
+                    else:
+                        temp_model_model_layers_connections[ModelLayerConnectionsProperties.INBOUND_NODES][layers_name][
+                            idx] = layer_inputs_name[idx]
+
+    def _handle_nested_layer(self, layer: tf.keras.layers.Layer) -> KerasTensor:
+        """
+        Helper function to handle nested layers such as subclass, functional, or sequential.
+
+        :param layer: The layer to handle
+        :return: The output tensor of the layer
+        """
+        _logger.debug("Extracting layers for '%s'", layer.name)
+
+        # Converts CamelCase to snake_case of nested layers class name
+        self.class_names.update([layer.name] if self._inherits_from_keras_model(
+            layer) else self._get_class_names_in_model(layer))
+
+        # Create a model based on the nested layer.
+        # This is done with the layer input from the model layers connections dictionary.
+        # 1) The input layer is used to create the temporary functional model
+        # 2) The input layer is used in the nested layers call function as a symbolic tensor to get internal layers
+        layer_input = self._get_layer_input(layer)
+        temp_model = tf.keras.models.clone_model(self._get_temporary_model(layer, layer_input))
+
+        # Get the model layers connections dictionary for the temporary model and merge it with the model layers
+        # connections dictionary for the functional model. This is done, so we can keep track of the sublayer and
+        # their inputs and outputs.
+        temp_model_model_layers_connections = ModelLayerConnections.get_model_layers_connection_properties(temp_model)
+        self._update_temporary_model_layers_connections_inbound_nodes(
+            temp_model_model_layers_connections, temp_model, layer_input
+        )
+
+        self.model_layers_connections = ModelLayerConnections.merge_model_layers_connections(
+            self.model_layers_connections, temp_model_model_layers_connections
+        )
+
+        return self._prepare_model_helper(temp_model)
+
+    def _handle_normal_keras_layer(self, layer: tf.keras.layers.Layer) -> KerasTensor:
+        """
+        Helper function to handle normal keras layers. This function will create a new output tensor for the layer
+        and return it.
+
+        :param layer: The layer to create the output tensor for
+        :return: The output tensor of the layer
+        """
+        call_args = self._get_updated_call_args(layer)
+
+        if isinstance(layer, TFOpLambda):
+            if call_kwargs := self._get_call_kwargs(layer):
+                # Special case for 'tf.concat' that takes a list of inputs with kwargs attached
+                # may need to updated in the future
+
+                if "concat" in layer.name:
+                    new_output_tensor = layer.call([*call_args], **call_kwargs)
+                else:
+                    new_output_tensor = layer.call(*call_args, **call_kwargs)
+            else:
+                new_output_tensor = layer.call(*call_args)
+        # Special case for "Merge" layers that take a list of inputs such as "tf.keras.layers.Concatenate" and
+        # "tf.keras.layers.Add"
+        elif isinstance(layer, MergeLayersParentClass):
+            new_output_tensor = layer(call_args)
+        else:
+            new_output_tensor = layer(*call_args)
+
+        return new_output_tensor
+
+    def _prepare_model_helper(self, model: tf.keras.Model) -> KerasTensor:
+        """
+        Helper function to recursively prepare a model. This function will be recursively called if a nested layer is
+        found. This function will extract the layers from the nested layer and add them to the functional model.
+        Otherwise, it will add the layer to the functional model.
+
+        :param model: The model to prepare
+        :return: The last layer of the model
+        """
+        for current_layer in model.layers:
+            _logger.debug("Processing layer: '%s'", current_layer.name)
+            # Skip input layers
+            if isinstance(current_layer, tf.keras.layers.InputLayer):
+                continue
+
+            # If the current layer is either a subclassed layer, functional model or sequential model, we need to
+            # extract the layers from the nested layer and add them to the functional model.
+            if self._is_nested_layer(current_layer):
+                new_output_tensor = self._handle_nested_layer(current_layer)
+                # If we are at the end of the original model, we want the model_outputs to be the end model outputs
+                if current_layer == self.original_models_last_layer:
+                    _logger.debug(
+                        "Last layer was a nested layer. "
+                        "Using temp model's output from _handle_nested_layer as model_output"
+                    )
+                    continue
+                self.model_outputs.clear()
+            else:
+                new_output_tensor = self._handle_normal_keras_layer(current_layer)
+
+            self._update_output_tensors_in_model_layers_connections(current_layer, new_output_tensor, model)
+        return new_output_tensor
+
+    def prepare_model(self):
+        """
+        Function to get the prepared model. This function sets up the input layer and calls the helper function to
+        recursively prepare the model.
+        """
+        _ = self._prepare_model_helper(self.original_model)
+
+        # If the model outputs are empty, then we need to get the most recently added output tensor. This is the case
+        # when a model might be sparse and not fully connected or when a Functional model is inside an inherited model.
+        if not self.model_outputs:
+            _logger.warning(
+                "No model outputs found. This usually occurs when a models is made by inheriting from "
+                "'tf.keras.Model' and placing a Functional model inside. Using most recently added output tensor as "
+                "prepared models output."
+            )
+            self.model_outputs = self._get_most_recently_added_output_tensor()
+
+        setattr(self, "prepared_model", tf.keras.Model(
+            inputs=self.input_layer,
+            outputs=self.model_outputs,
+            name=f"{self.original_model.name}_prepared"
+        ))
+
+        # Cloning model to remove any references to the original model
+        K.clear_session()  # To avoid name conflicts
+        self.prepared_model = tf.keras.models.clone_model(self.prepared_model)
+        setattr(
+            self, "custom_objects",  # For acceptable subclass layers
+            self._get_models_custom_objects(self.prepared_model)
+        )
+        _logger.info("Prepared Model Summary: \n")
+        self.prepared_model.summary(print_fn=_logger.info)
+
+        # Copying over weights from original model to functional model
+        _logger.debug("Final class_names: %s", self.class_names)
+        self._set_prepared_models_weights()
+
+        # Extra prepare step to replace Separable Conv's with Depthwise Pointwise pattern.
+        self.prepared_model, _ = replace_separable_conv_with_depthwise_pointwise(
+            self.prepared_model,
+            custom_objects=self.custom_objects
+        )
+        self.prepared_model, _ = replace_relu6_with_relu(
+            self.prepared_model,
+            custom_objects=self.custom_objects
+        )
+
+        self.verify_prepared_model()
+
+    @staticmethod
+    def _get_models_custom_objects(model: tf.keras.Model) -> Optional[Dict[str, tf.keras.layers.Layer]]:
+        """
+        Helper function to return a models `custom_objects` if there are any present in the model.
+
+        :param model: The model to check
+        :return: A dictionary {layer name : layer obj} of the custom objects or None if there are not any
+        """
+
+        return {
+            layer.__class__.__name__: layer.__class__
+            for layer in model.layers
+            if not getattr(layer, "__module__", None).split(".")[0] == "keras" and  # TF 2.10.1 and up
+            not getattr(layer, "__module__", None).split(".")[0] == "tensorflow"    # TF 2.4.3 support
+        } or None
+
+    @staticmethod
+    def _model_has_nested_layers(model: tf.keras.Model) -> bool:
+        """
+        Helper function to check if a model is needed to be prepared or not based on if the model has nested layers such as
+        subclass, functional, or sequential.
+
+        :param model: The model to check
+        :return: If the model needs to be prepared or not
+        """
+        for layer in model.layers:
+            if _KerasModelPreparer._is_nested_layer(layer):
+                return True
+        return False
+
+    @staticmethod
+    def _inherits_from_keras_model(model: tf.keras.Model) -> bool:
+        """
+        Helper function to check if a model itself is inheriting from tf.keras.Model. If so, then the model needs to connected.
+
+        :param model: The model to check.
+        :return: If the model is inheriting from tf.keras.Model
+        """
+
+        return (
+            type(model).__bases__[0] == tf.keras.Model and
+            not _KerasModelPreparer._is_functional_model(model) and
+            not _KerasModelPreparer._is_sequential_model(model)
+        )
+
+    @staticmethod
+    def _connect_inherited_model(model: tf.keras.Model, input_layer: Union[
+            tf.keras.layers.InputLayer, List[tf.keras.layers.InputLayer]],
+                                 is_original_model: bool = False) -> tf.keras.Model:
+        """
+        Function to loop through models that inherit from tf.keras.Model and therefore could potentially have no
+        outbound nodes.
+
+        :param model: Model to connect.
+        :param input_layer: The input layer to connect the model.
+        :param is_original_model: Flag to clone the model if the original model is the one passed in.
+        This is to fix naming issues. Otherwise, the model is not cloned.
+        :return: A model with the outbound nodes generated.
+        """
+
+        # TODO: Fix case where the layers are all the same. Maybe user has to?
+        model = tf.keras.Model(inputs=input_layer, outputs=model.call(input_layer), name=_TEMP_MODEL_NAME)
+        if is_original_model:
+            try:
+                return tf.keras.models.clone_model(model)
+            except TypeError as e:
+                _logger.error("The layer %s inherits from tf.keras.Model and has layer that does not have a "
+                              "`get_config` defined. Due to this, Keras cannot clone this layer. Please override the "
+                              "`get_config` function and provide the missing keys mentioned in the Keras error logs.",
+                              model.name)
+                raise e
+        return model
+
+    def verify_prepared_model(self):
+        """
+        Function to verify that the prepared model is correct. This function will check that the prepared model has
+        the same weights as the original model and that the prepared model has the same outputs as the original model.
+        """
+
+        # Check that the prepared model has the same number of parameters as the original model
+        assert self.prepared_model.count_params() == self.original_model.count_params(), \
+            "Prepared model and original model do not have the same number of parameters"
+        _logger.debug("Prepared model and original model have the same number of parameters")
+
+        # Check the weights of the prepared model and the original model
+        for original_weight, prepared_weight in zip(
+                self.original_weights_in_prepared_model_order, self.prepared_model.get_weights()):
+            np.testing.assert_array_equal(
+                original_weight, prepared_weight,
+                err_msg="Weights of prepared model and original model do not match"
+            )
+        _logger.debug("Weights of prepared model and original model match")
+
+        # Create a random input to test the prepared model
+        if isinstance(self.prepared_model.input_shape, List):
+            random_input = []
+            for current_input_shape in self.original_model.input_shape:
+                input_shape = [shape if shape is not None else 1 for shape in current_input_shape]
+                random_input.append(np.random.rand(*input_shape).astype(np.float32))
+        else:
+            input_shape = [shape if shape is not None else 1 for shape in self.prepared_model.input_shape]
+            random_input = np.random.rand(*input_shape).astype(np.float32)
+
+        verbose = logging.DEBUG == _logger.level
+        original_model_output = self.original_model.predict(random_input, verbose=verbose)
+        prepared_model_output = self.prepared_model.predict(random_input, verbose=verbose)
+
+        # Check the outputs of the prepared model and the original model
+        err_msg = """
+        Outputs of prepared model and original model do not match. Since the weights match and params 
+        match, this is likely due to a mismatch in the model's architecture. Specifically, if there is a reuse of a 
+        layer, then the prepared model will not have the same output as the original model. For example, 
+        if a ReLU layer is defined once and then used twice, then the prepared model will only have one ReLU layer 
+        while the original model will have two ReLU layers. Please check the model's architecture to see if there are 
+        any layers that are reused.
+        """
+
+        if isinstance(original_model_output, Dict):
+            original_model_output = list(original_model_output.values())
+            if len(original_model_output) == 1:
+                original_model_output = original_model_output[0]
+
+        if isinstance(original_model_output, List):
+            for original_output, prepared_output in zip(original_model_output, prepared_model_output):
+                np.testing.assert_array_equal(original_output, prepared_output, err_msg=err_msg)
+        else:
+            np.testing.assert_array_equal(original_model_output, prepared_model_output, err_msg=err_msg)
+        _logger.debug("Outputs of prepared model and original model match")
+
+        _logger.info("Prepared model verified")
+
+
+
[docs]def prepare_model(original_model: tf.keras.Model, + input_layer: Union[tf.keras.layers.InputLayer, List[tf.keras.layers.InputLayer]] = None) \ + -> tf.keras.Model: + """ + This function prepares a Keras model before continuing on with AIMET. Specifically, it will convert the model into + a purely Functional API model and copy over the original models weights. + + :param original_model: The original model to be prepared + :param input_layer: The input layer to be used for the new model. By default, the input layer is set to None. If the + beginning portion of the model is subclassed, then the input layer must be passed in. + :return: The prepared model if needed, or the original model + """ + + # Initial check to see if preparing model is necessary + # pylint: disable=protected-access + if not _KerasModelPreparer._model_has_nested_layers(original_model) and \ + not _KerasModelPreparer._inherits_from_keras_model(original_model): + _logger.info("Model does not contain any nested layers. " + "Returning original model after going through " + "'replace_separable_conv_with_depthwise_pointwise' and 'replace_relu6_with_relu.") + custom_objects = _KerasModelPreparer._get_models_custom_objects(original_model) + prepared_model, _ = replace_relu6_with_relu(original_model, custom_objects=custom_objects) + prepared_model, _ = replace_separable_conv_with_depthwise_pointwise(prepared_model, + custom_objects=custom_objects) + return prepared_model + + keras_model_preparer = _KerasModelPreparer(original_model, input_layer=input_layer) + + keras_model_preparer.prepare_model() + + return keras_model_preparer.prepared_model
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/quant_analyzer.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/quant_analyzer.html new file mode 100644 index 0000000..77e67ad --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/quant_analyzer.html @@ -0,0 +1,1734 @@ + + + + + + aimet_tensorflow.keras.quant_analyzer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.quant_analyzer

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+"""Quant Analyzer"""
+import os
+from collections import OrderedDict, defaultdict
+from typing import Dict, List, Tuple
+
+import tensorflow as tf
+
+from aimet_common.defs import QuantScheme
+from aimet_common.quant_analyzer import export_per_layer_sensitivity_analysis_plot, save_json, \
+    create_and_export_min_max_ranges_plot, export_stats_histogram_plot, export_per_layer_mse_plot
+from aimet_common.utils import CallbackFunc, AimetLogger, Spinner
+from aimet_tensorflow.keras.batch_norm_fold import fold_all_batch_norms
+from aimet_tensorflow.keras.graphsearchtuils import GraphSearchUtils
+from aimet_tensorflow.keras.quant_sim.qc_quantize_wrapper import QcQuantizeWrapper
+from aimet_tensorflow.keras.quant_sim.tensor_quantizer import TensorQuantizer
+from aimet_tensorflow.keras.quantsim import QuantizationSimModel
+from aimet_tensorflow.keras.utils.quantizer_utils import get_enabled_activation_quantizers, enable_disable_quantizers, \
+    get_enabled_param_quantizers
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+
+def _sort_quant_wrappers_based_on_occurrence(sim: QuantizationSimModel) -> Dict[str, QcQuantizeWrapper]:
+    """
+    Sort quant wrappers based on occurrence for given quantsim model.
+
+    :param sim: Quantsim model.
+    :return: Ordered dictionary which maps wrapped layer name to quant wrapper.
+    """
+    sorted_quant_wrappers_dict = OrderedDict()
+    for wrapper in sim.model.layers:
+        if not isinstance(wrapper, QcQuantizeWrapper):
+            continue
+
+        sorted_quant_wrappers_dict[wrapper.original_layer.name] = wrapper
+
+    return sorted_quant_wrappers_dict
+
+
+def _get_enabled_quantizers(sorted_quant_wrappers: Dict[str, QcQuantizeWrapper]) -> \
+        Dict[QcQuantizeWrapper, List[TensorQuantizer]]:
+    """
+    For given sorted quant wrappers dict, get enabled quantizers.
+
+    :param sorted_quant_wrappers: Dictionary containing quant wrappers sorted based on occurrence.
+    :return: Dictionary which maps a quant wrapper to a list of enabled quantizers in it.
+    """
+    enabled_quant_wrappers = defaultdict(list)
+
+    for quant_wrapper in sorted_quant_wrappers.values():
+        for quantizer in quant_wrapper.param_quantizers:
+            if quantizer.is_enabled():
+                enabled_quant_wrappers[quant_wrapper].append(quantizer)
+
+        for quantizer in quant_wrapper.output_quantizers:
+            if quantizer.is_enabled():
+                enabled_quant_wrappers[quant_wrapper].append(quantizer)
+
+        for quantizer in quant_wrapper.input_quantizers:
+            if quantizer.is_enabled():
+                enabled_quant_wrappers[quant_wrapper].append(quantizer)
+
+    return enabled_quant_wrappers
+
+
+def _get_output_of_intermediate_layer(model: tf.keras.Model,
+                                      input_tensor: tf.Tensor,
+                                      layer_index: int) -> tf.Tensor:
+    """
+    Return output tensor from model extracted up to target intermediate layer
+
+    :param model: tf.keras.Model
+    :param input_tensor: Input tensor to feed
+    :param layer_index: Index of layer
+    :return: Output tensor from intermediate layer
+    """
+    layer_output = model.get_layer(index=layer_index).output
+    extracted_model = tf.keras.Model(inputs=model.inputs, outputs=layer_output)
+
+    return extracted_model(input_tensor)
+
+
+
[docs]class QuantAnalyzer: + """ + QuantAnalyzer tool provides + + 1) model sensitivity to weight and activation quantization + 2) per layer sensitivity analysis + 3) per layer encoding (min - max range) + 4) per PDF analysis and + 5) per layer MSE analysis + """ + + def __init__(self, + model: tf.keras.Model, + forward_pass_callback: CallbackFunc, + eval_callback: CallbackFunc): + """ + :param model: FP32 model to analyze for quantization. + :param forward_pass_callback: A callback function for model calibration that simply runs + forward passes on the model to compute encoding (delta/offset). This + callback function should use representative data and should be subset of + entire train/validation dataset (~1000 images/samples). + :param eval_callback: A callback function for model evaluation that determines model + performance. This callback function is expected to return scalar value + representing the model performance evaluated against entire test/evaluation dataset. + """ + if not isinstance(forward_pass_callback, CallbackFunc): + raise ValueError('forward_pass_callback and its argument(s) are not encapsulated by CallbackFunc class.') + if not isinstance(eval_callback, CallbackFunc): + raise ValueError('eval_callback and its argument(s) are not encapsulated by CallbackFunc class.') + + self._model = model + self._forward_pass_callback = forward_pass_callback + self._eval_callback = eval_callback + self._unlabeled_dataset = None + self._num_batches = None + + # pylint: disable=unused-argument, no-self-use +
[docs] def analyze(self, + quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + rounding_mode: str = "nearest", + default_param_bw: int = 8, + default_output_bw: int = 8, + config_file: str = None, + results_dir: str = "./tmp/"): + """ + Analyze model for quantization and point out sensitive parts/hotspots of the model by performing + 1) model sensitivity to quantization, + 2) perform per layer sensitivity analysis by enabling and disabling quant wrappers, + 3) export per layer encodings min - max ranges, + 4) export per layer statistics histogram (PDF) when quant scheme is TF-Enhanced, + 5) per layer MSE analysis + + :param quant_scheme: Quantization scheme. Supported values are + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced. + :param rounding_mode: The round scheme to used. One of: 'nearest' or 'stochastic', defaults to 'nearest' + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs and outputs. + :param config_file: Path to configuration file for model quantizers. + :param results_dir: Directory to save the results. + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + sim = self._create_quantsim_and_encodings(quant_scheme, + rounding_mode, + default_param_bw, + default_output_bw, + config_file) + + # Check model sensitivity to weight and activation quantization individually. + self.check_model_sensitivity_to_quantization(sim, default_param_bw, default_output_bw) + + # Perform per layer analysis by enabling each quant wrapper (OPTION-1). + self.perform_per_layer_analysis_by_enabling_quant_wrappers(sim, results_dir) + + # Perform per layer analysis by disabling each quant wrapper (OPTION-2). + self.perform_per_layer_analysis_by_disabling_quant_wrappers(sim, results_dir) + + # Export encoding min-max range. + self.export_per_layer_encoding_min_max_range(sim, results_dir) + + # Export PDF of statistics + if quant_scheme == QuantScheme.post_training_tf_enhanced: + self.export_per_layer_stats_histogram(sim, results_dir) + + # Export per layer MSE loss between fp32 and quantized output activations. + if self._unlabeled_dataset and self._num_batches: + self.export_per_layer_mse_loss(sim, results_dir)
+ + def _create_quantsim_and_encodings(self, + quant_scheme: QuantScheme, + rounding_mode: str, + default_param_bw: int, + default_output_bw: int, + config_file: str) -> QuantizationSimModel: + """ + Create Quantsim and compute encodings. + + :param quant_scheme: Quantization scheme. + :param rounding_mode: The round scheme to used. One of: 'nearest' or 'stochastic', defaults to 'nearest' + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs and outputs. + :param config_file: Path to configuration file for model quantizers. + :return: Quantsim model. + """ + _, self._model = fold_all_batch_norms(self._model) # pylint: disable=attribute-defined-outside-init + sim = QuantizationSimModel(self._model, + quant_scheme=quant_scheme, + rounding_mode=rounding_mode, + default_output_bw=default_output_bw, + default_param_bw=default_param_bw, + config_file=config_file) + + sim.compute_encodings(forward_pass_callback=self._forward_pass_callback.func, + forward_pass_callback_args=self._forward_pass_callback.args) + + return sim + + def check_model_sensitivity_to_quantization(self, + sim: QuantizationSimModel, + default_param_bw: int, + default_output_bw: int): + """ + Perform the sensitivity analysis to weight and activation quantization + individually. + + :param sim: Quantsim model. + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs and outputs. + :return: FP32 eval score, weight-quantized eval score, act-quantized eval score. + """ + fp32_eval_score = self._eval_model(self._model) + _logger.info("FP32 eval score (W32A32): %f", fp32_eval_score) + + weight_quantized_eval_score = self._eval_weight_quantized_model(sim) + _logger.info("Weight-quantized eval score (W%dA32): %f", default_param_bw, + weight_quantized_eval_score) + + act_quantized_eval_score = self._eval_activation_quantized_model(sim) + _logger.info("Activation-quantized eval score (W32A%d): %f", default_output_bw, + act_quantized_eval_score) + + def _eval_model(self, model: tf.keras.Model) -> float: + """ + Evaluate the model performance. + :param model: tf.keras.Model to be evaluated + :return: Scalar value representing model performance + """ + return self._eval_callback.func(model, self._eval_callback.args) + + def _eval_weight_quantized_model(self, sim: QuantizationSimModel) -> float: + """ + Evaluate weight quantized model performance. + For weight quantized model performance, disable enabled activation quantizers, measure + eval score and enable again. + + :param sim: Quantsim model. + :return: Quantized model performance. + """ + enabled_activation_quantizers = get_enabled_activation_quantizers(sim) + enable_disable_quantizers(enabled_activation_quantizers, enabled=False) + eval_score = self._eval_model(sim.model) + enable_disable_quantizers(enabled_activation_quantizers, enabled=True) + return eval_score + + def _eval_activation_quantized_model(self, sim: QuantizationSimModel) -> float: + """ + Evaluate activation quantized model performance. + For activation quantized model performance, disable enabled param quantizers, measure + eval score and enable again. + + :param sim: Quantsim model. + :return: Quantized model performance. + """ + enabled_param_quantizers = get_enabled_param_quantizers(sim) + enable_disable_quantizers(enabled_param_quantizers, enabled=False) + eval_score = self._eval_model(sim.model) + enable_disable_quantizers(enabled_param_quantizers, enabled=True) + return eval_score + + def perform_per_layer_analysis_by_enabling_quant_wrappers(self, + sim: QuantizationSimModel, + results_dir: str) -> Dict[str, float]: + """ + NOTE: Option 1 + + 1. All quant wrappers' parameters and activations quantizers are disabled. + 2. For every quant wrappers, based on occurrence: + i. Each quant wrapper's parameters and activations quantizers are enabled as per JSON config file + and set to bit-width specified. + ii. Measure and record eval score on subset of dataset. + iii. Disable enabled quantizers in step i. + 3. Returns dictionary containing quant wrapper name and corresponding eval score. + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer-wise eval score dictionary. dict[layer_name] = eval_score + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + _logger.info("\nOPTION-1:\nAll the quant wrappers are disabled.\n" + "Starting per-layer analysis by enabling quant wrappers as per config file.") + + layer_wise_eval_score_dict = self._perform_per_layer_analysis(sim, + disable_all_quantizers=True, + enabled_before=True, + enabled_after=False) + export_per_layer_sensitivity_analysis_plot(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_enabled") + save_json(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_enabled.json") + _logger.info("Exported per-layer quant analysis (enabled) plot.") + return layer_wise_eval_score_dict + + def perform_per_layer_analysis_by_disabling_quant_wrappers(self, + sim: QuantizationSimModel, + results_dir: str) -> Dict[str, float]: + """ + NOTE: Option 2 + + 1. All quant wrappers' parameters and activations quantizers are enabled as per JSON config file + and set to bit-width specified. + 2. For every quant wrappers, based on occurrence: + i. Each quant wrapper's parameters and activations quantizers are disabled. + ii. Measure and record eval score on subset of dataset. + iii. Enable disabled quantizers in step i. + 3. Returns dictionary containing quant wrapper name and corresponding eval score. + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer wise eval score dictionary. dict[layer_name] = eval_score + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + _logger.info("\nOPTION-2:\nAll the quant wrappers are enabled as per config file.\n" + "Starting per-layer analysis by disabling quant wrappers.") + layer_wise_eval_score_dict = self._perform_per_layer_analysis(sim, + disable_all_quantizers=False, + enabled_before=False, + enabled_after=True) + export_per_layer_sensitivity_analysis_plot(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_disabled") + save_json(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_disabled.json") + _logger.info("Exported per-layer quant analysis (disabled) plot.") + return layer_wise_eval_score_dict + + def _perform_per_layer_analysis(self, + sim: QuantizationSimModel, + disable_all_quantizers: bool, + enabled_before: bool, + enabled_after: bool) -> Dict[str, float]: + """ + Helper function for perform_per_layer_analysis_by_enabling_quant_wrappers() and + perform_per_layer_analysis_by_disabling_quant_wrappers() + + :param sim: Quantsim model. + :param disable_all_quantizers: Flag to disable all the quantizers before per-layer analysis. + :param enabled_before: Flag to set enabled for quantizers before computing encodings. + :param enabled_after: Flag to set enabled for quantizers after computing encodings. + :return: layer wise eval score dictionary. dict[layer_name] = eval_score. + """ + # Sorted quant wrappers based on occurrence. + # maps wrapped module name to a quant wrapper. + sorted_quant_wrappers = _sort_quant_wrappers_based_on_occurrence(sim) + + # quant wrappers and it's enabled quantizers. + # maps quant wrapper to a list of enabled quantizers in it. + enabled_quant_wrappers = _get_enabled_quantizers(sorted_quant_wrappers) + + if disable_all_quantizers: + for enabled_quantizers in enabled_quant_wrappers.values(): + enable_disable_quantizers(enabled_quantizers, enabled=False) + + eval_score_dict = {} + for name, quant_wrapper in sorted_quant_wrappers.items(): + if quant_wrapper in enabled_quant_wrappers: + enabled_quantizers = enabled_quant_wrappers[quant_wrapper] + enable_disable_quantizers(enabled_quantizers, enabled=enabled_before) + + # Record eval score. + eval_score_dict[name] = self._eval_model(sim.model) + _logger.debug("For layer: %s, the eval score is: %f", name, eval_score_dict[name]) + + enable_disable_quantizers(enabled_quantizers, enabled=enabled_after) + + if disable_all_quantizers: + for enabled_quantizers in enabled_quant_wrappers.values(): + enable_disable_quantizers(enabled_quantizers, enabled=True) + + return eval_score_dict + + # pylint: disable=no-self-use + def export_per_layer_encoding_min_max_range(self, + sim: QuantizationSimModel, + results_dir: str) -> Tuple[Dict, Dict]: + """ + Export encoding min and max range for all weights and activations. results_dir should have + html files in following format. + + -results_dir + -activations.html + -weights.html + + If per channel quantization(PCQ) is enabled then, + + -results_dir + -activations.html + -{wrapped_module_name}_{param_name}.html + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer wise min-max range for weights and activations. + """ + min_max_ranges_dir = os.path.join(results_dir, "min_max_ranges") + + min_max_range_for_activations_dict = {} + min_max_range_for_weights_dict = {} + for quant_wrapper in sim.quant_wrappers(): + wrapped_layer_name = quant_wrapper.original_layer.name + + for index, quantizer in enumerate(quant_wrapper.input_quantizers): + if quantizer.is_enabled(): + name = f"{wrapped_layer_name}_input_{index}" + min_max_range_for_activations_dict[name] = (quantizer.encoding.min, quantizer.encoding.max) + + for index, quantizer in enumerate(quant_wrapper.output_quantizers): + if quantizer.is_enabled(): + name = f"{wrapped_layer_name}_output_{index}" + min_max_range_for_activations_dict[name] = (quantizer.encoding.min, quantizer.encoding.max) + + for quantizer in quant_wrapper.param_quantizers: + if quantizer.is_enabled(): + # Keras parameter name usually contains slash (/) and it can cause incorrect file path when saving + # Replace slash (/) with dash (-) to avoid it + quantizer_name = quantizer.name.replace("/", "-") + name = f"{wrapped_layer_name}_{quantizer_name}" + + if isinstance(quantizer.encoding, List): # per-channel + per_channel_encodings = {} + for index, encoding in enumerate(quantizer.encoding): + per_channel_encodings[f"{name}_{index}"] = (encoding.min, encoding.max) + min_max_range_for_weights_dict[name] = per_channel_encodings + else: # per-tensor + min_max_range_for_weights_dict[name] = (quantizer.encoding.min, quantizer.encoding.max) + + create_and_export_min_max_ranges_plot(min_max_range_for_weights_dict, + min_max_ranges_dir, + title="weights") + create_and_export_min_max_ranges_plot(min_max_range_for_activations_dict, + min_max_ranges_dir, + title="activations") + save_json(min_max_range_for_weights_dict, min_max_ranges_dir, title="weights.json") + save_json(min_max_range_for_activations_dict, min_max_ranges_dir, title="activations.json") + _logger.info("Exported per layer encodings min-max ranges plot(s).") + return min_max_range_for_weights_dict, min_max_range_for_activations_dict + + def export_per_layer_stats_histogram(self, sim: QuantizationSimModel, results_dir: str) -> None: + """ + NOTE: Not to invoke when quantization scheme is not TF-Enhanced. + + Export histogram that represents a PDF of collected statistics by a quantizer for every + quant wrapper. After invoking this API, results_dir should have html files in following + format for every quantizers of quant wrappers. + + -results_dir + -activations_pdf + name_{input/output}_{index}.html + -weights_pdf + -name + param_name_{channel_index}.html + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + """ + weights_pdf_dir = os.path.join(results_dir, "weights_pdf") + activations_pdf_dir = os.path.join(results_dir, "activations_pdf") + + for quant_wrapper in sim.quant_wrappers(): + wrapped_layer_name = quant_wrapper.original_layer.name + + for index, quantizer in enumerate(quant_wrapper.input_quantizers): + if quantizer.encoding: + self._create_and_export_stats_histogram_plot(quantizer, activations_pdf_dir, + title=f"{wrapped_layer_name}_input_q{index}") + + for index, quantizer in enumerate(quant_wrapper.output_quantizers): + if quantizer.encoding: + self._create_and_export_stats_histogram_plot(quantizer, activations_pdf_dir, + title=f"{wrapped_layer_name}_output_q{index}") + + for quantizer in quant_wrapper.param_quantizers: + if quantizer.encoding: + # Keras parameter name usually contains slash (/) and it can cause incorrect file path when saving + # Replace slash (/) with dash (-) to avoid it + param_name = quantizer.name.replace("/", "-") + self._create_and_export_stats_histogram_plot(quantizer, + os.path.join(weights_pdf_dir, wrapped_layer_name), + title=f"{wrapped_layer_name}_{param_name}") + _logger.info("Exported per layer stats histogram plot(s).") + + @staticmethod + def _create_and_export_stats_histogram_plot(quantizer: TensorQuantizer, + results_dir: str, + title: str) -> None: + """ + For given quantizer, create and export histogram (PDF) of statistics in html format. + + :param quantizer: Quantizer. + :param results_dir: Directory to save the results. + :param title: Title of the plot. + """ + os.makedirs(results_dir, exist_ok=True) + + histograms = quantizer.get_stats_histogram() + encodings = quantizer.encoding + if not isinstance(encodings, List): + encodings = [encodings] + + for index, (histogram, encoding) in enumerate(zip(histograms, encodings)): + export_stats_histogram_plot(histogram, encoding, results_dir, title=f"{title}_{index}") + + def export_per_layer_mse_loss(self, + sim: QuantizationSimModel, + results_dir: str) -> Dict[str, float]: + """ + NOTE: Need to pass same model input data through both fp32 and quantsim model to + tap output activations of each layer. + + Export MSE loss between fp32 and quantized output activations for each layer. + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return layer wise MSE loss. dict[layer_name] = MSE loss. + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + mse_loss_dict = {} + with Spinner("Calculating per-layer MSE loss"): + for index, layer in enumerate(self._model.layers): + if isinstance(layer, tf.keras.layers.InputLayer) or \ + GraphSearchUtils.is_folded_batch_normalization(layer): + continue + + loss = self._compute_mse_loss(sim, index) + mse_loss_dict[layer.name] = loss + + export_per_layer_mse_plot(mse_loss_dict, + results_dir, + title="per_layer_mse_loss") + save_json(mse_loss_dict, results_dir, title="per_layer_mse_loss.json") + _logger.info("Exported per layer MSE loss plot.") + return mse_loss_dict + + def _compute_mse_loss(self, + sim: QuantizationSimModel, + index: int) -> float: + """ + Compute MSE loss between fp32 and quantized output activations for each batch, add for + all the batches and return averaged mse loss. + + :param sim: Quantsim model. + :param index: Index of layer + :return: MSE loss between fp32 and quantized output activations. + """ + loss = 0.0 + total = 0 + mse = tf.keras.losses.MeanSquaredError() + for tensor in self._unlabeled_dataset.take(self._num_batches): + quantized_output = _get_output_of_intermediate_layer(sim.model, tensor, index) + fp32_output = _get_output_of_intermediate_layer(self._model, tensor, index) + + loss += mse(quantized_output, fp32_output).numpy() + total += tensor.shape[0] + + return loss / total + + def enable_per_layer_mse_loss(self, unlabeled_dataset: tf.data.Dataset, num_batches: int) -> None: + """ + Enable per layer MSE loss analysis. + + :param unlabeled_dataset: tf.data.Dataset provided as input to the model + and used to calculate mse loss + :param num_batches: Maximum number of batches to be used for MSE loss calculation + """ + self._unlabeled_dataset = unlabeled_dataset + self._num_batches = num_batches
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/keras/quantsim.html b/releases/1.32.2/_modules/aimet_tensorflow/keras/quantsim.html new file mode 100644 index 0000000..61388c6 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/keras/quantsim.html @@ -0,0 +1,1957 @@ + + + + + + aimet_tensorflow.keras.quantsim — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.keras.quantsim

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+""" Quantsim for Keras """
+from __future__ import annotations
+
+from dataclasses import dataclass
+import json
+import os
+from typing import Union, Dict, Tuple, Optional, List
+
+import tensorflow as tf
+from aimet_common import libpymo
+
+from aimet_common.defs import QuantScheme, QuantizationDataType
+from aimet_common.utils import AimetLogger, save_json_yaml
+from aimet_common.quantsim import encoding_version, extract_global_quantizer_args
+from aimet_tensorflow.keras.connectedgraph import ConnectedGraph
+from aimet_tensorflow.keras.graphsearchtuils import GraphSearchUtils
+from aimet_tensorflow.keras.quant_sim.qc_quantize_wrapper import QcQuantizeWrapper, QuantizerSettings
+from aimet_tensorflow.keras.quant_sim.qc_mha_wrapper import QcQuantizableMultiHeadAttention
+from aimet_tensorflow.keras.rnn.qc_quant_LSTM import QuantizedLSTM
+from aimet_tensorflow.keras.quant_sim.tensor_quantizer import TensorQuantizer, ActivationTensorQuantizer, \
+    ParamPerTensorQuantizer, StaticGridPerChannelQuantizer, ParamPerChannelQuantizer
+from aimet_tensorflow.keras.quantsim_config.quantsim_config import QuantSimConfigurator, INPUT_QUANTIZERS, \
+    OUTPUT_QUANTIZERS, PARAM_QUANTIZERS
+from aimet_tensorflow.keras.utils.common import convert_h5_model_to_pb_model
+
+from aimet_tensorflow.keras.defs import AxisHandling
+import aimet_tensorflow.keras.utils.common as keras_common_utils
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+unquantizable_modules = (tf.keras.layers.InputLayer, QcQuantizeWrapper)
+substitutable_modules = {
+    tf.keras.layers.MultiHeadAttention: QcQuantizableMultiHeadAttention,
+    tf.keras.layers.LSTM: QuantizedLSTM
+}
+
+
+@dataclass
+class QuantizationSimModelParams:
+    """
+    Data class that holds parameters for QuantizationSimModel. Used specifically to rebuild after converting to TF frozen pb
+    """
+    quant_scheme: Union[QuantScheme, str] = 'tf_enhanced'
+    rounding_mode: str = 'nearest'
+    default_output_bw: int = 8
+    default_param_bw: int = 8
+    in_place: bool = False
+    config_file: str = None
+    default_data_type: QuantizationDataType = QuantizationDataType.int
+
+
+# pylint: disable=too-many-ancestors
+# pylint: disable=too-many-instance-attributes
+
[docs]class QuantizationSimModel(tf.keras.Model): + """ + Implements mechanism to add quantization simulations ops to a model. This allows for off-target simulation of + inference accuracy. Also allows the model to be fine-tuned to counter the effects of quantization. + """ + + # pylint: disable=too-many-arguments + # pylint: disable=unused-argument + def __init__(self, model, quant_scheme: Union[QuantScheme, str] = 'tf_enhanced', rounding_mode: str = 'nearest', + default_output_bw: int = 8, default_param_bw: int = 8, in_place: bool = False, + config_file: str = None, default_data_type: QuantizationDataType = QuantizationDataType.int): + """ + :param model: Model to quantize + :param quant_scheme: Quantization Scheme, currently supported schemes are post_training_tf and + post_training_tf_enhanced, defaults to post_training_tf_enhanced + :param rounding_mode: The round scheme to used. One of: 'nearest' or 'stochastic', defaults to 'nearest'. + :param default_output_bw: bitwidth to use for activation tensors, defaults to 8 + :param default_param_bw: bitwidth to use for parameter tensors, defaults to 8 + :param in_place: If True, then the given 'model' is modified in-place to add quant-sim nodes. + Only suggested use of this option is when the user wants to avoid creating a copy of the model + :param config_file: Path to a config file to use to specify rules for placing quant ops in the model + :param default_data_type: Default data type to use for quantizing all layer parameters. + Possible options are QuantizationDataType.int and QuantizationDataType.float. + Note that the mode default_data_type=QuantizationDataType.float is only supported with + default_output_bw=16 and default_param_bw=16 + """ + super().__init__() + + self._model_without_wrappers = model + if not in_place: + self._model_without_wrappers = tf.keras.models.clone_model(model) + n_weights = len(self._model_without_wrappers.weights) + self._model_without_wrappers.set_weights(model.get_weights()[:n_weights]) + self._layer_name_to_quant_wrapper = {} + self._substituted_layer = {} # to hold the substituted layers + self._validate_model() + self.connected_graph = ConnectedGraph(self._model_without_wrappers) + self._quantsim_configurator = self._initialize_quantsim_configurator(quant_scheme, rounding_mode, + default_output_bw, default_param_bw, + default_data_type, config_file) + self.quant_scheme = quant_scheme + self._percentile_value = 100 # default percentile value + self.per_channel_quantization_enabled = self._quantsim_configurator.per_channel_quantization_flag + self.model = self._add_quantization_wrappers(quant_scheme, rounding_mode, + default_output_bw, default_param_bw, default_data_type) + self.quant_args = extract_global_quantizer_args(quant_scheme, self._quantsim_configurator) + + self._params = QuantizationSimModelParams(quant_scheme, rounding_mode, default_output_bw, default_param_bw, + in_place, config_file, default_data_type) + + def _validate_model(self): + """ + Check that model is appropriate for quantsim. + """ + multiple_inbound_node_layers = [] + + for layer in self._model_without_wrappers.layers: + if len(layer.inbound_nodes) > 1: + multiple_inbound_node_layers.append(layer.name) + + if multiple_inbound_node_layers: + error_msg = (f'Layers with more than one inbound nodes are unsupported. This may occur if a layer is ' + f'reused multiple times in the model definition.\n' + f'Layers with multiple inbound nodes: {multiple_inbound_node_layers}') + _logger.error(error_msg) + raise NotImplementedError(error_msg) + + sep_conv_found = self.check_separable_conv(self._model_without_wrappers) + if sep_conv_found: + # Raising an assertion error incase there's SeparableConv2D in the model because in this case we have two sets of weights: Depthwise + # and Pointwise. For depthwise kernels, LAST TWO AXIS should be considered and for pointwise kernels LAST AXIS + # should be considered, which is not handled here. Running model preparer beforehand will resolve this as there the + # SeparableConv2D is splitted into two layers Depthwise and Pointwise seperately. + raise AssertionError("SeparableConv2D found in the model. Please run model preparer before calling QuantizationSimModel") + + def check_separable_conv(self, model: tf.keras.models.Model | tf.keras.Sequential) -> bool: + """ + Checks for SeparableConv2D layer in the model + :param model: Keras Model + :return: Boolean value, True if SeperableConv layer is found else False + """ + for layer in model.layers: + if isinstance(layer, tf.keras.Sequential): + if self.check_separable_conv(layer): + return True + elif isinstance(layer, tf.keras.layers.SeparableConv2D): + return True + return False + + def _get_quantizer_list(self) -> Tuple[List, List, List]: + """ + Method to provide a list of input, output and parameter quantizers + :return: Three lists containing input, paramater and output quantizers respectively + """ + input_quantizers = [] + parameter_quantizers = [] + output_quantizers = [] + + for wrapper in self.quant_wrappers(): + for quantizer in wrapper.input_quantizers: + input_quantizers.append(quantizer) + + for quantizer in wrapper.param_quantizers: + parameter_quantizers.append(quantizer) + + for quantizer in wrapper.output_quantizers: + output_quantizers.append(quantizer) + + return input_quantizers, parameter_quantizers, output_quantizers + + def set_percentile_value(self, percentile_value: float): + """ + Set the percentile value to be used while computing encodings for quantizers having percentile quant scheme. + + :param percentile_value: Percentile value to be set to + """ + if percentile_value < 90 or percentile_value > 100: + raise ValueError("Percentile value must be in range [90, 100]") + self._percentile_value = percentile_value + + # Set the percentile value to the activation quantizers + input_quantizers, _, output_quantizers = self._get_quantizer_list() + for quantizer in input_quantizers + output_quantizers: + if quantizer.quant_scheme == QuantScheme.post_training_percentile: + quantizer.set_percentile_value(self._percentile_value) + + def _initialize_quantsim_configurator(self, quant_scheme: Union[QuantScheme, str], rounding_mode: str, + default_output_bw: int, default_param_bw: int, + default_data_type: QuantizationDataType = QuantizationDataType.int, + config_file: str = None) -> QuantSimConfigurator: + """ + Initialize quantsim configurator + :param quant_scheme: Quantization Scheme + :param rounding_mode: The round scheme to used + :param default_output_bw: bitwidth to use for activation tensors + :param default_param_bw: bitwidth to use for parameter tensors + :param default_data_type: data type to use for the parameter tensors + :param config_file: Path to a config file to use to specify rules for placing quant ops in the model + :return: QuantSimConfigurator + """ + return QuantSimConfigurator(self.connected_graph, quant_scheme, rounding_mode, + default_output_bw, default_param_bw, default_data_type, config_file) + + def _add_quantization_wrappers(self, quant_scheme, rounding_mode, + default_output_bw, default_param_bw, default_data_type): + """ + Add quantization wrappers to the model and return a new model with the wrappers inserted. + :param quant_scheme: Quantization scheme to use + :param rounding_mode: Rounding mode to use + :param default_output_bw: Default bitwidth for activation quantizers + :param default_param_bw: Default bitwidth for param quantizers + :param default_data_type: data type to use for param quantizers + """ + + def wrap_layer(layer) -> tf.keras.layers.Layer: + """ + Function to wrap layers with QcQuantizeWrappers, used by keras clone_model() + :param layer: Layer to wrap + :return: Wrapped layer, or original layer if layer is not to be wrapped + """ + if isinstance(layer, tuple(substitutable_modules.keys())): + new_class = substitutable_modules[type(layer)] + config = layer.get_config() + config["copy_source_weights"] = layer.get_weights() + + if isinstance(layer, tf.keras.layers.LSTM): + if isinstance(self._model_without_wrappers, tf.keras.Sequential): + config["is_sequential_model"] = True + + # pylint: disable=protected-access + if self._quantsim_configurator._layer_to_config_dict[layer]["is_input_quantized"]["setting"]: + config["is_input_quantized"] = True + config["quant_scheme"] = quant_scheme + config["rounding_mode"] = rounding_mode + config["default_output_bw"] = default_output_bw + config["default_param_bw"] = default_param_bw + config["default_data_type"] = default_data_type + + wrapped_layer = new_class.from_config(config) + self._substituted_layer[layer] = wrapped_layer + return wrapped_layer + + if isinstance(layer, tf.keras.Sequential): + return tf.keras.models.clone_model(layer, clone_function=wrap_layer) + + if isinstance(layer, unquantizable_modules) or layer.submodules: + return layer + + activation_quant_settings = QuantizerSettings(default_output_bw, default_data_type, rounding_mode, + quant_scheme, False, False, False) + param_quant_settings = QuantizerSettings(default_param_bw, default_data_type, rounding_mode, + quant_scheme, False, False, False) + + input_quantizers, output_quantizers, param_quantizers = self._get_quantizers_by_layer(layer) + wrapper = QcQuantizeWrapper(layer, activation_quant_settings, param_quant_settings, + num_inputs=len(layer.inbound_nodes[0].keras_inputs), + input_quantizers=input_quantizers, + output_quantizers=output_quantizers, + param_quantizers=param_quantizers, + per_channel_quantization_enabled=self.per_channel_quantization_enabled) + self._layer_name_to_quant_wrapper[layer.name] = wrapper + return wrapper + + return tf.keras.models.clone_model(self._model_without_wrappers, clone_function=wrap_layer) + + def _get_quantizers_by_layer(self, layer: tf.keras.layers.Layer) -> Tuple[Optional[ActivationTensorQuantizer], + Optional[ActivationTensorQuantizer], + Union[ParamPerTensorQuantizer, + ParamPerChannelQuantizer]]: + """ + Get input/output/param quantizers from quantizers dictionary or initialize quantizers if layer is not found + :param layer: Target layer + :return: tuple of input, output, param quantizers + """ + quantizers_dict = self._quantsim_configurator.get_quantizers_dict(layer) + if quantizers_dict is None: + _logger.warning("%s not found in quantizers dict, will generate quantizers automatically", layer.name) + input_quantizers = None + output_quantizers = None + param_quantizers = None + else: + input_quantizers = quantizers_dict.get(INPUT_QUANTIZERS) + output_quantizers = quantizers_dict.get(OUTPUT_QUANTIZERS) + param_quantizers = quantizers_dict.get(PARAM_QUANTIZERS) + + return input_quantizers, output_quantizers, param_quantizers + + @staticmethod + def _quantizer_to_name_tuple(quantizers: List[TensorQuantizer]) -> Tuple[Optional[List[str]]]: + """ + Converts a list of quantizers to a tuple of quantizer names + :param quantizers: quantizers + :return: tuple of quantizer names + """ + quant_list = [] + if not quantizers: + return None + + for quantizer in quantizers: + quant_list.append(quantizer.name) + return tuple(quant_list) + + def get_quantizer_name_by_layer(self, layer: tf.keras.layers.Layer) -> Tuple[Optional[List[str]], + Optional[List[str]], + Optional[List[str]]]: + """ + Get the names of input, output and param quantizers + :param layer: the keras layer + :return: Tuple of quantizer names + """ + input_quantizers, output_quantizers, param_quantizers = self._get_quantizers_by_layer(layer) + output_quantizers_names = self._quantizer_to_name_tuple(output_quantizers) + input_quantizers_names = self._quantizer_to_name_tuple(input_quantizers) + parameter_quantizers_names = self._quantizer_to_name_tuple(param_quantizers) + + return input_quantizers_names, output_quantizers_names, parameter_quantizers_names + + def _disable_quantizers_in_folded_batchnorm(self): + """ + Disable input/output/param quantizers if layer is folded batch normalization + """ + for quantsim_wrapper in self._layer_name_to_quant_wrapper.values(): + if GraphSearchUtils.is_folded_batch_normalization(quantsim_wrapper.original_layer): + for q in quantsim_wrapper.input_quantizers: + q.disable() + for q in quantsim_wrapper.output_quantizers: + q.disable() + for q in quantsim_wrapper.param_quantizers: + q.disable() + + @staticmethod + def _get_encoding_dict_for_quantizer(quantizer: TensorQuantizer) -> Union[List[Dict[str, Union[str, int, float]]], + Dict[str, Union[str, int, float]]]: + """ + Get encoding dict for a tensor quantizer. + + :param quantizer: Quantizer to get encoding info from + :return: Dictionary or List of dictionaries containing encodings info for the tensor quantizer + """ + if not isinstance(quantizer, ParamPerChannelQuantizer) or quantizer.data_type == QuantizationDataType.float: + quantizer_encodings = [quantizer.encoding] + else: + quantizer_encodings = quantizer.encoding + return [ + { + 'min': encoding.min, + 'max': encoding.max, + 'scale': encoding.delta, + 'offset': int(encoding.offset), + 'bitwidth': encoding.bw, + 'is_symmetric': str(quantizer.is_symmetric), + 'dtype': 'int' + } if quantizer.data_type == QuantizationDataType.int + else {'dtype': 'float', 'bitwidth': int(quantizer.bitwidth)} + for encoding in quantizer_encodings + ] + + def get_encodings_dict(self) -> Dict[str, Union[str, Dict]]: + """ + Get encodings dict containing all activation and parameter encodings info in the model + :return: Dictionary containing all activation and parameter encodings info in the model + """ + # pylint: disable=protected-access, too-many-branches + model_input_tensor_names = [inp.name for inp in self.model.inputs] + activation_encodings = {} + param_encodings = {} + for wrapper in self.quant_wrappers(): + for idx, input_quantizer in enumerate(wrapper.input_quantizers): + if input_quantizer.is_encoding_valid() or input_quantizer.data_type == QuantizationDataType.float: + # because dense layers in quantizable MHA are not explicitly sublayers, they don't have their + # inbound_nodes parameter populated, so the name of the quantizer is used instead + if not wrapper._layer_to_wrap.inbound_nodes: + tensor_name = wrapper.name + "/" + input_quantizer.name + ":0" + else: + tensor_name = wrapper._layer_to_wrap.inbound_nodes[0].keras_inputs[idx].name + encoding_dict = self._get_encoding_dict_for_quantizer(input_quantizer) + if tensor_name in model_input_tensor_names: + tensor_name += ":0" + activation_encodings[tensor_name] = encoding_dict + for idx, param_quantizer in enumerate(wrapper.param_quantizers): + if param_quantizer.is_encoding_valid() or param_quantizer.data_type == QuantizationDataType.float: + param_name = wrapper._layer_to_wrap.weights[idx].name + encoding_dict = self._get_encoding_dict_for_quantizer(param_quantizer) + param_encodings[param_name] = encoding_dict + for idx, output_quantizer in enumerate(wrapper.output_quantizers): + if output_quantizer.is_encoding_valid() or output_quantizer.data_type == QuantizationDataType.float: + # because dense layers in quantizable MHA are not explicitly sublayers, they don't have their + # inbound_nodes parameter populated, so the name of the quantizer is used instead + if not wrapper._layer_to_wrap.inbound_nodes: + tensor_name = wrapper.name + ":0" + elif isinstance(wrapper._layer_to_wrap.output, List): + tensor_name = wrapper._layer_to_wrap.output[idx].name + else: + tensor_name = wrapper._layer_to_wrap.output.name + encoding_dict = self._get_encoding_dict_for_quantizer(output_quantizer) + activation_encodings[tensor_name] = encoding_dict + return { + 'version': encoding_version, + 'activation_encodings': activation_encodings, + 'param_encodings': param_encodings, + 'quantizer_args': self.quant_args if hasattr(self, "quant_args") else {} + } + +
[docs] def compute_encodings(self, forward_pass_callback, forward_pass_callback_args): + """ + Computes encodings for all quantization sim nodes in the model. + :param forward_pass_callback: A callback function that is expected to runs forward passes on a model. + This callback function should use representative data for the forward pass, so the calculated + encodings work for all data samples. + :param forward_pass_callback_args: These argument(s) are passed to the forward_pass_callback as-is. Up to + the user to determine the type of this parameter. E.g. could be simply an integer representing the number + of data samples to use. Or could be a tuple of parameters or an object representing something more + complex. + """ + ops_with_invalid_encodings = [] + self._compute_and_set_parameter_encodings(ops_with_invalid_encodings) + + self._set_op_mode_parameters(libpymo.TensorQuantizerOpMode.quantizeDequantize) + + forward_pass_callback(self.model, forward_pass_callback_args) + for quant_wrapper in self.quant_wrappers(): + quant_wrapper.compute_encoding(ops_with_invalid_encodings) + + op_mode = self._param_op_mode_after_analysis(self.quant_scheme) + + self._set_op_mode_parameters(op_mode) + + if ops_with_invalid_encodings: + _logger.info('The following quantizers did not have valid encodings and have been set to passThrough mode: ' + '%s', ops_with_invalid_encodings) + _logger.info('This can be due to the quantizers not having been evaluated during the forward pass in ' + 'compute encodings. Evaluation is required to collect statistics needed to compute valid ' + 'encodings.\n' + 'As a result, the quantizers have been set to passThrough mode, meaning no quantization noise ' + 'will be simulated for these ops if they are evaluated in the future.\n' + 'If this is not desired, amend the forward pass to evaluate tensors which require these ops ' + 'to be evaluated, and recompute encodings.')
+ + def _set_op_mode_parameters(self, op_mode: libpymo.TensorQuantizerOpMode): + """ + Sets quant mode for parameters and if the encodings are invalid, then adds those wrappers + to wrappers_with_invalid_encodings + :param op_mode: Quant mode to set to + """ + + for quantizer_info in self.quant_wrappers(): + for param_quantizer in quantizer_info.param_quantizers: + if param_quantizer.is_enabled(): + param_quantizer.quant_mode = op_mode + +
[docs] def export(self, path, filename_prefix, custom_objects=None, convert_to_pb=True): + """ + This method exports out the quant-sim model so it is ready to be run on-target. + Specifically, the following are saved + 1. The sim-model is exported to a regular Keras model without any simulation ops + 2. The quantization encodings are exported to a separate JSON-formatted file that can + then be imported by the on-target runtime (if desired) + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param custom_objects: If there are custom objects to load, Keras needs a dict of them to map them + """ + model_path = os.path.join(path, filename_prefix) + + #TF Version 2.4 has bug i.e. save() in tf format don't work for unrolled LSTM. + for layer in self._model_without_wrappers.layers: + if isinstance(layer, tf.keras.layers.LSTM): + break + else: + self._model_without_wrappers.save(model_path) + + self._model_without_wrappers.save(model_path + '.h5', save_format='h5') + + # Conversion of saved h5 model to pb model for consumption by SNPE/QNN + try: + if convert_to_pb: + convert_h5_model_to_pb_model(f'{model_path}.h5', custom_objects=custom_objects) + except ValueError: + _logger.error("Could not convert h5 to frozen pb. " + "Please call export() again with custom_objects defined.") + raise + finally: + encodings_dict = self.get_encodings_dict() + encoding_file_path = os.path.join(path, filename_prefix + '.encodings') + save_json_yaml(encoding_file_path, encodings_dict)
+ + def _compute_and_set_parameter_encodings(self, ops_with_invalid_encodings: List): + # pylint: disable=too-many-nested-blocks + for quantizer_wrapper in self.quant_wrappers(): + for idx, param_quantizer in enumerate(quantizer_wrapper.param_quantizers): + if param_quantizer.is_enabled() and param_quantizer.data_type == QuantizationDataType.int: + # 0th input to our quant wrapper is the tensor being quantized + weight_tensor = quantizer_wrapper.original_layer.get_weights()[idx] + + # Per-channel + if isinstance(param_quantizer, StaticGridPerChannelQuantizer): + for index, tensor_quantizer in enumerate(param_quantizer.tensor_quantizer): + if param_quantizer.axis_handling == AxisHandling.LAST_TWO_AXES.value: + last_two_axes_combined_shape = list(weight_tensor.shape[:-2]) + [-1] + channel_slice = weight_tensor.reshape(*last_two_axes_combined_shape) + channel_slice = channel_slice.take(index, channel_slice.ndim - 1) + elif isinstance(quantizer_wrapper.original_layer, tf.keras.layers.Conv2DTranspose): + if weight_tensor.ndim == 4: + channel_slice = weight_tensor.take(index, weight_tensor.ndim - 2) + else: + # For bias in Transpose layers + channel_slice = weight_tensor.take(index, weight_tensor.ndim - 1) + else: + channel_slice = weight_tensor.take(index, weight_tensor.ndim - 1) + tensor_quantizer.updateStats(channel_slice, False) + + # Per-tensor + else: + tensor_quantizer = param_quantizer.tensor_quantizer + tensor_quantizer.updateStats(weight_tensor, False) + + param_quantizer.compute_encoding(ops_with_invalid_encodings) + + def set_and_freeze_param_encodings(self, encoding_path: str): + """ + Set and freeze parameter encodings from encodings JSON file + :param encoding_path: path from where to load parameter encodings file + """ + # Load parameter encodings file + with open(encoding_path) as json_file: + param_encodings = json.load(json_file) + + for quant_wrapper in self.quant_wrappers(): + quant_wrapper.set_and_freeze_param_encoding(param_encodings) + + def load_encodings_to_sim(self, encoding_file_path: str): + """ + Loads the saved encodings to quant sim model + + :param encoding_file_path: path from where to load encodings file + :return: + """ + # pylint: disable=protected-access, too-many-branches, too-many-locals, too-many-statements + # Load encodings file + with open(encoding_file_path) as json_file: + encodings = json.load(json_file) + + param_encodings = encodings['param_encodings'] + activation_encodings = encodings['activation_encodings'] + + model_input_tensor_names = [inp.name for inp in self.model.inputs] + + for wrapper in self.quant_wrappers(): + for idx, input_quantizer in enumerate(wrapper.input_quantizers): + # because dense layers in quantizable MHA and RNN are not explicitly sublayers, they don't have their + # inbound_nodes parameter populated, so the name of the quantizer is used instead + if not wrapper._layer_to_wrap.inbound_nodes: + tensor_name = wrapper.name + "/" + input_quantizer.name + ":0" + else: + tensor_name = wrapper._layer_to_wrap.inbound_nodes[0].keras_inputs[idx].name + if tensor_name in model_input_tensor_names: + tensor_name += ":0" + + if tensor_name in activation_encodings: + if not input_quantizer.is_enabled(): + _logger.info("Not loading encodings for quantizer: %s as it is disabled", tensor_name) + continue + encoding_dict = activation_encodings[tensor_name][0] + if encoding_dict['dtype'] == 'int': + encoding, is_symmetric = keras_common_utils.create_encoding_from_dict(encoding_dict) + input_quantizer.tensor_quantizer.isEncodingValid = True + input_quantizer.set_quantizer_encodings(encoding.bw, is_symmetric, encoding, + libpymo.TensorQuantizerOpMode.quantizeDequantize) + _logger.info("Setting encodings for : %s", tensor_name) + elif encoding_dict['dtype'] == 'float': + input_quantizer.data_type = QuantizationDataType.float + input_quantizer.bitwidth = encoding_dict['bitwidth'] + _logger.info("Setting quantizer dtype to float for : %s", tensor_name) + else: + raise RuntimeError("Unrecognized dtype %s for: %s" % (encoding_dict['dtype'], tensor_name)) + else: + if input_quantizer.is_enabled(): + input_quantizer.disable() + _logger.info("Encoding for quantizer: %s is not present thus disabling it.", tensor_name) + + for idx, param_quantizer in enumerate(wrapper.param_quantizers): + param_name = wrapper._layer_to_wrap.weights[idx].name + + if param_name in param_encodings: + if not param_quantizer.is_enabled(): + _logger.info("Not loading encodings for parameter: %s as quantizer is disabled", param_name) + continue + if isinstance(param_quantizer, StaticGridPerChannelQuantizer): + assert param_encodings[param_name][0]['dtype'] != 'float', "PerChannel Quantizers can't be set to float" + encoding, is_symmetric = keras_common_utils.create_encoding_from_dict( + param_encodings[param_name]) + for tensor_quantizer in param_quantizer.tensor_quantizer: + tensor_quantizer.isEncodingValid = True + bw = encoding[0].bw + param_quantizer.set_quantizer_encodings(bw, is_symmetric, encoding, + libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize) + _logger.info("Setting encodings for : %s", param_name) + else: + encoding_dict = param_encodings[param_name][0] + if encoding_dict['dtype'] == 'int': + encoding, is_symmetric = keras_common_utils.create_encoding_from_dict(encoding_dict) + param_quantizer.tensor_quantizer.isEncodingValid = True + bw = encoding.bw + param_quantizer.set_quantizer_encodings(bw, is_symmetric, encoding, + libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize) + _logger.info("Setting encodings for : %s", param_name) + elif encoding_dict['dtype'] == 'float': + param_quantizer.data_type = QuantizationDataType.float + param_quantizer.bitwidth = encoding_dict['bitwidth'] + _logger.info("Setting quantizer to float for : %s", param_name) + else: + raise RuntimeError("Unrecognized dtype %s for: %s" % (encoding_dict['dtype'], tensor_name)) + else: + if param_quantizer.is_enabled(): + param_quantizer.disable() + _logger.info("Encoding for parameter: %s not present thus disabling this quantizer.", + param_name) + + # Loading encodings means that compute encodings was called. Therefore, these two lines set the correct + # op mode for the correct quant scheme and if the quantization was per channel or not. + op_mode = self._param_op_mode_after_analysis(self.quant_scheme) + self._set_op_mode_parameters(op_mode) + + for idx, output_quantizer in enumerate(wrapper.output_quantizers): + # because dense layers in quantizable MHA are not explicitly sublayers, they don't have their + # inbound_nodes parameter populated, so the name of the quantizer is used instead + if not wrapper._layer_to_wrap.inbound_nodes: + tensor_names = [wrapper.name + ":0"] + else: + # There can be multiple outputs if there is a + # `tf.split` in the model. + if isinstance(wrapper._layer_to_wrap.output, list): + tensor_names = [ + output.name + for output in wrapper._layer_to_wrap.output + ] + else: + tensor_names = [wrapper._layer_to_wrap.output.name] + + for tensor_name in tensor_names: + if tensor_name in activation_encodings: + if not output_quantizer.is_enabled(): + _logger.info("Not loading encodings for quantizer: %s as it is disabled", tensor_name) + continue + encoding_dict = activation_encodings[tensor_name][0] + if encoding_dict['dtype'] == 'int': + encoding, is_symmetric = keras_common_utils.create_encoding_from_dict(encoding_dict) + output_quantizer.tensor_quantizer.isEncodingValid = True + output_quantizer.set_quantizer_encodings(encoding.bw, is_symmetric, encoding, + libpymo.TensorQuantizerOpMode.quantizeDequantize) + _logger.info("Setting encodings for : %s", tensor_name) + elif encoding_dict['dtype'] == 'float': + output_quantizer.data_type = QuantizationDataType.float + output_quantizer.bitwidth = encoding_dict['bitwidth'] + _logger.info("Setting quantizer dtype to float for : %s", tensor_name) + else: + raise RuntimeError("Unrecognized dtype %s for: %s" % (encoding_dict['dtype'], tensor_name)) + else: + if output_quantizer.is_enabled(): + output_quantizer.disable() + _logger.info("Encoding for quantizer: %s is not present thus disabling it.", tensor_name) + + def _param_op_mode_after_analysis(self, quant_scheme) -> libpymo.TensorQuantizerOpMode: + """ + Returns quant mode to use for parameters after encodings have been computed + :param quant_scheme: Quantization scheme to use + :return: Quant mode to use + """ + if quant_scheme in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init] \ + or self.per_channel_quantization_enabled: + return libpymo.TensorQuantizerOpMode.quantizeDequantize + return libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize + + def quant_wrappers(self): + """ + Generator for yielding all quantization wrappers + """ + for layer in self.model.layers: + if isinstance(layer, QcQuantizeWrapper): + yield layer + if isinstance(layer, tuple(substitutable_modules.values())): + yield from layer.quant_wrappers() + + # For Getting Quantizers from Sequantial Block + if isinstance(layer, tf.keras.Sequential): + yield from quant_wrappers_for_sequential_block(layer) + + def get_quant_wrapper_for_layer_name(self, layer_name: str) -> QcQuantizeWrapper: + """ + Return qc quant wrapper corresponding to a layer name + :param layer_name: Layer name to get quantize wrapper for + :return: Qc quant wrapper corresponding to a layer name + """ + return self._layer_name_to_quant_wrapper.get(layer_name) + + # pylint: disable=too-many-locals + def _fill_missing_encoding_min_max_gradients(self, gradients: list): + """ + Computes the encoding min/max gradients and populates the gradients list + :param gradients: gradients computed using GradientTape(gradients for encoding min/max will be `None`) + """ + + def _find_weight_in_layer(weight_name: str, model_layer: tf.keras.layers.Layer): + + for weight in model_layer.weights: + if weight.name.split(":")[0] == weight_name: + return weight + + return None + + # Mapping used to get the gradients of weights(kernel, bias etc) + weight_name_to_gradient = dict(zip([weight.name.split(":")[0] for weight in self.model.trainable_weights], + gradients)) + + # Mapping used to get index of encoding min/max gradients (which would be `None`) and fill them + weight_name_to_index = dict(zip([weight.name for weight in self.model.trainable_weights], + range(len(self.model.trainable_weights)))) + + # Only process layers where 'param_quantizers' is defined (i.e. QcQuantizeWrapper layers) + for layer in filter(lambda _layer: hasattr(_layer, 'param_quantizers'), self.model.layers): + for param_quantizer in layer.param_quantizers: + if param_quantizer.name in weight_name_to_gradient: + # Value of weight associated with this param quantizer + weight_tensor = _find_weight_in_layer(param_quantizer.name, layer.original_layer) + + # Gradients of the weights + grad = weight_name_to_gradient[param_quantizer.name] + + # Using the weights and it's gradients, compute gradients for encoding min/max + dloss_by_dmin, dloss_by_dmax = param_quantizer.get_gradients_for_encoding_min_max(weight_tensor, + grad) + + enc_min_index = weight_name_to_index[param_quantizer.encoding_min.name] + enc_max_index = weight_name_to_index[param_quantizer.encoding_max.name] + + gradients[enc_min_index] = dloss_by_dmin + gradients[enc_max_index] = dloss_by_dmax + + # TODO: Remove this logic once this has been resolved in QNN/SNPE + # Go through activation quantizers (Input/Output) and set any ReLU's encoding min to 0 + relu_quantize_wrappers = [ + _layer for _layer in self.model.layers + if isinstance(_layer, QcQuantizeWrapper) and isinstance(_layer.original_layer, tf.keras.layers.ReLU) + ] + + def _set_encoding_min_grad_to_None(quantizer): + enc_min_index = weight_name_to_index[quantizer.encoding_min.name] + gradients[enc_min_index] = None + + for relu_quantizer in relu_quantize_wrappers: + for output_quantizer in relu_quantizer.output_quantizers: + _set_encoding_min_grad_to_None(output_quantizer) + + # pylint: disable=useless-super-delegation + def get_config(self): + return super().get_config() + + def call(self, inputs, training=None, mask=None): + return self.model.call(inputs, training, mask) + + def train_step(self, data): + """ + Custom training loop, equivalent to overriding `keras.Model.fit` function + Reference: https://keras.io/guides/customizing_what_happens_in_fit/ + Only relevant when using range-learning, otherwise equivalent to `keras.Model.fit` + Param quantizers are disconnected in the op graph of the wrapped model + Because of this, the gradients are not computed for encoding min/max(when range learning is enabled) + This custom train_step function computes the missing gradients for encoding min/max of param quantizers + """ + x, y = data + + with tf.GradientTape() as tape: + predictions = self(x, training=True) + loss = self.compiled_loss(y, predictions) + + gradients = tape.gradient(loss, self.model.trainable_weights) + + # Manually compute missing gradients for encoding min/max when using range learning + if self.quant_scheme in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init]: + self._fill_missing_encoding_min_max_gradients(gradients) + + gradients_to_apply = [(gradient, weight) for gradient, weight in zip(gradients, self.model.trainable_weights) + if gradient is not None] + + self.optimizer.apply_gradients(gradients_to_apply) + + self.compiled_metrics.update_state(y, predictions) + + return {m.name: m.result() for m in self.metrics}
+ + +def quant_wrappers_for_sequential_block(seq_block: tf.keras.Sequential): + """ + Generator for yielding all quantization wrappers for a Sequantial Block + """ + for layer in seq_block.layers: + if isinstance(layer, QcQuantizeWrapper): + yield layer + if isinstance(layer, tuple(substitutable_modules.values())): + yield from layer.quant_wrappers() + + # in cases of nested Sequential Block + if isinstance(layer, tf.keras.Sequential): + yield from quant_wrappers_for_sequential_block(layer) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/layer_output_utils.html b/releases/1.32.2/_modules/aimet_tensorflow/layer_output_utils.html new file mode 100644 index 0000000..d9acbb5 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/layer_output_utils.html @@ -0,0 +1,1298 @@ + + + + + + aimet_tensorflow.layer_output_utils — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.layer_output_utils

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" This module contains utilities to capture and save intermediate layer-outputs of a model """
+
+import re
+from typing import List, Dict, Tuple, Union
+
+import numpy as np
+import tensorflow as tf
+
+from aimet_common.utils import AimetLogger
+from aimet_common.layer_output_utils import SaveInputOutput, save_layer_output_names
+
+from aimet_tensorflow.common.connectedgraph import ConnectedGraph
+from aimet_tensorflow.quantsim import QuantizationSimModel
+from aimet_tensorflow.utils.common import create_input_feed_dict
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.LayerOutputs)
+
+
+
[docs]class LayerOutputUtil: + """ Implementation to capture and save outputs of intermediate layers of a model (fp32/quantsim) """ + + def __init__(self, session: tf.compat.v1.Session, starting_op_names: List[str], output_op_names: List[str], + dir_path: str): + """ + Constructor for LayerOutputUtil. + + :param session: Session containing the model whose layer-outputs are needed. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :param dir_path: Directory wherein layer-outputs will be saved. + """ + self.session = session + self.starting_op_names = starting_op_names + + # Utility to capture layer-outputs + self.layer_output = LayerOutput(session=session, starting_op_names=starting_op_names, + output_op_names=output_op_names, dir_path=dir_path) + + # Identify the axis-layout used for representing an image tensor + axis_layout = 'NHWC' if tf.keras.backend.image_data_format() == 'channels_last' else 'NCHW' + + # Utility to save model inputs and their corresponding layer-outputs + self.save_input_output = SaveInputOutput(dir_path, axis_layout) + +
[docs] def generate_layer_outputs(self, input_batch: Union[np.ndarray, List[np.ndarray], Tuple[np.ndarray]]): + """ + This method captures output of every layer of a model & saves the inputs and corresponding layer-outputs to disk. + + :param input_batch: Batch of inputs for which we want to obtain layer-outputs. + :return: None + """ + logger.info("Generating layer-outputs for %d input instances", len(input_batch)) + + feed_dict = create_input_feed_dict(self.session.graph, self.starting_op_names, input_batch) + + # Obtain layer-output name to output dictionary + layer_output_batch_dict = self.layer_output.get_outputs(feed_dict) + + # Skip constant scalar layer-outputs + const_scalar_layer_name = [] + for layer_name, layer_output in layer_output_batch_dict.items(): + if not isinstance(layer_output, np.ndarray): + const_scalar_layer_name.append(layer_name) + for layer_name in const_scalar_layer_name: + logger.info("Skipping constant scalar output of layer %s", layer_name) + _ = layer_output_batch_dict.pop(layer_name) + + # Save inputs and layer-outputs + self.save_input_output.save(input_batch, layer_output_batch_dict) + + logger.info('Layer-outputs generated for %d input instances', len(input_batch))
+ + +class LayerOutput: + """ + This class creates a layer-output name to layer-output dictionary. The layer-output names are as per the AIMET exported + tensorflow model. + """ + def __init__(self, session: tf.compat.v1.Session, starting_op_names: List[str], output_op_names: List[str], dir_path: str): + """ + Constructor - It initializes few lists that are required for capturing and naming layer-outputs. + + :param session: Session containing TF model. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + """ + self.session = session + self.activation_tensor_names, self.activation_tensors = LayerOutput.get_activation_tensor_info( + session, starting_op_names, output_op_names) + + # Save activation tensor names which are in topological order of model graph. This order can be used while comparing layer-outputs. + save_layer_output_names(self.activation_tensor_names, dir_path) + + def get_outputs(self, feed_dict: Dict) -> Dict[str, np.ndarray]: + """ + This function creates layer-output name to layer-output dictionary. The layer-output names are as per the AIMET + exported TF model. + + :param feed_dict: input tensor to input batch map + :return: layer-output name to layer-output dictionary + """ + act_outputs = self.session.run(self.activation_tensors, feed_dict=feed_dict) + return dict(zip(self.activation_tensor_names, act_outputs)) + + @staticmethod + def get_activation_tensor_info(session: tf.compat.v1.Session, starting_op_names: List[str], output_op_names: List[str]) -> Tuple[List, List]: + """ + This function fetches the activation tensors and its names from the given TF model. These activation tensors contain + the layer-outputs of the given TF model. + + :param session: Session containing TF model. + :param starting_op_names: List of starting op names of the model. + :param output_op_names: List of output op names of the model. + :return: activation_tensor_names, activation_tensors + """ + connected_graph = ConnectedGraph(session.graph, starting_op_names, output_op_names) + # pylint: disable=protected-access + activation_op_names = QuantizationSimModel._get_ops_to_quantize_activations_for(session.graph, connected_graph) + + # Get activation quantization ops + activation_quant_op_names = [op_name for op_name in activation_op_names if op_name.endswith('_quantized')] + + # If activation quant ops are present then capture only their tensors + if activation_quant_op_names: + activation_op_names = activation_quant_op_names + + activation_tensor_names = [] + activation_tensors = [] + for activation_op_name in activation_op_names: + activation_op = session.graph.get_operation_by_name(activation_op_name) + for output in activation_op.outputs: + activation_tensor_names.append(output.name) + activation_tensors.append(output) + + # Update activation tensor names by removing 'quantized:' string and replacing '/' with '_'. + activation_tensor_names = [re.sub(r'\W+', "_", name.replace('quantized:', '')) for name in activation_tensor_names] + + return activation_tensor_names, activation_tensors +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/plotting_utils.html b/releases/1.32.2/_modules/aimet_tensorflow/plotting_utils.html new file mode 100644 index 0000000..5e7f6a7 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/plotting_utils.html @@ -0,0 +1,1614 @@ + + + + + + aimet_tensorflow.plotting_utils — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.plotting_utils

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019-2021, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Create visualizations on the weights in each conv and linear layer in a model"""
+import os
+import math
+import holoviews as hv
+import numpy as np
+import pandas as pd
+from bokeh import plotting
+from bokeh.layouts import row
+from bokeh.models import HoverTool, WheelZoomTool, ColumnDataSource, Span, TableColumn, DataTable
+from bokeh.plotting import figure
+from bokeh.layouts import column
+from bokeh.models import Div
+
+# Some magic stuff happening during import that ties pandas dataframe to hvplot
+# Need this import, please don't remove
+import hvplot.pandas  # pylint:disable=unused-import
+
+from aimet_tensorflow.utils.op.conv import WeightTensorUtils
+
+
+def get_weights(conv_module, sess):
+    """
+    Returns the weights of a conv_module in a 2d matrix, where each column is an output channel.
+
+    :param sess: tf.compat.v1.Session
+    :param conv_module: convNd module
+    :return: 2d numpy array
+    """
+    numpy_weight = WeightTensorUtils.get_tensor_as_numpy_data(sess, conv_module)
+    numpy_weight = np.reshape(numpy_weight, (numpy_weight.shape[3], numpy_weight.shape[2], numpy_weight.shape[0],
+                                             numpy_weight.shape[1]))
+    axis_0_length = numpy_weight.shape[0]
+    axis_1_length = np.prod(numpy_weight.shape[1:])
+    reshaped_weights = numpy_weight.reshape(int(axis_0_length), int(axis_1_length))
+    return reshaped_weights
+
+
+def style(p):
+    """
+    Style bokeh figure object p and return the styled object
+    :param p: Bokeh figure object
+    :return: Bokeh figure object
+    """
+    # Title
+    p.title.align = 'center'
+    p.title.text_font_size = '14pt'
+    p.title.text_font = 'serif'
+
+    # Axis titles
+    p.xaxis.axis_label_text_font_size = '12pt'
+    # p.xaxis.axis_label_text_font_style = 'bold'
+    p.yaxis.axis_label_text_font_size = '12pt'
+    #     p.yaxis.axis_label_text_font_style = 'bold'
+
+    # Tick labels
+    p.xaxis.major_label_text_font_size = '10pt'
+    p.yaxis.major_label_text_font_size = '10pt'
+
+    p.add_tools(WheelZoomTool())
+
+    return p
+
+
+def line_plot_changes_in_summary_stats(data_before, data_after, x_axis_label=None, y_axis_label=None, title=None):
+    """
+    Returns a bokeh figure object showing a lineplot of min, max, and mean per output channel, shading in the area
+    difference between before and after.
+    :param data_before: pandas data frame with columns min, max, and mean.
+    :param data_after: pandas data frame with columns min, max, and mean
+    :param x_axis_label: string description of x axis
+    :param y_axis_label: string description of y axis
+    :param title: title for the plot
+    :return: bokeh figure object
+    """
+    layer_weights_old_model = convert_pandas_data_frame_to_bokeh_column_data_source(data_before)
+    layer_weights_new_model = convert_pandas_data_frame_to_bokeh_column_data_source(data_after)
+    plot = figure(x_axis_label=x_axis_label, y_axis_label=y_axis_label,
+                  title=title,
+                  tools="pan, box_zoom, crosshair, reset, save",
+                  width_policy="max", sizing_mode='stretch_both', output_backend="webgl")
+    plot.line(x='index', y='min', line_width=2, line_color="#2171b5", legend_label="Minimum After Optimization",
+              source=layer_weights_old_model, name="new model")
+    plot.line(x='index', y='max', line_width=2, line_color="green", legend_label="Maximum After Optimization", source=layer_weights_old_model,
+              name="new model")
+    plot.line(x='index', y='mean', line_width=2, line_color="orange", legend_label="Mean After Optimization",
+              source=layer_weights_old_model, name="new model")
+
+    plot.line(x='index', y='min', line_width=2, line_color="#2171b5", line_dash='dotted',
+              legend_label="Minimum Before Optimization", source=layer_weights_new_model, name="old model")
+    plot.line(x='index', y='max', line_width=2, line_color="green", line_dash='dotted',
+              legend_label="Maximum Before Optimizaiton", source=layer_weights_new_model, name="old model")
+    plot.line(x='index', y='mean', line_width=2, line_color="orange", line_dash='dotted',
+              legend_label="Mean Before Optimization", source=layer_weights_new_model, name="old model")
+
+    plot.varea(x=data_after.index,
+               y1=data_after['min'],
+               y2=data_before['min'], fill_alpha=0.3, legend_label="shaded region", name="new model")
+
+    plot.varea(x=data_after.index,
+               y1=data_after['max'],
+               y2=data_before['max'], fill_color="green", fill_alpha=0.3, legend_label="shaded region")
+
+    plot.varea(x=data_after.index,
+               y1=data_after['mean'],
+               y2=data_before['mean'], fill_color="orange", fill_alpha=0.3, legend_label="shaded region")
+
+    plot.legend.location = "top_left"
+    plot.legend.click_policy = "hide"
+    plot.legend.background_fill_alpha = 0.3
+
+    if not x_axis_label or not y_axis_label or not title:
+        layout = row(plot)
+        return layout
+
+    # display a tooltip whenever the cursor in line with a glyph
+    hover1 = HoverTool(tooltips=[("Output Channel", "$index"),
+                                 ("Mean Before Optimization", "@mean{0.00}"),
+                                 ("Minimum Before Optimization", "@min{0.00}"),
+                                 ("Maximum Before Optimization", "@max{0.00}"),
+                                 ("25 Percentile Before Optimization", "@{25%}{0.00}"),
+                                 ("75 Percentile Before Optimization", "@{75%}{0.00}")], names=['old model'],
+                       mode='mouse'
+                       )
+    hover2 = HoverTool(tooltips=[("Output Channel", "$index"),
+                                 ("Mean After Optimization", "@mean{0.00}"),
+                                 ("Minimum After Optimization", "@min{0.00}"),
+                                 ("Maximum After Optimization", "@max{0.00}"),
+                                 ("25 Percentile After Optimization", "@{25%}{0.00}"),
+                                 ("75 Percentile After Optimization", "@{75%}{0.00}")], names=['new model'],
+                       mode='mouse'
+                       )
+    plot.add_tools(hover1)
+    plot.add_tools(hover2)
+    style(plot)
+
+    layout = row(plot)
+    return layout
+
+
+def line_plot(x, y, x_axis_label, y_axis_label, title, x_range=None):
+    """
+    :param x: x coordinates of data points
+    :param y: y coordinates of data points
+    :param x_axis_label: string description of x axis
+    :param y_axis_label: string description of y axis
+    :param title: title for the plot
+    :return: bokeh figure object
+    """
+    plot = figure(x_axis_label=x_axis_label, y_axis_label=y_axis_label,
+                  title=title,
+                  tools="pan, box_zoom, crosshair, reset, save",
+                  x_range=x_range,
+                  width=1500)
+    plot.line(x=x, y=y, line_width=2, line_color="#2171b5")
+    plot.circle(x=x, y=y, color="black", alpha=0.7, size=10)
+    if isinstance(x_range, list) and isinstance(x_range[0], str):
+        plot.xaxis.major_label_orientation = math.pi / 4
+
+    style(plot)
+
+    return plot
+
+
+def scatter_plot_summary_stats(data_frame, x_axis_label_mean="mean", y_axis_label_mean="standard deviation",
+                               title_mean="Mean vs Standard Deviation",
+                               x_axis_label_min="Minimum",
+                               y_axis_label_min="Maximum", title_min="Minimum vs Maximum"):
+    """
+    Creates a scatter plot, plotting min vs max, and mean vs std side by side.
+    :param data_frame: pandas data frame object
+    :param x_axis_label_mean: string description of x axis in plot showing mean vs std
+    :param y_axis_label_mean: string description of y axis in plot showing mean vs std
+    :param x_axis_label_min: string description of x axis in plot showing min vs max
+    :param y_axis_label_min: string description of y axis in plot showing min vs max
+    :return: bokeh figure
+    """
+    plot1 = figure(x_axis_label=x_axis_label_mean, y_axis_label=y_axis_label_mean,
+                   title=title_mean,
+                   tools="box_zoom, crosshair,reset", output_backend="webgl")
+    plot1.circle(x=data_frame['mean'], y=data_frame['std'], size=10, color="orange", alpha=0.4)
+
+    plot2 = figure(x_axis_label=x_axis_label_min, y_axis_label=y_axis_label_min,
+                   title=title_min,
+                   tools="box_zoom, crosshair,reset", output_backend="webgl")
+    plot2.circle(x=data_frame['min'], y=data_frame['max'], size=10, color="#2171b5", alpha=0.4)
+    style(plot1)
+    style(plot2)
+    # layout = row(plot1, plot2)
+    return plot1, plot2
+
+
+def box_plot_max_ranges(data_frame, output_channels_needed, x_label=None, y_label=None, title=None):
+    """
+    Creates a figure with n boxplots that can be most sensitive to outliers.
+    :param data_frame: pandas dataframe object
+    :param described_df: pandas dataframe object with a max and min column
+    :param largest_ranges_n: number of boxplots to be made
+    :return: a boxplot figure that has n boxplots with the largest range
+    """
+    # CLEAN THIS UP
+    data_frame.columns = data_frame.columns.map(str)
+    max_range_df = data_frame[output_channels_needed]
+    columns = list(max_range_df.columns)
+    plot = max_range_df.hvplot.box(y=columns, legend=False, invert=False, box_fill_alpha=0.5,
+                                   outlier_fill_color="red",
+                                   outlier_alpha=0.3, width=1200, height=600,
+                                   xlabel=x_label,
+                                   ylabel=y_label,
+                                   title=title)
+    bokeh_plot = hv.render(plot)
+
+    style(bokeh_plot)
+    return bokeh_plot
+
+
+def identify_max_range_columns(data_frame, described_df, num_columns=50):
+    """
+    Returns a list of columns with the maximum absolute ranges.
+    :param data_frame: pandas data frame
+    :param described_df: pandas data frame with summary statistics
+    :param num_columns: number of output channels to return
+    :return: list of output channels with maximum ranges.
+    """
+    data_frame.columns = data_frame.columns.map(str)
+    described_df['range'] = described_df['max'] - described_df['min']
+    described_df = described_df.sort_values(by=['range'], ascending=False)
+    output_channels_needed = described_df[:num_columns].index
+
+    output_channels_needed = [str(i) for i in output_channels_needed]
+    return output_channels_needed
+
+
+def line_plot_summary_statistics_model(layer_name, layer_weights_data_frame, height, width):
+    """
+    Given a layer
+    :param layer_name:
+    :param layer_weights_data_frame:
+    :return:
+    """
+    layer_weights = convert_pandas_data_frame_to_bokeh_column_data_source(layer_weights_data_frame)
+    plot = figure(x_axis_label="Output Channels", y_axis_label="Summary Statistics",
+                  title="Weight Ranges per Output Channel: " + layer_name,
+                  tools="pan, box_zoom, crosshair, reset, save",
+                  width=width, height=height, output_backend="webgl")
+    plot.line(x='index', y='min', line_width=2, line_color="#2171b5",
+              legend_label="Minimum", source=layer_weights)
+    plot.line(x='index', y='max', line_width=2, line_color="green",
+              legend_label="Maximum", source=layer_weights)
+    plot.line(x='index', y='mean', line_width=2, line_color="orange",
+              legend_label="Average", source=layer_weights)
+
+    plot.legend.location = "top_left"
+    plot.legend.click_policy = "hide"
+    plot.legend.background_fill_alpha = 0.3
+
+    plot.add_tools(HoverTool(tooltips=[("Output Channel", "$index"),
+                                       ("Mean", "@mean{0.00}"),
+                                       ("Min", "@min{0.00}"),
+                                       ("Max", "@max{0.00}"),
+                                       ("25 percentile", "@{25%}{0.00}"),
+                                       ("75 percentile", "@{75%}{0.00}")],
+                             # display a tooltip whenever the cursor is vertically in line with a glyph
+                             mode='mouse'
+                             ))
+    style(plot)
+    return plot
+
+
+def identify_problematic_output_channels(module_weights_data_frame_described):
+    """
+    return a list of output channels that have large weight ranges
+    :param module_weights_data_frame: pandas data frame where each column are summary statistics for each row, output channels
+    :param largest_ranges_n: number of output channels to return
+    :return:
+    """
+    # data_frame.columns = data_frame.columns.map(str)
+    module_weights_data_frame_described['range'] = module_weights_data_frame_described['max'] - \
+                                                   module_weights_data_frame_described['min']
+    module_weights_data_frame_described["abs range"] = module_weights_data_frame_described["range"].abs()
+    variable = module_weights_data_frame_described["abs range"].min()
+    module_weights_data_frame_described["relative range"] = module_weights_data_frame_described["abs range"] / variable
+    described_df = module_weights_data_frame_described.sort_values(by=['relative range'], ascending=False)
+    all_output_channel_ranges = described_df["relative range"]
+    output_channels_needed = detect_outlier_channels(all_output_channel_ranges)
+
+    return output_channels_needed, all_output_channel_ranges
+
+
+def detect_outlier_channels(data_frame_with_relative_ranges):
+    """
+    Detects outliers for relative weight ranges.
+    :param data_frame_with_relative_ranges: pandas data frame with column name "relative ranges"
+    :return: list of output channels that have very large weight ranges
+    """
+    Q1 = data_frame_with_relative_ranges.quantile(0.25)
+    Q3 = data_frame_with_relative_ranges.quantile(0.75)
+    IQR = Q3 - Q1
+    v = (data_frame_with_relative_ranges > (Q3 + 1.5 * IQR))
+    v_df = v.to_frame()
+    keep_only_outliers = v_df.loc[v_df['relative range']]
+    output_channels_list = keep_only_outliers.index
+    return output_channels_list
+
+
+def add_vertical_line_to_figure(x_coordinate, figure_object):
+    """
+    adds a vertical line to a bokeh figure object
+    :param x_coordinate: x_coordinate to add line
+    :param figure_object: bokeh figure object
+    :return: None
+    """
+    # Vertical line
+    vertical_line = Span(location=x_coordinate, dimension='height', line_color='red', line_width=1)
+    figure_object.add_layout(vertical_line)
+
+
+def histogram(data_frame, column_name, num_bins, x_label=None, y_label=None, title=None):
+    """
+    Creates a histogram of the column in the input data frame.
+    :param data_frame: pandas data frame
+    :param column_name: column in data frame
+    :param num_bins: number of bins to divide data into for histogram
+    :return: bokeh figure object
+    """
+    hv_plot_object = data_frame.hvplot.hist(column_name, bins=num_bins, height=400, tools="", xlabel=x_label,
+                                            ylabel=y_label,
+                                            title=title, fill_alpha=0.5)
+
+    bokeh_plot = hv.render(hv_plot_object)
+    style(bokeh_plot)
+    return bokeh_plot
+
+
+def convert_pandas_data_frame_to_bokeh_data_table(data):
+    """
+    Converts a pandas data frame to a bokeh column data source object so that it can be plotted
+    :param data: pandas data frame
+    :return: data table that can be displayed on a bokeh plot
+    """
+    data["index"] = data.index
+    data = data[['index'] + data.columns[:-1].tolist()]
+
+    data.columns.map(str)
+    source = ColumnDataSource(data=data)
+    columns = [TableColumn(field=column_str, title=column_str) for column_str in data.columns]  # bokeh columns
+    data_table = DataTable(source=source, columns=columns)
+    layout = add_title(data_table, "Table Summarizing Weight Ranges")
+    return layout
+
+
+def convert_pandas_data_frame_to_bokeh_column_data_source(data):
+    """
+    Converts a pandas data frame to a bokeh column data source object so that it can be pushed to a server document
+    :param data: pandas data frame
+    :return: data table that can be displayed on a bokeh server document
+    """
+    data["index"] = data.index
+    data = data[['index'] + data.columns[:-1].tolist()]
+
+    data.columns.map(str)
+    source = ColumnDataSource(data=data)
+    return source
+
+
+def add_title(layout, title):
+    """
+    Add a title to the layout.
+    :return: layout wrapped with title div.
+    """
+    text_str = "<b>" + title + "</b>"
+    wrap_layout_with_div = column(Div(text=text_str), layout)
+    return wrap_layout_with_div
+
+
+
[docs]def visualize_weight_ranges_single_layer(sess, layer, results_dir): + """ + Given a layer, visualizes weight ranges with scatter plots and line plots + + :param sess: tf.compat.v1.Session + :param layer: layer with weights + :param results_dir: Directory to save the Bokeh plots + :return: Bokeh plot + """ + + file_path = os.path.join(results_dir, 'visualize_weight_ranges_single_layer.html') + plotting.output_file(file_path) + + layer_weights = pd.DataFrame(get_weights(layer, sess)) + layer_name = layer.name + layer_weights_summary_statistics = layer_weights.describe().T + + scatter_plot_mean, scatter_plot_min = scatter_plot_summary_stats(layer_weights_summary_statistics, + x_axis_label_mean="Mean Weights Per Output Channel", + y_axis_label_mean="Std Per Output Channel", + title_mean="Mean vs Standard Deviation: " + layer_name, + x_axis_label_min="Min Weights Per Output Channel", + y_axis_label_min="Max Weights Per Output Channel", + title_min="Minimum vs Maximum: " + layer_name) + + scatter_plots_layout = row(scatter_plot_mean, scatter_plot_min) + line_plots = line_plot_summary_statistics_model(layer_name=layer_name, + layer_weights_data_frame=layer_weights_summary_statistics, + width=1500, height=700) + layout = column(scatter_plots_layout, line_plots) + layout_with_title = add_title(layout, layer_name) + plotting.save(layout_with_title) + return layout_with_title
+ + +
[docs]def visualize_relative_weight_ranges_single_layer(sess, layer, results_dir): + """ + + Publishes a line plot showing weight ranges for each layer, summary statistics + for relative weight ranges, and a histogram showing weight ranges of output channels + + :param sess: tf.compat.v1.Session + :param layer: layer with weights + :param results_dir: Directory to save the Bokeh plots + :return: bokeh plot + + """ + + # pylint: disable=too-many-locals + file_path = os.path.join(results_dir, 'visualize_relative_weight_ranges_single_layer.html') + plotting.output_file(file_path) + + layer_weights_data_frame = pd.DataFrame(get_weights(layer, sess)).describe().T + layer_name = layer.name + plot = line_plot_summary_statistics_model(layer_name, layer_weights_data_frame, width=1150, height=700) + + # list of problematic output channels, data frame containing magnitude of range in each output channel + problematic_output_channels, output_channel_ranges_data_frame = identify_problematic_output_channels( + layer_weights_data_frame) + + histogram_plot = histogram(output_channel_ranges_data_frame, "relative range", 75, + x_label="Weight Range Relative to Smallest Output Channel", + y_label="Count", + title="Relative Ranges For All Output Channels") + output_channel_ranges_data_frame = output_channel_ranges_data_frame.describe().T.to_frame() + output_channel_ranges_data_frame = output_channel_ranges_data_frame.drop("count") + + output_channel_ranges_as_column_data_source = convert_pandas_data_frame_to_bokeh_data_table( + output_channel_ranges_data_frame) + + # add vertical lines to highlight problematic channels + for channel in problematic_output_channels: + add_vertical_line_to_figure(channel, plot) + + column_layout = column(histogram_plot, output_channel_ranges_as_column_data_source) + layout = row(plot, column_layout) + layout_with_title = add_title(layout, layer_name) + + plotting.save(layout_with_title) + return layout_with_title
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/quant_analyzer.html b/releases/1.32.2/_modules/aimet_tensorflow/quant_analyzer.html new file mode 100644 index 0000000..344d5fb --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/quant_analyzer.html @@ -0,0 +1,1690 @@ + + + + + + aimet_tensorflow.quant_analyzer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.quant_analyzer

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Quant Analyzer """
+
+import os
+from typing import List, Tuple, Dict
+import tensorflow.compat.v1 as tf
+from aimet_common.defs import QuantScheme
+from aimet_common.quant_analyzer import save_json, export_per_layer_sensitivity_analysis_plot,\
+    create_and_export_min_max_ranges_plot, export_per_layer_mse_plot, export_stats_histogram_plot
+from aimet_common.utils import AimetLogger, CallbackFunc
+from aimet_tensorflow.common.operation import Op
+from aimet_tensorflow.utils.common import create_input_feed_dict, iterate_tf_dataset
+from aimet_tensorflow.quantizer_info import QuantizerInfo
+from aimet_tensorflow.quantsim import QuantizationSimModel
+from aimet_tensorflow import batch_norm_fold
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+DEFAULT_BOKEH_FIGURE_HEIGHT = 300
+
+
[docs]class QuantAnalyzer: + """ + QuantAnalyzer tool provides + 1) Model sensitivity to weight and activation quantization + 2) Per layer encoding (min - max range) and PDF analysis + 3) Per op sensitivity analysis + 4) Per op MSE analysis + + """ + + def __init__(self, session: tf.compat.v1.Session, start_op_names: List[str], output_op_names: List[str], + forward_pass_callback: CallbackFunc, eval_callback: CallbackFunc, use_cuda: bool = True): + """ + :param session: The input model as session to add quantize ops to + :param start_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :param forward_pass_callback: A callback function that is expected to run forward passes on a session. + This callback function should use representative data for the forward pass, so the calculated + encodings work for all data samples. This callback internally chooses the number of data samples + it wants to use for calculating encodings. + :param eval_callback: A callback function for model evaluation that determines model + performance. This callback function is expected to return scalar value + representing the model performance evaluated against entire test/evaluation dataset. + :param use_cuda: If True, places quantization ops on GPU. Defaults to True + """ + if not isinstance(forward_pass_callback, CallbackFunc): + raise ValueError('forward_pass_callback and its argument(s) are not encapsulated by CallbackFunc class.') + if not isinstance(eval_callback, CallbackFunc): + raise ValueError('eval_callback and its argument(s) are not encapsulated by CallbackFunc class.') + + self._session = session + self._start_op_names = start_op_names + self._output_op_names = output_op_names + self._forward_pass_callback = forward_pass_callback + self._eval_callback = eval_callback + self._use_cuda = use_cuda + self._default_output_bw = None + self._default_param_bw = None + self._unlabeled_dataset = None + self._num_batches = None + + # pylint: disable=too-many-arguments +
[docs] def analyze(self, + quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + rounding_mode: str = 'nearest', + default_param_bw: int = 8, + default_output_bw: int = 8, + config_file: str = None, + unlabeled_dataset: tf.compat.v1.data.Dataset = None, + num_batches: int = None, + results_dir: str = "./tmp/"): + """ + Analyze model for quantization and point out sensitive parts/hotspots of the model by performing + 1) model sensitivity to quantization + 2) export per layer encoding (min - max range) + 3) export per layer statistics histogram (PDF) when quant scheme is TF-Enhanced + 4) perform per op sensitivity analysis by enabling and disabling quant ops + 5) per op MSE loss between fp32 and quantized output activations + + :param quant_scheme: Quantization Scheme, currently supported schemes are post_training_tf and + post_training_tf_enhanced, defaults to post_training_tf_enhanced + :param rounding_mode: The round scheme to used. One of: 'nearest' or 'stochastic', defaults to 'nearest' + :param default_param_bw: bitwidth to use for parameter tensors, defaults to 8 + :param default_output_bw: bitwidth to use for activation tensors, defaults to 8 + :param config_file: Path to a config file to use to specify rules for placing quant ops in the model + :param results_dir: Directory to save the results. + :param unlabeled_dataset: Unlabeled TF dataset + Used in per op MSE loss calculation + :param num_batches: Number of batches. Approximately 256 samples/images are recommended, + so if batch size of data loader is 64, then 4 number of batches leads to 256 samples/images + Used in per op MSE loss calculation + """ + self._unlabeled_dataset = unlabeled_dataset + self._num_batches = num_batches + self._default_param_bw = default_param_bw + self._default_output_bw = default_output_bw + sim = self._create_quantsim_and_encodings(quant_scheme, rounding_mode, config_file) + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + # Check model sensitivity to weight and activation quantization individually. + self._check_model_sensitivity_to_quantization(sim) + + # Export encoding min-max range. + self._export_per_layer_encoding_min_max_range(sim, results_dir) + + # Export PDF of statistics. + if quant_scheme == QuantScheme.post_training_tf_enhanced: + self._export_per_layer_stats_histogram(sim, results_dir) + + # Perform per op analysis by enabling each quant op (OPTION-1). + self._perform_per_op_analysis_by_enabling_quant_ops(sim, results_dir) + + # Perform per op analysis by disabling each quant op (OPTION-2). + self._perform_per_op_analysis_by_disabling_quant_ops(sim, results_dir) + + # Perform per op MSE loss between fp32 and quantized output activations. + if self._unlabeled_dataset and self._num_batches: + self._perform_per_op_mse_loss(sim, results_dir)
+ + def _create_quantsim_and_encodings(self, quant_scheme: QuantScheme, rounding_mode: str, + config_file: str) -> QuantizationSimModel: + """" + Create Quantsim and compute encodings. + + :param quant_scheme: Quantization Scheme + :param rounding_mode: The round scheme to used + :param config_file: Path to a config file + :return: Quantsim model + """ + bn_folded_sess, _ = batch_norm_fold.fold_all_batch_norms(self._session, input_op_names=self._start_op_names, + output_op_names=self._output_op_names) + self._session = bn_folded_sess + quant_sim_model = QuantizationSimModel(session=bn_folded_sess, + starting_op_names=self._start_op_names, + output_op_names=self._output_op_names, + quant_scheme=quant_scheme, rounding_mode=rounding_mode, + default_output_bw=self._default_output_bw, + default_param_bw=self._default_param_bw, + use_cuda=self._use_cuda, + config_file=config_file) + quant_sim_model.compute_encodings(forward_pass_callback=self._forward_pass_callback.func, + forward_pass_callback_args=self._forward_pass_callback.args) + + return quant_sim_model + + def _check_model_sensitivity_to_quantization(self, sim: QuantizationSimModel) -> Tuple[float, float, float]: + """ + Perform the sensitivity analysis to weight and activation quantization + individually. + + :param sim: Quantsim model. + :return: FP32 eval score, weight-quantized eval score, act-quantized eval score. + """ + fp32_eval_score = self._eval_model(self._session) + _logger.info("FP32 eval score (W32A32): %f", fp32_eval_score) + + act_quantized_eval_score = self._eval_activation_quantized_model(sim) + _logger.info("Activation-quantized eval score (W32A%d): %f", self._default_output_bw, + act_quantized_eval_score) + + weight_quantized_eval_score = self._eval_weight_quantized_model(sim) + _logger.info("Weight-quantized eval score (W%dA32): %f", self._default_param_bw, + weight_quantized_eval_score) + + return fp32_eval_score, weight_quantized_eval_score, act_quantized_eval_score + + def _eval_model(self, session: tf.compat.v1.Session) -> float: + """ + Evaluate the model performance. + + :param session: TensorFlow session to be evaluated. + :return: Scaler value representing model performance. + """ + return self._eval_callback.func(session, self._eval_callback.args) + + def _eval_weight_quantized_model(self, sim): + """ + Evaluate weight quantized model performance. + For weight quantized model performance, disable enabled activation quantizers, measure + eval score and enable again. + + :param sim: Quantsim model. + :return: Quantized model performance. + """ + enabled_activation_quantizers = sim.get_enabled_activation_quantizers() + self._enable_disable_quantizers(enabled_activation_quantizers, enabled=False) + eval_score = self._eval_model(sim.session) + self._enable_disable_quantizers(enabled_activation_quantizers, enabled=True) + return eval_score + + def _eval_activation_quantized_model(self, sim): + """ + Evaluate activation quantized model performance. + For activation quantized model performance, disable enabled param quantizers, measure + eval score and enable again. + + :param sim: Quantsim model. + :return: Quantized model performance. + """ + enabled_param_quantizers = sim.get_enabled_parameter_quantizers() + self._enable_disable_quantizers(enabled_param_quantizers, enabled=False) + eval_score = self._eval_model(sim.session) + self._enable_disable_quantizers(enabled_param_quantizers, enabled=True) + return eval_score + + def _perform_per_op_analysis_by_enabling_quant_ops(self, + sim: QuantizationSimModel, + results_dir: str = "./tmp/", + ) -> Dict: + """ + 1. All activations and parameters quantizers are disabled. + 2. For every activations and parameters quantizers: + i. Quantizer is enabled + ii. Measure and record eval score on subset of dataset. + iii. Disable enabled quantizer in step i. + 3. Returns dictionary containing quant op name and corresponding eval score. + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: op wise eval score dictionary. dict[op_name] = eval_score + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + _logger.info("\nOPTION-1:\nAll the quant ops are disabled.\n" + "Starting per-op analysis by enabling quant ops as per config file.") + op_wise_eval_score_dict = self._perform_per_op_analysis(sim, + disable_all_quantizers=True, + enabled_before=True, + enabled_after=False) + export_per_layer_sensitivity_analysis_plot(op_wise_eval_score_dict, + results_dir, + title="per_op_quant_enabled") + save_json(op_wise_eval_score_dict, + results_dir, + title="per_op_quant_enabled.json") + return op_wise_eval_score_dict + + def _perform_per_op_analysis_by_disabling_quant_ops(self, + sim: QuantizationSimModel, + results_dir: str = "./tmp/", + ) -> Dict: + """ + 1. All activations and parameters quantizers are enabled as per JSON config file. + 2. For every activations and parameters quantizers: + i. Quantizer is disabled + ii. Measure and record eval score on subset of dataset. + iii. Enable disabled quantizer in step i. + 3. Returns dictionary containing quant op name and corresponding eval score. + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: op wise eval score dictionary. dict[op_name] = eval_score + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + _logger.info("\nOPTION-2:\nAll the quant ops are enabled as per config file.\n" + "Starting per-op analysis by disabling quant ops.") + op_wise_eval_score_dict = self._perform_per_op_analysis(sim, + disable_all_quantizers=False, + enabled_before=False, + enabled_after=True) + export_per_layer_sensitivity_analysis_plot(op_wise_eval_score_dict, + results_dir, + title="per_op_quant_disabled") + save_json(op_wise_eval_score_dict, + results_dir, + title="per_op_quant_disabled.json") + return op_wise_eval_score_dict + + def _perform_per_op_analysis(self, + sim: QuantizationSimModel, + disable_all_quantizers: bool, + enabled_before: bool, + enabled_after: bool, + ) -> Dict: + """ + Helper function for perform_per_op_analysis_by_enabling_quant_ops() and + perform_per_op_analysis_by_disabling_quant_ops() + + :param sim: Quantsim model. + :param disable_all_quantizers: Flag to disable all the quantizers before per-op analysis. + :param enabled_before: Flag to set enabled for quantizers before computing encodings. + :param enabled_after: Flag to set enabled for quantizers after computing encodings. + :return: op wise eval score dictionary. dict[conn_graph_op] = eval_score. + """ + + enabled_quant_ops = self._get_enabled_quantizer_groups(sim) + + if disable_all_quantizers: + for quantizer_group_list in enabled_quant_ops.values(): + if quantizer_group_list: + self._enable_disable_quantizers(quantizer_group_list, enabled=False) + + eval_score_dict = {} + for conn_graph_op, quantizer_info_list in enabled_quant_ops.items(): + if quantizer_info_list: + conn_graph_op = str(conn_graph_op) + self._enable_disable_quantizers(quantizer_info_list, enabled=enabled_before) + + # Record eval score. + eval_score_dict[conn_graph_op] = self._eval_model(sim.session) + _logger.info("For connected graph op: %s, the eval score is: %f", conn_graph_op, eval_score_dict[conn_graph_op]) + + self._enable_disable_quantizers(quantizer_info_list, enabled=enabled_after) + + if disable_all_quantizers: + for quantizer_group_list in enabled_quant_ops.values(): + if quantizer_group_list: + self._enable_disable_quantizers(quantizer_group_list, enabled=True) + + return eval_score_dict + + # pylint: disable=too-many-locals + def _perform_per_op_mse_loss(self, + sim: QuantizationSimModel, + results_dir: str, + ) -> Dict: + """ + MSE loss computation between fp32 and quantized output activations for each op. + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return op wise MSE loss. dict[op_name] = MSE loss. + """ + + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + # pylint: disable=protected-access + output_op_names = QuantizationSimModel._get_ops_to_quantize_activations_for(self._session.graph, sim.connected_graph) + mse_loss_dict = {} + + for _, output_op_name in enumerate(output_op_names): + mse_loss_dict[output_op_name] = self._compute_mse_loss(sim, output_op_name) + + export_per_layer_mse_plot(mse_loss_dict, + results_dir, + title="per_op_mse_loss") + save_json(mse_loss_dict, results_dir, title="per_op_mse_loss.json") + _logger.info("Exported per op MSE loss plot.") + return mse_loss_dict + + def _compute_mse_loss(self, sim: QuantizationSimModel, output_op_name) -> float: + """ + Compute MSE loss between fp32 and quantized output activations for each batch, add for + all the batches and return averaged mse loss. + :param sim: Quantsim model. + :param output_op_name: Output op name. + :return: MSE loss between fp32 and quantized output activations. + """ + total = 0 + loss = 0.0 + mse_loss = tf.keras.losses.MeanSquaredError() + iterator = iterate_tf_dataset(self._unlabeled_dataset) + for _ in range(self._num_batches): + try: + model_inputs = next(iterator) + except StopIteration: + raise ValueError(f'Can not fetch {self._num_batches} batches from dataset') # pylint: disable=raise-missing-from + + # Collect output activation data from original op + feed_dict = create_input_feed_dict(self._session.graph, self._start_op_names, model_inputs) + orig_op = self._session.graph.get_operation_by_name(output_op_name) + orig_out_data = self._session.run(orig_op.outputs[0], feed_dict=feed_dict) + + # Collect output activation data from quant sim op + feed_dict = create_input_feed_dict(sim.session.graph, self._start_op_names, model_inputs) + quant_op = sim.session.graph.get_operation_by_name(output_op_name + "_quantized") + quantized_out_data = sim.session.run(quant_op.outputs[0], feed_dict=feed_dict) + + # Calculate MSE loss + mse = mse_loss(orig_out_data, quantized_out_data) + with tf.compat.v1.Session().as_default(): + loss += mse.eval() + total += orig_out_data.shape[0] + return loss/total + + @staticmethod + def _get_enabled_quantizer_groups(sim: QuantizationSimModel)-> Dict[Op, List[QuantizerInfo]]: + """ + For given quantsim model, get all enabled activation and parameter quantizers. + :param sim: Quantsim model. + :return: Dictionary which maps a connected graph op to a list of enabled quantizer info in it. + """ + enabled_quantizers_dict = {} + # pylint: disable=protected-access + for conn_graph_op, quantizer_group in sim._op_to_quant_ops_dict.items(): + group = [] + # pylint: disable=protected-access + param_quant_op_dict, act_quant_op = quantizer_group + activation_quantize_info = sim._activation_quantizers.get(act_quant_op.name) + if activation_quantize_info.enabled: + group.append(activation_quantize_info) + for param_op_set in param_quant_op_dict.values(): + for param_op in param_op_set: + # pylint: disable=protected-access + param_quantize_info = sim._param_quantizers.get(param_op.name) + if param_quantize_info.enabled: + group.append(param_quantize_info) + enabled_quantizers_dict[conn_graph_op] = group + return enabled_quantizers_dict + + @staticmethod + def _enable_disable_quantizers(quantizer_list: List[QuantizerInfo], enabled: bool): + """ + For given list of quantizers, set (enable/disable) quantizer's enabled. + + :param quantizer_list: List of quantizers. + :param enabled: Enabled flag. + """ + for quantizer_info in quantizer_list: + if enabled: + quantizer_info.enable_keeping_encoding() + else: + quantizer_info.enabled = enabled + + def _export_per_layer_stats_histogram(self, sim: QuantizationSimModel, + results_dir: str = "./tmp/"): + """ + NOTE: Not to invoke when quantization scheme is not TF-Enhanced. + + Export histogram that represents a PDF of collected statistics by a quantizer for every + quant op. After invoking this API, results_dir should have html files in following + format for every quantizers of quant ops. + + -results_dir + -activations_pdf + quant_op_name.html + -weights_pdf + -quant_op_name + quant_op_name_{channel_index}.html + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + """ + # pylint: disable=protected-access + weights_pdf_dir = os.path.join(results_dir, "weights_pdf") + activations_pdf_dir = os.path.join(results_dir, "activations_pdf") + + for quant_op_name, quantizer_info in sim._activation_quantizers.items(): + quant_op_name = quant_op_name.replace("/", "_") + if quantizer_info.is_encoding_valid(): + self._create_and_export_stats_histogram_plot(quantizer_info, + activations_pdf_dir, + title=f"{quant_op_name}") + for quant_op_name, quantizer_info in sim._param_quantizers.items(): + quant_op_name = quant_op_name.replace("/", "_") + if quantizer_info.is_encoding_valid(): + self._create_and_export_stats_histogram_plot(quantizer_info, + os.path.join(weights_pdf_dir, quant_op_name), + title=f"{quant_op_name}") + + _logger.info("Exported per layer stats histogram.") + + # pylint: disable=no-self-use + def _export_per_layer_encoding_min_max_range(self, sim: QuantizationSimModel, + results_dir: str = "./tmp/" + ) -> Tuple[Dict, Dict]: + """ + Export encoding min and max range for all weights and activations. results_dir should have + html files in following format. + + -results_dir + -activations.html + -weights.html + + If per channel quantization(PCQ) is enabled then, + + -results_dir + -activations.html + -{quant_op_name}_{param_name}.html + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer wise min-max range for weights and activations. + """ + # pylint: disable=protected-access + min_max_ranges_dir = os.path.join(results_dir, "min_max_ranges") + + min_max_range_for_activations_dict = {} + min_max_range_for_weights_dict = {} + for quant_op_name, quantizer_info in sim._activation_quantizers.items(): + quant_op_name = quant_op_name.replace("/", "_") + if quantizer_info.enabled: + encoding = quantizer_info.get_encoding() + min_max_range_for_activations_dict[quant_op_name] = (encoding.min, encoding.max) + + for quant_op_name, quantizer_info in sim._param_quantizers.items(): + quant_op_name = quant_op_name.replace("/", "_") + if quantizer_info.enabled: + encoding = quantizer_info.get_encoding() + if isinstance(encoding, List): # per-channel + per_channel_encodings = {} + for index, enc in enumerate(encoding): + per_channel_encodings[f"{quant_op_name}_{index}"] = (enc.min, enc.max) + min_max_range_for_weights_dict[quant_op_name] = per_channel_encodings + else: # per-tensor + min_max_range_for_weights_dict[quant_op_name] = (encoding.min, encoding.max) + + create_and_export_min_max_ranges_plot(min_max_range_for_weights_dict, + min_max_ranges_dir, + title="weights") + create_and_export_min_max_ranges_plot(min_max_range_for_activations_dict, + min_max_ranges_dir, + title="activations") + save_json(min_max_range_for_weights_dict, min_max_ranges_dir, title="weights.json") + save_json(min_max_range_for_activations_dict, min_max_ranges_dir, title="activations.json") + _logger.info("Exported per layer encoding min-max ranges.") + return min_max_range_for_weights_dict, min_max_range_for_activations_dict + + + def _create_and_export_stats_histogram_plot(self, quantizer_info: QuantizerInfo, + results_dir: str, + title: str): + """ + For given quantizer, create and export histogram (PDF) of statistics in html format. + + :param quantizer_info: Quantizer. + :param results_dir: Directory to save the results. + :param title: Title of the plot. + """ + os.makedirs(results_dir, exist_ok=True) + + histograms = quantizer_info.get_stats_histogram() + encodings = quantizer_info.get_encoding() + if not isinstance(encodings, List): + encodings = [encodings] + + for index, (histogram, encoding) in enumerate(zip(histograms, encodings)): + export_stats_histogram_plot(histogram, encoding, results_dir, title=f"{title}_{index}")
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/quantsim.html b/releases/1.32.2/_modules/aimet_tensorflow/quantsim.html new file mode 100644 index 0000000..67860f9 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/quantsim.html @@ -0,0 +1,2762 @@ + + + + + + aimet_tensorflow.quantsim — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_tensorflow.quantsim

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2020-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Implementation for simulating models running on Quantized hardware """
+
+from typing import List, Union, Dict, Callable, Any, Tuple
+import os
+import shutil
+import json
+import numpy as np
+import tensorflow as tf
+from tensorflow.python.framework import ops as tf_ops
+from packaging import version  # pylint: disable=wrong-import-order
+
+import aimet_common.libpymo as libpymo
+import aimet_common.libaimet_tf_ops as qcops
+from aimet_common.defs import QuantScheme, QuantizationDataType
+from aimet_common.quantsim import encoding_version, validate_quantsim_inputs, \
+    recompute_grid_params, extract_global_quantizer_args
+from aimet_common.quant_utils import get_conv_accum_bounds
+from aimet_common.utils import AimetLogger, save_json_yaml
+from aimet_tensorflow import graph_editor
+from aimet_tensorflow.utils.common import update_variables_with_values, save_data_to_pickle_file, \
+    load_data_from_pickle_file, get_valid_ops
+from aimet_tensorflow import utils
+from aimet_tensorflow.utils import transformer_utils
+from aimet_tensorflow.utils.constants import QuantizeOpIndices
+from aimet_tensorflow.utils.op.embedding import get_embedding_params_using_patterns
+from aimet_tensorflow.utils.quantsim import create_op_to_quant_ops_dict, is_op_quantizable, \
+    get_time_steps_tensor_from_rnn_inner_ops, swap_last_two_dim
+from aimet_tensorflow.utils.graph import updated_graph_flow_context_to_loop_context, set_graph_flow_context, \
+    op_not_in_loop_control_flow_context
+from aimet_tensorflow.common.connectedgraph import ConnectedGraph
+from aimet_tensorflow.defs import ParameterInfo
+from aimet_tensorflow.quantizer_info import QuantizerInfo, QuantizerType, quant_scheme_to_libpymo
+from aimet_tensorflow.quantsim_config.quantsim_config import QuantSimConfigurator
+from aimet_tensorflow.quantsim_recurrent import _select_simple_rnn_internal_ops_to_quantize, \
+    _select_lstm_internal_ops_to_quantize, SUPPORTED_RECURRENT_TYPES
+
+from aimet_tensorflow.keras.defs import AxisHandling
+from aimet_tensorflow.keras.utils.common import create_encoding_from_dict
+
+# this is required to associate gradient with QcQuantize op
+from aimet_tensorflow import quantsim_straight_through_grad      # pylint: disable=unused-import
+
+
+# pylint: disable=too-many-lines
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+WORKING_DIR = '/tmp/quantsim/'
+
+
+# Op types which we will not place quantize ops after
+op_types_to_ignore = {'branch', 'Flatten', 'Shape', 'Identity', 'Reshape', 'Transpose', 'ResourceGather', 'Tile'}
+
+# Connected graph types to ignore parameter quantization
+param_quant_conn_op_ignore_list = {'FusedBatchNorm', 'FusedBatchNormV3', 'BatchNorm'}
+
+DTYPES_QUANTIZE_NOT_REQUIRED = [tf.dtypes.int8, tf.dtypes.uint8, tf.dtypes.int16, tf.dtypes.uint16,
+                                tf.dtypes.int32, tf.dtypes.uint32, tf.dtypes.int64, tf.dtypes.uint64,
+                                tf.bool, tf.dtypes.string]
+
+class PickleableQuantSimState:
+    """
+    State variables to be saved while pickling
+    """
+    def __init__(self, quant_scheme, rounding_mode, use_cuda,
+                 param_quantizer_dict, activation_quantizer_dict):
+        """
+        class type to save pickle-able info pertaining to quantsim config
+        :param quant_scheme: quant scheme
+        :param rounding_mode: rounding mode
+        :param use_cuda: flag to indicate usage of GPU
+        :param param_quantizer_dict: param quantizers dictionary
+        :param activation_quantizer_dict: activation quantizers dictionary
+        """
+
+        self.quant_scheme = quant_scheme
+        self.rounding_mode = rounding_mode
+        self.use_cuda = use_cuda
+        self.param_quantizers = param_quantizer_dict
+        self.activation_quantizers = activation_quantizer_dict
+
+
+
[docs]class QuantizationSimModel: + + """ + Creates a QuantSim model by adding quantization simulations ops to a given model. + + This enables + + #. off-target simulation of inference accuracy + #. the model to be fine-tuned to counter the effects of quantization + + """ + # pylint: disable=too-many-arguments + # pylint: disable=too-many-instance-attributes + def __init__(self, session: tf.compat.v1.Session, starting_op_names: List[str], output_op_names: List[str], + quant_scheme: Union[str, QuantScheme] = 'tf_enhanced', rounding_mode: str = 'nearest', + default_output_bw: int = 8, default_param_bw: int = 8, use_cuda: bool = True, config_file: str = None, + default_data_type: QuantizationDataType = QuantizationDataType.int): + """ + :param session: The input model as session to add quantize ops to + :param starting_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :param quant_scheme: Quantization Scheme, currently supported schemes are post_training_tf and + post_training_tf_enhanced, defaults to post_training_tf_enhanced + :param rounding_mode: The round scheme to used. One of: 'nearest' or 'stochastic', defaults to 'nearest'. + :param default_output_bw: bitwidth to use for activation tensors, defaults to 8 + :param default_param_bw: bitwidth to use for parameter tensors, defaults to 8 + :param use_cuda: If True, places quantization ops on GPU. Defaults to True + :param config_file: Path to a config file to use to specify rules for placing quant ops in the model + :param default_data_type: Default data type to use for quantizing all layer parameters. + Possible options are QuantizationDataType.int and QuantizationDataType.float. + Note that the mode default_data_type=QuantizationDataType.float is only supported with + default_output_bw=16 and default_param_bw=16 + + :returns: An object which can be used to perform quantization on a tensorflow graph + :raises: ValueError: An error occurred processing one of the input parameters. + + """ + # sanity checks + validate_quantsim_inputs(quant_scheme, + rounding_mode, + default_output_bw, + default_param_bw, + default_data_type) + + self.session = session + + if isinstance(quant_scheme, str): + quant_scheme_lookup = {'tf': QuantScheme.post_training_tf, + 'tf_enhanced': QuantScheme.post_training_tf_enhanced, + 'percentile': QuantScheme.post_training_percentile} + quant_scheme = quant_scheme_lookup[quant_scheme] + self._quant_scheme = quant_scheme + self._rounding_mode = rounding_mode + self._use_cuda = use_cuda + self._param_quantizers = {} + self._activation_quantizers = {} + self._default_output_bw = default_output_bw + self._default_param_bw = default_param_bw + self._percentile_value = 100 # default percentile value + self._op_to_quant_ops_dict = {} + self.connected_graph = ConnectedGraph(self.session.graph, starting_op_names, output_op_names) + + # We save a copy of the original model (to be used during export later) + with self.session.graph.as_default(): + saver = tf.compat.v1.train.Saver() + saver.save(self.session, save_path=WORKING_DIR+'orig_model_before_quantsim') + self._quantsim_configurator = QuantSimConfigurator(session, self.connected_graph, config_file, default_output_bw, + default_param_bw, default_data_type) + self._supported_kernels = self._quantsim_configurator.get_supported_kernels() + self.per_channel_quantization_enabled = self._quantsim_configurator.per_channel_quantization_flag + self._op_name_to_output_channels_axis_handling_dict = {} + + self.quant_args = extract_global_quantizer_args(quant_scheme, self._quantsim_configurator) + + with self.session.graph.as_default(): + self._add_and_configure_quant_nodes(starting_op_names, output_op_names, default_param_bw, default_output_bw, + default_data_type) + + self._override_quant_config_for_transformer_mask_add() + # Save and load the session so the graph changes can take effect + self._save_and_load_sim_model() + + def __getstate__(self): + # convert object to pickle-able state + state = PickleableQuantSimState(self._quant_scheme, self._rounding_mode, + self._use_cuda, self._param_quantizers, + self._activation_quantizers) + return state + + def __setstate__(self, state): + self.session = None + self._quant_scheme = state.quant_scheme + self._rounding_mode = state.rounding_mode + self._use_cuda = state.use_cuda + self._param_quantizers = state.param_quantizers + self._activation_quantizers = state.activation_quantizers + + def quantizer_config(self, quant_op_name: str) -> Union[QuantizerInfo, None]: + """ + gets QuantizerInfo associated with given quantize op + :param quant_op_name: Name of the Quantize op + :return: QuantizerInfo associated with the Quant op + """ + + if quant_op_name in self._param_quantizers: + return self._param_quantizers[quant_op_name] + + if quant_op_name in self._activation_quantizers: + return self._activation_quantizers[quant_op_name] + + _logger.error('Could not find Quantizer for given op {%s} ', quant_op_name) + return None + + def set_percentile_value(self, percentile_value: float): + """ + Set the percentile value to be used while computing encodings for quantizers having percentile quant scheme. + + :param percentile_value: Percentile value to set + """ + if percentile_value < 90 or percentile_value > 100: + raise ValueError("Percentile value must be in range [90, 100]") + self._percentile_value = percentile_value + + if self._quant_scheme == QuantScheme.post_training_percentile: + # Set the percentile value to the activation quantizers: + for quant_info in self._activation_quantizers.values(): + quant_info.set_percentile_value(self._percentile_value) + + def get_supported_kernels(self) -> Dict: + """ + Return _supported_kernels parsed from the config file + :return: Dictionary containing supported_kernels + """ + return self._supported_kernels + + def _get_op_variable_value(self, quant_op: tf.Operation, var_index: int): + """ + Utility to load variable values from quant op + :param quant_op: quantize op + :param var_index: variable index to be read + :return: variable value + """ + + op_var_tensor = quant_op.inputs[var_index] + return self.session.run(op_var_tensor) + + def configure_quantization_ops(self, conn_graph: ConnectedGraph, ops_with_param_names: List[str], indices: List[int], + params_to_quantize: Dict[str, ParameterInfo], activation_op_names: List[str]): + """ + Configure inserted quantize ops using config file + :param conn_graph: Connected graph of the model + :param ops_with_param_names: List of ops for which param quantization ops were inserted for + :param indices: List of input indices (one-to-one for each entry in ops) + :param params_to_quantize: Dictionary of parameters to quantize + :param activation_op_names: List of ops for which activation quantization ops were inserted for + """ + if not conn_graph: + error_msg = ('Connected graph passed into configure_quantization_ops() is None. If manual insertion of ' + 'quantization ops is being done, and get_ops_to_quantize_activations_for() has been ' + 'overriden, please override configure_quantization_ops() as well.') + _logger.error(error_msg) + raise AssertionError(error_msg) + self._op_to_quant_ops_dict = create_op_to_quant_ops_dict(self.session.graph, conn_graph, ops_with_param_names, indices, + params_to_quantize, activation_op_names) + self._quantsim_configurator.configure_quantizers(self._op_to_quant_ops_dict, self._param_quantizers, + self._activation_quantizers) + +
[docs] def compute_encodings(self, forward_pass_callback: Callable[[tf.compat.v1.Session, Any], None], + forward_pass_callback_args): + """ + Computes encodings for all quantization sim nodes in the model. + This is also used to set initial encodings for Range Learning. + + :param forward_pass_callback: A callback function that is expected to runs forward passes on a session. + This callback function should use representative data for the forward pass, so the calculated + encodings work for all data samples. This callback internally chooses the number of data samples + it wants to use for calculating encodings. + + :param forward_pass_callback_args: These argument(s) are passed to the forward_pass_callback as-is. Up to + the user to determine the type of this parameter. E.g. could be simply an integer representing the number + of data samples to use. Or could be a tuple of parameters or an object representing something more + complex. + + :return: None + + """ + + self._compute_and_set_parameter_encodings() + + # At the beginning before we do forward pass we want to set parameters to quantize dequantize mode and once we + # compute the encodings for activations we set it to the required op mode based on quant scheme & if per channel + # quantization is enabled + self._set_op_mode_parameters(libpymo.TensorQuantizerOpMode.quantizeDequantize, []) + + ops_with_invalid_encodings = [] + + # Run data through the quantsim so we can compute activation encodings + forward_pass_callback(self.session, forward_pass_callback_args) + + # For activations, calculate encodings and update min-max parameters + for op_name, quantizer_info in self._activation_quantizers.items(): + # Calculate encodings + if quantizer_info.get_op_mode() != int(libpymo.TensorQuantizerOpMode.passThrough): + op_bitwidth, op_use_symmetric_encodings = quantizer_info.bitwidth, quantizer_info.use_symmetric_encoding + encoding = quantizer_info.compute_encoding(op_bitwidth, op_use_symmetric_encodings) + # encoding would be invalid for dtype=fp because there is no encoding computed in float mode through the + # tensor_quantizer + if quantizer_info.data_type == QuantizationDataType.float: + quantizer_info.set_op_mode(libpymo.TensorQuantizerOpMode.quantizeDequantize) + else: + if quantizer_info.is_encoding_valid(): + quantizer_info.set_encoding(encoding) + quantizer_info.set_op_mode(libpymo.TensorQuantizerOpMode.quantizeDequantize) + else: + quantizer_info.set_op_mode(libpymo.TensorQuantizerOpMode.passThrough) + ops_with_invalid_encodings.append(op_name) + + # For post-training mode, params will always be in one-shot mode + op_mode = self._param_op_mode_after_analysis(self._quant_scheme) + + self._set_op_mode_parameters(op_mode, ops_with_invalid_encodings) + + if ops_with_invalid_encodings: + _logger.info('The following quantizers did not have valid encodings and have been set to passThrough mode: ' + '%s', ops_with_invalid_encodings) + _logger.info('This can be due to the quantizers not having been evaluated during the forward pass in ' + 'compute encodings. Evaluation is required to collect statistics needed to compute valid ' + 'encodings.\n' + 'As a result, the quantizers have been set to passThrough mode, meaning no quantization noise ' + 'will be simulated for these ops if they are evaluated in the future.\n' + 'If this is not desired, amend the forward pass to evaluate tensors which require these ops ' + 'to be evaluated, and recompute encodings.') + + self._clamp_transformer_attention_mask_encoding()
+ + def get_enabled_parameter_quantizers(self): + """ + For given quantsim model, get all enabled param quantizers. + :return: List of enabled param quantizers. + """ + enabled_param_quantizers = [] + for quantizer_info in self._param_quantizers.values(): + if quantizer_info.enabled: + enabled_param_quantizers.append(quantizer_info) + return enabled_param_quantizers + + def get_enabled_activation_quantizers(self): + """ + For given quantsim model, get all enabled activation quantizers. + :return: List of enabled activation quantizers. + """ + enabled_activation_quantizers = [] + for quantizer_info in self._activation_quantizers.values(): + if quantizer_info.enabled: + enabled_activation_quantizers.append(quantizer_info) + return enabled_activation_quantizers + + def _set_op_mode_parameters(self, op_mode: libpymo.TensorQuantizerOpMode, + ops_with_invalid_encodings: List): + """ + Sets op mode for parameters and if the encodings are invalid, then adds those ops to ops_with_invalid_encodings + :param op_mode: libpymo.TensorQuantizerOpMode + :param ops_with_invalid_encodings: list of ops that don't have vallid encodings + """ + for op_name, quantizer_info in self._param_quantizers.items(): + if quantizer_info.get_op_mode() != int(libpymo.TensorQuantizerOpMode.passThrough): + # encoding would be invalid for dtype=fp because there is no encoding computed in float mode through the + # tensor_quantizer + if quantizer_info.data_type == QuantizationDataType.float: + quantizer_info.set_op_mode(libpymo.TensorQuantizerOpMode.quantizeDequantize) + else: + if quantizer_info.is_encoding_valid(): + quantizer_info.set_op_mode(op_mode) + else: + quantizer_info.set_op_mode(libpymo.TensorQuantizerOpMode.passThrough) + ops_with_invalid_encodings.append(op_name) + +
[docs] def export(self, path: str, filename_prefix: str, orig_sess: tf.compat.v1.Session = None): + """ + This method exports out the quant-sim model so it is ready to be run on-target. + + Specifically, the following are saved + + 1. The sim-model is exported to a regular tensorflow meta/checkpoint without any simulation ops + + 2. The quantization encodings are exported to a separate JSON-formatted file that can + then be imported by the on-target runtime (if desired) + + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param orig_sess: optional param to pass in original session without quant nodes for export + :return: None + + """ + # this is required to update the encoding for last iteration of backward pass for QAT 1.0 only + if self._quant_scheme in [QuantScheme.post_training_tf, QuantScheme.post_training_tf_enhanced]: + self._compute_and_set_parameter_encodings() + # save session without quant nodes + if orig_sess is not None: + with orig_sess.graph.as_default(): + saver = tf.compat.v1.train.Saver() + saver.save(orig_sess, save_path=WORKING_DIR+'orig_model_before_quantsim') + else: + _logger.info('Original session is not provided, use orig_model_before_quantsim.meta to export') + + self._remove_quantization_nodes_and_save_graph(path, filename_prefix) + self._export_encodings(os.path.join(path, filename_prefix) + '.encodings')
+ + def _compute_and_set_parameter_encodings(self): + + for quantizer_info in self._param_quantizers.values(): + + if quantizer_info.enabled and quantizer_info.data_type == QuantizationDataType.int: + # 0th input to our quant op is the tensor being quantized - in this case the parameter tensor + weight_tensor = quantizer_info.get_variable_from_op(0) + + # Per-channel + if isinstance(quantizer_info.tensor_quantizer, list): + for index, tensor_quantizer in enumerate(quantizer_info.tensor_quantizer): + if quantizer_info.axis_handling == AxisHandling.LAST_TWO_AXES: + last_two_axes_combined_shape = list(weight_tensor.shape[:-2]) + [-1] + channel_slice = weight_tensor.reshape(*last_two_axes_combined_shape) + channel_slice = channel_slice.take(index, channel_slice.ndim - 1) + tensor_quantizer.updateStats(channel_slice, False) + else: + channel_slice = weight_tensor.take(index, weight_tensor.ndim - 1) + tensor_quantizer.updateStats(channel_slice, False) + + # Per-tensor + else: + tensor_quantizer = quantizer_info.tensor_quantizer + tensor_quantizer.updateStats(weight_tensor, False) + + encoding = quantizer_info.compute_encoding(quantizer_info.bitwidth, + quantizer_info.use_symmetric_encoding) + + quantizer_info.set_encoding(encoding) + + def _remove_quantization_nodes_and_save_graph(self, path: str, filename_prefix: str): + """ + This function removes the quantization nodes from quantized graph and saves it + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + """ + vars_to_save = [] + with self.session.graph.as_default(): + for var in tf.compat.v1.global_variables(): + if not var.name[:-2].endswith(('_quantized', '_quantized_op_mode', '_quantized_quant_ref', + '_quantized_encoding_min', '_quantized_encoding_max', + '_quantized_bit_width', '_quantized_use_symmetric_encoding', + '_quantized_axis_handling', '_quantized_data_type')): + vars_to_save.append(var) + + saver = tf.compat.v1.train.Saver(vars_to_save) + saver.save(self.session, save_path=os.path.join(path, filename_prefix)) + shutil.copyfile(WORKING_DIR + 'orig_model_before_quantsim.meta', + os.path.join(path, filename_prefix) + '.meta') + + def save_to_keras(self, temp_dir_path: str = "/tmp/") -> tf.compat.v1.Session: + """ + This method exports out the quant-sim model so it is ready to be eval/trained using a Keras pipeline + + :param temp_dir_path: temporary directory to store intermediate files + :return: Session to import into a Keras model + + """ + current_graph = self.session.graph + with current_graph.as_default(): + ops = current_graph.get_operations() + for op in ops: + if op.type in ['QcQuantize', 'QcQuantizeRecurrentParam']: + + # Read the config + # ----------------- + quant_config = self.quantizer_config(op.name) + config_tuple = self.session.run([op.inputs[QuantizeOpIndices.op_mode], + op.inputs[QuantizeOpIndices.encoding_min], + op.inputs[QuantizeOpIndices.encoding_max], + op.inputs[QuantizeOpIndices.bit_width], + op.inputs[QuantizeOpIndices.use_symmetric_encoding]]) + op_mode, encoding_min, encoding_max, bitwidth, is_symmetric = config_tuple + + # Create the static op + # -------------------- + if not self._use_cuda: + with tf.device('/cpu:0'): + static_op = qcops.qc_quantize_static(name=op.name+"_static", in_tensor=op.inputs[0], + encoding_min=encoding_min, encoding_max=encoding_max, + bitwidth=bitwidth, quant_scheme=quant_config.quant_scheme, + op_mode=op_mode, is_symmetric=bool(is_symmetric)) + else: + static_op = qcops.qc_quantize_static(name=op.name + "_static", in_tensor=op.inputs[0], + encoding_min=encoding_min, encoding_max=encoding_max, + bitwidth=bitwidth, quant_scheme=quant_config.quant_scheme, + op_mode=op_mode, is_symmetric=bool(is_symmetric)) + + # Replace in graph + # ----------------- + graph_editor.reroute_ts(ts0=[static_op], ts1=[op.outputs[0]], + can_modify=op.outputs[0].consumers()) + graph_editor.detach_inputs(op) + + new_sess = utils.graph_saver.save_and_load_graph(temp_dir_path, self.session) + return new_sess + + def save_model_with_embedded_quantization_nodes(self, checkpoint_path: str, encoding_path: str = None, + orig_sess: tf.compat.v1.Session = None): + """ + This method is to export model embedded with native tensorflow quantization nodes + :param checkpoint_path: path to save the checkpoint files + :param encoding_path: optional param to pass the path from where to load parameter encodings file + :param orig_sess: optional param to pass in original session without quant nodes + """ + # Load encodings file + encodings_dicts = {} + if encoding_path and os.path.exists(encoding_path): + with open(encoding_path) as json_file: + encodings_dicts = json.load(json_file) + encodings_dicts = dict(encodings_dicts["activation_encodings"], **encodings_dicts["param_encodings"]) + + if orig_sess is None: + _logger.info('Original session is not provided, use orig_model_before_quantsim.meta as default graph') + orig_sess = utils.graph_saver.load_model_from_meta(meta_path=os.path.join(WORKING_DIR, + 'orig_model_before_quantsim' + '.meta')) + with orig_sess.graph.as_default(): + for op_name, quantizer_info in dict(self._param_quantizers, **self._activation_quantizers).items(): + tensor_name = self.session.graph.get_operation_by_name(op_name).inputs[0].name + op = orig_sess.graph.get_tensor_by_name(tensor_name).op + consumers = [consumer for consumer in op.outputs[0].consumers() if 'gradients' not in consumer.name] + if tensor_name in encodings_dicts: + # Check for per channel quantization + if self.per_channel_quantization_enabled and len(encodings_dicts[tensor_name]) > 1: + encoding_min = [channel_dict['min'] for channel_dict in encodings_dicts[tensor_name]] + encoding_max = [channel_dict['max'] for channel_dict in encodings_dicts[tensor_name]] + encoding_bw = encodings_dicts[tensor_name][0]['bitwidth'] + else: + encoding_max = encodings_dicts[tensor_name][0].get('max') + encoding_min = encodings_dicts[tensor_name][0].get('min') + encoding_bw = encodings_dicts[tensor_name][0].get('bitwidth') + + else: + if not quantizer_info.is_encoding_valid(): + if quantizer_info.data_type == QuantizationDataType.float and quantizer_info.get_op_mode() in\ + [int(libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize), + int(libpymo.TensorQuantizerOpMode.quantizeDequantize)]: + # Cast input tensor to data_type and dequant it to fp32 + with tf.device('' if self._use_cuda else '/cpu:0'): + tf_quantization_op = tf.cast(tf.cast(op.outputs[0], tf.float16), tf.float32) + # Replace in graph + # ----------------- + graph_editor.reroute_ts(ts0=tf_quantization_op, ts1=[op.outputs[0]], + can_modify=consumers) + continue + _logger.info("Can't find %s in encodings file, encodings in QuantizationSimModel will be used", + self._get_quantized_name(op.name)) + encoding_min, encoding_max = self.read_min_max(self._get_quantized_name(op.name)) + # if per channel quantization is enabled, then min and max are numpy arrays, and this function gates the array + encoding_bw = int(self._get_op_variable_value(self.session.graph.get_operation_by_name(op_name), + QuantizeOpIndices.bit_width)) + + _logger.info("Adding native tensorflow quantization op %s", self._get_quantized_name(op.name)) + # inser native tensorflow quantization nodes into graph + with tf.device('' if self._use_cuda else '/cpu:0'): + if not isinstance(encoding_max, (list, np.ndarray)): + tf_quantization_op = \ + tf.quantization.fake_quant_with_min_max_vars(op.outputs[0], min=encoding_min, max=encoding_max, + num_bits=encoding_bw, narrow_range=False, + name=self._get_quantized_name(op.name)) + else: + tf_quantization_op = \ + tf.quantization.fake_quant_with_min_max_vars_per_channel(op.outputs[0], min=np.array(encoding_min), + max=np.array(encoding_max), num_bits=encoding_bw, + narrow_range=False, name=self._get_quantized_name(op.name)) + + # Replace in graph + # ----------------- + graph_editor.reroute_ts(ts0=tf_quantization_op, ts1=[op.outputs[0]], + can_modify=consumers) + + utils.graph_saver.save_model_to_meta(orig_sess, os.path.join(checkpoint_path + '_embedded_quant_nodes')) + return utils.graph_saver.load_model_from_meta(meta_path=str(checkpoint_path + '_embedded_quant_nodes.meta')) + + def set_and_freeze_param_encodings(self, encoding_path: str): + """ + Set and freeze parameter encodings from encodings JSON file + :param encoding_path: path from where to load parameter encodings file + """ + # Load parameter encodings file + with open(encoding_path) as json_file: + param_encodings = json.load(json_file) + + # op mode will be Quantize dequantize + op_mode = libpymo.TensorQuantizerOpMode.quantizeDequantize + + for op_name, quantizer_info in self._param_quantizers.items(): + quant_op = self.session.graph.get_operation_by_name(op_name) + tensor_name = quant_op.inputs[0].name + if tensor_name in param_encodings: + encoding_dict = param_encodings[tensor_name] if self.per_channel_quantization_enabled else \ + param_encodings[tensor_name][0] + encoding, is_symmetric = create_encoding_from_dict(encoding_dict) + quantizer_info.use_symmetric_encoding = is_symmetric + quantizer_info.set_and_freeze_encoding_and_op_mode(encoding, op_mode) + _logger.info("Setting and freezing quantization encodings for parameter: %s", tensor_name) + + def load_encodings_to_sim(self, encoding_path: str): + """ + Set parameter and activation encodings from encodings JSON file + :param encoding_path: path from where to load encodings file + """ + # Load parameter encodings file + with open(encoding_path) as json_file: + encodings = json.load(json_file) + param_encodings = encodings['param_encodings'] + activation_encodings = encodings['activation_encodings'] + + for op_name, quantizer_info in self._param_quantizers.items(): + quant_op = self.session.graph.get_operation_by_name(op_name) + tensor_name = quant_op.inputs[0].name + if tensor_name in param_encodings: + # Check if the quantizer is disabled + if not quantizer_info.enabled: + _logger.info("Not loading encodings for parameter: %s as quantizer is disabled", tensor_name) + continue + encoding_dict = param_encodings[tensor_name] if self.per_channel_quantization_enabled else \ + param_encodings[tensor_name][0] + encoding, is_symmetric = create_encoding_from_dict(encoding_dict) + bitwidth = encoding_dict[0].get('bitwidth') if self.per_channel_quantization_enabled else \ + encoding_dict.get('bitwidth') + quantizer_info.set_encodings_to_quantizer(bitwidth, is_symmetric, encoding, + libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize) + _logger.info("Setting quantization encodings for parameter: %s", tensor_name) + else: + # Case where encoding is not present in the encoding file + # So we will disable the quantizer if its active + if quantizer_info.enabled: + quantizer_info.enabled = False + _logger.info("Encoding for parameter: %s not present thus disabling this quantizer.", tensor_name) + + for op_name, quantizer_info in self._activation_quantizers.items(): + quant_op = self.session.graph.get_operation_by_name(op_name) + tensor_name = quant_op.inputs[0].name + if tensor_name in activation_encodings: + # Check if the quantizer is disabled + if not quantizer_info.enabled: + _logger.info("Not loading encodings for parameter: %s as quantizer is disabled", tensor_name) + continue + encoding_dict = activation_encodings[tensor_name][0] + encoding, is_symmetric = create_encoding_from_dict(encoding_dict) + quantizer_info.set_encodings_to_quantizer(encoding_dict.get('bitwidth'), is_symmetric, + encoding, libpymo.TensorQuantizerOpMode.quantizeDequantize) + _logger.info("Setting quantization encodings for activation: %s", tensor_name) + else: + # Case where encoding is not present in the encoding file + # So we will disable the quantizer if its active + if quantizer_info.enabled: + quantizer_info.enabled = False + _logger.info("Encoding for parameter: %s not present thus disabling this quantizer.", tensor_name) + + def _param_op_mode_after_analysis(self, quant_scheme) -> libpymo.TensorQuantizerOpMode: + """ + Returns op mode to use for parameters after encodings have been computed + :param quant_scheme: Quantization scheme to use + :return: + """ + if quant_scheme in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init]: + op_mode = libpymo.TensorQuantizerOpMode.quantizeDequantize + else: + op_mode = libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize + + if self.per_channel_quantization_enabled: + op_mode = libpymo.TensorQuantizerOpMode.quantizeDequantize + + return op_mode + + def get_min_max_var_dict(self) -> Dict: + """ + Fetches all the min max variables in given Quantized graph. + :return: dictionary of min/ max variable names to var mapping + """ + variable_dict = {} + with self.session.graph.as_default(): + for var in tf.compat.v1.global_variables(): + if var.name.endswith('_encoding_min:0') or var.name.endswith('_encoding_max:0'): + variable_dict[var.name] = var + + return variable_dict + + def read_min_max(self, quant_op_name: str, variable_dict: Dict = None) -> (float, float): + """ + Reads min and max params from quantize op + :param quant_op_name: quantize op name to read min and max variables from. + :param variable_dict: dictionary of min/max variable names to variable mapping for given quantized graph, optional + :return: min and max variable values from the given quant op. + """ + if not variable_dict: + # get a variable dict if one is not provided + variable_dict = self.get_min_max_var_dict() + + min_var = variable_dict[quant_op_name + '_encoding_min:0'] + max_var = variable_dict[quant_op_name + '_encoding_max:0'] + return self.session.run([min_var, max_var]) + + def _export_encodings(self, encoding_file_path: str): + """ + Export encodings to the given file path. + + :param encoding_file_path: File path to export encodings to + """ + def update_encoding_dict_entry_float(encoding_dict: Dict, op_name: str): + quant_op = self.session.graph.get_operation_by_name(op_name) + op_bitwidth = int(self._get_op_variable_value(quant_op, QuantizeOpIndices.bit_width)) + if op_bitwidth != 16: + raise ValueError('dtype is set to float but bitwidth is not 16 for the layer:', op_name) + + tensor_name = quant_op.inputs[0].name + encoding_dict[tensor_name] = [{'dtype': 'float', + 'bitwidth': op_bitwidth}] + + def update_encoding_dict_entry_int(encoding_dict: Dict, quantizer_info: QuantizerInfo): + encoding = quantizer_info.get_encoding() + quant_op = self.session.graph.get_operation_by_name(quantizer_info.quant_op_name) + + # Min and max will be numpy arrays, so to make them JSON serializable + if self.per_channel_quantization_enabled and isinstance(encoding, list): + min_val = [enc.min for enc in encoding] + max_val = [enc.max for enc in encoding] + delta = [enc.delta for enc in encoding] + offset = [enc.offset for enc in encoding] + else: + # Wrap single min/max value in a list to support list comprehension + min_val = [encoding.min] + max_val = [encoding.max] + delta = [encoding.delta] + offset = [encoding.offset] + + tensor_name = quant_op.inputs[0].name + if quant_op.type in ['QcQuantizePerChannel'] and 'EagerPyFunc' in tensor_name: + tensor_name = quant_op.inputs[0].op.inputs[0].name + encoding_dict[tensor_name] = [{'min': min_val[idx], + 'max': max_val[idx], + 'scale': delta[idx], + 'offset': int(offset[idx]), + 'bitwidth': int(quantizer_info.bitwidth), + 'is_symmetric': str(quantizer_info.use_symmetric_encoding), + 'dtype': 'int'} for idx in range(len(min_val))] + + param_encodings = {} + for quant_op_name, quantizer_info in self._param_quantizers.items(): + if quantizer_info.data_type == QuantizationDataType.float: + update_encoding_dict_entry_float(param_encodings, quant_op_name) + else: + if not quantizer_info.is_encoding_valid(): + continue + update_encoding_dict_entry_int(param_encodings, self._param_quantizers[quant_op_name]) + + activation_encodings = {} + for quant_op_name, quantizer_info in self._activation_quantizers.items(): + if quantizer_info.data_type == QuantizationDataType.float: + update_encoding_dict_entry_float(activation_encodings, quant_op_name) + else: + if not quantizer_info.is_encoding_valid(): + continue + update_encoding_dict_entry_int(activation_encodings, self._activation_quantizers[quant_op_name]) + + encodings_dict = {'version': encoding_version, + 'activation_encodings': activation_encodings, + 'param_encodings': param_encodings, + 'quantizer_args': self.quant_args} + + save_json_yaml(encoding_file_path, encodings_dict) + + def _save_and_load_sim_model(self): + self.session = utils.graph_saver.save_and_load_graph(WORKING_DIR, self.session) + update_tensor_quantizer_references(self.session, self._activation_quantizers) + update_tensor_quantizer_references(self.session, self._param_quantizers) + + def _add_quant_nodes_recurrent(self, conn_graph: ConnectedGraph, default_param_bw: int, default_output_bw: int) \ + -> Tuple[List[str], List[int], List[str]]: + """ + Utility to add quant nodes to recurrent module + :param conn_graph: Connected graph of the model + :param default_param_bw: default param bitwidth + :param default_output_bw: default output bitwidth + :return: Tuple[List[str], List[int], List[str]], param op names, input indices and activation op names + """ + # pylint: disable=protected-access + # pylint: disable=too-many-locals + + # Register custom handlers to select internal ops to quantize in a given recurrent module type + switcher = { + "SimpleRNN": _select_simple_rnn_internal_ops_to_quantize, + "LSTM": _select_lstm_internal_ops_to_quantize + } + + ops_with_param_names = [] + input_indices = [] + activation_op_names = [] + + for op in conn_graph.get_all_ops().values(): + # we can configure custom layer selectors per recurrent type or use default one + if op.type in SUPPORTED_RECURRENT_TYPES: + if version.parse(tf.version.VERSION) >= version.parse("2.00"): + raise AssertionError('Recurrent layers are not supported with TF2.x, instead use TF1.15.') + internal_ops = op.internal_ops + + # select internal ops to quantize in this recurrent type + select_internal_ops_to_quantize = switcher.get(op.type) + module_ops_with_param_names, module_op_input_indices, module_activation_op_names = \ + select_internal_ops_to_quantize(self.session.graph, internal_ops) + + # insert the quant nodes + self._insert_param_quantization_ops_loop_context(module_ops_with_param_names, module_op_input_indices, + default_param_bw, internal_ops) + + self._insert_activation_quantization_ops(module_activation_op_names, default_output_bw, + in_loop_context=True) + + # if there are multiple recurrent modules, we want a list containing all the param + # and activation info + if module_ops_with_param_names and module_op_input_indices: + ops_with_param_names.extend(module_ops_with_param_names) + input_indices.extend(module_op_input_indices) + if module_activation_op_names: + activation_op_names.extend(module_activation_op_names) + + return ops_with_param_names, input_indices, activation_op_names + + def _add_and_configure_quant_nodes(self, starting_op_names: List[str], output_op_names: List[str], + default_param_bw: int, default_output_bw: int, + default_data_type: QuantizationDataType): + """ + Utility to add quant nodes + :param starting_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :param default_param_bw: default param bitwidth + :param default_output_bw: default output bitwidth + :param default_data_type: Default data type to use for quantizing all layer parameters + """ + + # Get list of ops with params to insert quantizers for, as well as the input indices to insert on. + params_to_quantize = QuantizationSimModel._get_ops_to_quantize_params_for(self.session.graph, + self.connected_graph, + starting_op_names, + output_op_names) + + # Get list of activation ops to insert quantizers for + activation_op_names = QuantizationSimModel._get_ops_to_quantize_activations_for(self.session.graph, + self.connected_graph) + + + self._insert_param_quantization_ops(params_to_quantize, default_param_bw, data_type=default_data_type) + self._insert_activation_quantization_ops(activation_op_names, default_output_bw, data_type=default_data_type) + + # this takes care of quant node insertion in loop context of recurrent layer, which makes a cell + recurrent_ops_with_param_names, recurrent_input_indices, recurrent_activation_op_names = \ + self._add_quant_nodes_recurrent(self.connected_graph, default_param_bw, default_output_bw) + + if recurrent_activation_op_names: + activation_op_names.extend(recurrent_activation_op_names) + + # Note: at this point, the session used to construct conn_graph is different than the current + # self.session, however we still use the connected graph to traverse the graph structure. + self.configure_quantization_ops(self.connected_graph, recurrent_ops_with_param_names, recurrent_input_indices, + params_to_quantize, activation_op_names) + + @staticmethod + def _get_quantized_name(op_name: str) -> str: + """ + Small utility function to name a quantized parameter + :param op_name: Name of the op being quantized + :return: Returns an appropriate name for the quantized op + """ + return op_name + '_quantized' + + @staticmethod + def _get_unquantized_name(quant_op_name: str) -> str: + """ + Small utility function to get the name of the op being quantized + :param quant_op_name: Name of the quant op + :return: Returns the name of the op being quantized + """ + assert quant_op_name.endswith('_quantized') + return quant_op_name[:-len('_quantized')] + + @staticmethod + def _get_op_to_modify_with_param_in(op: tf.Operation, index: int) -> (tf.Operation, tf.Tensor): + """ + utility to get op to modify along with param input + :param op: TensorFlow operation + :param index: input index to get param from + :return: Tuple of TF operation and param in tensor + """ + + op_to_modify = None + param_in = None + # case of params being depth 2 input nodes to MatMul + # via strided-slice or split op + if op.inputs[index].op.type in ['StridedSlice', 'Split']: + strided_slice_op = op.inputs[index].op + for inp in strided_slice_op.inputs: + if inp.op.type in ['ReadVariableOp']: + op_to_modify = strided_slice_op + param_in = inp + else: + # case of params being direct input nodes to MatMul + op_to_modify = op + param_in = op.inputs[index] + + return op_to_modify, param_in + + def _insert_param_quantization_ops(self, params_to_quantize: Dict[str, ParameterInfo], default_param_bw: int, + data_type: QuantizationDataType = QuantizationDataType.int): + """ + Inserts quantization ops for individual parameters + :param params_to_quantize: dictionary of parameters to quantize + :param default_param_bw : default param bitwidth + :return: None + """ + # pylint: disable=too-many-locals + for param_name, param_info in params_to_quantize.items(): + param_in = self.session.graph.get_operation_by_name(param_name).outputs[0] + can_modify_ops = [self.session.graph.get_operation_by_name(consumer) \ + for consumer in param_info.op_with_param_name] + # Assume all ops that are consumers of the param are of the same type for axis handling purposes + can_modify_op_type = can_modify_ops[0].type + if param_in is not None: + num_output_channels, quantization_axis_handling = \ + QuantizationSimModel._get_number_of_output_channels_and_quantization_axis_handling( + param_in.get_shape().as_list(), can_modify_op_type) + quant_op_name = self._get_quantized_name(param_name) + + self._op_name_to_output_channels_axis_handling_dict[quant_op_name] = [num_output_channels, + quantization_axis_handling] + _logger.info("Adding weight quantization op %s", quant_op_name) + op_mode = libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize + + # If per channel quantization is enabled we tranpose the weights of tranpose op and then + # perform per channel quantization + if can_modify_op_type in ['Conv2DTranspose', 'Conv2DBackpropInput'] and \ + self.per_channel_quantization_enabled: + + fout = tf.py_function(func=swap_last_two_dim, inp=[param_in], Tout=tf.float32) + + q_op_out = self._insert_post_training_quant_op(fout, quant_op_name, + op_mode, self._param_quantizers, QuantizerType.param, + default_param_bw, data_type) + + q_op_out = tf.py_function(func=swap_last_two_dim, inp=[q_op_out], Tout=tf.float32) + else: + q_op_out = self._insert_post_training_quant_op(param_in, quant_op_name, + op_mode, self._param_quantizers, QuantizerType.param, + default_param_bw, data_type) + + nodes_modified_count = graph_editor.reroute_ts(tf_ops.convert_to_tensor(q_op_out), param_in, + can_modify=can_modify_ops) + + if nodes_modified_count != len(can_modify_ops): + raise ValueError(f'Issue quantizing {param_in.name}') + + def _insert_param_quantization_ops_loop_context(self, op_names: List[str], indices: List[int], + default_param_bw: int, + inner_ops: List[tf.Operation], + data_type: QuantizationDataType = QuantizationDataType.int): + """ + Inserts quantization ops for individual parameters + :param op_names: List of ops whose parameters are being quantized + :param indices: List of input indices (one-to-one for each entry in ops) + :param default_param_bw : default param bitwidth + :param inner_ops: list of tf.Operations inside a RNN op + :param data_type: Default data type to use for quantizing all layer parameters + :return: None + """ + # pylint: disable=too-many-locals + ops = [self.session.graph.get_operation_by_name(op_name) for op_name in op_names] + assert len(ops) == len(indices) + + for op, index in zip(ops, indices): + # Modify the weight/bias inputs to use the quantized inputs + can_modify_op, param_in = QuantizationSimModel._get_op_to_modify_with_param_in(op, index) + + if param_in is not None: + num_output_channels, quantization_axis_handling = \ + QuantizationSimModel._get_number_of_output_channels_and_quantization_axis_handling( + can_modify_op.inputs[index].get_shape().as_list(), can_modify_op.type) + quant_op_name = self._get_quantized_name(param_in.op.name) + + self._op_name_to_output_channels_axis_handling_dict[quant_op_name] = [num_output_channels, + quantization_axis_handling] + _logger.info("Adding weight quantization op %s", quant_op_name) + op_mode = libpymo.TensorQuantizerOpMode.oneShotQuantizeDequantize + + q_op_out = self._insert_param_quantizer_loop_context(inner_ops, param_in, quant_op_name, + op_mode, self._param_quantizers, + QuantizerType.param, + default_param_bw, data_type) + + nodes_modified_count = graph_editor.reroute_ts(tf_ops.convert_to_tensor(q_op_out), param_in, + can_modify=can_modify_op) + if nodes_modified_count != 1: + raise ValueError('Input ' + param_in.name + ' not quantized!') + + + @staticmethod + def _get_number_of_output_channels_and_quantization_axis_handling(weight_shape: List[int], + consumer_op_type: str) -> \ + Tuple[int, AxisHandling]: + """ + Gets number of output channels and quantization axis handling for an op for per channel quantization + :param weight_shape: list containing tensor shape of weight + :param consumer_op_type: type of op that consumes weight + :return number of output channel and axis handling from weight_shape + """ + # Initialize axis_handling and num_output_channels with values fitting most ops + axis_handling = AxisHandling.LAST_AXIS + num_output_channels = weight_shape[-1] + if consumer_op_type in ['Conv2DTranspose', 'Conv2DBackpropInput']: + num_output_channels = weight_shape[2] + elif consumer_op_type == 'DepthwiseConv2dNative': + num_output_channels *= weight_shape[-2] + axis_handling = AxisHandling.LAST_TWO_AXES + + # If op is not any special op, fall through and return the unmodified values. + return num_output_channels, axis_handling + + @staticmethod + def _is_op_quantizable(op: tf.Operation) -> bool: + """ + utility to check if the quantization can be supported for this op + :param op: op as tf.Operation type + :return: True if the op can be quantized, False otherwise + """ + + if op.outputs: + if op.outputs[0].dtype not in DTYPES_QUANTIZE_NOT_REQUIRED: + return True + + return False + + def _insert_activation_quantization_ops(self, valid_op_names: List[str], default_output_bw, + in_loop_context: bool = False, + data_type: QuantizationDataType = QuantizationDataType.int): + """ + Inserts quantization ops at the outputs of given ops + :param valid_op_names: List of op names to insert activation quantizers for + :param default_output_bw: default activation bitwidth + :param in_loop_context: True, if the ops belong to a loop control flow context + :param data_type: Default data type to use for quantizing all layer activations + return: + """ + for op_name in valid_op_names: + quant_op_name = self._get_quantized_name(op_name) + op = self.session.graph.get_operation_by_name(op_name) + _logger.info("Adding activation quantization op %s", quant_op_name) + + consumers = [consumer for consumer in op.outputs[0].consumers() if 'gradients' not in consumer.name] + + if not QuantizationSimModel._is_op_quantizable(op): + error_msg = f'Unsupported dtype {op.outputs[0].dtype} detected for op {op_name}.' + _logger.error(error_msg) + raise AssertionError(error_msg) + + if in_loop_context: + q_op_out = self._insert_post_training_quant_op_in_loop_context(op.outputs[0], quant_op_name, + libpymo.TensorQuantizerOpMode.updateStats, + self._activation_quantizers, + QuantizerType.activation, + default_output_bw, data_type) + else: + q_op_out = self._insert_post_training_quant_op(op.outputs[0], quant_op_name, + libpymo.TensorQuantizerOpMode.updateStats, + self._activation_quantizers, QuantizerType.activation, + default_output_bw, data_type) + + # Re-route + num_rerouted_outputs = graph_editor.reroute_ts(tf_ops.convert_to_tensor(q_op_out), + op.outputs[0], can_modify=consumers) + if num_rerouted_outputs != len(consumers): + raise ValueError('Failed to map ' + str(len(consumers)) + ' quantization output(s). Only mapped ' + + str(num_rerouted_outputs)) + + def _create_encoding_min_max_vars(self, q_op_name: str, quantizer_type: QuantizerType = None) -> (tf.Variable, tf.Variable): + """ + creates encoding min and max variables for quant op. + :param q_op_name: name of quantize op + :param quantizer_type: Quantizer type param or activation + :return: encoding min and max as tf.Variable type + """ + + is_trainable = False + if self._quant_scheme in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init]: + is_trainable = True + + initial_min_val = 0.0 + initial_max_val = 0.0 + + if quantizer_type == QuantizerType.param and self.per_channel_quantization_enabled: + num_output_channels, _ = self._op_name_to_output_channels_axis_handling_dict[q_op_name] + initial_min_val = [0.0] * num_output_channels + initial_max_val = [0.0] * num_output_channels + + encoding_min_var = tf.Variable(initial_value=initial_min_val, + name=q_op_name + '_encoding_min', + trainable=is_trainable, dtype=tf.double) + encoding_max_var = tf.Variable(initial_value=initial_max_val, + name=q_op_name + '_encoding_max', + trainable=is_trainable, dtype=tf.double) + + return encoding_min_var, encoding_max_var + + @staticmethod + def _get_ops_to_quantize_params_for(graph: tf.Graph, conn_graph: ConnectedGraph, starting_op_names: List[str], + output_op_names: List[str]) -> Dict[str, ParameterInfo]: + """ + Get names of ops to insert param quantizers for, as well as corresponding indices + :param graph: TensorFlow graph to get names of ops to quantize weights for + :param conn_graph: Connected graph of the model + :param starting_op_names: List of starting op names of the model + :param output_op_names: List of output op names of the model + :return: Dictionary with name of parameters to quantize as keys and information about parameters as values + """ + if conn_graph is None: + _logger.error("Connected graph is not passed as a parameter") + raise AssertionError("Connected graph is not passed as a parameter") + + # Get available connected graphs + valid_conns = [conn for conn in conn_graph.get_all_ops().values() + if conn.type not in param_quant_conn_op_ignore_list] + + valid_ops = get_valid_ops(graph, starting_op_names, output_op_names) + + # Get parameters of connected graphs + params_to_quantize = {} + for conn in valid_conns: + for param_name, param_info in conn.parameters.items(): + for consumer_name in param_info.op_with_param_name: + consumer = graph.get_operation_by_name(consumer_name) + if op_not_in_loop_control_flow_context(graph, consumer) and consumer in valid_ops: + if param_name in params_to_quantize: + # Parameter can be a weight shared parameter, that was used for a different op that was + # processed earlier. In this case, there will already be a parameter info entry for this + # parameter, and we need to update the op_with_param_name list to include the current op. + params_to_quantize[param_name].op_with_param_name.extend(param_info.op_with_param_name) + else: + params_to_quantize[param_name] = param_info + + params_to_quantize.update(get_embedding_params_using_patterns(conn_graph)) + + return params_to_quantize + + @staticmethod + def _get_ops_to_quantize_activations_for(graph: tf.Graph, conn_graph: ConnectedGraph) -> List[str]: + """ + Get names of ops to insert activation quantizers for + :param graph: TensorFlow graph to get names of ops to quantize weights for + :param conn_graph: Connected graph of the model + :return: List of op names to insert activation quantize ops for + """ + valid_ops = [op for op in conn_graph.get_all_ops().values() if op.type not in op_types_to_ignore] + op_names_to_quantize = [conn_graph_op.output_op_node.name for conn_graph_op in valid_ops if + is_op_quantizable(conn_graph_op.output_op_node) + and op_not_in_loop_control_flow_context(graph, conn_graph_op.output_op_node)] + + return op_names_to_quantize + + def _insert_post_training_quant_op_in_loop_context(self, preceeding_tensor, + quant_op_name: str, + op_mode: libpymo.QuantizationMode, + quantizer_dict: Dict[str, QuantizerInfo], + quantizer_type: QuantizerType, + bit_width: int = 8, + data_type: QuantizationDataType = QuantizationDataType.int): + """ + Create and insert a post-training quant op after a given tensor in a loop control flow context. + :param preceeding_tensor: Preceeding tensor to insert the quant op after + :param quant_op_name: Name to give to the new quant op + :param op_mode: Starting mode to configure for the new quant op + :param quantizer_dict: dictionary of op and QuantizerInfo + :param quantizer_type : indicate param or activation quantizer + :param bit_width : bit-width to be used (output or param quantization bit-width), default set to 8 + :param data_type: data type to use for quantizing all layer parameters + :return: None + """ + + # this handles cases such as conditional blocks that are defined in their own context + context_bk = updated_graph_flow_context_to_loop_context(self.session.graph, preceeding_tensor) + q_op_out = self._insert_post_training_quant_op(preceeding_tensor, quant_op_name, op_mode, quantizer_dict, + quantizer_type, bit_width, data_type) + + # revert the context back to graph level from op context + set_graph_flow_context(self.session.graph, context_bk) + + return q_op_out + + def _insert_param_quantizer_loop_context(self, inner_ops, preceeding_tensor, + quant_op_name: str, + op_mode: libpymo.QuantizationMode, + quantizer_dict: Dict[str, QuantizerInfo], + quantizer_type: QuantizerType, + bit_width: int = 8, + data_type: QuantizationDataType = QuantizationDataType.int): + """ + Create and insert a post-training quant op after a given tensor in a loop control flow context. + :param preceeding_tensor: Preceeding tensor to insert the quant op after + :param quant_op_name: Name to give to the new quant op + :param op_mode: Starting mode to configure for the new quant op + :param quantizer_dict: dictionary of op and QuantizerInfo + :param quantizer_type : indicate param or activation quantizer + :param bit_width: bit-width to be used (output or param quantization bit-width), default set to 8. + :param data_type: data type to use for quantizing all layer parameters + :return: None + """ + + # this handles cases such as conditional blocks that are defined in their own context + context_bk = updated_graph_flow_context_to_loop_context(self.session.graph, preceeding_tensor) + q_op_out = self._insert_param_quantizer_recurrent(inner_ops, preceeding_tensor, quant_op_name, op_mode, quantizer_dict, + quantizer_type, bit_width, data_type) + + # revert the context back to graph level from op context + set_graph_flow_context(self.session.graph, context_bk) + + return q_op_out + + # pylint: disable=too-many-locals + def _create_and_init_quant_op_input_vars(self, quant_op_name: str, quantizer_dict: Dict[str, QuantizerInfo], + quantizer_type, op_mode: libpymo.QuantizationMode, bit_width: int = 8, + data_type: QuantizationDataType = QuantizationDataType.int): + """ + creates input variables to Quantize op and initializes them + :param quant_op_name: quantize op name + :param quantizer_dict: dictionary of op and QuantizerInfo + :param quantizer_type: indicate param or activation quantizer + :param op_mode: Starting mode to configure for the new quant op + :param bit_width: bit-width to be used (output or param quantization bit-width), default set to 8 + :param data_type: data type to use for quantizing all layer parameters + :return: quant op input variables created + """ + with self.session.graph.as_default(): + op_mode_var = tf.Variable(int(op_mode), + name=quant_op_name + '_op_mode', trainable=False, + dtype=tf.int32) + + bit_width = tf.Variable(initial_value=bit_width, + name=quant_op_name + '_bit_width', + trainable=False, dtype=tf.int8) + + # Note: Later, is_symmetric_encoding value is to be read from config file + use_symmetric_encoding = tf.Variable(initial_value=False, + name=quant_op_name + '_use_symmetric_encoding', + trainable=False, dtype=tf.bool) + axis_handling = AxisHandling.LAST_AXIS + if quantizer_type == QuantizerType.param and self.per_channel_quantization_enabled: + tensor_quantizer, tensor_quant_ref, encoding_min, encoding_max, axis_handling = \ + self._create_per_channel_quantizers_and_encodings(quant_op_name) + else: + tensor_quantizer, tensor_quant_ref, \ + encoding_min, encoding_max = self._create_per_tensor_quantizers_and_encodings(quant_op_name) + + quantization_axis_handling = tf.Variable(initial_value=axis_handling.value, + name=quant_op_name + '_axis_handling', + trainable=False, dtype=tf.int32) + + is_int_data_type = tf.Variable(initial_value=(data_type == QuantizationDataType.int), + name=quant_op_name + '_data_type', trainable=False, dtype=tf.bool) + + # Add to quantizer dict + quantizer_info = QuantizerInfo(self.session, tensor_quantizer, quant_op_name, quantizer_type, + self._quant_scheme, self.per_channel_quantization_enabled, axis_handling) + quantizer_dict[quant_op_name] = quantizer_info + + self.session.run([op_mode_var.initializer, tensor_quant_ref.initializer, encoding_min.initializer, + encoding_max.initializer, bit_width.initializer, use_symmetric_encoding.initializer, + quantization_axis_handling.initializer, is_int_data_type.initializer]) + + return op_mode_var, tensor_quant_ref, encoding_min, encoding_max, bit_width, use_symmetric_encoding, \ + quantization_axis_handling, is_int_data_type + + def _create_per_channel_quantizers_and_encodings(self, quant_op_name: str) -> \ + Tuple[List[libpymo.TensorQuantizer], tf.Variable, tf.Variable, tf.Variable, AxisHandling]: + """ + Creates per channel quantizers and encoding min max variables + :param quant_op_name: Name of quantization op with parameter to create per channel quantizers for + :return: Tensor quantizers, variable with quantizer pointer, encoding min variable, encoding max variable, and + axis handling enum + """ + num_output_channels, axis_handling = self._op_name_to_output_channels_axis_handling_dict[quant_op_name] + tensor_quantizer_int64 = [None] * num_output_channels + tensor_quantizers = [None] * num_output_channels + # Create a tensor_quantizer per channel + for i in range(num_output_channels): + tensor_quantizer = libpymo.TensorQuantizer(quant_scheme_to_libpymo[self._quant_scheme], + libpymo.RoundingMode.ROUND_NEAREST) + + tensor_quantizers[i] = tensor_quantizer + val = libpymo.PtrToInt64(tensor_quantizer) + tensor_quantizer_int64[i] = val + + tensor_quant_ref = tf.Variable(tensor_quantizer_int64, name=quant_op_name + '_quant_ref', + trainable=False, dtype=tf.int64) + + encoding_min, encoding_max = self._create_encoding_min_max_vars(quant_op_name, + quantizer_type=QuantizerType.param) + + return tensor_quantizers, tensor_quant_ref, encoding_min, encoding_max, axis_handling + + def _create_per_tensor_quantizers_and_encodings(self, quant_op_name: str): + """ + Creates per tensor quantizers and encoding min max variables + """ + tensor_quantizer = libpymo.TensorQuantizer(quant_scheme_to_libpymo[self._quant_scheme], + libpymo.RoundingMode.ROUND_NEAREST) + tensor_quantizer_int64 = libpymo.PtrToInt64(tensor_quantizer) + tensor_quant_ref = tf.Variable(tensor_quantizer_int64, name=quant_op_name + '_quant_ref', + trainable=False, dtype=tf.int64) + encoding_min, encoding_max = self._create_encoding_min_max_vars(quant_op_name) + return tensor_quantizer, tensor_quant_ref, encoding_min, encoding_max + + def _insert_param_quantizer_recurrent(self, inner_ops, preceeding_tensor, quant_op_name: str, + op_mode: libpymo.QuantizationMode, + quantizer_dict: Dict[str, QuantizerInfo], quantizer_type: QuantizerType, + bit_width: int = 8, + data_type: QuantizationDataType = QuantizationDataType.int): + """ + Create and insert a post-training quant op after a given tensor + :param preceeding_tensor: Preceeding tensor to insert the quant op after + :param quant_op_name: Name to give to the new quant op + :param op_mode: Starting mode to configure for the new quant op + :param quantizer_dict: dictionary of op and QuantizerInfo + :param quantizer_type : indicate param or activation quantizer + :param bit_width : bit-width to be used (output or param quantization bit-width), default set to 8 + :param data_type: data type to use for quantizing all layer parameters + :return: None + """ + # pylint: disable=too-many-locals + # Create variables for op_mode, tensor_quantizer_reference, encoding_min, encoding_max, bitwidth and + # is_symmetric_encoding flag + # (so we can change these in the future, if needed) + + op_mode_var, tensor_quant_ref, encoding_min, encoding_max, bit_width, use_symmetric_encoding, _, _ = \ + self._create_and_init_quant_op_input_vars(quant_op_name, quantizer_dict, quantizer_type, op_mode, + bit_width, data_type) + + # extract loop cond bool variable + time_step_tensor = get_time_steps_tensor_from_rnn_inner_ops(inner_ops) + + # CPU device assignment for QcQuantize op + q_op_out = self._create_and_place_recurrent_param_quantize_op(quant_op_name, preceeding_tensor, + op_mode_var, + tensor_quant_ref, + encoding_min, + encoding_max, + bit_width, + use_symmetric_encoding, + time_step_tensor) + + return q_op_out + + def _insert_post_training_quant_op(self, preceeding_tensor, quant_op_name: str, op_mode: libpymo.QuantizationMode, + quantizer_dict: Dict[str, QuantizerInfo], quantizer_type: QuantizerType, + bit_width: int = 8, data_type: QuantizationDataType = QuantizationDataType.int): + """ + Create and insert a post-training quant op after a given tensor + :param preceeding_tensor: Preceeding tensor to insert the quant op after + :param quant_op_name: Name to give to the new quant op + :param op_mode: Starting mode to configure for the new quant op + :param quantizer_dict: dictionary of op and QuantizerInfo + :param quantizer_type : indicate param or activation quantizer + :param bit_width : bit-width to be used (output or param quantization bit-width), default set to 8. + :param data_type: data type to use for quantizing the op + :return: None + """ + # pylint: disable=too-many-locals + # Create variables for op_mode, tensor_quantizer_reference, encoding_min, encoding_max, bitwidth and + # is_symmetric_encoding flag + # (so we can change these in the future, if needed) + + op_mode_var, tensor_quant_ref, encoding_min, encoding_max, bit_width, use_symmetric_encoding, \ + quantization_axis_handling, is_int_data_type = self._create_and_init_quant_op_input_vars(quant_op_name, + quantizer_dict, + quantizer_type, + op_mode, + bit_width, data_type) + + # CPU device assignment for QcQuantize op + q_op_out = self._create_and_place_quantize_op(quant_op_name, preceeding_tensor, op_mode_var, tensor_quant_ref, + encoding_min, encoding_max, bit_width, use_symmetric_encoding, + quantizer_type, quantization_axis_handling, is_int_data_type) + + return q_op_out + + def _create_and_place_quantize_op(self, quant_op_name: str, preceeding_tensor, + op_mode_var: tf.Variable, tensor_quant_ref: tf.Variable, + encoding_min: tf.Variable, encoding_max: tf.Variable, bit_width: tf.Variable, + use_symmetric_encoding: tf.Variable, quantizer_type: QuantizerType, + quantization_axis_handling: tf.Variable, is_int_data_type: tf.Variable): + """ + Create a QcQuantize op and place it on CPU/CPU and with the right custom-gradient function registered + """ + # pylint: disable=too-many-arguments + + def create_quantize_op(): + if self.per_channel_quantization_enabled and quantizer_type == QuantizerType.param: + + is_training = tf.keras.backend.learning_phase() + + op = qcops.qc_quantize_per_channel(name=quant_op_name, in_tensor=preceeding_tensor, + op_mode=op_mode_var, + tensor_quantizer_reference=tensor_quant_ref, + encoding_min=encoding_min, + encoding_max=encoding_max, + bit_width=bit_width, + is_int_data_type=is_int_data_type, + use_symmetric_encoding=use_symmetric_encoding, + axis_handling=quantization_axis_handling, is_training=is_training) + else: + op = qcops.qc_quantize(name=quant_op_name, in_tensor=preceeding_tensor, + op_mode=op_mode_var, + tensor_quantizer_reference=tensor_quant_ref, + encoding_min=encoding_min, encoding_max=encoding_max, + bit_width=bit_width, + use_symmetric_encoding=use_symmetric_encoding, + is_int_data_type=is_int_data_type) + + return op + + if not self._use_cuda: + with tf.device('/cpu:0'): + if self._quant_scheme in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init]: + with self.session.graph.gradient_override_map( + {"QcQuantize": "QcQuantizeRangeLearningCustomGradient", + "QcQuantizePerChannel": "QcQuantizePerChannelRangeLearningCustomGradient"}): + q_op_out = create_quantize_op() + else: + q_op_out = create_quantize_op() + + # GPU device assignment for QcQuantize op + else: + if self._quant_scheme in [QuantScheme.training_range_learning_with_tf_init, + QuantScheme.training_range_learning_with_tf_enhanced_init]: + with self.session.graph.gradient_override_map( + {"QcQuantize": "QcQuantizeRangeLearningCustomGradient", + "QcQuantizePerChannel": "QcQuantizePerChannelRangeLearningCustomGradient"}): + q_op_out = create_quantize_op() + else: + q_op_out = create_quantize_op() + + return q_op_out + + def _create_and_place_recurrent_param_quantize_op(self, quant_op_name: str, preceeding_tensor, + op_mode_var: tf.Variable, tensor_quant_ref: tf.Variable, + encoding_min: tf.Variable, encoding_max: tf.Variable, + bit_width: tf.Variable, + use_symmetric_encoding: tf.Variable, time_steps): + def create_recurrent_param_quantize_op(): + op = qcops.qc_quantize_recurrent_param(name=quant_op_name, in_tensor=preceeding_tensor, + op_mode=op_mode_var, tensor_quantizer_reference=tensor_quant_ref, + encoding_min=encoding_min, encoding_max=encoding_max, + bit_width=bit_width, use_symmetric_encoding=use_symmetric_encoding, + time_steps=time_steps) + return op + + if not self._use_cuda: + with tf.device('/cpu:0'): + q_op_out = create_recurrent_param_quantize_op() + + # GPU device assignment for QcQuantize op + else: + q_op_out = create_recurrent_param_quantize_op() + + return q_op_out + + @staticmethod + def _is_op_transformer_mask(quant_op_name: str) -> bool: + """ + Check if quant_op_name is transformer mask add op + :param quant_op_name: op name to check + :return: True if quant_op_name belongs to transformer mask add op + """ + for supported_mask in transformer_utils.SUPPORTED_ATTENTION_MASK_OVERRIDE: + if quant_op_name.endswith(supported_mask + '_quantized'): + return True + return False + + def _override_quant_config_for_transformer_mask_add(self): + """ + Find transformer mask add op and change bitwidth to 16 and quant_scheme to tf + """ + for quant_op_name, quantizer_info in self._activation_quantizers.items(): + if self._is_op_transformer_mask(quant_op_name) and quantizer_info.data_type == QuantizationDataType.int: + quantizer_info.bitwidth = 16 + quantizer_info.quant_scheme = QuantScheme.post_training_tf + + def _clamp_transformer_attention_mask_encoding(self): + """ + Clamp the quantizer encoding min associated with mask adder op within an attention head. + """ + for quant_op_name, quantizer_info in self._activation_quantizers.items(): + if self._is_op_transformer_mask(quant_op_name) and quantizer_info.enabled \ + and quantizer_info.data_type == QuantizationDataType.int: + encoding = quantizer_info.get_encoding() + encoding.min = max(encoding.min, transformer_utils.MASK_OVERRIDE_VALUE) + + clamped_encoding = recompute_grid_params(encoding, self._default_output_bw, + quantizer_info.use_symmetric_encoding) + quantizer_info.bitwidth = self._default_output_bw + quantizer_info.quant_scheme = self._quant_scheme + quantizer_info.set_encoding(clamped_encoding) + quantizer_info.freeze_encoding()
+ + +# load and save utilities +def update_tensor_quantizer_references(quant_sim_sess: tf.compat.v1.Session, quantizer_dict: Dict[str, QuantizerInfo]): + """ + updates the param / activation quant ops in the passed-in session with new tensor quantizer references. + :param quant_sim_sess: tensorflow session held by quantsim object + :param quantizer_dict: dictionary with quant ops and associated quantizer info + :return: None, updates passed-in session quant ops with new tensor quantizer references. + """ + + vars_with_value = {} + for q_op_name in quantizer_dict: + # also update the session held by tensor quantizer object + quantizer_dict[q_op_name].session = quant_sim_sess + # For per channel quantization of parameters + tensor_quantizers = quantizer_dict[q_op_name].tensor_quantizer + tensor_quantizer_ref = [] + if isinstance(tensor_quantizers, list): + for tensor_quantizer in tensor_quantizers: + ptr_to_int64_val = libpymo.PtrToInt64(tensor_quantizer) + tensor_quantizer_ref.append(ptr_to_int64_val) + else: + ptr_to_int64_val = libpymo.PtrToInt64(tensor_quantizers) + tensor_quantizer_ref.append(ptr_to_int64_val) + tensor_quantizer_ref = tensor_quantizer_ref[0] + vars_with_value[q_op_name + '_quant_ref'] = tensor_quantizer_ref + + update_variables_with_values(quant_sim_sess, vars_with_value) + + +def save_checkpoint(quantsim: QuantizationSimModel, meta_path: str, file_name_prefix: str): + """ + Saves a checkpoint of the QuantSim model which can be loaded at a later point to continue fine-tuning. + See also load_checkpoint(). + + :param quantsim: QuantizationSimModel to be saved + :param meta_path: path to save the meta file + :param file_name_prefix: filename prefix string + """ + if not os.path.exists(meta_path): + os.mkdir(meta_path) + + save_path = os.path.join(meta_path, file_name_prefix) + + # save the model with quant ops + utils.graph_saver.save_model_to_meta(quantsim.session, save_path) + + # save info in the quantsim object + save_data_to_pickle_file(quantsim, meta_path, 'orig_quantsim_config') + + +def load_checkpoint(meta_path: str, file_name_prefix: str) -> QuantizationSimModel: + """ + Loads QuantSim model from saved checkpoint and pickle files. + + :param meta_path: to load meta from + :param file_name_prefix: filename prefix string + :return: returns new QuantSim object + """ + #pylint: disable=protected-access + + # load saved session with quant ops + new_sess = utils.graph_saver.load_model_from_meta(meta_path=str(meta_path + '/' + file_name_prefix + '.meta')) + + # load quant sim model object with params from saved pickle data + new_quant_sim = load_data_from_pickle_file(meta_path + '/orig_quantsim_config') + + # set session for the new quantsim object + new_quant_sim.session = new_sess + + # update tensor references in the new quantsim object + update_tensor_quantizer_references(new_sess, new_quant_sim._param_quantizers) + update_tensor_quantizer_references(new_sess, new_quant_sim._activation_quantizers) + + return new_quant_sim + + +def check_accumulator_overflow(sess: tf.compat.v1.Session, quant_bw: int, accum_bw: int): + """ + Checks for any potential for accumulator overflow across all the layers of the given model + :param sess: Tensorflow session + :param quant_bw: Bitwidth the layers are quantized at + :param accum_bw: Bitwidth of the accumulator + :return: Name of the layer with the most accumulator range used and range used + """ + + most_accum_range_used = 0 + most_accum_range_used_layer = None + + for op in sess.graph.get_operations(): + if op.type == 'Conv2D': + weights = utils.op.conv.WeightTensorUtils.get_tensor_as_numpy_data(sess, op) + weights = np.transpose(weights, (3, 2, 0, 1)) # Reshape from HWIO to OIHW + was_accum_range_exceeded, accum_range_used = get_conv_accum_bounds(weights, quant_bw, accum_bw) + if accum_range_used > most_accum_range_used: + most_accum_range_used = accum_range_used + most_accum_range_used_layer = op.name + + if was_accum_range_exceeded: + _logger.info('Possible accumulator overflow for layer: %s', op.name) + + if most_accum_range_used < 1: + _logger.info('No overflow detected. Layer %s had the most accumulator range used: %f%%', + most_accum_range_used_layer, most_accum_range_used * 100) + else: + _logger.info('Overflow detected. Layer %s had the most accumulator range used: %f%%', + most_accum_range_used_layer, most_accum_range_used * 100) + + return most_accum_range_used_layer, most_accum_range_used +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/svd.html b/releases/1.32.2/_modules/aimet_tensorflow/svd.html new file mode 100644 index 0000000..a4ca863 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/svd.html @@ -0,0 +1,2176 @@ + + + + + + aimet_tensorflow.svd — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_tensorflow.svd

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2017-2018, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+# pylint: disable=too-many-lines
+
+""" Implementation of the SVD model compression technique for TensorFlow """
+
+import os
+from functools import reduce
+import operator
+from enum import Enum
+import numpy as np
+import tensorflow as tf
+
+from aimet_tensorflow import graph_editor
+from aimet_tensorflow.common import core, graph_eval
+import aimet_common.libpymo as pymo
+from aimet_common import statistics_util as stats_u
+from aimet_common.utils import AimetLogger
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Svd)
+
+_SVD_TYPES = {'svd': pymo.TYPE_SINGLE,
+              'ssvd': pymo.TYPE_SUCCESSIVE}
+_SVD_LAYER_TYPES = {'Conv2D': pymo.LAYER_TYPE_CONV,
+                    'MatMul': pymo.LAYER_TYPE_FC}
+
+_MIN_LAYER_DIM_FOR_SVD = 10
+_SVD_SUPPORTED_LAYER_TYPES = ['Conv2D', 'MatMul']
+
+
+class CostMetric(Enum):
+    """ Enumeration of metrics to measure cost of a model/layer """
+    mac = 1
+    memory = 2
+
+
+class LayerAttributes:
+    """ Holds attributes for a given layer """
+
+    def __init__(self, layer_ref, cost, weight_shape):
+        """
+        Constructor
+        :param layer_ref: Reference to the layer object in TensorFlow
+        :param cost: Cost of the layer
+        :param weight_shape: Shape of the output activation of the layer
+        """
+        self.layer_ref = layer_ref
+        self.cost = cost
+        self.weight_shape = weight_shape
+
+
+
[docs]class Svd: + """A class for performing singular value decomposition on a tensorflow model. + + The Svd class enables model compression through singular value decomposition (SVD). + It can analyze convolution and fully connected layers and perform + some analysis to find the optimal ranks for balancing compression and the + accuracy of the network. + """ + # pylint: disable=too-many-instance-attributes + + def __init__(self, graph, checkpoint, metric, output_file='./svd_graph', svd_type='svd', + num_layers=0, layers=None, layer_ranks=None, num_ranks=20, gpu=True, debug=False, no_evaluation=False, + layer_selection_threshold=0.6): + """ + Constructor for the Svd class + + Constructs the Svd class from a set of options passed in at construction. The class takes + a number of named arguments which are detailed below. + + :param graph: The file path to the meta graph. + :param checkpoint: The file path to the tensorflow checkpoint file. + :param metric: The metric to use for determining the optimal compression. Either + 'mac' for optimizing compression to minimize multiplies and accumulates or 'memory' which + optimizes for overall memory footprint. Defaults to 'memory' + :param output_file: The file path for saving the compressed tensorflow graph. + aimet will save to the directory specified, using output_file as a filename prefix + :param svd_type: Indicates which algorithm should be used, either + 'svd' or 'ssvd'. Defaults to 'svd'. + :param num_layers: The number of layers to compress. Defaults to '0' which uses a + heuristic to determine the optimal number of layers to compress. + :param layers: A list of op names to compress. All other layers will be ignored. + Overrides num_layers and sets it to the length of this list. + :param layer_ranks: required only if no_evaluation is set to True. A list of tuples to compress + layers specified in layers argument. + :param num_ranks: The number of ranks (compression_points) to evaluate for compression. + Defaults to 20. Value should be greater than 2. + :param gpu: Indicates if the algorithm should run on GPU or CPU. Defaults to GPU. To + use CPU set to false + :param debug: If true debug messages will be printed. Defaults to False. + :param no_evaluation: If true, ranks will be set manually from user. Defaults to False. + :param layer_selection_threshold: Threshold (0-1) to use to select the top layers in the network + + :raises: ValueError: An error occurred processing one of the input parameters. + """ + # pylint: disable=too-many-arguments + + self._sanity_check_constructor_parameters(layer_selection_threshold, layers, no_evaluation, num_layers, + num_ranks, svd_type) + + self._gpu = gpu + self._debug = debug + self._default_meta_graph = graph + self._default_checkpoint = checkpoint + self._output_file = output_file + self._output_dir = os.path.dirname(output_file) + if not os.path.exists(self._output_dir): + os.makedirs(self._output_dir) + logger.info('Saving SVD output as: %s', output_file) + + self.svd_type = _SVD_TYPES[svd_type] + + self._metric = metric + + self._num_layers = num_layers + + self._selected_layers = [] + self._networkCost = None + + if layers: + logger.debug('Attempting to compress: %s', layers) + self._layers_to_compress = layers + else: + self._layers_to_compress = [] + + if num_ranks < 0: + raise ValueError("num_ranks must be >= 0") + self._num_ranks = num_ranks + + if layer_ranks: + self._layer_ranks = layer_ranks + self._num_layer_ranks = len(layer_ranks) + logger.debug('Attempting to compress model with user provided ranks : %s', layer_ranks) + + # Setup the SVD instance and load the graph + self._svd = pymo.GetSVDInstance() + self._no_eval = no_evaluation + self._layer_selection_threshold = layer_selection_threshold + self._model_performance_candidate_ranks = list() + + # Todo: Need to look at these attributes and see how to handle them better + # Very likely these attributes don't need to be object attributes + self._generator = None + self._eval_names = None + self._eval_func = None + self._iterations = None + self._run_graph = None + self._baseline_perf = None + self._error_margin = None + self._compressible_ops = None + + @staticmethod + def _sanity_check_constructor_parameters(layer_selection_threshold, layers, no_evaluation, num_layers, + num_ranks, svd_type): + if svd_type not in _SVD_TYPES: + raise ValueError('Invalid SVD mode: ' + svd_type) + if no_evaluation: + if not layers: + raise ValueError('Both layers and layer_rank parameters are needed for Manual mode') + if layer_selection_threshold < 0 or layer_selection_threshold > 1: + raise ValueError('Layer selection threshold should be between 0 and 1') + if not no_evaluation: + if num_ranks <= 2: + raise ValueError('Number of ranks should be greater than 2 for auto mode') + if num_layers < 0: + raise ValueError("num_layers must be >= 0") + + def _compute_per_layer_compression_ratio(self, split_layers_shape, output_shape, original_layer_shape, op_type): + """ + Updates the per layer statistics + + :param orig_layer: The layer before it was split + :param split_layers: List of split layers + :return: The compression ratio of split layers + """ + orig_layer_cost = self._compute_layer_cost(original_layer_shape, output_shape, op_type) + + split_layers_mem_cost = 0 + split_layers_mac_cost = 0 + + for layer_shape in split_layers_shape: + mem_cost, mac_cost = self._compute_layer_cost(layer_shape, output_shape, op_type) + if not isinstance(mem_cost, int): + mem_cost = mem_cost.value + if not isinstance(mac_cost, int): + mac_cost = mac_cost.value + split_layers_mem_cost += mem_cost + split_layers_mac_cost += mac_cost + + if self._metric is CostMetric.memory: + savings = orig_layer_cost[0] - split_layers_mem_cost + ratio = savings / orig_layer_cost[0] + logger.debug('Original Layer Cost: %s Memory Compression Ratio: %s', orig_layer_cost[0], ratio) + else: + savings = orig_layer_cost[1] - split_layers_mac_cost + ratio = savings / orig_layer_cost[1] + logger.debug('Original Layer Cost: %s MAC Compression Ratio: %s', orig_layer_cost[1], ratio) + + return ratio + + @staticmethod + def _reset_session(sess): + """ + Reset the given tf.compat.v1.Session + :param sess: tf.compat.v1.Session + :return: None + """ + tf.compat.v1.reset_default_graph() + sess.close() + + @staticmethod + def _load_graph(graph, meta_graph, checkpoint): + """ + Load a graph and checkpoint and create a new tf.compat.v1.Session + :param graph: TF graph + :param meta_graph: Meta file + :param checkpoint: Checkpoint file + :return: Newly created session + """ + logger.info('Loading graph: %s', meta_graph) + sess = tf.compat.v1.Session(graph=graph) + + # Open the graph and retore the parameters + saver = tf.compat.v1.train.import_meta_graph(meta_graph) + saver.restore(sess, checkpoint) + return sess, saver + + @staticmethod + def _get_layer_type(op): + """ + Converts TF layer types into corresponding PyMo layer enumerated values + :param op: TF op + :return: PyMo enumerated value corresponding to the type of op + """ + if op.type in _SVD_LAYER_TYPES: + return _SVD_LAYER_TYPES[op.type] + return pymo.LAYER_TYPE_OTHER + + class LayerSelectionScheme(Enum): + """ Enumeration of schemes supported to select layers for SVD compression """ + manual = 1 + top_n_layers = 2 + top_x_percent = 3 + + @staticmethod + def _pick_compression_layers(sess, cost_metric, layer_select_scheme, **kwargs): + """ + Pick layers for SVD compression given parameters + :param sess: tf.compat.v1.Session + :param cost_metric: Metric to use for evaluating layer cost (either in terms of memory or mac) + :param layer_select_scheme: Layer selection scheme to use + :param kwargs: Keyword arguments that depend on which layer selection scheme is specified + top_n_layers:: num_layers: Number of layers to pick + top_x_percent:: percent_thresh: Top layers up to this parameter will be selected + manual:: layers_to_compress: List of layers (names) to compress + :return: + """ + # pylint: disable=too-many-locals,too-many-branches + + if not isinstance(cost_metric, CostMetric): + raise TypeError("cost_metric is not of type CostMetric") + + if not isinstance(layer_select_scheme, Svd.LayerSelectionScheme): + raise TypeError("layer_selection_scheme is not of type Svd.LayerSelectionScheme") + + # Find all compressible ops + query = core.OpQuery(sess.graph) + compressible_ops = query.get_weight_ops() + compressible_ops = [op for op in compressible_ops if op.type in _SVD_SUPPORTED_LAYER_TYPES] + + layer_attributes_list = Svd._create_layer_attributes_list(compressible_ops, sess) + network_cost = Svd._compute_network_cost(layer_attributes_list) + + # Heuristic1: Reject any ops whose param shape does not meet a base criterion + pruned_list = [] + for layer_attributes in layer_attributes_list: + h, w, n, c = layer_attributes.weight_shape + if (n >= _MIN_LAYER_DIM_FOR_SVD) and ((c * h * w) >= _MIN_LAYER_DIM_FOR_SVD): + pruned_list.append(layer_attributes) + else: + print("Pruning out {}: shape is {}".format(layer_attributes.layer_ref.name, + layer_attributes.weight_shape)) + + # Reset layer_attributes_list for the next phase + layer_attributes_list = pruned_list + pruned_list = [] + + # Sort the attribute list based on cost + if cost_metric == CostMetric.memory: + layer_attributes_list.sort(key=lambda x: x.cost[0], reverse=True) + else: + layer_attributes_list.sort(key=lambda x: x.cost[1], reverse=True) + + if layer_select_scheme == Svd.LayerSelectionScheme.top_n_layers: + num_layers = kwargs['num_layers'] + pruned_list = layer_attributes_list[:num_layers] + + elif layer_select_scheme == Svd.LayerSelectionScheme.top_x_percent: + percent_thresh = kwargs['percent_thresh'] + accum_cost = 0. + total_cost = network_cost[0] if (cost_metric == CostMetric.memory) else network_cost[1] + + for layer in layer_attributes_list: + cost = layer.cost[0] if (cost_metric == CostMetric.memory) else layer.cost[1] + + if (100 * (cost + accum_cost)/total_cost) < percent_thresh: + pruned_list.append(layer) + accum_cost += cost + + elif layer_select_scheme == Svd.LayerSelectionScheme.manual: + layers_to_compress = kwargs['layers_to_compress'] + for layer in layer_attributes_list: + if layer.layer_ref.name in layers_to_compress: + pruned_list.append(layer) + + if not pruned_list: + raise RuntimeError('No suitable layers found in the model.') + return pruned_list, network_cost + + + @staticmethod + def _create_layer_attributes_list(ops_to_use, sess): + """ + Creates list of layer attributes given a set of TF ops + :param ops_to_use: TF ops to collect layer attributes for + :param sess: tf.compat.v1.Session to use + :return: Created list of layer attributes + """ + query = core.OpQuery(sess.graph) + layer_attributes_list = [] + for op in ops_to_use: + + weight_shape = query.get_weights_for_op(op).eval(session=sess).shape + if op.type == 'MatMul': + n, c = weight_shape + weight_shape = (1, 1, n, c) + output_dims = op.outputs[0].shape + + cost = Svd._compute_layer_cost(weight_shape, output_dims, op.type) + + + layer_attributes_list.append(LayerAttributes(op, cost, weight_shape)) + + return layer_attributes_list + + @staticmethod + def _compute_network_cost(layer_attributes_list): + """ + Compute aggregate cost of the layers included in the layer attributes list + :param layer_attributes_list: List of layer attributes + :return: Computed cost + """ + mac_cost = 0 + mem_cost = 0 + for layer_attributes in layer_attributes_list: + op_mem_cost, op_mac_cost = layer_attributes.cost + mem_cost += op_mem_cost + mac_cost += op_mac_cost + + return mem_cost, mac_cost + + @staticmethod + def _compute_layer_cost(weights_shape, output_dims, op_type): + """ + Compute cost of a layer + :param weights_shape: Shape of the weights of this layer + :param output_dims: Shape of the output of this layer + :param op_type: Type of this TF op + :return: Computed layer cost + """ + # for outputs, TF uses dims [N,H,W,C] + mem_cost = reduce(operator.mul, weights_shape) + + if op_type == 'Conv2D': + mac_cost = mem_cost * int(output_dims[1]) * int(output_dims[2]) + elif op_type == 'MatMul': + mac_cost = mem_cost + + return mem_cost, mac_cost + + def _compute_compression_ratio(self, sess, cost_metric): + """ + Compute compression ratio + :param sess: tf.compat.v1.Session + :return: Computed compression ratio + """ + query = core.OpQuery(sess.graph) + compressible_ops = query.get_weight_ops() + compressible_ops = [op for op in compressible_ops if op.type in _SVD_SUPPORTED_LAYER_TYPES] + + layer_attributes_list = Svd._create_layer_attributes_list(compressible_ops, sess) + selected_layers_ops = [layer.layer_ref.name for layer in self._selected_layers] + layer_attributes_list = [layer for layer in layer_attributes_list if layer.layer_ref.name not in selected_layers_ops] + compressed_network_cost = Svd._compute_network_cost(layer_attributes_list) + + if cost_metric is CostMetric.memory: + savings = self._networkCost[0] - compressed_network_cost[0] + ratio = savings/self._networkCost[0] + + else: + savings = self._networkCost[1] - compressed_network_cost[1] + ratio = savings/self._networkCost[1] + + return ratio + + def _store_net_stats(self, sess): + """ + Store layer attributes in the PyMo library instance + :param sess: tf.compat.v1.Session + :return: None + """ + # pylint: disable=too-many-locals,too-many-branches,too-many-statements + + if self._metric == CostMetric.memory: + pymo_metric = pymo.COST_TYPE_MEMORY + else: + pymo_metric = pymo.COST_TYPE_MAC + + self._svd.SetCostMetric(pymo_metric) + + # Layer-selection + if self._layers_to_compress: + selected_layers, network_cost = self._pick_compression_layers(sess, + self._metric, + self.LayerSelectionScheme.manual, + layers_to_compress=self._layers_to_compress) + elif self._num_layers > 0: + selected_layers, network_cost = self._pick_compression_layers(sess, + self._metric, + self.LayerSelectionScheme.top_n_layers, + num_layers=self._num_layers) + else: + percent_thresh = self._layer_selection_threshold * 100 + selected_layers, network_cost = self._pick_compression_layers(sess, + self._metric, + self.LayerSelectionScheme.top_x_percent, + percent_thresh=percent_thresh) + + self._networkCost = network_cost + + print("Selected Layers:") + for layer in selected_layers: + print(layer.layer_ref.name) + + self._selected_layers = selected_layers + + # Get the op query module and query for all Conv/FC layers + query = core.OpQuery(sess.graph) + self._compressible_ops = query.get_weight_ops() + + # Set up the layer attributes for each Conv/FC layer (this also checks for trailing + # bias adds + for i, op in enumerate(self._compressible_ops): + + # If op is not a selected layer, skip + if not any(op is layer.layer_ref for layer in selected_layers): + continue + + attr = pymo.LayerAttributes() + layerName = op.name + output_dims = op.outputs[0].shape # TF uses dims [N,H,W,C] + attr.layerType = self._get_layer_type(op) + if self.svd_type == pymo.TYPE_SINGLE: + attr.mode = self._svd.GetCompressionType(attr.layerType, 'single') + else: + attr.mode = self._svd.GetCompressionType(attr.layerType, 'successive') + + if op.type == 'Conv2D' or op.type == 'MatMul': + logger.info('Setting layer attributes for: %s', layerName+'('+op.type+')') + + # Get weights + weights = query.get_weights_for_op(op).eval(session=sess) + w_shape = weights.shape + logger.debug('Got weight shape: %s', w_shape) + + # Check for bias op + bias = None + if (i+1) < len(self._compressible_ops): + bias = query.get_bias_for_op(self._compressible_ops[i+1]) + if bias is not None: + bias = bias.eval(session=sess) + logger.debug('Got %s w/bias. Shape: %s', op.type, str(bias.shape)) + + if op.type == 'Conv2D': + attr.shape = [w_shape[3], w_shape[2], w_shape[0], w_shape[1]] # TF Conv weight order [KH,KW,ID,OD] + attr.activation_dims = (output_dims[1], output_dims[2]) # (H,W) + + # CONV weights are stored in the order {H,W,I,O} in Tensorflow + # Re-order them to the form {O,I,H,W} + weights = np.transpose(weights, (3, 2, 0, 1)) + + elif op.type == 'MatMul': + attr.shape = [w_shape[1], w_shape[0], 1, 1] # TF FC weight order [ID,OD], SVD expects [OD,ID] + attr.activation_dims = (1, 1) + weights = np.transpose(weights, (1, 0)) + + # blobs is a numpy array... add to list then set + params = [weights.flatten()] + if bias is not None: + params.append(bias.flatten()) + attr.blobs = params + + # Save the attributes for this layer + self._svd.StoreLayerAttributes(layerName, attr) + + def _compute_objective_score(self, model_perf, compression_score): + """ + Compute objective score of a given compression model + :param model_perf: Performance of compressed model + :param compression_score: Compression ratio + :return: Computed objective score + """ + if model_perf + (self._error_margin / 100) >= self._baseline_perf: + objective_score = 1 - model_perf + (1 - compression_score) + else: + objective_score = 1 + (1 - compression_score) # treat lower accuracies as 0 + + return objective_score + + def _split_conv_layer(self, sess, svd_ranks, attr, op_name, bias_op_name=None): + """ + Split a given conv layer given a rank + :param sess: tf.compat.v1.Session + :param svd_ranks: Rank to split the layer with (two ranks in case of SSVD) + :param attr: Reference to the corresponding layer attribute + :param op_name: Name of the op to split + :param bias_op_name: Name of the corresponding bias op (if any) + :return: None + """ + # pylint: disable=too-many-statements,too-many-branches,too-many-locals + + logger.info('Splitting conv op: %s', op_name) + + # Retrieve the op(s) from the current graph + op = sess.graph.get_operation_by_name(op_name) + + bias_op = None + if bias_op_name: + bias_op = sess.graph.get_operation_by_name(bias_op_name) + + # Create new 'conv_a' layer + pad_mode = op.get_attr('padding') + data_format = op.get_attr('data_format').decode('utf-8') + strides = op.get_attr('strides') + + # Print current conv weight shape + query = core.OpQuery(sess.graph) + w_shape = query.get_weights_for_op(op).get_shape().as_list() + logger.debug('Original %s weight shape: %s', op.name, str(w_shape)) + split_weights, weight_sizes = [], [] + split_biases, bias_sizes = [], [] + + # TF weights are in [H,W,I,O] order. We must reshape the split weights to SVD format [O,I,H,W] + # and then transpose back + # Conv a weights are: [1, 1, w_shape[2], svd_ranks[0]] + split_conv_a_w_shape = (svd_ranks[0], w_shape[2], 1, 1) + conv_a_weights = np.zeros(split_conv_a_w_shape) # transpose(2,3,1,0) + split_weights.append(conv_a_weights.flatten().tolist()) + weight_sizes.append(conv_a_weights.size) + if bias_op: + conv_a_bias = np.zeros(svd_ranks[0]) + split_biases.append(conv_a_bias.flatten().tolist()) + bias_sizes.append(conv_a_bias.size) + + num_filters = w_shape[3] + if len(svd_ranks) >= 2 and attr.mode == pymo.TYPE_SUCCESSIVE: + # Output channels = output_rank (s) + num_filters = svd_ranks[1] + + # Conv b weights are: [w_shape[0],w_shape[1],svd_ranks[0],num_filters] + split_conv_b_w_shape = (num_filters, svd_ranks[0], w_shape[0], w_shape[1]) + conv_b_weights = np.zeros(split_conv_b_w_shape) + conv_b_bias = np.zeros(num_filters) + split_weights.append(conv_b_weights.flatten().tolist()) + weight_sizes.append(conv_b_weights.size) + if bias_op: + split_biases.append(conv_b_bias.flatten().tolist()) + bias_sizes.append(conv_b_bias.size) + + # Only create a third conv layer when performing successive SVD + if len(svd_ranks) >= 2 and attr.mode == pymo.TYPE_SUCCESSIVE: + # Conv c weights are: [1,1,num_filters,w_shape[3]] + split_conv_c_w_shape = (w_shape[3], num_filters, 1, 1) + conv_c_weights = np.zeros(split_conv_c_w_shape) + conv_c_bias = np.zeros(w_shape[3]) + split_weights.append(conv_c_weights.flatten().tolist()) + weight_sizes.append(conv_c_weights.size) + if bias_op: + split_biases.append(conv_c_bias.flatten().tolist()) + bias_sizes.append(conv_c_bias.size) + + # Split the weights and biases according to the number of layers and ranks + split_weights = self._svd.SplitLayerWeights(op.name, split_weights, weight_sizes, svd_ranks) + split_biases = self._svd.SplitLayerBiases(op.name, split_biases, bias_sizes, svd_ranks) + if split_weights: + conv_a_name = op.name+'_a' + conv_a_weights = np.array(split_weights[0]).reshape(split_conv_a_w_shape).transpose(2, 3, 1, 0) + conv_a_w = tf.Variable(initial_value=conv_a_weights, name=conv_a_name+'_w', dtype=tf.float32) + logger.debug('%s weight shape: %s', conv_a_name, str(conv_a_weights.shape)) + + # Create conv_a using default strides (1,1) + # pylint: disable=no-member + conv_acts = tf.nn.conv2d(op.inputs[0], conv_a_w, strides=[1, 1, 1, 1], data_format=data_format, + padding=pad_mode, name=op.name+'_a') # dilation_rate=dilation_rate + if bias_op: + conv_a_bias = tf.Variable(initial_value=split_biases[0], name=conv_a_name+'_bias', dtype=tf.float32) + conv_acts = conv_acts + conv_a_bias # tf.nn.bias_add(conv_acts, split_biases[0]) + + if len(split_weights) > 1: + # Create conv_b + conv_b_name = op.name+'_b' + conv_b_weights = np.array(split_weights[1]).reshape(split_conv_b_w_shape).transpose(2, 3, 1, 0) + conv_b_w = tf.Variable(initial_value=conv_b_weights, name=conv_b_name+'_w', dtype=tf.float32) + logger.debug('%s weight shape: %s', conv_b_name, str(conv_b_weights.shape)) + + # pylint: disable=no-member + conv_acts = tf.nn.conv2d(conv_acts, conv_b_w, strides=strides, data_format=data_format, padding=pad_mode, name=conv_b_name) #dilation_rate=dilation_rate + if bias_op: + conv_b_bias = tf.Variable(initial_value=split_biases[1], name=conv_b_name+'_bias', dtype=tf.float32) + conv_acts = conv_acts + conv_b_bias # tf.nn.bias_add(conv_acts, split_biases[1]) + ratio = self._compute_per_layer_compression_ratio([conv_a_w.shape, conv_b_w.shape], conv_acts.shape, w_shape, "Conv2D") + # Only create a third conv layer when performing successive SVD + if len(split_weights) > 2 and len(svd_ranks) >= 2 and attr.mode == pymo.TYPE_SUCCESSIVE: + # Create conv_c, using default strides (1,1) + conv_c_name = op.name+'_c' + conv_c_weights = np.array(split_weights[2]).reshape(split_conv_c_w_shape).transpose(2, 3, 1, 0) + conv_c_w = tf.Variable(initial_value=conv_c_weights, name=conv_c_name+'_w', dtype=tf.float32) + logger.debug('%s weight shape: %s', conv_c_name, str(conv_c_weights.shape)) + + # pylint: disable=no-member + conv_acts = tf.nn.conv2d(conv_acts, conv_c_w, strides=[1, 1, 1, 1], data_format=data_format, + padding=pad_mode, name=conv_c_name) + if bias_op: + conv_c_bias = tf.Variable(initial_value=split_biases[2], name=conv_c_name+'_bias', dtype=tf.float32) + conv_acts = conv_acts + conv_c_bias # tf.nn.bias_add(conv_acts, split_biases[2]) + + consumers = [] + rerouted_inputs = [bias_op.outputs[0]] if bias_op else [op.outputs[0]] + for inp in rerouted_inputs: + for consumer in inp.consumers(): + consumers.append(consumer) + _ = graph_editor.reroute_ts(conv_acts, rerouted_inputs, can_modify=consumers) + + return ratio + + def _split_fc_layer(self, sess, svd_ranks, op_name, bias_op_name=None): + """ + Split a given conv layer given a rank + :param sess: tf.compat.v1.Session + :param svd_ranks: Rank to split the layer with (two ranks in case of SSVD) + :param op_name: Name of the op to split + :param bias_op_name: Name of the corresponding bias op (if any) + :return: None + """ + # pylint: disable=too-many-statements, too-many-locals + + logger.info('Splitting fully connected op: %s', op_name) + + # Retrieve the op(s) from the current graph + op = sess.graph.get_operation_by_name(op_name) + bias_op = None + if bias_op_name: + bias_op = sess.graph.get_operation_by_name(bias_op_name) + + # Print current conv weight shape + query = core.OpQuery(sess.graph) + w_shape = query.get_weights_for_op(op).get_shape().as_list() + logger.debug('Original %s weight shape: %s', op.name, str(w_shape)) + split_weights, weight_sizes = [], [] + split_biases, bias_sizes = [], [] + + # FC weights are: [w_shape[2],svd_ranks[0]] in [I,O] order. + # We must reshape the split weights to SVD format [O,I] and then transpose to NHWC + split_fc_a_w_shape = (svd_ranks[0], w_shape[0]) + fc_a_weights = np.zeros(split_fc_a_w_shape) + fc_a_bias = np.zeros(svd_ranks[0]) + split_weights.append(fc_a_weights.flatten().tolist()) + weight_sizes.append(fc_a_weights.size) + if bias_op: + split_biases.append(fc_a_bias.flatten().tolist()) + bias_sizes.append(fc_a_bias.size) + + # FC b weights are: [svd_ranks[0],num_filters] in [H,W,I,O] order. + # We must reshape the split weights to SVD format [O,I,H,W] and then transpose to NHWC + split_fc_b_w_shape = (w_shape[1], svd_ranks[0]) + fc_b_weights = np.zeros(split_fc_b_w_shape) + split_weights.append(fc_b_weights.flatten().tolist()) + weight_sizes.append(fc_b_weights.size) + if bias_op: + fc_b_bias = np.zeros(w_shape[1]) + split_biases.append(fc_b_bias.flatten().tolist()) + bias_sizes.append(fc_b_bias.size) + + # Split the weights and biases according to the number of layers and ranks + split_weights = self._svd.SplitLayerWeights(op.name, split_weights, weight_sizes, svd_ranks) + split_biases = self._svd.SplitLayerBiases(op.name, split_biases, bias_sizes, svd_ranks) + + if split_weights: + fc_a_name = op.name+'_a' + fc_a_weights = np.array(split_weights[0]).reshape(split_fc_a_w_shape).transpose(1, 0) + fc_a_w = tf.Variable(initial_value=fc_a_weights, name=fc_a_name+'_w', dtype=tf.float32) + logger.debug('%s weight shape: %s', fc_a_name, str(fc_a_weights.shape)) + + # Create fc_a using default strides (1,1) + fc_acts = tf.matmul(op.inputs[0], fc_a_w, name=fc_a_name) + if bias_op: + fc_a_bias = tf.Variable(initial_value=split_biases[0], name=fc_a_name+'_bias', dtype=tf.float32) + fc_acts = fc_acts + fc_a_bias + + if len(split_weights) > 1: + # Create fc_b + fc_b_name = op.name+'_b' + fc_b_weights = np.array(split_weights[1]).reshape(split_fc_b_w_shape).transpose(1, 0) + fc_b_w = tf.Variable(initial_value=fc_b_weights, name=fc_b_name+'_w', dtype=tf.float32) + logger.debug('%s weight shape: %s', fc_b_name, str(fc_b_weights.shape)) + fc_acts = tf.matmul(fc_acts, fc_b_w, name=fc_b_name) + if bias_op: + fc_b_bias = tf.Variable(initial_value=split_biases[1], name=fc_b_name+'_bias', dtype=tf.float32) + fc_acts = fc_acts + fc_b_bias + ratio = self._compute_per_layer_compression_ratio([fc_a_w.shape, fc_b_w.shape], fc_acts.shape, w_shape, 'MatMul') + consumers = [] + rerouted_inputs = [bias_op.outputs[0]] if bias_op else [op.outputs[0]] + for inp in rerouted_inputs: + for consumer in inp.consumers(): + consumers.append(consumer) + _ = graph_editor.reroute_ts(fc_acts, rerouted_inputs, can_modify=consumers) + return ratio + + def _split_layers(self, sess, rank_index, use_best_ranks): + """ + Split all the selected layers given a rank index + :param sess: tf.compat.v1.Session + :param rank_index: Rank index to use for finding the ranks + :param use_best_ranks: Use the best rank index (for final compressed network) + :return: None + """ + layer_stats = list() + for i, op in enumerate(self._compressible_ops): + + # If op is not a selected layer, skip + if not any(op is layer.layer_ref for layer in self._selected_layers): + continue + + # Bias is taken care of as part of the Conv/FC op + if op.type in ['Add', 'BiasAdd']: + continue + + # Get the stored attributes for this op + attr = self._svd.GetLayerAttributes(op.name) + if not attr: + raise RuntimeError("Layer attributes not available for layer"+op.name) + + if use_best_ranks: + svd_ranks = attr.bestRanks + else: + svd_ranks = self._svd.GetCandidateRanks(op.name, rank_index) + if svd_ranks: + bias_op = None + if i+1 < len(self._compressible_ops): + bias_op = self._compressible_ops[i+1] + bias_op = bias_op.name if bias_op.type in ['Add', 'BiasAdd'] else None + if op.type in ['Conv2D']: + ratio = self._split_conv_layer(sess, svd_ranks, attr, op.name, bias_op) + elif op.type in ['MatMul']: + ratio = self._split_fc_layer(sess, svd_ranks, op.name, bias_op) + per_layer_stats = stats_u.SvdStatistics.PerSelectedLayer(op.name, svd_ranks, ratio) + layer_stats.append(per_layer_stats) + return layer_stats + + def _create_compressed_network(self, sess, rank_index, use_best_ranks): + """ + Create a compressed network for a given rank index + :param sess: tf.compat.v1.Session + :param rank_index: Rank index to use for finding the ranks + :param use_best_ranks: Use the best rank index (for final compressed network) + :return: None + """ + # Split the network layers and update the connections + per_layer_stats = self._split_layers(sess, rank_index, use_best_ranks) + return per_layer_stats + + def _perform_rank_selection(self): + """ + Perform rank selection procedure + :return: None + """ + # pylint: disable=too-many-locals + stats_per_rank_index = list() + self._svd.ComputeNetworkCost() + self._num_ranks = self._svd.SetCandidateRanks(self._num_ranks) + + if not self._num_ranks: + raise RuntimeError('No good candidate ranks found for compressing specified layers.') + + # Ranks are in order from least compression to highest + best_index = -1 + optimal_score = 0.0 + + for rank_index in range(self._num_ranks): + g = tf.Graph() + with g.as_default(): + # Create a new network for each rank_index + self._svd.PrintCandidateRanks(rank_index, False) + + # Load the default graph so we are operating on a fresh copy of the original graph + sess, saver = self._load_graph(g, self._default_meta_graph, self._default_checkpoint) + per_layer_stats = self._create_compressed_network(sess, rank_index, False) + + # Save the temp model + output_file = os.path.join(self._output_dir, 'svd_rank_index_' + str(rank_index)) + self._save_graph(sess, saver, output_file) + + # Reset the session and start a new graph for loading the compressed model + self._reset_session(sess) + + g = tf.Graph() + with g.as_default(): + + # In TF after making changes to the graph you must save and reload, then evaluate + sess, saver = self._load_graph(g, output_file+'.meta', output_file) + model_perf = self._run_graph(sess, self._generator, self._eval_names, self._eval_func, self._iterations) + logger.info('%s performance: %s', output_file, str(model_perf)) + self._model_performance_candidate_ranks.append(model_perf * 100) + + # Estimate relative compression score for this rank_index + compression_score = self._compute_compression_ratio(sess, self._metric) + objective_score = self._compute_objective_score(model_perf, compression_score) + rank_data = stats_u.SvdStatistics.PerRankIndex(rank_index=rank_index, model_accuracy=model_perf, + model_compression_ratio=compression_score, + layer_stats_list=per_layer_stats) + stats_per_rank_index.append(rank_data) + + logger.info('Compressed network with rank_index %i/%i: accuracy = %f percent ' + 'with %f percent compression (%r option) and an objective score of %f', + rank_index, self._num_ranks, model_perf * 100, compression_score * 100, + self._metric, objective_score) + + if rank_index == 0: + optimal_score = objective_score + logger.info('Initializing objective score to %f at rank index %i', optimal_score, rank_index) + + if model_perf + self._error_margin/100 < self._baseline_perf: + logger.info('Model performance %f falls below %f percent of baseline performance %f' + ' Ending rank selection', model_perf, self._error_margin, self._baseline_perf) + break + + if objective_score <= optimal_score: + optimal_score = objective_score + logger.info('Found a better value for the objective score %f at rank_index %i', + optimal_score, rank_index) + best_index = rank_index + + if best_index != -1: + self._svd.StoreBestRanks(best_index) + memory_compression_ratio = self._compute_compression_ratio(sess, CostMetric.memory) + mac_compression_ratio = self._compute_compression_ratio(sess, CostMetric.mac) + stats = stats_u.SvdStatistics(self._baseline_perf, model_perf, self._metric, best_index, + mem_comp_ratio=memory_compression_ratio, mac_comp_ratio=mac_compression_ratio, + rank_stats_list=stats_per_rank_index) + # close the session and reset the default graph + self._reset_session(sess) + return stats + + # close the session and reset the default graph + self._reset_session(sess) + raise RuntimeError('No suitable ranks found to compress model within defined error bounds.') + + def manual_rank_svd(self): + """ + Set provided ranks in the PyMo library + :return: None + """ + # Store total net cost + self._svd.ComputeNetworkCost() + + # Ensure proper layer names are provided in no_eval mode + if not self._layer_ranks: + raise ValueError('Layer names MUST be specified in no_eval mode.') + + # Ensure layer_ranks is in list of tuples format + if not all(isinstance(item, tuple) for item in self._layer_ranks): + raise ValueError('layer_ranks should be in list of tuples format for both SVD and SSVD') + + # Check number of input ranks match with number of input layers + if len(self._layers_to_compress) != self._num_layer_ranks: + raise ValueError('Number of Input SVD ranks does not match number of layers.') + + for layer_name, rank in zip(self._layers_to_compress, self._layer_ranks): + rank_list = list() + rank_list.append(rank[1]) + if self.svd_type == _SVD_TYPES['ssvd']: + rank_list.append(rank[1]) + self._svd.StoreBestRanks(layer_name, rank_list) + stats = self._stats_for_manual_rank_svd() + return stats + + @staticmethod + def _save_graph(sess, saver, output_graph): + """ + Utility function to save a graph + :param sess: tf.compat.v1.Session + :param saver: TF save + :param output_graph: Filename and path for saving the output + :return: + """ + logger.info('Saving graph: %s', output_graph) + saver.save(sess, output_graph) + _ = tf.compat.v1.summary.FileWriter(os.path.dirname(output_graph)+"/models", sess.graph) + + def _save_compressed_network(self): + """ + Create and save a compressed network (using the best ranks identified) + :return: + """ + logger.info('Saving final compressed network') + g = tf.Graph() + with g.as_default(): + sess, saver = self._load_graph(g, self._default_meta_graph, self._default_checkpoint) + per_layer_stats = self._create_compressed_network(sess, 0, True) + + # Save the final network + self._save_graph(sess, saver, self._output_file) + self._reset_session(sess) + return per_layer_stats + + def _stats_for_manual_rank_svd(self): + per_layer_stats = self._save_compressed_network() + g = tf.Graph() + with g.as_default(): + # Load and evaluate the final network + sess, _ = self._load_graph(g, self._output_file+'.meta', self._output_file) + model_perf = self._run_graph(sess, self._generator, self._eval_names, self._eval_func, self._iterations) + logger.info('%s performance: %s', self._output_file, str(model_perf)) + + # Estimate relative compression score for this rank_index + self._svd.PrintCandidateRanks(0, True) + # Estimate relative compression score for this rank_index + compression_score = self._compute_compression_ratio(sess, self._metric) + logger.info('Evaluating final model using layer(s): %s. ' + 'Final accuracy = %f percent with %f percent compression (%r option).', + self._eval_names, model_perf*100, compression_score*100, self._metric) + + memory_compression_ratio = self._compute_compression_ratio(sess, + CostMetric.memory) + mac_compression_ratio = self._compute_compression_ratio(sess, + CostMetric.mac) + rank_data = stats_u.SvdStatistics.PerRankIndex(rank_index=0, model_accuracy=model_perf, + model_compression_ratio=compression_score, + layer_stats_list=per_layer_stats) + rank_data_list = list() + rank_data_list.append(rank_data) + stats = stats_u.SvdStatistics(self._baseline_perf, model_perf, self._metric, 0, + mem_comp_ratio=memory_compression_ratio, + mac_comp_ratio=mac_compression_ratio, + rank_stats_list=rank_data_list) + return stats + +
[docs] def compress_net(self, generator, eval_names=None, run_graph=graph_eval.evaluate_graph, + eval_func=graph_eval.default_eval_func, error_margin=2, iterations=100): + """ + Compresses the network using SVD + + Runs rank selection on the network, and compresses it using the method and parameters + passed during construction of the Svd object. + + :param generator: The generator which should be used for generating data for quantization + :param eval_names: The list of names to use for calculating model performance + :param run_graph: The function to use for running data through the graph and evaluating + the network's performance. This function must return only a single number representing the + avg performance of the model over the dataset batches. + See the 'graph_eval' module's 'evaluate_graph' function for the prototype + :param eval_func: The function to use for evaluating the network performance. This function should always + return a single number that can be used for comparing different graph's performance. + (The default is accuracy) + :param error_margin: The acceptable degradation in network accuracy from the original. + 1 for 1% drop, etc. Defaults to 2%. + :param iterations: The number of iterations (data batches) to run through the network for analysis + :return: An object containing compression statistics + + :raises: - ValueError: An invalid parameter was passed + - RuntimeError: An error occurred analyzing or compressing the network. The associated error + and other information will be returned with the error. + """ + + self._generator = generator + + if not eval_names: + eval_names = ['accuracy'] + + self._eval_names = eval_names + self._run_graph = run_graph + self._eval_func = eval_func + if error_margin <= 0: + raise ValueError('Invalid error_margin: '+str(error_margin)+'. Must pass error_margin > 0') + self._error_margin = error_margin + if iterations <= 0: + raise ValueError('Invalid iterations: '+str(iterations)+'. Number of iterations must be > 0') + self._iterations = iterations + + # Get baseline accuracy, then store the network stats + g = tf.Graph() + with g.as_default(): + sess, _ = self._load_graph(g, self._default_meta_graph, self._default_checkpoint) + self._baseline_perf = run_graph(sess, generator, eval_names, eval_func, iterations) + logger.info('Baseline performance: %f', self._baseline_perf) + self._store_net_stats(sess) + + self._reset_session(sess) + + if self._no_eval: + # Set Manual rank + stats = self.manual_rank_svd() + else: + # Perform rank selection + stats = self._perform_rank_selection() + self._save_compressed_network() + + return stats
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/utils/convert_tf_sess_to_keras.html b/releases/1.32.2/_modules/aimet_tensorflow/utils/convert_tf_sess_to_keras.html new file mode 100644 index 0000000..95dc102 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/utils/convert_tf_sess_to_keras.html @@ -0,0 +1,1304 @@ + + + + + + aimet_tensorflow.utils.convert_tf_sess_to_keras — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_tensorflow.utils.convert_tf_sess_to_keras

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2020, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+""" Utilities to convert TF session to Keras """
+# pylint: skip-file
+import shutil
+from typing import List, Tuple
+import tensorflow as tf
+
+
+
[docs]def save_tf_session_single_gpu(sess: tf.compat.v1.Session(), path: 'str', input_tensor: 'str', output_tensor: 'str'): + """ + Saves TF session, meta graph and variables in the provided path + + :param sess: Input: tf.compat.v1.Session + :param path: Path to save the session + :param input_tensor: Name of starting op to the given graph + :param output_tensor: Name of output op of the graph + :return: None + + """ + + # Initilzing the given Tensorflow session + with sess.graph.as_default(): + init = tf.compat.v1.global_variables_initializer() + sess.run(init) + + # Getting the input and output tensors of the graph using provided names + inputs = sess.graph.get_tensor_by_name(input_tensor) + train_out = sess.graph.get_tensor_by_name(output_tensor) + + # Saving the input session, meta graph and variables in the provided path + with sess.graph.as_default(): + train_signature = tf.compat.v1.saved_model.predict_signature_def(inputs={'x': inputs}, outputs={'out': train_out}) + shutil.rmtree(path, ignore_errors=True) + builder = tf.compat.v1.saved_model.Builder(path) + builder.add_meta_graph_and_variables(sess, ['serve'], signature_def_map={'train': train_signature}) + builder.save()
+ + +def change_name_of_compressed_op(x: str): + """ + Splits op name and adds kernel:0 to it + :param x: Name of op + :return: + """ + return x.split('/')[0]+'/kernel'+':0' + + +
[docs]def load_tf_sess_variables_to_keras_single_gpu(path: 'str', compressed_ops: List['str']) -> tf.compat.v1.keras.Model: + """ + Creates a Keras model subclass and loads the saved session, meta graph and variables to Keras model + + :param path: Path to load the tf session saved using save_session_graph_and_variables + :param compressed_ops: List of ops names skipped in Keras model creations. These are the the ops + that AIMET compressed and are isolated from rest of the graph. + :return: Subclassed Keras Model + + """ + + to_ignore = map(change_name_of_compressed_op, compressed_ops) + + class Model(tf.compat.v1.keras.Model): + """ Keras Model subclassing and loading the saved variables""" + def __init__(self): + super(Model, self).__init__() + self.imported = tf.compat.v1.saved_model.load_v2(path) + self.variables_list = [v for v in self.imported.variables if v.name not in to_ignore] + + def call(self, inputs, training=None): + """ + Creates a Keras model from the saved object in path + :param inputs: Input to model + :param training: If model is to be trained + :return: + """ + if training: + return self.imported.signatures['train'](inputs) + return self.imported.signatures['serving_default'](input) + + return Model()
+ + +
[docs]def save_as_tf_module_multi_gpu(loading_path: 'str', saving_path: 'str', compressed_ops: List['str'], input_shape: Tuple): + """ + Loads a Keras model and re-saves the loaded object in the form of tf.Module + + :param loading_path: Path to load the Keras Model + :param saving_path: Path to save the object + :param compressed_ops: List of ops names for which we need to skip in Keras model creation. These are the the + ops that AIMET compressed and are isolated from rest of the graph. + :param input_shape: shape of input to the model + :return: None + + """ + + def trace_model(inputs): + tf.keras.backend.set_learning_phase(1) + model = load_tf_sess_variables_to_keras_single_gpu(loading_path, compressed_ops) + train_out = model(inputs, training=True) + return train_out + + def export(): + tf.keras.backend.clear_session() + with tf.compat.v1.keras.backend.get_session() as sess: + + fn = tf.wrap_function(trace_model, signature=[tf.TensorSpec((None, input_shape[0], input_shape[1], + input_shape[2]), tf.float32)]) + train_fn = fn.prune(feeds=fn.inputs[0], fetches=fn.outputs[0]) + obj = tf.Module() + obj.variables_list = list(fn.graph.variables) + sess.run(tf.compat.v1.global_variables_initializer()) + tf.saved_model.save(obj, saving_path, {'train': train_fn, 'serving_default': train_fn}) + + export()
+ + +
[docs]def load_keras_model_multi_gpu(loading_path: 'str', input_shape: List): + """ + This function loads the Keras model back, which can be used for funetuning within a strategy + + :param loading_path: Path to load the Keras Model + :param input_shape: the shape of stating tensor in graph ; for instance (224,224,3) for ResNet50 and MoblinetV1 + :return: subclassed Keras model + """ + + class Model(tf.compat.v1.keras.Model): + """ Keras Model subclassing and loading the saved variables """ + def __init__(self): + super(Model, self).__init__() + self.imported = tf.compat.v1.saved_model.load_v2(loading_path) + self.variables_list = self.imported.variables_list + + def call(self, inputs, training=None): + """ + Creates a Keras model from the saved object in path + :param inputs: Input to model + :param training: If training is True or False + :return: + """ + if training: + return self.imported.signatures['train'](inputs) + return self.imported.signatures['serving_default'](inputs) + + tf.keras.backend.set_learning_phase(1) + + x = tf.keras.Input(shape=tuple(input_shape)) + return tf.compat.v1.keras.Model(x, Model()(x, training=True))
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_tensorflow/utils/graph.html b/releases/1.32.2/_modules/aimet_tensorflow/utils/graph.html new file mode 100644 index 0000000..54452cd --- /dev/null +++ b/releases/1.32.2/_modules/aimet_tensorflow/utils/graph.html @@ -0,0 +1,1240 @@ + + + + + + aimet_tensorflow.utils.graph — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_tensorflow.utils.graph

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2020, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+""" utilities for tf graph related operations """
+
+import os
+import tensorflow as tf
+from tensorflow.keras.models import load_model, save_model
+
+
+def op_not_in_loop_control_flow_context(graph: tf.Graph, input_op: tf.Operation) -> bool:
+    """
+    checks if the  op is not in loop control flow context or not
+    :param graph: tf.Graph is the active graph
+    :param input_op: op as tf.Operation
+    :return: True if op is not in a loop control flow context, False otherwise.
+    """
+    # pylint: disable=protected-access
+    active_ctxt = graph._get_control_flow_context()
+    input_ctxt = input_op._get_control_flow_context()
+
+    if not input_ctxt or input_ctxt is active_ctxt:
+        # input_op isn't in 'a' loop control flow context or
+        # input_op is in the same context as op.
+        return True
+
+    return False
+
+
+def updated_graph_flow_context_to_loop_context(graph: tf.Graph, preceeding_tensor: tf.Tensor):
+    """
+    updates graph flow context to loop context
+    :param graph: TensorFlow Graph (tf.Graph)
+    :param preceeding_tensor: TF tensor that feeds into the op which needs modification
+    :return: old graph context object
+    """
+
+    # pylint: disable=protected-access
+    old_graph_context = graph._get_control_flow_context()
+    graph._set_control_flow_context(preceeding_tensor.op._get_control_flow_context())
+
+    return old_graph_context
+
+
+def set_graph_flow_context(graph: tf.Graph, active_context):
+    """
+    sets graph context to active context provided
+    :param graph: TensorFlow Graph (tf.Graph)
+    :param active_context: context object to be set as current graph's context
+    :return:
+    """
+
+    # pylint: disable=protected-access
+    graph._set_control_flow_context(active_context)
+
+
+
[docs]def update_keras_bn_ops_trainable_flag(model: tf.keras.Model, trainable: bool, load_save_path: str) -> tf.keras.Model: + """ + helper method to update Keras BN ops trainable state in a given keras model. + :param model: Keras model to be updated with BN ops trainable flag + :param trainable: bool flag to indicate trainable to be set to true or false + :param load_save_path: temp folder to perform load/save, cleans up file created + :return: updated keras model + """ + + if not os.path.exists(load_save_path): + os.mkdir(load_save_path) + + output_file_with_path = os.path.join(load_save_path, 't.h5') + + # update BN ops trainable flag + for layer in model.layers: + if isinstance(layer, tf.keras.layers.BatchNormalization): + layer.trainable = trainable + save_model(model, output_file_with_path) + tf.compat.v1.keras.backend.clear_session() + model = load_model(output_file_with_path) + + # clean up file after use + if os.path.exists(output_file_with_path): + os.remove(output_file_with_path) + + # return updated keras model + return model
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/adaround/adaround_weight.html b/releases/1.32.2/_modules/aimet_torch/adaround/adaround_weight.html new file mode 100644 index 0000000..02503f9 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/adaround/adaround_weight.html @@ -0,0 +1,1771 @@ + + + + + + aimet_torch.adaround.adaround_weight — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_torch.adaround.adaround_weight

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Top level API for Adaptive Rounding - Post-Training Quantization (PTQ) """
+
+import os
+import contextlib
+import itertools
+import json
+import shutil
+from typing import Tuple, Union, Dict, List, Callable, Any, Optional
+import torch
+from torch.utils.data import DataLoader
+from tqdm import tqdm
+
+# Import AIMET specific modules
+from aimet_common.utils import AimetLogger, convert_configs_values_to_bool
+from aimet_common.defs import QuantScheme, QuantizationDataType
+
+from aimet_torch import utils
+from aimet_torch.save_utils import SaveUtils
+from aimet_torch.meta import connectedgraph_utils
+from aimet_torch.quantsim import QuantizationSimModel, QcQuantizeWrapper, ExportableQuantModule
+from aimet_torch.qc_quantize_op import StaticGridQuantWrapper, QcQuantizeOpMode
+from aimet_torch.tensor_quantizer import TensorQuantizer
+from aimet_torch.adaround.adaround_wrapper import AdaroundWrapper
+from aimet_torch.adaround.adaround_optimizer import AdaroundOptimizer
+from aimet_torch.adaround.adaround_loss import AdaroundHyperParameters
+from aimet_torch.adaround.activation_sampler import create_modulelist_for_group_modules, get_block_inputs, \
+    get_block_outputs, create_cached_block_schedule_list
+from aimet_torch.utils import get_named_module
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+# The following modules with weights are supported by Adaround
+AdaroundSupportedModules = (torch.nn.Conv2d, torch.nn.ConvTranspose2d, torch.nn.Linear)
+WORKING_DIR = '/tmp/adaround/'
+
+
+
[docs]class AdaroundParameters: + """ + Configuration parameters for Adaround + """ + def __init__(self, data_loader: DataLoader, num_batches: int, + default_num_iterations: int = None, default_reg_param: float = 0.01, + default_beta_range: Tuple = (20, 2), default_warm_start: float = 0.2, + forward_fn: Callable[[torch.nn.Module, Any], Any] = None): + """ + :param data_loader: Data loader + :param num_batches: Number of batches to be used for Adaround. + A commonly recommended value for this parameter is the smaller value among (1) len(data_loader) and (2) ceil(2000/batch_size) + :param default_num_iterations: Number of iterations to adaround each layer. + The default value is 10K for models with 8- or higher bit weights, and 15K for models with lower than 8 bit weights. + :param default_reg_param: Regularization parameter, trading off between rounding loss vs reconstruction loss. + Default 0.01 + :param default_beta_range: Start and stop beta parameter for annealing of rounding loss (start_beta, end_beta). + Default (20, 2) + :param default_warm_start: warm up period, during which rounding loss has zero effect. Default 20% (0.2) + :param forward_fn: Optional adapter function that performs forward pass given a model and inputs + yielded from the data loader. The function expects model as first argument and inputs to model + as second argument. + """ + if len(data_loader) < num_batches: + raise ValueError(f'Can not fetch {num_batches} batches from ' + f'a data loader of length {len(data_loader)}.') + + self.data_loader = data_loader + self.num_batches = num_batches + self.num_iterations = default_num_iterations + self.reg_param = default_reg_param + self.beta_range = default_beta_range + self.warm_start = default_warm_start + self.forward_fn = forward_fn
+ + +class Adaround: + """ + Weight-rounding mechanism for Post Training Quantization (PTQ) + """ + @classmethod + def apply_adaround(cls, model: torch.nn.Module, dummy_input: Union[torch.Tensor, Tuple], params: AdaroundParameters, + path: str, filename_prefix: str, default_param_bw: int = 4, + param_bw_override_list: List[Tuple[torch.nn.Module, int]] = None, + ignore_quant_ops_list: List[torch.nn.Module] = None, + default_quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + default_config_file: str = None) -> torch.nn.Module: + """ + Returns model with optimized weight rounding of every module (Conv and Linear) and also saves the + corresponding quantization encodings to a separate JSON-formatted file that can then be imported by + QuantSim for inference or QAT + + :param model: Model to Adaround + :param dummy_input: Dummy input to the model. Used to parse model graph. If the model has more than one input, + pass a tuple. User is expected to place the tensors on the appropriate device. + :param params: Parameters for Adaround + :param path: path where to store parameter encodings + :param filename_prefix: Prefix to use for filename of the encodings file + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters + :param param_bw_override_list: List of Tuples. Each Tuple is a module and the corresponding parameter bitwidth + to be used for that module. + :param ignore_quant_ops_list: Ops listed here are skipped during quantization needed for AdaRounding. Do not + specify Conv and Linear modules in this list. Doing so, will affect accuracy. + :param default_quant_scheme: Quantization scheme. Supported options are using Quant Scheme Enum + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced + :param default_config_file: Default configuration file for model quantizers + :return: Model with Adarounded weights and saves corresponding parameter encodings JSON file at provided path + """ + # pylint: disable=too-many-arguments + # Create Quant sim with given parameters + quant_sim = cls._get_quantsim(model, dummy_input=dummy_input, quant_scheme=default_quant_scheme, + default_param_bw=default_param_bw, + config_file=default_config_file) + + # For the modules in the param_bw_override_list, override the default parameter bitwidths in the QuantSim + if param_bw_override_list: + cls._override_param_bitwidth(model, quant_sim, param_bw_override_list) + + if ignore_quant_ops_list: + cls._exclude_modules(model, quant_sim, ignore_quant_ops_list) + + # Compute only param encodings + cls._compute_param_encodings(quant_sim) + + return cls._apply_adaround(quant_sim, model, dummy_input, params, path, filename_prefix) + + @classmethod + def _apply_adaround(cls, quant_sim: QuantizationSimModel, model: torch.nn.Module, + dummy_input: Union[torch.Tensor, Tuple], params: AdaroundParameters, + path: str, filename_prefix: str, checkpoints_config: str = None) -> torch.nn.Module: + """ + Returns model with optimized weight rounding of every module (Conv and Linear) and also saves the + corresponding quantization encodings to a separate JSON-formatted file that can then be imported by + QuantSim for inference or QAT + + :param quant_sim: QuantizationSimModel object to optimize weight rounding. + The activation quantizers are expected to have been disabled. + :param model: Original fp32 model from which quant_sim was created. + :param dummy_input: Dummy input to the model. Used to parse model graph. If the model has more than one input, + pass a tuple. User is expected to place the tensors on the appropriate device. + :param params: Parameters for Adaround + :param path: path where to store parameter encodings + :param filename_prefix: Prefix to use for filename of the encodings file + :param checkpoints_config: Config files to split fp32/quant model by checkpoints + :return: Model with Adarounded weights and saves corresponding parameter encodings JSON file at provided path + """ + + # Sanity check: All the input/output quantizers should be disabled + cls._check_input_output_quantizers_for_adaround(quant_sim.model) + + # Get the module - activation function pair using ConnectedGraph + module_act_func_pair = connectedgraph_utils.get_module_act_func_pair(model, dummy_input) + + cls._adaround_model(model, quant_sim, module_act_func_pair, params, dummy_input, checkpoints_config) + + # Export quantization encodings to JSON-formatted file + cls._export_encodings_to_json(path, filename_prefix, quant_sim) + + cls._remove_quantization_wrappers(quant_sim.model) + logger.info('Completed Adarounding Model') + return quant_sim.model + + @classmethod + def _adaround_model(cls, model: torch.nn.Module, quant_sim: QuantizationSimModel, module_act_func_pair: Dict, + params: AdaroundParameters, dummy_input: Union[torch.Tensor, Tuple], + checkpoints_config: str = None): + """ + Optimize weight rounding of every module (AdaroundSupportedModules) of model in sequential manner + based on occurrence + + NOTE: When checkpoints_config file is provided, assumption is that the outputs from previous group modules (block) + should feed directly into next group modules (block) + + :param model: Original fp32 model from which quant_sim was created. + :param quant_sim: QuantizationSimModel object to optimize weight rounding. + The activation quantizers are expected to have been disabled. + :param module_act_func_pair: Dictionary of module to immediate following activation function + :param params: Adaround parameters + :param dummy_input: Dummy input to the model + :param checkpoints_config: Config files to split fp32/quant model by checkpoints to speedup activations sampling + """ + # pylint: disable=too-many-locals, protected-access, too-many-branches, too-many-statements + + num_iterations = params.num_iterations + + if num_iterations is None: + lowest_weight_bw = cls._get_lowest_weight_bw(quant_sim.model) + # If the lowest wegith bitwidth is < 8, then set num_iterations to 15K by default + if lowest_weight_bw < 8: + num_iterations = 15000 + else: + num_iterations = 10000 + try: + # Cache model input data to WORKING_DIR + cached_dataset = utils.CachedDataset(params.data_loader, params.num_batches, WORKING_DIR) + + # Optimization Hyper parameters + opt_params = AdaroundHyperParameters(num_iterations, params.reg_param, params.beta_range, + params.warm_start) + + # AdaRound must be applied to modules in the order of occurrence + if checkpoints_config: + # Load the predefined json file for checkpoints info + checkpoint_config = json.load(open(checkpoints_config)) + convert_configs_values_to_bool(checkpoint_config) + + assert 'cache_on_cpu' in checkpoint_config.keys(), \ + "Please define cache_on_cpu to determine whether to cache intermediate tensors on CPU" + cache_on_cpu = checkpoint_config['cache_on_cpu'] + + checkpoint_type = checkpoint_config.get('checkpoint_type', 'sequential') + if checkpoint_type == 'sequential': + assert 'grouped_modules' in checkpoint_config.keys(), \ + "Please provide a dictionary of grouped_modules in the file to define checkpoints" + assert 'include_static_inputs' in checkpoint_config.keys(), \ + "Please provide a dictionary of include_static_inputs in the file to define checkpoints" + + grouped_modules = checkpoint_config['grouped_modules'] + breakpoint_module_name = checkpoint_config['grouped_modules'][list(grouped_modules.keys())[0]][0] + include_static_inputs = checkpoint_config['include_static_inputs'] + cached_fp_dataset, cached_quant_dataset = get_block_inputs(model, quant_sim, + breakpoint_module_name, + cached_dataset, cache_on_cpu, + params.forward_fn, params.num_batches, + WORKING_DIR) + # Get the device of model to latter be used to place input tensor on the same device + device = utils.get_device(model) + model.cpu() + quant_sim.model.cpu() + + # Forward function for the ModuleList object + def fwd_mod_ls(mod_ls, x): + for mod in mod_ls: + x = params.forward_fn(mod, x) + return x + + sub_fp_models, sub_sim_models = create_modulelist_for_group_modules(model, quant_sim, grouped_modules) + for i, (fp_block, quant_sim_block, static_input) in enumerate(zip(sub_fp_models, + sub_sim_models, + include_static_inputs)): + modules = utils.get_ordered_list_of_modules(fp_block, cached_fp_dataset[0], fwd_mod_ls) + cls._run_adaround_model(modules, fp_block, quant_sim_block, + module_act_func_pair, opt_params, + fwd_mod_ls, + cached_fp_dataset, cached_quant_dataset) + + # Get the outputs from the current block and assign to be the inputs for next block + # except for the last block + if i < len(sub_fp_models) - 1: + get_block_outputs(fp_block, quant_sim_block, static_input, + cached_fp_dataset, cached_quant_dataset, cache_on_cpu, + fwd_mod_ls, device, WORKING_DIR) + + # After finishing Adaround, placing the quant model back to its original device + quant_sim.model.to(device) + else: + assert 'cached_blocks' in checkpoint_config.keys(), \ + "Please provide a list of modules that can be cached" + + block_list = create_cached_block_schedule_list( + model, dummy_input, checkpoint_config['cached_blocks'], AdaroundSupportedModules) + + for block_cfg, modules in tqdm(block_list, desc='block'): + if block_cfg is None: # doesn't belong to a cached block + cls._run_adaround_model(modules, model, quant_sim.model, module_act_func_pair, opt_params, + params.forward_fn, cached_dataset) + else: + block_name, fp_block = block_cfg + quant_sim_block: torch.nn.Module = get_named_module(quant_sim.model, block_name) + + cached_fp_dataset, cached_quant_dataset = get_block_inputs(model, quant_sim, + block_name, + cached_dataset, cache_on_cpu, + params.forward_fn, + params.num_batches, + WORKING_DIR, + incl_kwargs=True) + + def block_fwd(_model, x): + return _model(*x) + + cls._run_adaround_model(modules, fp_block, quant_sim_block, module_act_func_pair, + opt_params, + block_fwd, cached_fp_dataset, cached_quant_dataset) + del cached_fp_dataset + del cached_quant_dataset + else: + modules = utils.get_ordered_list_of_modules(model, dummy_input) + cls._run_adaround_model(modules, model, quant_sim.model, module_act_func_pair, opt_params, + params.forward_fn, cached_dataset) + finally: + try: + logger.info('Deleting model inputs from location: %s', WORKING_DIR) + shutil.rmtree(WORKING_DIR) + except FileNotFoundError: + pass + + @classmethod + def _run_adaround_model(cls, modules: List, model: torch.nn.Module, quant_sim_model: torch.nn.Module, + module_act_func_pair: Dict, opt_params: AdaroundHyperParameters, forward_fn: Callable, + cached_dataset: utils.CachedDataset, + cached_quant_dataset: Optional[utils.CachedDataset] = None): + """ + Iterate through all modules to find out Adaround supported modules and + apply Adaround optimization to those modules + + :param modules: Candidate modules + :param model: Original fp32 model + :param quant_sim_model: QuantSim model + :param module_act_func_pair: Activation function pairs + :param opt_params: Optimization parameters + :param forward_fn: Adapter function that performs forward pass given a model and inputs + yielded from the data loader + :param cached_dataset: Cached dataset for the fp32 model + :param cached_quant_dataset: Cached dataset for the quant model + """ + # pylint: disable=too-many-arguments, too-many-locals, protected-access + for name, module in tqdm(modules): + if isinstance(module, AdaroundSupportedModules): + # Using name, get corresponding quantized wrapper module from Quant sim model + quant_wrapper = cls._get_quant_wrapper(quant_sim_model, name) + if not quant_wrapper: + continue + + # Wraps the quant module with adaround wrapper + # and temporarily replace quant module with wrapped module + with cls._replace_quantization_layer(quant_sim_model, name) as adaround_wrapper: + + # Get module's next following activation function + act_func = module_act_func_pair[module] + + logger.info("Started Optimizing weight rounding of module: %s", name) + AdaroundOptimizer.adaround_module(module, adaround_wrapper, model, quant_sim_model, act_func, + cached_dataset, forward_fn, opt_params, cached_quant_dataset) + weight = adaround_wrapper.weight + + # Fold trained alpha to weight + with torch.no_grad(): + # Use soft rounding to compute Adarounded weight + adaround_wrapper.use_soft_rounding = True + adarounded_weight = adaround_wrapper.apply_adaround(weight) + weight.copy_(adarounded_weight) + del adarounded_weight + + @staticmethod + def _compute_param_encodings(quant_sim: QuantizationSimModel): + """ + Compute encodings for parameters, needed for initializing Adaround quantizers + :param quant_sim: Quant sim + """ + for quant_module in quant_sim.model.modules(): + if isinstance(quant_module, StaticGridQuantWrapper): + # Adaround requires input and output quantizers to be disabled + for quatizer in quant_module.input_quantizers: + quatizer.enabled = False + for quatizer in quant_module.output_quantizers: + quatizer.enabled = False + + # pylint: disable=protected-access + for name, param in quant_module._module_to_wrap.named_parameters(): + param_quantizer = quant_module.param_quantizers[name] + param_quantizer.reset_encoding_stats() + param_quantizer.update_encoding_stats(param.data) + param_quantizer.compute_encoding() + + # Wrapper mode must be set to ACTIVE because the wrapper's quantize_dequantize_params() will only call + # into the param tensor quantizer's quantize_dequantize() if the mode is not PASSTHROUGH. + quant_module.set_mode(QcQuantizeOpMode.ACTIVE) + + @staticmethod + def _get_quantsim(model: torch.nn.Module, dummy_input: torch.Tensor, + quant_scheme: QuantScheme, default_param_bw: int, config_file: str): + return QuantizationSimModel(model, dummy_input=dummy_input, quant_scheme=quant_scheme, + default_param_bw=default_param_bw, + config_file=config_file) + + @staticmethod + def _get_adaround_wrapper(quant_module: QcQuantizeWrapper): + return AdaroundWrapper(quant_module) + + @staticmethod + def _remove_quantization_wrappers(module: torch.nn.Module): + SaveUtils.remove_quantization_wrappers(module) + + @staticmethod + @contextlib.contextmanager + def _patch_module_layer(model, layer_name, new_layer): + """ + Temporarily replace model layer + """ + original_layer = getattr(model, layer_name) + setattr(model, layer_name, new_layer) + yield + setattr(model, layer_name, original_layer) + + @staticmethod + def _validate_quant_module_for_adaround(quant_module: StaticGridQuantWrapper): + assert quant_module.param_quantizers['weight'], '%s does not have weight parameter.' % quant_module + assert quant_module.param_quantizers['weight'].encoding, '%s encoding needs to be set.' % quant_module + + @staticmethod + def _check_input_output_quantizers_for_adaround(quant_model: torch.nn.Module): + _, input_quantizers, output_quantizers = utils.get_all_quantizers(quant_model) + for quantizer in itertools.chain(input_quantizers, output_quantizers): + assert not quantizer.enabled + + @staticmethod + def _get_lowest_weight_bw(quant_model: torch.nn.Module): + param_quantizers, _, _ = utils.get_all_quantizers(quant_model) + return min( + quantizer.bitwidth for quantizer in param_quantizers + if quantizer.enabled and quantizer.data_type == QuantizationDataType.int + ) + + @classmethod + @contextlib.contextmanager + def _replace_quantization_layer(cls, quant_sim_model: torch.nn.Module, module_name: str): + """ + Replace the quantized module's weight tensor quantizer with the Adaround tensor quantizer + :param quant_module: quant module + """ + quant_module = utils.get_named_module(quant_sim_model, module_name) + cls._validate_quant_module_for_adaround(quant_module) + adaround_layer = cls._get_adaround_wrapper(quant_module) + + # We need to look for the container to patch for modules inside submodule + upper_module = quant_sim_model + upper_module_name, _, target_module_name = module_name.rpartition('.') + if upper_module_name: + upper_module = utils.get_named_module(quant_sim_model, upper_module_name) + + # Temporarily replace quant module with wrapped module + with cls._patch_module_layer(upper_module, target_module_name, adaround_layer): + yield adaround_layer + + @staticmethod + def _get_quant_wrapper(quant_sim_model: torch.nn.Module, module_name: str) -> Union[StaticGridQuantWrapper, None]: + """ + For given module name, get the quantized wrapper module from the QuantSim model + :param quant_sim_model: Model with simulation ops + :param module_name: Module name + :return: Quantized wrapper module or None + """ + quant_module = None + + for name, module in quant_sim_model.named_modules(): + if name == module_name and isinstance(module, StaticGridQuantWrapper): + quant_module = module + break + + return quant_module + + @classmethod + def _export_encodings_to_json(cls, path: str, filename_prefix: str, quant_sim: QuantizationSimModel): + """ + Save Adadrounded module's parameter encodings to JSON file + :param path: path where to store param encodings + :param filename_prefix: filename to store exported weight encodings in JSON format + :param quant_sim: QunatSim that contains the model and Adaround tensor quantizers + """ + # pylint: disable=protected-access + # Create a dictionary to export to JSON file + param_encodings = {} + + for name, quant_module in quant_sim.model.named_modules(): + if isinstance(quant_module, ExportableQuantModule) and \ + isinstance(quant_module.get_original_module(), AdaroundSupportedModules): + + if 'weight' in quant_module.param_quantizers: + cls._update_param_encodings_dict(quant_module, name, param_encodings) + + # Unify the encoding format to be same as that of full encoding export file + encoding = {'param_encodings': param_encodings} + # export encodings to JSON file + os.makedirs(os.path.abspath(path), exist_ok=True) + encoding_file_path = os.path.join(path, filename_prefix + '.encodings') + with open(encoding_file_path, 'w') as encoding_fp: + json.dump(encoding, encoding_fp, sort_keys=True, indent=4) + + @classmethod + def _update_param_encodings_dict(cls, quant_module: ExportableQuantModule, name: str, param_encodings: Dict): + """ + Add module's weight parameter encodings to dictionary to be used for exporting encodings + :param quant_module: quant module + :param name: name of module + :param param_encodings: Dictionary of param encodings + """ + for orig_param_name, encodings in quant_module.export_param_encodings().items(): + if orig_param_name == 'weight' and encodings: + param_name = name + '.' + orig_param_name + param_encodings[param_name] = encodings + + @staticmethod + def _create_encodings_dict_for_quantizer(quantizer: TensorQuantizer) -> List[Dict]: + """ + Return encodings for given qunatizer + :param quantizer: Tensor quantizer associated with module's param + :return: Dictionary containing encodings + """ + quant_encodings = quantizer.encoding + if not isinstance(quantizer.encoding, list): + quant_encodings = [quant_encodings] + + encodings_dict = [] + for enc in quant_encodings: + encodings_dict.append({'min': enc.min, + 'max': enc.max, + 'scale': enc.delta, + 'offset': int(enc.offset), + 'bitwidth': enc.bw, + 'is_symmetric': str(quantizer.use_symmetric_encodings), + 'dtype': 'int' if quantizer.data_type == QuantizationDataType.int else 'float'}) + return encodings_dict + + @staticmethod + def _override_param_bitwidth(model: torch.nn.Module, quant_sim: QuantizationSimModel, + param_bw_override_list: List[Tuple[torch.nn.Module, int]]): + """ + For the QuantSim, for the list of modules in the param_bw_override_list, + overrides the default parameter bitwidths with the provided bitwidth. + + :param model: The original model + :param quant_sim: The QuantSim that was created using a deepcopy of the original model. + :param param_bw_override_list: List of Tuples. Each Tuple is a module and the corresponding parameter bitwidth + to be used for that module. + """ + # Create a mapping of original model's AdaRoundable module and their name + module_to_name = {} + for name, module in model.named_modules(): + if isinstance(module, AdaroundSupportedModules): + module_to_name[module] = name + + # Create a mapping of QuantSim model's AdaRoundable module name and their module + name_to_module = {} + for q_name, q_module in quant_sim.model.named_modules(): + if isinstance(q_module, ExportableQuantModule): + if isinstance(q_module.get_original_module(), AdaroundSupportedModules): # pylint: disable=protected-access + name_to_module[q_name] = q_module + + # For the modules specified in the param_bw_override_list, set the weight quantizer bitwidth + for (module, bw) in param_bw_override_list: + module_name = module_to_name[module] + quant_wrapper = name_to_module[module_name] + quant_wrapper.param_quantizers['weight'].bitwidth = bw + + @classmethod + def _exclude_modules(cls, model: torch.nn.Module, quant_sim: QuantizationSimModel, + ignore_quant_ops_list: List[torch.nn.Module]): + """ + For the modules mentioned in the ignore_quant_ops_list, remove the corresponding quant wrappers from the + quantSim and excludes modules from adaround optimization. + + :param model: The original model + :param quant_sim: The QuantSim that was created using a deepcopy of the original model. + :param ignore_quant_ops_list: The list of modules for which the Quantization wrappers are removed from the + QuantSim object. + """ + quant_wrappers_to_exclude = [] + for module in ignore_quant_ops_list: + for m in module.modules(): + name = utils.get_layer_name(model, m) + quant_wrapper = cls._get_quant_wrapper(quant_sim.model, name) + if quant_wrapper: + quant_wrappers_to_exclude.append(quant_wrapper) + + quant_sim.exclude_layers_from_quantization(quant_wrappers_to_exclude) + + @classmethod + def apply_adaround_with_cache(cls, model: torch.nn.Module, dummy_input: Union[torch.Tensor, Tuple], + params: AdaroundParameters, + path: str, filename_prefix: str, default_param_bw: int = 4, + param_bw_override_list: List[Tuple[torch.nn.Module, int]] = None, + ignore_quant_ops_list: List[torch.nn.Module] = None, + default_quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + default_config_file: str = None, + checkpoints_config: str = None) -> torch.nn.Module: + """ + Returns model with optimized weight rounding of every module (Conv and Linear) and also saves the + corresponding quantization encodings to a separate JSON-formatted file that can then be imported by + QuantSim for inference or QAT + :param model: Model to Adaround + :param dummy_input: Dummy input to the model. Used to parse model graph. If the model has more than one input, + pass a tuple. User is expected to place the tensors on the appropriate device. + :param params: Parameters for Adaround + :param path: path where to store parameter encodings + :param filename_prefix: Prefix to use for filename of the encodings file + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters + :param param_bw_override_list: List of Tuples. Each Tuple is a module and the corresponding parameter bitwidth + to be used for that module. + :param ignore_quant_ops_list: Ops listed here are skipped during quantization needed for AdaRounding. Do not + specify Conv and Linear modules in this list. Doing so, will affect accuracy. + :param default_quant_scheme: Quantization scheme. Supported options are using Quant Scheme Enum + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced + :param default_config_file: Default configuration file for model quantizers + :param checkpoints_file: JSON file to define checkpoints for caching intermediate tensors of fp32/quant model + :return: Model with Adarounded weights and saves corresponding parameter encodings JSON file at provided path + """ + # pylint: disable=too-many-arguments + assert checkpoints_config is not None, "To run Adaround with cached tensors, please provide a JSON file with checkpoints defined" + # Create Quant sim with given parameters + quant_sim = cls._get_quantsim(model, dummy_input=dummy_input, quant_scheme=default_quant_scheme, + default_param_bw=default_param_bw, + config_file=default_config_file) + + # For the modules in the param_bw_override_list, override the default parameter bitwidths in the QuantSim + if param_bw_override_list: + cls._override_param_bitwidth(model, quant_sim, param_bw_override_list) + + if ignore_quant_ops_list: + cls._exclude_modules(model, quant_sim, ignore_quant_ops_list) + + # Compute only param encodings + cls._compute_param_encodings(quant_sim) + + return cls._apply_adaround(quant_sim, model, dummy_input, params, path, filename_prefix, checkpoints_config) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/auto_quant.html b/releases/1.32.2/_modules/aimet_torch/auto_quant.html new file mode 100644 index 0000000..14d9dfb --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/auto_quant.html @@ -0,0 +1,2575 @@ + + + + + + aimet_torch.auto_quant — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.auto_quant

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+# pylint: disable=too-many-lines
+
+""" Implementation of AIMET AutoQuantBase and v1 AutoQuant """
+import abc
+import copy
+import contextlib
+from collections import OrderedDict, defaultdict
+from dataclasses import dataclass
+import functools
+import itertools
+import math
+import traceback
+import os
+import sys
+import io
+from unittest.mock import patch
+from typing import Any, Callable, Dict, List, Optional, Tuple, Union, Mapping
+import pickle
+from uuid import uuid4
+import torch
+from torch.utils.data import DataLoader
+import jinja2
+from bokeh.resources import CDN
+from tqdm import tqdm
+
+from aimet_torch import utils
+from aimet_torch.adaround.adaround_weight import Adaround, AdaroundParameters
+from aimet_torch.cross_layer_equalization import equalize_model
+from aimet_torch.batch_norm_fold import fold_all_batch_norms
+from aimet_torch.quantsim import QuantizationSimModel
+from aimet_torch.utils import get_all_quantizers, in_eval_mode
+from aimet_torch.onnx_utils import OnnxExportApiArgs
+from aimet_torch.model_preparer import prepare_model
+from aimet_torch.model_validator.model_validator import ModelValidator
+
+from aimet_common.auto_quant import Diagnostics
+from aimet_common.cache import Cache
+from aimet_common.defs import QuantScheme
+from aimet_common.utils import AimetLogger, Spinner
+from aimet_common.quantsim import validate_quantsim_inputs
+
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.AutoQuant)
+
+cache = Cache()
+
+
+# The number of samples to be used for performance evaluation.
+# NOTE: None means "all".
+NUM_SAMPLES_FOR_PERFORMANCE_EVALUATION = None
+
+class _StageSkipped(Exception):
+    pass
+
+
+@dataclass(frozen=True)
+class _QuantSchemePair:
+    param_quant_scheme: QuantScheme
+    output_quant_scheme: QuantScheme
+    param_percentile: Optional[float] = None
+    output_percentile: Optional[float] = None
+
+    def __str__(self):
+        def scheme_to_str(quant_scheme, percentile):
+            if quant_scheme == QuantScheme.post_training_percentile:
+                return f"{percentile}%ile"
+            if quant_scheme in (QuantScheme.post_training_tf,
+                                QuantScheme.training_range_learning_with_tf_init):
+                return "tf"
+            if quant_scheme in (QuantScheme.post_training_tf_enhanced,
+                                QuantScheme.training_range_learning_with_tf_enhanced_init):
+                return "tf-enhanced"
+            raise ValueError
+
+        param_str = scheme_to_str(self.param_quant_scheme, self.param_percentile)
+        output_str = scheme_to_str(self.output_quant_scheme, self.output_percentile)
+        return f"W@{param_str} / A@{output_str}"
+
+
+_QUANT_SCHEME_CANDIDATES = (
+    # Weight:     tf
+    # Activation: tf
+    _QuantSchemePair(QuantScheme.post_training_tf,
+                     QuantScheme.post_training_tf),
+
+    # Weight:     tf_enhanced
+    # Activation: tf
+    _QuantSchemePair(QuantScheme.post_training_tf_enhanced,
+                     QuantScheme.post_training_tf),
+
+    # Weight:     tf_enhanced
+    # Activation: tf_enhanced
+    _QuantSchemePair(QuantScheme.post_training_tf_enhanced,
+                     QuantScheme.post_training_tf_enhanced),
+
+    # Weight:     tf_enhanced
+    # Activation: percentile(99.9)
+    _QuantSchemePair(QuantScheme.post_training_tf_enhanced,
+                     QuantScheme.post_training_percentile,
+                     output_percentile=99.9),
+
+    # Weight:     tf_enhanced
+    # Activation: percentile(99.99)
+    _QuantSchemePair(QuantScheme.post_training_tf_enhanced,
+                     QuantScheme.post_training_percentile,
+                     output_percentile=99.99),
+)
+
+
+def _validate_inputs(model: torch.nn.Module, # pylint: disable=too-many-arguments
+                     data_loader: DataLoader,
+                     eval_callback: Callable[[torch.nn.Module], float],
+                     dummy_input: torch.Tensor,
+                     results_dir: str,
+                     strict_validation: bool,
+                     quant_scheme: QuantScheme,
+                     param_bw: int,
+                     output_bw: int,
+                     rounding_mode: str):
+    """
+    Confirms inputs are of the correct type
+    :param model: Model to be quantized
+    :param data_loader: A collection that iterates over an unlabeled dataset, used for computing encodings
+    :param eval_callback: Function that calculates the evaluation score
+    :param dummy_input: Dummy input for the model
+    :param results_dir: Directory to save the results of PTQ techniques
+    :param strict_validation: Flag set to True by default. When False, AutoQuant will proceed with execution and try to handle errors internally if possible. This may produce unideal or unintuitive results.
+    :param quant_scheme: Quantization scheme
+    :param param_bw: Parameter bitwidth
+    :param output_bw: Output bitwidth
+    :param rounding_mode: Rounding mode
+    """
+    if not isinstance(model, torch.nn.Module):
+        raise ValueError('Model must be of type torch.nn.Module, not ' + str(type(model).__name__))
+
+    if not isinstance(data_loader, DataLoader):
+        raise ValueError('data_loader must be of type DataLoader, not ' + str(
+            type(data_loader).__name__))
+
+    if not isinstance(eval_callback, Callable):  # pylint: disable=isinstance-second-argument-not-valid-type
+        raise ValueError('eval_callback must be of type Callable, not ' + str(type(eval_callback).__name__))
+
+    if not isinstance(dummy_input, (torch.Tensor, Tuple)):
+        raise ValueError(
+            'dummy_input must be of type torch.Tensor or Tuple, not ' + str(type(dummy_input).__name__))
+
+    if not isinstance(results_dir, str):
+        raise ValueError('results_dir must be of type str, not ' + str(type(results_dir).__name__))
+
+    results_dir = os.path.abspath(results_dir)
+    os.makedirs(results_dir, exist_ok=True)
+
+    if not isinstance(strict_validation, bool):
+        raise ValueError('strict_validation must be of type bool, not ' + str(type(strict_validation).__name__))
+
+    validate_quantsim_inputs(quant_scheme, rounding_mode, output_bw, param_bw)
+
+
+class AutoQuantBase(abc.ABC): # pylint: disable=too-many-instance-attributes
+    """
+    Integrate and apply post-training quantization techniques.
+
+    AutoQuant includes 1) batchnorm folding, 2) cross-layer equalization,
+    and 3) Adaround.
+    These techniques will be applied in a best-effort manner until the model
+    meets the evaluation goal given as allowed_accuracy_drop.
+    """
+
+    def __init__( # pylint: disable=too-many-arguments, too-many-locals
+            self,
+            model: torch.nn.Module,
+            dummy_input: Union[torch.Tensor, Tuple],
+            data_loader: DataLoader,
+            eval_callback: Callable[[torch.nn.Module], float],
+            param_bw: int = 8,
+            output_bw: int = 8,
+            quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced,
+            rounding_mode: str = 'nearest',
+            config_file: str = None,
+            results_dir: str = "/tmp",
+            cache_id: str = None,
+            strict_validation: bool = True,
+            model_prepare_required: bool = True) -> None:
+        '''
+        :param model: Model to be quantized. Assumes model is on the correct device
+        :param dummy_input: Dummy input for the model. Assumes that dummy_input is on the correct device
+        :param data_loader: A collection that iterates over an unlabeled dataset, used for computing encodings
+        :param eval_callback: Function that calculates the evaluation score
+        :param param_bw: Parameter bitwidth
+        :param output_bw: Output bitwidth
+        :param quant_scheme: Quantization scheme
+        :param rounding_mode: Rounding mode
+        :param config_file: Path to configuration file for model quantizers
+        :param results_dir: Directory to save the results of PTQ techniques
+        :param cache_id: ID associated with cache results
+        :param strict_validation: Flag set to True by default.hen False, AutoQuant will proceed with execution and handle errors internally if possible. This may produce unideal or unintuitive results.
+        :param model_prepare_required: Flag set to True by default.If False, AutoQuant will skip model prepare block in the pipeline.
+        '''
+        _validate_inputs(model, data_loader, eval_callback, dummy_input, results_dir,
+                         strict_validation, quant_scheme, param_bw, output_bw, rounding_mode)
+
+        self.fp32_model = model
+        self.dummy_input = dummy_input
+        self.data_loader = data_loader
+        self.eval_callback = eval_callback
+
+        self._quantsim_params = dict(
+            param_bw=param_bw,
+            output_bw=output_bw,
+            quant_scheme=_QuantSchemePair(quant_scheme, quant_scheme),
+            rounding_mode=rounding_mode,
+            config_file=config_file,
+        )
+
+        self.results_dir = results_dir
+        if cache_id:
+            self.cache_dir = os.path.join(results_dir, ".auto_quant_cache", cache_id)
+        else:
+            self.cache_dir = None
+
+        self.model_prepare_required = model_prepare_required
+
+        def forward_pass_callback(model, _: Any = None):
+            device = utils.get_device(model)
+            with in_eval_mode(model), torch.no_grad():
+                for input_data in tqdm(data_loader):
+                    input_data = utils.change_tensor_device_placement(input_data, device)
+                    if isinstance(input_data, torch.Tensor):
+                        model(input_data)
+                    else:
+                        assert isinstance(input_data, (tuple, list))
+                        model(*input_data)
+
+        self.forward_pass_callback = forward_pass_callback
+
+        @functools.wraps(eval_callback)
+        def eval_callback_wrapper(model: torch.nn.Module, *args, **kwargs) -> float:
+            """
+            Wrapper to ensure that model is in eval mode before entering eval_callback.
+            """
+            with in_eval_mode(model), torch.no_grad():
+                return eval_callback(model, *args, **kwargs)
+
+        self.eval_callback = eval_callback_wrapper
+
+        # Use at most 2000 samples for AdaRound.
+        num_samples = min(len(self.data_loader.dataset), 2000)
+        batch_size = self.data_loader.batch_size or 1
+        num_batches = math.ceil(num_samples / batch_size)
+        num_batches = min(num_batches, len(self.data_loader))
+        self.adaround_params = self._get_adaround_parameters(self.data_loader, num_batches)
+
+        self._export_kwargs = dict(
+            onnx_export_args=OnnxExportApiArgs(),
+            propagate_encodings=False,
+        )
+        self._model_preparer_kwargs = dict(
+            modules_to_exclude=None,
+            module_classes_to_exclude=None,
+            concrete_args=None,
+        )
+
+        self.eval_manager = _EvalManager(
+            quantsim_factory=self._create_quantsim_and_encodings,
+            eval_func=self._evaluate_model_performance,
+            dummy_input_on_cpu=utils.change_tensor_device_placement(dummy_input, torch.device("cpu")),
+            results_dir=self.results_dir,
+            strict_validation=strict_validation)
+
+        self._quant_scheme_candidates = _QUANT_SCHEME_CANDIDATES
+        self._fp32_acc = None
+
+    @staticmethod
+    @abc.abstractmethod
+    def _get_adaround():
+        """ returns AdaRound """
+
+    @staticmethod
+    @abc.abstractmethod
+    def _get_adaround_parameters(data_loader, num_batches):
+        """ Returns AdaroundParameters(data_loader, num_batches) """
+
+
+    def _evaluate_model_performance(self, model) -> float:
+        """
+        Evaluate the model performance.
+        """
+        return self.eval_callback(model, NUM_SAMPLES_FOR_PERFORMANCE_EVALUATION)
+
+    def run_inference(self) -> Tuple[QuantizationSimModel, float]:
+        '''
+        Creates a quantization model and performs inference
+
+        :return: QuantizationSimModel, model accuracy as float
+        '''
+        model = self.fp32_model
+
+        if self.model_prepare_required:
+            with self.eval_manager.session("Prepare Model") as sess:
+                model = sess.wrap(self._prepare_model)(self.fp32_model)
+
+        # Batchnorm Folding
+        with self.eval_manager.session("Batchnorm Folding", ptq=True) as sess:
+            model, _ = sess.wrap(self._apply_batchnorm_folding)(model)
+            if sess.ptq_result is None:
+                sess.set_ptq_result(model=model,
+                                    applied_techniques=["batchnorm_folding"],
+                                    export_kwargs=self._export_kwargs)
+
+        sim = self._create_quantsim_and_encodings(model)
+
+        if sess.ptq_result is None:
+            # BN folding failed. Need to measure the eval score
+            acc = self._evaluate_model_performance(sim.model)
+        else:
+            # BN folding success. No need to measure the eval score again
+            acc = sess.ptq_result.accuracy
+
+        return sim, acc
+
+    def optimize(self, allowed_accuracy_drop: float = 0.0) -> Tuple[torch.nn.Module, float, str]:
+        """
+        Integrate and apply post-training quantization techniques.
+
+        :param allowed_accuracy_drop: Maximum allowed accuracy drop
+        :return: Tuple of (best model, eval score, encoding path)
+        """
+        result = self._optimize_helper(self._optimize_main, allowed_accuracy_drop)
+        return result["model"],\
+               result["accuracy"],\
+               result["encoding_path"]
+
+    def set_adaround_params(self, adaround_params) -> None:
+        """
+        Set Adaround parameters.
+        If this method is not called explicitly by the user, AutoQuant will use
+        `data_loader` (passed to `__init__`) for Adaround.
+
+        :param adaround_params: Adaround parameters.
+        """
+        self.adaround_params = adaround_params
+
+    def set_export_params(self,
+                          onnx_export_args: OnnxExportApiArgs = -1,
+                          propagate_encodings: bool = None) -> None:
+        """
+        Set parameters for QuantizationSimModel.export.
+
+        :param onnx_export_args: optional export argument with onnx specific overrides
+                if not provide export via torchscript graph
+        :param propagate_encodings: If True, encoding entries for intermediate ops
+                (when one PyTorch ops results in multiple ONNX nodes) are filled with
+                the same BW and data_type as the output tensor for that series of ops.
+        """
+        # Here, we use -1 to indicate `onnx_export_args` wasn't specified
+        # since onnx_export_args being None has its own meaning.
+        if onnx_export_args != -1:
+            self._export_kwargs.update(onnx_export_args=onnx_export_args)
+        if propagate_encodings is not None:
+            self._export_kwargs.update(propagate_encodings=propagate_encodings)
+
+    def set_model_preparer_params(
+            self,
+            modules_to_exclude: Optional[List[torch.nn.Module]] = None,
+            module_classes_to_exclude: Optional[List[torch.nn.Module]] = None,
+            concrete_args: Optional[Dict[str, Any]] = None,
+    ):
+        """
+        Set parameters for model preparer.
+
+        :param modules_to_exclude: List of modules to exclude when tracing.
+        :param module_classes_to_exclude: List of module classes to exclude when tracing.
+        :param concrete_args: Parameter for model preparer. Allows you to partially specialize
+            your function, whether it's to remove control flow or data structures. If the
+            model has control flow, torch.fx won't be able to trace the model. Check
+            torch.fx.symbolic_trace API in detail.
+        """
+        self._model_preparer_kwargs["modules_to_exclude"] = copy.copy(modules_to_exclude)
+        self._model_preparer_kwargs["module_classes_to_exclude"] = copy.copy(module_classes_to_exclude)
+        self._model_preparer_kwargs["concrete_args"] = copy.copy(concrete_args)
+
+    def _create_quantsim_and_encodings( # pylint: disable=too-many-arguments, too-many-locals, too-many-branches
+            self,
+            model: torch.nn.Module,
+            rounding_mode: str = None,
+            output_bw: int = None,
+            output_quant_scheme: QuantScheme = None,
+            output_percentile: float = None,
+            param_bw: int = None,
+            param_quant_scheme: QuantScheme = None,
+            param_percentile: float = None,
+            config_file: str = None,
+            encoding_path: str = None,
+    ) -> QuantizationSimModel:
+        """
+        Create a QuantizationSimModel and compute encoding. If `encoding_path` is not None,
+        it is prioritized over other arguments (`output_bw`, `param_bw`, ...).
+
+        :param model: Model to quantize.
+        :param rounding_mode: Rounding mode. Defaults to self._quantsim_params["rounding_mode"].
+        :param output_bw: Default bitwidth (4-31) to use for quantizing layer inputs andoutputs.
+            Defaults to self._quantsim_params["output_bw"].
+        :param output_quant_scheme: Quantization scheme for output quantizers.
+            Defaults to self._quantsim_params["quant_scheme"].output_quant_scheme.
+        :param output_percentile: Percentile value for outputs.
+            Only valid if output quant scheme is percentile scheme.
+        :param param_bw: Default bitwidth (4-31) to use for quantizing layer parameters.
+            Defaults to self._quantsim_params["param_bw"].
+        :param param_quant_scheme: Quantization scheme for param quantizers.
+            Defaults to self._quantsim_params["quant_scheme"].param_quant_scheme.
+        :param param_percentile: Percentile value for parameters.
+            Only valid if param quant scheme is percentile scheme.
+        :param config_file: Path to configuration file for model quantizers.
+                            Defaults to self._quantsim_params["config_file"].
+        :param encoding_path: Path to parameter encodings file.
+        :return: Quantsim model.
+        """
+        if output_bw is not None:
+            assert output_bw <= 32
+
+        if param_bw is not None:
+            assert param_bw <= 32
+
+        if output_quant_scheme is None or param_quant_scheme is None:
+            assert self._quantsim_params["quant_scheme"] is not None
+
+        kwargs = dict(
+            rounding_mode=(rounding_mode or self._quantsim_params["rounding_mode"]),
+            default_output_bw=(output_bw or self._quantsim_params["output_bw"]),
+            default_param_bw=(param_bw or self._quantsim_params["param_bw"]),
+            config_file=(config_file or self._quantsim_params["config_file"]),
+        )
+        sim = self._get_quantsim(model, self.dummy_input, **kwargs)
+
+        default_quant_scheme = self._quantsim_params.get("quant_scheme")
+        if default_quant_scheme is not None:
+            output_quant_scheme = output_quant_scheme or\
+                                  default_quant_scheme.output_quant_scheme
+            output_percentile = output_percentile or default_quant_scheme.output_percentile
+            param_quant_scheme = param_quant_scheme or\
+                                 default_quant_scheme.param_quant_scheme
+            param_percentile = param_percentile or default_quant_scheme.param_percentile
+
+        self._configure_quantsim(sim,
+                                 output_bw,
+                                 output_quant_scheme,
+                                 output_percentile,
+                                 param_bw,
+                                 param_quant_scheme,
+                                 param_percentile,
+                                 encoding_path)
+
+        if self._has_enabled_quantizers(sim):
+            sim.compute_encodings(self.forward_pass_callback, None)
+
+        return sim
+
+    @staticmethod
+    @abc.abstractmethod
+    def _get_quantsim(model, dummy_input, **kwargs):
+        """ Returns QuantizationSimModel(model, dummy_input, **kwargs) """
+
+    @abc.abstractmethod
+    def _configure_quantsim(self, # pylint: disable=too-many-arguments
+                            sim,
+                            output_bw,
+                            output_quant_scheme,
+                            output_percentile,
+                            param_bw,
+                            param_quant_scheme,
+                            param_percentile,
+                            encoding_path):
+        """Configures quantizers in sim with given bitwidths, quantschemes, and percentiles then loads encodings
+
+        Any 32 bit quantizers are disabled after loading and freezing encodings
+        """
+
+    @staticmethod
+    @abc.abstractmethod
+    def _has_enabled_quantizers(sim):
+        """ Returns True if any quantizer in sim is enabled """
+
+    def _prepare_model(self, model):
+        prepared_model = prepare_model(model, **self._model_preparer_kwargs)
+
+        if ModelValidator.validate_model(prepared_model, self.dummy_input):
+            _logger.info(
+                "Model validation has succeeded. Proceeding to AutoQuant algorithm."
+            )
+        else:
+            raise ValueError(
+                "Model validation has failed."
+                " Please make the necessary changes to the model and run again."
+            )
+        return prepared_model
+
+    @cache.mark("batchnorm_folding")
+    def _apply_batchnorm_folding(self, model: torch.nn.Module)\
+            -> Tuple[torch.nn.Module, List[Tuple]]:
+        """
+        Apply batchnorm folding.
+
+        NOTE: Input model is not mutated.
+
+        :param model: Model to apply batchnorm folding.
+        :return: Output model and folded pairs.
+        """
+        model = copy.deepcopy(model)
+        folded_pairs = fold_all_batch_norms(model, None, self.dummy_input)
+        return model, folded_pairs
+
+    @cache.mark("cle")
+    def _apply_cross_layer_equalization(self, model: torch.nn.Module) -> torch.nn.Module:
+        """
+        Apply cross-layer equalization.
+
+        NOTE: Input model is not mutated.
+
+        :param model: Model to apply cross-layer-equalization.
+        :return: Output model.
+        """
+        model = copy.deepcopy(model)
+        if isinstance(self.dummy_input, torch.Tensor):
+            input_shape = tuple(self.dummy_input.shape)
+        else:
+            input_shape = [tuple(x.shape) for x in self.dummy_input]
+        equalize_model(model, input_shape)
+        return model
+
+    @cache.mark("adaround")
+    def _apply_adaround(self, model: torch.nn.Module) -> Tuple[torch.nn.Module, str]:
+        """
+        Apply adaround.
+
+        NOTE1: Input model is not mutated.
+        NOTE2: Parameters `param_bw_override_list` and `ignore_quant_ops_list` are always set to None.
+
+        :param model: Model to apply adaround.
+        :return: Output model and the path to the parameter encoding file.
+        """
+        # NOTE: We dont need to make a deepcopy of model here, since Adaround.apply_adaround
+        # internally creates and returns a deepcopy of model.
+        filename_prefix = "adaround"
+        adaround_encoding_path = os.path.join(self.results_dir,
+                                              "{}.encodings".format(filename_prefix))
+
+        sim = self._create_quantsim_and_encodings(model)
+
+        self._disable_activation_quantizers(sim)
+
+        model = self._get_adaround()._apply_adaround(sim, model, self.dummy_input, self.adaround_params, # pylint: disable=protected-access
+                                                     path=self.results_dir, filename_prefix=filename_prefix)
+
+        return model, adaround_encoding_path
+
+    @staticmethod
+    @abc.abstractmethod
+    def _disable_activation_quantizers(sim):
+        """ Disables all input and output quantizers in sim """
+
+    def _optimize_helper(
+            self,
+            optimize_fn: Callable,
+            allowed_accuracy_drop: float) -> Tuple[torch.nn.Module, float, str]:
+        """
+        Integrate and apply post-training quantization techniques.
+
+        :param allowed_accuracy_drop: Maximum allowed accuracy drop
+        :return: Tuple of (best model, eval score, encoding path)
+        """
+        allowed_accuracy_drop = float(allowed_accuracy_drop)
+        if allowed_accuracy_drop < 0:
+            raise ValueError(
+                "`allowed_accuracy_drop` must be a positive value. Got {:.2f}"
+                .format(allowed_accuracy_drop)
+            )
+
+        self.eval_manager.clear()
+
+        try:
+            with in_eval_mode(self.fp32_model), cache.enable(self.cache_dir):
+                _logger.info("Starting AutoQuant")
+
+                self._fp32_acc = self._evaluate_model_performance(self.fp32_model)
+                target_acc = self._fp32_acc - allowed_accuracy_drop
+                _logger.info("Target eval score: %f", target_acc)
+                _logger.info("FP32 eval score (W32A32): %f", self._fp32_acc)
+
+                ret = optimize_fn(self.fp32_model, target_acc)
+
+                acc = ret["accuracy"]
+                if acc is not None:
+                    _logger.info("Best eval score: %f", acc)
+
+                    if acc < target_acc:
+                        _logger.info(
+                            "AutoQuant is unable to match the target accuracy. "
+                            "Consider Quantization Aware Training."
+                        )
+
+                return ret
+        finally:
+            self.eval_manager.export_diagnostics()
+
+    def get_quant_scheme_candidates(self) -> Tuple[_QuantSchemePair, ...]:
+        """
+        Return the candidates for quant scheme search.
+        During :meth:`~AutoQuant.optimize`, the candidate with the highest accuracy
+        will be selected among them.
+
+        :return: Candidates for quant scheme search
+        """
+        return self._quant_scheme_candidates
+
+    def set_quant_scheme_candidates(self, candidates: Tuple[_QuantSchemePair, ...]):
+        """
+        Set candidates for quant scheme search.
+        During :meth:`~AutoQuant.optimize`, the candidate with the highest accuracy
+        will be selected among them.
+
+        :param candidates: Candidates for quant scheme search
+        """
+        self._quant_scheme_candidates = copy.copy(candidates)
+
+    def _choose_default_quant_scheme(self):
+        def eval_fn(pair: _QuantSchemePair):
+            sim = self._create_quantsim_and_encodings(
+                self.fp32_model,
+                param_quant_scheme=pair.param_quant_scheme,
+                param_percentile=pair.param_percentile,
+                output_quant_scheme=pair.output_quant_scheme,
+                output_percentile=pair.output_percentile,
+            )
+            eval_score = self._evaluate_model_performance(sim.model)
+            _logger.info("Evaluation finished: %s (eval score: %f)", pair, eval_score)
+            return eval_score
+
+        param_bw = self._quantsim_params["param_bw"]
+        output_bw = self._quantsim_params["output_bw"]
+
+        candidates = self.get_quant_scheme_candidates()
+
+        # If the weight representation has sufficient precision (i.e. bitwidth >= 16),
+        # always use tf scheme
+        if param_bw >= 16:
+            candidates = [
+                candidate for candidate in candidates
+                if candidate.param_quant_scheme == QuantScheme.post_training_tf
+            ]
+
+        # If the output representation has sufficient precision (i.e. bitwidth >= 16),
+        # always use tf scheme
+        if output_bw >= 16:
+            candidates = [
+                candidate for candidate in candidates
+                if candidate.output_quant_scheme == QuantScheme.post_training_tf
+            ]
+
+        # If we have only one candidate left, we don't need to evaluated
+        # the quant scheme for comparison
+        if len(candidates) == 1:
+            return candidates[0]
+
+        assert candidates
+
+        # Find the quant scheme that yields the best eval score
+        return max(candidates, key=eval_fn)
+
+    def _optimize_main(self, fp32_model: torch.nn.Module, target_acc: float): # pylint: disable=too-many-branches
+        """
+        Helper function of apply().
+
+        :param fp32_model: Model to apply PTQ techniques.
+        :param target_acc: Target eval score.
+
+        :raises RuntimeError: If none of the PTQ techniques were finished successfully.
+
+        :return: The best ptq result as a dictionary.
+        """
+        fp32_model = self.fp32_model
+
+        with self.eval_manager.session("Prepare Model") as sess:
+            if self.model_prepare_required:
+                fp32_model = sess.wrap(self._prepare_model)(self.fp32_model)
+            else:
+                raise _StageSkipped("Skipping Model Preparer")
+
+        # Choose quant scheme automatically.
+        with self.eval_manager.session("QuantScheme Selection") as sess:
+            self._quantsim_params["quant_scheme"] = sess.wrap(self._choose_default_quant_scheme)()
+
+        with self.eval_manager.session("W32 Evaluation") as sess:
+            w32_eval_score = sess.wrap(sess.eval)(model=fp32_model, param_bw=32)
+            _logger.info("Evaluation finished: W32A%d (eval score: %f)",
+                         self._quantsim_params["output_bw"], w32_eval_score)
+
+            # Early exit
+            if w32_eval_score < target_acc:
+                _logger.info(
+                    "W32A%d eval score (%f) is lower "
+                    "than the target eval score (%f). This means it is unlikely that "
+                    "the target eval score can be met using PTQ techniques. "
+                    "Please consider finetuning the model using range learning.",
+                    self._quantsim_params["output_bw"], w32_eval_score, target_acc
+                )
+
+                # Since AutoQuant pipeline exited early, all the return values are set to None
+                return {
+                    "model": None,
+                    "accuracy": None,
+                    "encoding_path": None,
+                    "applied_techniques": None,
+                }
+
+            sess.result["target_satisfied"] = True
+
+        # Batchnorm Folding
+        with self.eval_manager.session("Batchnorm Folding", ptq=True) as sess:
+            model, _ = sess.wrap(self._apply_batchnorm_folding)(fp32_model)
+            if sess.ptq_result is None:
+                sess.set_ptq_result(model=model,
+                                    applied_techniques=["batchnorm_folding"],
+                                    export_kwargs=self._export_kwargs)
+
+        best_result = self.eval_manager.get_best_ptq_result()
+        if best_result and best_result.accuracy >= target_acc:
+            sess.result["target_satisfied"] = True
+            return best_result.as_dict()
+
+        # Cross-Layer Equalization
+        with self.eval_manager.session("Cross-Layer Equalization", ptq=True) as sess:
+            model = sess.wrap(self._apply_cross_layer_equalization)(fp32_model)
+            if sess.ptq_result is None:
+                sess.set_ptq_result(model=model,
+                                    applied_techniques=["cross_layer_equalization"],
+                                    export_kwargs=self._export_kwargs)
+
+        best_result = self.eval_manager.get_best_ptq_result()
+        if best_result and best_result.accuracy >= target_acc:
+            sess.result["target_satisfied"] = True
+            return best_result.as_dict()
+
+        if best_result is None:
+            model = fp32_model
+            applied_techniques = []
+        else:
+            if "cross_layer_equalization" not in best_result.applied_techniques:
+                sess.result["effective"] = False
+            model = best_result.load_model()
+            applied_techniques = best_result.applied_techniques
+
+        # AdaRound
+        with self.eval_manager.session("AdaRound", ptq=True) as sess:
+            model, encoding_path = self._apply_adaround(model)
+            if sess.ptq_result is None:
+                sess.set_ptq_result(model=model,
+                                    encoding_path=encoding_path,
+                                    applied_techniques=[*applied_techniques, "adaround"],
+                                    export_kwargs=self._export_kwargs)
+
+        best_result = self.eval_manager.get_best_ptq_result()
+        if best_result:
+            if "adaround" not in best_result.applied_techniques:
+                sess.result["effective"] = False
+            if best_result.accuracy >= target_acc:
+                sess.result["target_satisfied"] = True
+            return best_result.as_dict()
+
+        raise RuntimeError("None of batchnorm folding, CLE, or Adaround "
+                           "has been finished successfully.")
+
+
+@dataclass
+class PtqResult:
+    """
+    Evaluation results.
+    :param tag: Identifier string of the evaluation result.
+    :param model_path: Path to the serialized model.
+    :param encoding_path: Path to the encoding file.
+    :param accuracy: Accuracy of the model.
+    """
+    model_path: str
+    device: torch.device
+    encoding_path: str
+    accuracy: float
+    applied_techniques: List[str]
+
+    def load_model(self) -> torch.nn.Module:
+        """
+        Load model.
+        :return: Loaded model.
+        """
+        return torch.load(self.model_path).to(self.device)
+
+    def as_dict(self):
+        """Convert to dictionary"""
+        return dict(model=self.load_model(),
+                    accuracy=self.accuracy,
+                    encoding_path=self.encoding_path,
+                    applied_techniques=self.applied_techniques)
+
+
+class _EvalManager:
+    """
+    Evaluation manager for AutoQuant.
+    """
+    def __init__(self,
+                 quantsim_factory: Callable,
+                 eval_func: Callable[[torch.nn.Module], float],
+                 dummy_input_on_cpu: Union[torch.Tensor, Tuple],
+                 results_dir: str,
+                 strict_validation: bool):
+        """
+        :param quantsim_factory: A factory function that returns QuantizationSimModel.
+        :param eval_func: Evaluation function.
+        :param dummy_input: Dummy input to the model. Assumed to be located on the same device as the model.
+        :param dummy_input_on_cpu: Dummy input to the model in CPU memory.
+        :param results_dir: Base directory to save the temporary serialized model.
+        """
+        self._quantsim_factory = quantsim_factory
+        self._eval_func = eval_func
+        self._dummy_input_on_cpu = dummy_input_on_cpu
+        self._results_dir = results_dir
+        self._strict_validation = strict_validation
+
+        os.makedirs(self._results_dir, exist_ok=True)
+
+        self._all_sessions = OrderedDict() # type: OrderedDict[str, _EvalSession]
+
+    def clear(self):
+        """
+        Clear all the session status saved in the previous run
+        """
+        for sess in self._all_sessions.values():
+            sess.reset_status()
+
+    def get_best_ptq_result(self) -> Optional[PtqResult]:
+        """
+        Get the results with the highest evaluation score among the ptq results evaluated so far.
+        :return: The best evaluation result so far.
+        """
+        ptq_results = [sess.ptq_result for sess in self._all_sessions.values()
+                       if sess.ptq_result is not None]
+        if not ptq_results:
+            return None
+
+        return max(ptq_results, key=lambda ptq_result: ptq_result.accuracy)
+
+    def session(self, title: str, ptq: bool = False):
+        """
+        Session factory.
+        :param title: Title of the session.
+        :param ptq: True if this session is a ptq session
+        :return: Session object.
+        """
+        if title not in self._all_sessions:
+            session = _EvalSession(title,
+                                   self._quantsim_factory,
+                                   self._eval_func,
+                                   self._dummy_input_on_cpu,
+                                   results_dir=os.path.join(self._results_dir, ".trace"),
+                                   strict_validation=self._strict_validation,
+                                   ptq=ptq)
+            self._all_sessions[title] = session
+        return self._all_sessions[title]
+
+    HTML_TEMPLATE_FILE = os.path.join(
+        os.path.dirname(os.path.abspath(__file__)),
+        "auto_quant_diagnostics_template.html",
+    )
+
+    def export_diagnostics(self) -> str:
+        """
+        Export diagnostics in html format.
+        :return: Diagnostics string in html format.
+        """
+        loader = jinja2.FileSystemLoader(os.path.dirname(self.HTML_TEMPLATE_FILE))
+        env = jinja2.Environment(loader=loader)
+        template = env.get_template(os.path.basename(self.HTML_TEMPLATE_FILE))
+
+        if any(sess.diagnostics.contains_bokeh() for sess in self._all_sessions.values()):
+            head = CDN.render()
+        else:
+            head = ""
+
+        log = io.StringIO()
+        for sess in self._all_sessions.values():
+            if sess.diagnostics.is_empty():
+                continue
+            log.write(
+                f"<h1> {sess.title} </h1>\n"
+            )
+            content = "\n".join(
+                line.get_html_elem() for line in sess.diagnostics
+            )
+            log.write(f"{content}\n")
+
+        result = OrderedDict()
+        result["ptq_techniques"] = OrderedDict()
+
+        for sess in self._all_sessions.values():
+            if sess.is_ptq_session():
+                result["ptq_techniques"][sess.title_lowercase] = sess.result
+            else:
+                result[sess.title_lowercase] = sess.result
+
+        flowchart_metadata = _build_flowchart_metadata(result)
+
+        html = template.render(head=head, log=log.getvalue(), **flowchart_metadata)
+
+        filename = os.path.join(self._results_dir, "diagnostics.html")
+        with open(filename, "w") as f:
+            f.write(html)
+        return html
+
+
+class _EvalSession: # pylint: disable=too-many-instance-attributes
+    """
+    Evaluation session for AutoQuant.
+
+    Each session object contains a title and diagnostics produced during the session.
+    The collected diagnostics will be exported into a html file by _EvalManager.
+    """
+    def __init__(
+            self,
+            title: str,
+            quantsim_factory: Callable,
+            eval_func: Callable[[torch.nn.Module], float],
+            dummy_input_on_cpu: Union[torch.Tensor, Tuple],
+            results_dir: str,
+            strict_validation: bool,
+            ptq: bool,
+    ):
+        """
+        :param title: Title of the session.
+        :param quantsim_factory: A factory function that returns QuantizationSimModel.
+        :param eval_func: Evaluation function.
+        :param dummy_input_on_cpu: Dummy input to the model in CPU memory.
+        :param results_dir: Base directory to save the temporary serialized model.
+        :param ptq: True if this session is a ptq session
+        """
+        self.title = title
+        self._quantsim_factory = quantsim_factory
+        self._eval_func = eval_func
+        self._dummy_input_on_cpu = dummy_input_on_cpu
+        self._results_dir = results_dir
+        self._strict_validation = strict_validation
+        self._ptq = ptq
+
+        self._spinner = None
+
+        self.result = {
+            "status": None,
+            "error": None,
+            "target_satisfied": False,
+            "effective": True,
+        }
+
+        os.makedirs(self._results_dir, exist_ok=True)
+
+        self.diagnostics = Diagnostics()
+
+        # Map session title to file name.
+        # e.g. title: "Cross-Layer Equalization" -> filename: "cross_layer_equalization"
+        self.title_lowercase = self.title.lower().replace("-", " ")
+        self.title_lowercase = "_".join(self.title_lowercase.split())
+
+        stdout_write = sys.stdout.write
+        self._log = io.StringIO()
+
+        # Redirects stdout to self._log
+        def write_wrapper(*args, **kwargs):
+            self._log.write(*args, **kwargs)
+            return stdout_write(*args, **kwargs)
+
+        self._stdout_redirect = patch.object(sys.stdout, "write", write_wrapper)
+        self._ptq_result = None
+        self._cached_result = None
+
+    def is_ptq_session(self):
+        """
+        Getter method of self._ptq flag
+        """
+        return self._ptq
+
+    def reset_status(self):
+        """
+        Reset the session status saved in the previous run
+        """
+        self.result = {
+            "status": None,
+            "error": None,
+            "target_satisfied": False,
+            "effective": True,
+        }
+
+    def wrap(self, fn):
+        """
+        Return a wrapper function that caches the return value.
+
+        :param fn: Function to wrap.
+        :returns: Function whose return value is cached.
+        """
+
+        results_dir = self._results_dir
+        class CachedResult:
+            """Cached result """
+            def __init__(self, obj):
+                self._filename = os.path.join(results_dir, f".{uuid4()}")
+                while os.path.exists(self._filename):
+                    self._filename = os.path.join(results_dir, f".{uuid4()}")
+                with open(self._filename, "wb") as f:
+                    pickle.dump(obj, f)
+
+            def load(self):
+                """Load cached result """
+                with open(self._filename, "rb") as f:
+                    return pickle.load(f)
+
+        @functools.wraps(fn)
+        def wrapper(*args, **kwargs):
+            if self._cached_result:
+                return self._cached_result.load()
+            ret = fn(*args, **kwargs)
+            self._cached_result = CachedResult(ret)
+            return ret
+        return wrapper
+
+    def eval(self, model: torch.nn.Module, **kwargs):
+        """
+        Evaluate the model.
+        :param model: Model to evaluate.
+        :param **kwargs: Additional arguments to the quantsim factory.
+        :return: Eval score.
+        """
+        sim = self._quantsim_factory(model, **kwargs)
+        acc = self._eval_func(sim.model)
+        return acc
+
+    def __enter__(self):
+        self._spinner = Spinner(self.title)
+        self._spinner.__enter__()
+        self._stdout_redirect.start()
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        if self._ptq_result is not None:
+            _logger.info("Session finished: %s. (eval score: %f)",
+                         self.title, self._ptq_result.accuracy)
+
+        self._spinner.__exit__(exc_type, exc_val, exc_tb)
+
+        if exc_val:
+            buffer = io.StringIO()
+            traceback.print_exception(exc_type, exc_val, exc_tb, file=buffer)
+
+            if exc_type == _StageSkipped:
+                print(exc_val.args[0])
+            else:
+                if self._strict_validation:
+                    print(buffer.getvalue())
+                else:
+                    print(
+                        "################################################################\n"
+                        "################################################################\n"
+                        "################################################################\n"
+                        "WARNING: The following exception was raised but ignored:\n\n"
+                        f"{buffer.getvalue()}"
+                        "################################################################\n"
+                        "################################################################\n"
+                        "################################################################\n"
+                    )
+
+        self._stdout_redirect.stop()
+        self.diagnostics.add(self._log.getvalue())
+
+        self.result["error"] = exc_val
+        if not exc_val:
+            self.result["status"] = "success"
+        elif exc_type == _StageSkipped:
+            self.result["status"] = "discarded"
+            return True
+        elif self._strict_validation:
+            self.result["status"] = "error-failed"
+        else:
+            self.result["status"] = "error-ignored"
+
+        if exc_val and not self._strict_validation:
+            # Return True so that the error doesn't propagate further
+            return True
+        return None
+
+    @property
+    def ptq_result(self) -> Optional[PtqResult]:
+        """Getter of self._ptq_result."""
+        return self._ptq_result
+
+    def set_ptq_result(
+            self,
+            applied_techniques: List[str],
+            model: torch.nn.Module = None,
+            sim: QuantizationSimModel = None,
+            acc: float = None,
+            export_kwargs: Mapping = None,
+            **kwargs
+    ) -> None:
+        """
+        Set the result of PTQ. Should be called exactly once inside a with-as block.
+
+        Exactly one among model and (sim, acc) pair should be specified.
+        1) If sim and acc is specified, save them as the result of this session.
+        2) If model is specified, evaluate the quantized accuracy of the model and save the result.
+
+        :param model: Result of PTQ.
+        :param sim: Result of PTQ. The quamtization encoding (compute_encodings()) is
+                    assumed to have been computed in advance.
+        :param acc: Eval score.
+        :param **kwargs: Additional arguments to the quantsim factory.
+        :return: None
+        """
+        if export_kwargs is None:
+            export_kwargs = {}
+
+        if sim is None:
+            assert acc is None
+            assert model is not None
+            sim = self._quantsim_factory(model, **kwargs)
+            acc = self._eval_func(sim.model)
+        else:
+            assert acc is not None
+            assert model is None
+
+        self._set_ptq_result(sim, acc, applied_techniques, export_kwargs)
+
+    def _set_ptq_result(
+            self,
+            sim: QuantizationSimModel,
+            acc: float,
+            applied_techniques: List[str],
+            export_kwargs: Mapping,
+    ) -> PtqResult:
+        """
+        Set the result of PTQ. Should be called exactly once inside a with-as block.
+
+        :param sim: Result of PTQ. The quamtization encoding (compute_encodings()) is
+                    assumed to have been computed in advance.
+        :param acc: Eval score.
+        :param export_kwargs: Additional kwargs for sim.export
+        :return: PtqResult object.
+        """
+        if self._ptq_result is not None:
+            raise RuntimeError(
+                "sess.eval() can be called only once per each _EvalSession instance."
+            )
+
+        device = utils.get_device(sim.model)
+        model_path, encoding_path = self._export(sim, export_kwargs)
+        self._ptq_result = PtqResult(
+            model_path=model_path,
+            device=device,
+            encoding_path=encoding_path,
+            accuracy=acc,
+            applied_techniques=applied_techniques,
+        )
+        return self._ptq_result
+
+    def _export(self, sim: QuantizationSimModel, export_kwargs: Mapping) -> Tuple[str, str]:
+        """
+        Export quantsim.
+        :param sim: QuantizationSimModel object to export.
+        :param export_kwargs: Additional kwargs for sim.export
+        :return: The paths where model and encoding are saved
+        """
+        sim.export(path=self._results_dir,
+                   filename_prefix=self.title_lowercase,
+                   dummy_input=self._dummy_input_on_cpu,
+                   **export_kwargs)
+        model_path = os.path.join(self._results_dir, f"{self.title_lowercase}.pth")
+        encoding_path = os.path.join(self._results_dir, f"{self.title_lowercase}.encodings")
+        _logger.info("The results of %s is saved in %s and %s.",
+                     self.title, model_path, encoding_path)
+        return model_path, encoding_path
+
+
+@contextlib.contextmanager
+def spy_auto_quant(auto_quant: AutoQuantBase):
+    """
+    Install a spy that collects the handles to the ptq result of
+    each stage of AutoQuant.
+
+    Typical usage::
+        >>> auto_quant = AutoQuant(...)
+        ... with auto_quant_spy(auto_quant) as spy:
+        ...     _ = auto_quant.apply(...)
+        ...
+        ... for result in spy.get_all_ptq_results():
+        ...     print(result.applied_techniques)
+        ...     print(result.accuracy)
+        ...     print(result.encoding_path)
+        ...     model = result.load_model()
+        ...     ...
+    """
+    # pylint: disable=protected-access
+    class Spy:
+        """
+        Spy that collects the handles to the ptq result of
+        each stage of AutoQuant.
+        """
+        def __init__(self, eval_manager):
+            self._eval_manager = eval_manager
+
+        def get_all_ptq_results(self) -> List[PtqResult]:
+            """Return handles to the results of AutoQuant"""
+            if self._eval_manager is None:
+                return []
+            return [sess.ptq_result for sess in self._eval_manager._all_sessions.values()
+                    if sess.ptq_result is not None]
+
+    spy = Spy(auto_quant.eval_manager)
+
+    _optimize_main = auto_quant._optimize_main
+
+    def _optimize_main_wrapper(fp32_model, target_acc):
+        return _optimize_main(fp32_model, target_acc)
+
+    try:
+        setattr(auto_quant, "_optimize_main", _optimize_main_wrapper)
+        yield spy
+    finally:
+        setattr(auto_quant, "_optimize_main", _optimize_main)
+
+
+def _build_flowchart_metadata(result: Mapping) -> Dict: # pylint: disable=too-many-return-statements
+    """
+    Build flowchart metadata for the html template of summary report
+
+    :param result: Result of AutoQuant with the following format:
+
+        result := {
+            "prepare_model": _stage_result,
+            "quantscheme_selection": _stage_result,
+            "w32_evaluation": _stage_result,
+            "ptq_techniques" [
+                "batchnorm_folding": _stage_result,
+                "cross_layer_equalization": _stage_result,
+                "adaround": _stage_result,
+            ]
+
+        }
+
+        where _stage_result is a dictionary defined as below:
+
+        _stage_result := {
+            "status": str,
+            "error": Exception,
+            "target_satisfied": bool,
+            "effective": bool,
+        }
+
+    :return: Dictionary that contains flowchart metadata for html template
+    """
+    metadata = defaultdict(str)
+    metadata.update(
+        edge_prepare_model_in='data-visited="true"',
+        node_prepare_model='data-visited="true"',
+    )
+
+    status = result['prepare_model']['status']
+    metadata.update(
+        node_prepare_model=f'data-visited="true" data-stage-result="{status}"',
+    )
+
+    if status == 'error-failed':
+        return metadata
+
+    metadata.update(
+        edge_prepare_model_out='data-visited="true"',
+    )
+
+    if "quantscheme_selection" in result:
+        status = result['quantscheme_selection']['status']
+        metadata.update(
+            node_quant_scheme_selection=f'data-visited="true" data-stage-result="{status}"',
+        )
+
+        if status == 'error-failed':
+            return metadata
+
+    metadata.update(
+        edge_quant_scheme_selection_out='data-visited="true"',
+        node_test_w32_eval_score='data-visited="true"',
+    )
+
+    if not result["w32_evaluation"]["target_satisfied"]:
+        metadata.update(
+            edge_test_w32_eval_score_if_false='data-visited="true"',
+            node_result_fail='data-visited="true"',
+        )
+        return metadata
+
+    metadata.update(
+        edge_test_w32_eval_score_if_true='data-visited="true"',
+    )
+
+
+    for ptq_name, ptq_result in result["ptq_techniques"].items():
+        status = ptq_result['status']
+        effective = ptq_result['effective']
+        if status == "success" and not effective:
+            status = "discarded"
+        metadata.update({
+            f"node_{ptq_name}": f'data-visited="true" data-stage-result="{status}"',
+        })
+
+        if status == 'error-failed':
+            return metadata
+
+        metadata.update({
+            f'edge_{ptq_name}_out': 'data-visited="true"',
+            f'node_test_{ptq_name}': 'data-visited="true"',
+        })
+
+        if ptq_result['target_satisfied']:
+            metadata.update({
+                f'edge_test_{ptq_name}_if_true': 'data-visited="true"',
+                'node_result_success': 'data-visited="true"',
+            })
+            return metadata
+
+        metadata.update({
+            f'edge_test_{ptq_name}_if_false': 'data-visited="true"',
+        })
+
+    metadata.update(
+        node_result_fail='data-visited="true"',
+    )
+
+    return metadata
+
+
+
[docs]class AutoQuant(AutoQuantBase): # pylint: disable=too-many-instance-attributes + """ + Integrate and apply post-training quantization techniques. + + AutoQuant includes 1) batchnorm folding, 2) cross-layer equalization, + and 3) Adaround. + These techniques will be applied in a best-effort manner until the model + meets the evaluation goal given as allowed_accuracy_drop. + """ + + @staticmethod + def _get_adaround(): + """ returns AdaRound """ + return Adaround + + @staticmethod + def _get_adaround_parameters(data_loader, num_batches): + return AdaroundParameters(data_loader, num_batches) + + @staticmethod + def _get_quantsim(model, dummy_input, **kwargs): + return QuantizationSimModel(model, dummy_input, **kwargs) + + def _configure_quantsim(self, # pylint: disable=too-many-arguments + sim, + output_bw, + output_quant_scheme, + output_percentile, + param_bw, + param_quant_scheme, + param_percentile, + encoding_path): + + param_quantizers, input_quantizers, output_quantizers = utils.get_all_quantizers(sim.model) + + # Set input/output quantizers' quant schemes + for quantizer in itertools.chain(input_quantizers, output_quantizers): + quantizer.quant_scheme = output_quant_scheme + if quantizer.quant_scheme == QuantScheme.post_training_percentile and\ + output_percentile is not None: + quantizer.set_percentile_value(output_percentile) + + # Set param quantizers' quant schemes + for quantizer in param_quantizers: + quantizer.quant_scheme = param_quant_scheme + if quantizer.quant_scheme == QuantScheme.post_training_percentile and\ + param_percentile is not None: + quantizer.set_percentile_value(param_percentile) + + if encoding_path: + sim.set_and_freeze_param_encodings(encoding_path) + + param_quantizers, input_quantizers, output_quantizers = utils.get_all_quantizers(sim.model) + + # Disable input/output quantizers, using fp32 to simulate int32. + if output_bw == 32: + for quantizer in input_quantizers + output_quantizers: + quantizer.enabled = False + + # Disable param quantizers, using fp32 to simulate int32. + if param_bw == 32: + for quantizer in param_quantizers: + quantizer.enabled = False + + @staticmethod + def _has_enabled_quantizers(sim): + param_quantizers, input_quantizers, output_quantizers = utils.get_all_quantizers(sim.model) + return any(quantizer.enabled for quantizer in param_quantizers +\ + input_quantizers +\ + output_quantizers) + + @staticmethod + def _disable_activation_quantizers(sim): + _, input_quantizers, output_quantizers = get_all_quantizers(sim.model) + for quantizer in itertools.chain(input_quantizers, output_quantizers): + quantizer.enabled = False
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/batch_norm_fold.html b/releases/1.32.2/_modules/aimet_torch/batch_norm_fold.html new file mode 100644 index 0000000..68f848f --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/batch_norm_fold.html @@ -0,0 +1,1751 @@ + + + + + + aimet_torch.batch_norm_fold — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.batch_norm_fold

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Optimization code to fold batch-norm layers """
+
+import contextlib
+import math
+from typing import List, Tuple, Union, Dict, Iterable, Set, Any
+import numpy as np
+import torch
+import torch.nn
+from torch.nn.modules.batchnorm import BatchNorm1d, BatchNorm2d
+from torch.nn.modules.conv import _ConvTransposeNd
+
+import aimet_common.libpymo as libpymo
+
+from aimet_common.bias_correction import ConvBnPatternHandler, CONV_OP_TYPES, LINEAR_OP_TYPES, BN_OP_TYPES
+from aimet_common.graph_pattern_matcher import PatternType
+from aimet_common.graph_searcher import GraphSearcher
+from aimet_common.utils import AimetLogger
+
+# pylint: disable=unused-import
+from aimet_torch.defs import PassThroughOp
+from aimet_torch import utils
+from aimet_torch.meta.connectedgraph import ConnectedGraph
+from aimet_torch.quantsim import QuantizationSimModel
+from aimet_torch.qc_quantize_op import QcQuantizeWrapper
+from aimet_torch.tensor_quantizer import LearnedGridTensorQuantizer
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.BatchNormFolding)
+
+
+LayerType = Union[
+    torch.nn.Linear,
+    torch.nn.Conv1d,
+    torch.nn.Conv2d,
+    torch.nn.ConvTranspose2d,
+]
+_supported_layers = LayerType.__args__
+
+BatchNormType = Union[BatchNorm1d, BatchNorm2d]
+_supported_batchnorms = BatchNormType.__args__
+
+
+def _delete_bn_from_model(model: torch.nn.Module, bn_layer_list: Iterable[BatchNormType]):
+    utils.replace_modules_with_instances_of_new_type(model, bn_layer_list, torch.nn.Identity)
+
+
+@contextlib.contextmanager
+def _expand_shape_to_4d(weight_tensor: libpymo.TensorParams):
+    """ Expand the shape of the weight into 4d.  """
+    dims = len(weight_tensor.shape)
+
+    if dims > 5:
+        raise RuntimeError
+
+    if dims == 4:
+        yield weight_tensor
+
+    else:
+        orig_shape = weight_tensor.shape
+        if dims < 4:
+            # If we have less dimensions, we add 1s to make 4 dimensions
+            _4d_shape = np.append(orig_shape, [1 for _ in range(4-dims)]).astype(int)
+        else:
+            # If we have more dimensions, we concatenate all the dimensions beyond 3 into one dimension
+            _4d_shape = np.array(orig_shape[:3] + [math.prod(orig_shape[3:])])
+
+        try:
+            weight_tensor.shape = _4d_shape
+            yield weight_tensor
+        finally:
+            weight_tensor.shape = orig_shape
+
+
+def _call_mo_batch_norm_fold(weight: torch.Tensor,
+                             bias: torch.Tensor,
+                             bn: BatchNormType,
+                             fold_backward: bool):
+    """
+    Calls C++ batch norm folding API.
+
+    :param weight: Weight or scale tensor to fold BN into.
+    :param bias: Bias tensor to fold BN into.
+    :param bn: Batch Norm layer
+    :param fold_backward: True if BatchNorm comes after Conv/Linear layer
+    """
+    with torch.no_grad():
+        bn_params = libpymo.BNParams()
+        bn_params.gamma = bn.weight.detach().cpu().numpy().reshape(-1)
+        bn_params.beta = bn.bias.detach().cpu().numpy().reshape(-1)
+        bn_params.runningMean = bn.running_mean.detach().cpu().numpy().reshape(-1)
+        sigma = torch.sqrt(bn.running_var + bn.eps)
+        bn_params.runningVar = sigma.detach().cpu().numpy().reshape(-1)
+
+        weight_tensor = libpymo.TensorParams()
+
+        weight_tensor.data = weight.detach().cpu().numpy().reshape(-1)
+        weight_tensor.shape = np.array(weight.shape)
+
+        bias_tensor = libpymo.TensorParams()
+
+        bias_tensor.data = bias.detach().cpu().numpy().reshape(-1)
+        bias_tensor.shape = np.array(bias.shape)
+        is_bias_valid = True
+
+        with _expand_shape_to_4d(weight_tensor):
+            _bias = libpymo.fold(bn_params, weight_tensor, bias_tensor, is_bias_valid, fold_backward)
+
+        bias.copy_(torch.tensor(_bias, device=bias.device, dtype=bias.dtype)
+                   .reshape_as(bias))
+
+        weight.copy_(torch.tensor(weight_tensor.data, device=weight.device, dtype=weight.dtype)
+                     .reshape_as(weight))
+
+
+class _BatchNormFoldingNotSupported(RuntimeError):
+    pass
+
+
+def _fold_to_scale(conv_wrapper: QcQuantizeWrapper, bn_wrapper: QcQuantizeWrapper):
+    """
+    Fold BatchNorm into the scale and bias of the given layer.
+
+    :param conv_wrapper: QcQuantizeWrapper that wraps conv or linear layer.
+    :param bn_wrapper: QcQuantizeWrapper that wraps bn.
+    """
+    # pylint: disable=protected-access, too-many-locals, too-many-branches, too-many-statements
+    conv = conv_wrapper._module_to_wrap
+    bn = bn_wrapper._module_to_wrap
+
+    weight_quantizer = conv_wrapper.param_quantizers["weight"]
+
+    if not isinstance(weight_quantizer, LearnedGridTensorQuantizer):
+        raise _BatchNormFoldingNotSupported(
+            "BatchNorm folding to scale supports LearnedGridTensorQuantizer only; "
+            f"got {type(weight_quantizer)}."
+        )
+
+    output_quantizer = conv_wrapper.output_quantizers[0]
+
+    if output_quantizer.enabled:
+        raise _BatchNormFoldingNotSupported(
+            "BatchNorm should belong to the same supergroup with the layer to be folded to."
+        )
+
+    if "bias" in conv_wrapper.param_quantizers:
+        bias_quantizer = conv_wrapper.param_quantizers["bias"]
+        if bias_quantizer.enabled:
+            raise _BatchNormFoldingNotSupported(
+                "Can't fold BatchNorm to scale if bias quantizer is enabled."
+            )
+
+    encodings = weight_quantizer.encoding
+
+    if encodings is None:
+        raise RuntimeError
+
+    if isinstance(encodings, libpymo.TfEncoding):
+        encodings = [encodings]
+
+    if isinstance(conv, _ConvTransposeNd) and conv.groups != 1:
+        raise _BatchNormFoldingNotSupported(
+            "BatchNorm folding to scale is not supported for grouped ConvTransposeNd."
+        )
+
+    # Add quantization noise to the BN params (bn weight & bn bias) before folding.
+    # NOTE: Quantization of foldable batchnorms is automatically disabled when
+    #       initializing quantsim. However, it is still safer to call _quantize_params here
+    #       as we can't guarantee this is always the case.
+    #       For example, the user can manually enable quantization of batchnorms, etc...
+    #       (FYI: _quantize_params takes effect only when the parameter quantizers are enabled)
+    with bn_wrapper._quantize_params():
+        _fold_to_weight(conv, bn, fold_backward=True)
+
+        gamma = bn.weight
+        sigma = torch.sqrt(bn.running_var + bn.eps)
+
+        new_encodings = []
+        for old_encoding, c in zip(encodings, gamma/sigma):
+            new_encoding = libpymo.TfEncoding()
+            new_encoding.delta = old_encoding.delta * abs(c)
+            if c >= 0:
+                new_encoding.max = old_encoding.max * c
+                new_encoding.min = old_encoding.min * c
+            else:
+                new_encoding.max = old_encoding.min * c
+                new_encoding.min = old_encoding.max * c
+            new_encoding.offset = old_encoding.offset
+            new_encoding.bw = old_encoding.bw
+            new_encodings.append(new_encoding)
+
+        weight_quantizer.encoding = new_encodings
+
+    # Copy batchnorm's output quantizers to conv output quantizers
+    for conv_output_quantizer, bn_output_quantizer in\
+            zip(conv_wrapper.output_quantizers, bn_wrapper.output_quantizers):
+        conv_output_quantizer.enabled = bn_output_quantizer.enabled
+
+        if bn_output_quantizer.encoding is not None:
+            encoding = libpymo.TfEncoding()
+            encoding.delta  = bn_output_quantizer.encoding.delta
+            encoding.max    = bn_output_quantizer.encoding.max
+            encoding.min    = bn_output_quantizer.encoding.min
+            encoding.offset = bn_output_quantizer.encoding.offset
+            encoding.bw     = bn_output_quantizer.encoding.bw
+            conv_output_quantizer.encoding = encoding
+
+        bn_output_quantizer.enabled = False
+
+    if "bias" not in conv_wrapper.param_quantizers:
+        bias_quantizer = LearnedGridTensorQuantizer(weight_quantizer.bitwidth,
+                                                    weight_quantizer.round_mode,
+                                                    weight_quantizer.quant_scheme,
+                                                    weight_quantizer.use_symmetric_encodings,
+                                                    enabled_by_default=False,
+                                                    data_type=weight_quantizer.data_type)
+        bias_quantizer._ch_axis = weight_quantizer._ch_axis
+        conv_wrapper.param_quantizers["bias"] = bias_quantizer
+
+
+def _fold_to_weight(conv_linear: LayerType, bn: BatchNormType, fold_backward: bool):
+    """
+    Fold BatchNorm into the weight and bias of the given layer.
+
+    :param conv_linear: Conv or linear layer to fold BN into.
+    :param bn: BatchNorm to fold.
+    """
+    # Transpose weights to C, N, H, W from N, C, H, W since axis are flipped for transposed conv
+    # However depthwise conv layers are always N, 1, H, W whether transposed-conv or not, so no need to transpose
+    if isinstance(conv_linear, torch.nn.ConvTranspose2d) and conv_linear.groups == 1:
+        conv_linear.weight.data = conv_linear.weight.data.permute(1, 0, 2, 3)
+
+    if conv_linear.bias is None:
+        out_channels = conv_linear.out_features if isinstance(conv_linear, torch.nn.Linear)\
+                       else conv_linear.out_channels
+        bias = torch.zeros(out_channels,
+                           device=conv_linear.weight.device,
+                           dtype=conv_linear.weight.dtype)
+        conv_linear.bias = torch.nn.Parameter(bias)
+
+    _call_mo_batch_norm_fold(conv_linear.weight, conv_linear.bias, bn, fold_backward=fold_backward)
+
+    # Transpose weight back to N, C, H, W for transposed Conv2D, for non-depthwise layers
+    if isinstance(conv_linear, torch.nn.ConvTranspose2d) and conv_linear.groups == 1:
+        conv_linear.weight.data = conv_linear.weight.data.permute(1, 0, 2, 3)
+
+
+
[docs]def fold_given_batch_norms(model, layer_pairs): + """ + Fold a given set of batch_norm layers into conv layers + + :param model: Model + :param layer_pairs: Pairs of conv and batch_norm layers to use for folding + :return: None + """ + # pylint: disable=protected-access + conv_bn_pairs = [] + bn_conv_pairs = [] + + def is_batchnorm(module: torch.nn.Module) -> bool: + if isinstance(module, QcQuantizeWrapper): + module = module._module_to_wrap + return isinstance(module, _supported_batchnorms) + + def is_conv_linear(module: torch.nn.Module) -> bool: + if isinstance(module, QcQuantizeWrapper): + module = module._module_to_wrap + return isinstance(module, _supported_layers) + + for x, y in layer_pairs: + if is_batchnorm(x): + assert is_conv_linear(y) + bn = x + conv = y + bn_conv_pairs.append((bn, conv)) + else: + assert is_conv_linear(x) + assert is_batchnorm(y) + conv = x + bn = y + conv_bn_pairs.append((conv, bn)) + + _fold_given_batch_norms(model, conv_bn_pairs, bn_conv_pairs)
+ + +def _fold_given_batch_norms(model, + conv_bn_pairs: Iterable[Tuple[torch.nn.Module, torch.nn.Module]], + bn_conv_pairs: Iterable[Tuple[torch.nn.Module, torch.nn.Module]]): + """ + Fold a given set of batch_norm layers into conv layers + + :param model: Model + :param conv_bn_pairs: List of (conv, bn) pairs to fold + :param bn_conv_pairs: List of (bn, conv) pairs to fold + :return: None + """ + # pylint: disable=protected-access + for bn, conv in bn_conv_pairs: + if isinstance(conv, QcQuantizeWrapper): + raise RuntimeError(f"Forward folding to scale is not possible. Got {conv}") + + bn_modules = [] + + def _fold(conv, bn, fold_backward): + is_wrapped = isinstance(conv, QcQuantizeWrapper) or isinstance(bn, QcQuantizeWrapper) + try: + if is_wrapped: + assert isinstance(conv, QcQuantizeWrapper) and isinstance(bn, QcQuantizeWrapper) + _fold_to_scale(conv, bn) + bn_modules.append(bn._module_to_wrap) + else: + _fold_to_weight(conv, bn, fold_backward=fold_backward) + except _BatchNormFoldingNotSupported as e: + bn_name = utils.get_layer_name(model, bn) + conv_name = utils.get_layer_name(model, conv) + _logger.warning( + "Failed to fold %s to %s. [Reason] %s", bn_name, conv_name, str(e) + ) + else: + bn_modules.append(bn._module_to_wrap if is_wrapped else bn) + + + with utils.in_eval_mode(model), torch.no_grad(): + for conv, bn in conv_bn_pairs: + _fold(conv, bn, fold_backward=True) + + for bn, conv in bn_conv_pairs: + _fold(conv, bn, fold_backward=False) + + _delete_bn_from_model(model, bn_modules) + + +def find_all_batch_norms_to_fold(model, input_shapes, dummy_input: Union[torch.Tensor, Tuple] = None): + """ + Find all possible batch norm layers that can be folded. And returns a list of pairs such that (bn, layer) + means bn will be forward-folded into layer and (layer, bn) means bn will be backward-folded into layer + :param model: Model to search + :param input_shapes: Input shapes to use for the model (can be one or multiple inputs) + :param dummy_input: A dummy input to the model. Can be a Tensor or a Tuple of Tensors + :return: List of pairs of bn and layers to fold bn into + """ + device = utils.get_device(model) + if dummy_input is not None: + connected_graph = ConnectedGraph(model, dummy_input) + else: + device = utils.get_device(model) + inp_tensor_list = utils.create_rand_tensors_given_shapes(input_shapes, device) + connected_graph = ConnectedGraph(model, inp_tensor_list) + + conv_bn_pairs, bn_conv_pairs, _ = _find_all_batch_norms_to_fold(connected_graph) + return conv_bn_pairs + bn_conv_pairs + + +def _find_all_batch_norms_to_fold(connected_graph: ConnectedGraph) -> Tuple[ + List[Tuple[LayerType, BatchNormType]], List[Tuple[BatchNormType, LayerType]]]: + """ + Find all possible batch norm layers that can be folded. And returns a list of pairs such that (bn, layer) + means bn will be forward-folded into layer and (layer, bn) means bn will be backward-folded into layer + :param connected_graph: Connected graph associated with the model. + :return: A list of (layer, bn) pairs and a list of (bn, layer) pairs, + where `bn` can be folded into to `layer`. + """ + conv_bn_pairs, bn_conv_pairs, bn_to_fold = _find_foldable_bn_pair_and_bn_picked_for_folding(connected_graph) + return conv_bn_pairs, bn_conv_pairs, bn_to_fold + +def _find_foldable_bn_pair_and_bn_picked_for_folding(connected_graph: ConnectedGraph) -> Tuple[ + List[Tuple[LayerType, BatchNormType]], List[Tuple[BatchNormType, LayerType]], Set]: + """ + Find all possible batch norm layers that can be folded. And returns a list of pairs such that (bn, layer) + means bn will be forward-folded into layer and (layer, bn) means bn will be backward-folded into layer + :param connected_graph: Connected graph associated with the model. + :return: A list of (layer, bn) pairs and a list of (bn, layer) pairs, + where `bn` can be folded into to `layer`. + A set of bn ops which can be folded in to immediate convs. + """ + conv_linear_bn_activation_info_dict = find_all_conv_bn_with_activation_in_graph(connected_graph) + + # To mark BN's already picked for backward folding + bn_picked_for_folding = set() + + _conv_linear_optypes = CONV_OP_TYPES + LINEAR_OP_TYPES + ordered_conv_fc_modules = [op.get_module() for op in connected_graph.ordered_ops if op.type in _conv_linear_optypes] + + conv_bn_pairs = [] + # Backward fold is given priority over Forward fold + for module in ordered_conv_fc_modules: + if module in conv_linear_bn_activation_info_dict.keys() and _is_valid_bn_fold(module, True): + bn_info = conv_linear_bn_activation_info_dict[module] + if bn_info.output_bn and bn_info.output_bn not in bn_picked_for_folding: + conv_bn_pairs.append((module, bn_info.output_bn.get_module())) + bn_picked_for_folding.add(bn_info.output_bn) + + bn_conv_pairs = [] + for module in ordered_conv_fc_modules: + if module in conv_linear_bn_activation_info_dict.keys() and _is_valid_bn_fold(module, False): + bn_info = conv_linear_bn_activation_info_dict[module] + if bn_info.input_bn and bn_info.input_bn not in bn_picked_for_folding: + bn_conv_pairs.append((bn_info.input_bn.get_module(), module)) + bn_picked_for_folding.add(bn_info.input_bn) + + return conv_bn_pairs, bn_conv_pairs, bn_picked_for_folding + +def find_standalone_batchnorm_ops(connected_graph: ConnectedGraph)->set: + """ + Find all batchnorms ops can not be folded. + :param connected_graph: Connected graph associated with the model. + :return stand_alone_bn_ops: Set of batchnorm ops can not be folded. + """ + _, _, bn_picked_for_folding = _find_foldable_bn_pair_and_bn_picked_for_folding(connected_graph) + bn_ops = {op for op in connected_graph.get_all_ops().values() if op.type in BN_OP_TYPES} + stand_alone_bn_ops = bn_ops - bn_picked_for_folding + + return stand_alone_bn_ops + +def _is_valid_bn_fold(conv: LayerType, fold_backward: bool) -> bool: + """ + Determine if a given layer can successfully absorb a BatchNorm given the layer type and parameters + :param conv: The Conv/Linear layer to fold a BatchNorm into. + :param fold_backward: True if BatchNorm comes after Conv/Linear layer + :return: True if a BatchNorm layer can be folded without causing output error. + """ + valid = True + if not fold_backward: + # Cannot fold BN -> Conv with padding. AIMET does not support forward folding to grouped or DW Conv + if isinstance(conv, (torch.nn.Conv2d, torch.nn.Conv1d, torch.nn.Conv3d)): + valid &= all(item == 0 for item in conv.padding) + valid &= conv.groups == 1 + # AIMET does not support forward folding to ConvTranspose + elif isinstance(conv, torch.nn.ConvTranspose2d): + valid = False + else: + # AIMET does not support backwards folding to grouped ConvTranspose + if isinstance(conv, torch.nn.ConvTranspose2d): + valid &= conv.groups in (1, conv.in_channels) + return valid + + +def fold_all_batch_norms_to_weight( + model: torch.nn.Module, + input_shapes: Union[Tuple, List[Tuple]], + dummy_input: Union[torch.Tensor, Tuple] = None +) -> List[Tuple[LayerType, BatchNormType]]: + """ + Fold all batch_norm layers in a model into the weight of the corresponding conv layers + + :param model: Model + :param input_shapes: Input shapes for the model (can be one or multiple inputs) + :param dummy_input: A dummy input to the model. Can be a Tensor or a Tuple of Tensors + :return: A list of pairs of layers [(Conv/Linear, BN layer that got folded)] + """ + if isinstance(model, torch.nn.DataParallel): + return fold_all_batch_norms_to_weight(model.module, input_shapes, dummy_input) + device = utils.get_device(model) + if dummy_input is None: + inp_tensor_list = utils.create_rand_tensors_given_shapes(input_shapes, device) + else: + inp_tensor_list = dummy_input + connected_graph = ConnectedGraph(model, inp_tensor_list) + + conv_bn_pairs, bn_conv_pairs, bn_to_fold = _find_all_batch_norms_to_fold(connected_graph) + + _fold_given_batch_norms(model, conv_bn_pairs, bn_conv_pairs) + + # Convert the standalone BNs which are not folded + bn_converted = convert_standalone_batchnorms(model, inp_tensor_list, bn_to_fold) + _logger.info("%d BatchNorms' weights got converted", len(bn_converted)) + return conv_bn_pairs + [(conv, bn) for bn, conv in bn_conv_pairs] + + +def convert_standalone_batchnorms(model: torch.nn.Module, + dummy_input: Union[torch.Tensor, Tuple], + folded_bn: set) -> List[Tuple[Any, BatchNorm2d]]: + """ + Convert the weights of all the standalone batchnorms of a model which didn't get folded. + :param model: torch model for which batch norm folding is being performed + :param dummy_input: dummy input for the model + :param folded_bn: list of BNs which got folded + :return: List of tuple(name, bn_module) whose weights got converted + """ + + module_list = utils.get_ordered_list_of_modules(model, dummy_input) + bn_converted = [] + for name, module in module_list: + if isinstance(module, (torch.nn.BatchNorm1d, torch.nn.BatchNorm2d)) and module not in folded_bn: + convert_batchnorm_parameters(model, module) + _logger.debug("%s weights got converted", name) + bn_converted.append((name, module)) + return bn_converted + + +def convert_batchnorm_parameters(model: torch.nn.Module, bn: Union[torch.nn.BatchNorm1d, torch.nn.BatchNorm2d]): + """ + To convert the weight of a batchnorm such that it becomes in the format y = weights*input + bias + :param model: torch model for which batch norm folding is being performed + :param bn: BatchNorm module whose weights needs to be converted + """ + with utils.in_eval_mode(model), torch.no_grad(): + gamma = bn.weight + beta = bn.bias + running_mean = bn.running_mean + inv_sigma = torch.rsqrt(bn.running_var + bn.eps) + + weight = gamma*inv_sigma + bias = beta - running_mean * weight + + # Update the values + bn.eps = 0 + bn.track_running_stats = False + bn.weight.copy_(weight.clone().detach()) + bn.bias.copy_(bias.clone().detach()) + bn.running_mean = torch.zeros(bn.running_mean.shape, device=bn.running_mean.device, dtype=bn.running_mean.dtype) + bn.running_var = torch.ones(bn.running_var.shape, device=bn.running_var.device, dtype=bn.running_var.dtype) + + +fold_all_batch_norms = fold_all_batch_norms_to_weight + + +
[docs]def fold_all_batch_norms_to_scale( + sim: QuantizationSimModel, +) -> List[Tuple[QcQuantizeWrapper, QcQuantizeWrapper]]: + """ + Fold all batch_norm layers in a model into the quantization scale parameter + of the corresponding conv layers + + :param sim: QuantizationSimModel + :return: A list of pairs of layers [(Conv/Linear, BN layer that got folded)] + """ + # pylint: disable=protected-access + assert sim.model is not None + assert sim.connected_graph is not None + + model = sim.model + connected_graph = sim.connected_graph + + quant_wrappers = { + quant_wrapper._module_to_wrap: quant_wrapper + for _, quant_wrapper in sim.quant_wrappers() + } + conv_bn_pairs, bn_conv_pairs, _ = _find_all_batch_norms_to_fold(connected_graph) + conv_bn_pairs = [ + (quant_wrappers[conv], quant_wrappers[bn]) for conv, bn in conv_bn_pairs + ] + bn_conv_pairs = [ + (quant_wrappers[bn], quant_wrappers[conv]) for bn, conv in bn_conv_pairs + ] + + _fold_given_batch_norms(model, conv_bn_pairs, bn_conv_pairs) + + return conv_bn_pairs + [(conv, bn) for bn, conv in bn_conv_pairs]
+ + +def find_all_conv_bn_with_activation(model: torch.nn.Module, input_shape: Tuple) -> Dict: + """ + Uses searcher to find preceding and next bn layers for a conv/linear layer + :param model: PyTorch model + :param input_shape: shape of input to the model + :return: dictionary of conv/linear layers with associated bn op / activation info + """ + device = utils.get_device(model) + inp_tensor_list = utils.create_rand_tensors_given_shapes(input_shape, device) + connected_graph = ConnectedGraph(model, inp_tensor_list) + return find_all_conv_bn_with_activation_in_graph(connected_graph) + + +def find_all_conv_bn_with_activation_in_graph(connected_graph: ConnectedGraph) -> Dict: + """ + Uses searcher to find preceding and next bn layers for a conv/linear layer + :param connected_graph: ConnectedGraph object. + :return: dictionary of conv/linear layers with associated bn op / activation info + """ + + # initialize all patterns to be matched and associated call back functions + patterns_with_callbacks = [] + layer_select_handler = ConvBnPatternHandler() + conv_types = ['Conv1d', 'Conv', 'ConvTranspose'] + linear_types = ['Gemm'] + + for op_type in conv_types + linear_types: + patterns_with_callbacks.append(PatternType(pattern=['BatchNormalization', op_type], + action=layer_select_handler)) + patterns_with_callbacks.append(PatternType(pattern=[op_type, 'BatchNormalization'], + action=layer_select_handler)) + patterns_with_callbacks.append(PatternType(pattern=['Conv3d', 'BatchNorm3d'], action=layer_select_handler)) + patterns_with_callbacks.append(PatternType(pattern=['BatchNorm3d', 'Conv3d'], action=layer_select_handler)) + + # create graph searcher instance with connected graph and patterns to search + graph_searcher = GraphSearcher(connected_graph, patterns_with_callbacks) + + # get all conv/linear and bn info + graph_searcher.find_all_patterns_in_graph_apply_actions() + convs_bn_activation_dict = layer_select_handler.get_conv_linear_bn_info_dict() + + return convs_bn_activation_dict +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/bias_correction.html b/releases/1.32.2/_modules/aimet_torch/bias_correction.html new file mode 100644 index 0000000..5772aae --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/bias_correction.html @@ -0,0 +1,1521 @@ + + + + + + aimet_torch.bias_correction — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.bias_correction

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+# TODO Need to exclude this file for PyLint checking. We get the following error that needs to be investigated:
+# RecursionError: maximum recursion depth exceeded while calling a Python object
+# pylint: skip-file
+
+""" Code to perform bias correction for layers """
+from typing import Callable, Tuple, List, Union, Dict
+import copy
+
+import torch
+import torch.nn
+import numpy as np
+import aimet_common.libpymo as libpymo
+
+from aimet_common.graph_pattern_matcher import PatternType
+from aimet_common.graph_searcher import GraphSearcher
+
+from aimet_torch import utils
+from aimet_torch import quantsim as qsim
+from aimet_torch.meta.connectedgraph import ConnectedGraph
+from aimet_torch.quantsim import QcQuantizeWrapper
+from aimet_torch.save_utils import SaveUtils
+from aimet_common.utils import AimetLogger
+from aimet_common.bias_correction import ConvBnInfoType, ConvBnPatternHandler
+from aimet_common.defs import ActivationType
+from aimet_torch.utils import get_ordered_lists_of_conv_fc
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+
+class StopForwardException(Exception):
+    """ Dummy exception to early-terminate forward-pass """
+
+
+def forward_pass(model: torch.nn.Module, batch: torch.Tensor):
+    """
+    forward pass depending model allocation on CPU / GPU till StopForwardException
+    :param model: model
+    :param batch: batch
+    :return: Nothing
+    """
+    # first check if the model is on GPU or not
+    if utils.is_model_on_gpu(model):
+        batch = batch.cuda()
+    try:
+        with utils.in_eval_mode(model), torch.no_grad():
+            _ = model(batch)
+    except StopForwardException:
+        pass
+
+
+def get_quantized_dequantized_weight(layer: torch.nn.Module) -> torch.Tensor:
+    """
+    Gets quantized dequantized weights of a layer
+    :param layer: Conv/FC layer
+    :return: quantized dequantized weights
+    """
+    weight_tensor = layer._module_to_wrap.weight
+    weight_quantizer = layer.param_quantizers['weight']
+
+    quant_dequant_weights = weight_quantizer.quantize_dequantize(weight_tensor, weight_quantizer.round_mode)
+
+    return quant_dequant_weights
+
+
+def register_fwd_hook_for_layer(layer: torch.nn.Module, hook: Callable) -> torch.utils.hooks.RemovableHandle:
+    """
+    register forward hook for given layer
+    :param layer: layer
+    :param hook: hook function
+    :return: hook handle
+    """
+    hook_handle = layer.register_forward_hook(hook)
+    return hook_handle
+
+
+def get_output_data(layer: torch.nn.Module, model: torch.nn.Module, images_in_one_batch: torch.Tensor) -> np.ndarray:
+    """
+    Function to get output values of a layer
+    :param layer: layer
+    :param model: model
+    :param images_in_one_batch
+    :return: list of output of layer for all batches of images
+    """
+    def _hook_to_collect_output_data(module, _, out_data):
+        """
+        hook to collect output data
+        """
+        out_data = utils.to_numpy(out_data)
+        orig_layer_out_data.append(out_data)
+        raise StopForwardException
+
+    hook_handles = list()
+
+    orig_layer_out_data = list()
+
+    # register forward hooks
+    hook_handles.append(register_fwd_hook_for_layer(layer, _hook_to_collect_output_data))
+
+    # forward pass for 1 batch for model
+    forward_pass(model, images_in_one_batch)
+    output_data = np.vstack(orig_layer_out_data)
+
+    # remove hook handles
+    for hook_handle in hook_handles:
+        hook_handle.remove()
+
+    return output_data
+
+
+def call_empirical_mo_correct_bias(layer: torch.nn.Module, bias_correction: libpymo.BiasCorrection):
+    """
+    :param layer: Layer to be corrected
+    :param bias_correction: BiasCorrection object to call pymo interface
+    """
+    device = layer.bias.device
+
+    bias_tensor = libpymo.TensorParamBiasCorrection()
+    bias_tensor.data = layer.bias.detach().cpu().numpy()
+
+    bias_correction.correctBias(bias_tensor)
+
+    bias = torch.nn.Parameter(torch.Tensor(bias_tensor.data))
+
+    layer.bias.data = bias.to(device=device)
+
+
+def call_analytical_mo_correct_bias(layer: torch.nn.Module, bn: Union[torch.nn.BatchNorm2d, None],
+                                    activation_type: Union[ActivationType, None]):
+    """
+    :param layer: Layer to be corrected
+    :param bn: Input BN to layer
+    :param activation_type: Input activation to layer
+    """
+    bias_correction = libpymo.BnBasedBiasCorrection()
+    # Passed wrapped layer since quantized network has to be corrected
+    device = layer._modules['_module_to_wrap'].bias.device
+
+    quant_dequant_weight = get_quantized_dequantized_weight(layer)
+
+    weight_tensor = layer._module_to_wrap.weight
+
+    # Transpose weights to C, N, H, W from N, C, H, W since axis are flipped for transposed conv
+    if isinstance(layer._module_to_wrap, torch.nn.ConvTranspose2d) and layer._module_to_wrap.groups == 1:
+        weight_tensor = weight_tensor.permute(1, 0, 2, 3)
+        quant_dequant_weight = quant_dequant_weight.permute(1, 0, 2, 3)
+
+    quant_dequant_weight = quant_dequant_weight.detach().cpu().numpy()
+
+    weight_tensor = weight_tensor.detach().cpu().numpy()
+    bias_tensor = libpymo.TensorParamBiasCorrection()
+    bias_tensor.data = layer._module_to_wrap.bias.detach().cpu().numpy()
+
+    # Assigning activation to No Acivation
+    activation = libpymo.ActivationType.noActivation
+    bn_params = libpymo.BnParamsBiasCorr()
+    if bn is None:
+        shape = weight_tensor.shape[1]
+        bn_params.gamma = np.ones(shape)
+        bn_params.beta = np.zeros(shape)
+    else:
+        bn_params.gamma = bn.get_module().weight.detach().cpu().numpy()
+        bn_params.beta = bn.get_module().bias.detach().cpu().numpy()
+
+        if activation_type == ActivationType.relu:
+            activation = libpymo.ActivationType.relu
+        # Relu6's type in connected graph is hardtanh
+        elif activation_type == ActivationType.relu6:
+            activation = libpymo.ActivationType.relu6
+
+    bias_correction.correctBias(bias_tensor, quant_dequant_weight, weight_tensor, bn_params, activation)
+
+    # Assigning the updated bias back to the layer
+    bias = torch.nn.Parameter(torch.Tensor(bias_tensor.data))
+
+    layer._module_to_wrap.bias.data = bias.to(device=device)
+
+
+
[docs]def correct_bias(model: torch.nn.Module, quant_params: qsim.QuantParams, + num_quant_samples: int, data_loader, num_bias_correct_samples: int, + conv_bn_dict: Union[Dict[torch.nn.Module, ConvBnInfoType], None] = None, + perform_only_empirical_bias_corr: bool = True, + layers_to_ignore: List[torch.nn.Module] = None): + """ + Corrects bias for each Conv layer of model (unless ignored). A combination of Analytical and Empirical Bias + Correction is used i.e. all the layers which can be corrected using Analytical Bias Correction are corrected + using Analytical Bias Correction and remaining layers are corrected using Empirical method. + + Returns an in-place corrected floating point model + + :param model: Model to be corrected + :param quant_params: Named tuple for quantization simulation for bias correction + :param num_quant_samples: number of samples of images to pass through quantization sim for bias correction. + :param data_loader: data loader for the model + :param num_bias_correct_samples: number of samples for Bias correction + :param conv_bn_dict: Dict of conv and bn with information related to activation. If None, the function calc it + :param perform_only_empirical_bias_corr: Default True. If true will perform only empirical Bias Corr for all layers + irrespective of the fact that layer is eligible for Analytical Bias Corr. + :param layers_to_ignore: list of layer names for which we need to skip bias correction. + + """ + + if layers_to_ignore is None: + layers_to_ignore = [] + + # Find batch size and shape of input tensor + batch_size, input_shape = utils.get_input_shape_batch_size(data_loader) + + # Rounding up number of samples to batch size + n_batches_bias_correction = int(np.ceil(num_bias_correct_samples / batch_size)) + n_batches_quantization = int(np.ceil(num_quant_samples / batch_size)) + + data_loader_n_samples_bias_corr = utils.IterFirstX(data_loader, n_batches_bias_correction) + data_loader_n_samples_quant = utils.IterFirstX(data_loader, n_batches_quantization) + + # TODO: Remove wrapper function + # Create a wrapping function for data loader for quantization + def pass_data_through_model(model, early_stopping_iterations=None, use_cuda=False): + # pylint: disable=unused-argument + # forward pass for given number of batches for model + for (images_in_one_batch, *_) in data_loader_n_samples_quant: + forward_pass(model, images_in_one_batch) + + ordered_conv_linear_nodes = get_ordered_lists_of_conv_fc(model, input_shape) + + if conv_bn_dict is None: + conv_bn_dict = find_all_conv_bn_with_activation(model, input_shape) + + # Create a copy of the model as reference model + model_copy = copy.deepcopy(model) + + # Add bias for all the layers whose bias is None + for name, module in ordered_conv_linear_nodes: + if module.bias is None: + if isinstance(module, (torch.nn.Conv2d, torch.nn.ConvTranspose2d)): + output_size = module.out_channels + elif isinstance(module, torch.nn.Linear): + output_size = module.out_features + module.bias = torch.nn.Parameter(torch.zeros(output_size)) + module.bias.data = module.bias.data.to(device=module.weight.device) + + # Quantize full model + dummy_tensors = utils.create_rand_tensors_given_shapes(input_shape, utils.get_device(model)) + q = qsim.QuantizationSimModel(model=model, quant_scheme=quant_params.quant_scheme, + rounding_mode=quant_params.round_mode, + default_output_bw=quant_params.act_bw, + default_param_bw=quant_params.weight_bw, + in_place=True, + dummy_input=dummy_tensors, config_file=quant_params.config_file) + + # make sure model got updated in-place before we use it for bc updates + assert(q.model is model) + + # updates to skip_output_activation and layers_to_ignore + for name, module in model.named_modules(): + # Skip all layer's output quantization + if isinstance(module, QcQuantizeWrapper): + module.output_quantizers[0].enabled = False + + q.compute_encodings(pass_data_through_model, None) + + # For first conv layer, perform analytical bc if perform_only_empirical_bias_corr is set to False + # and layer is not marked to be ignored during bc. + if not perform_only_empirical_bias_corr: + module_name, module = ordered_conv_linear_nodes[0] + if module not in layers_to_ignore: + logger.info('Correcting layer %s using Analytical Bias Correction', module_name) + quantize_layer = utils.get_layer_by_name(model, module_name) + call_analytical_mo_correct_bias(quantize_layer, None, None) + logger.info('Corrected bias for the layer') + ordered_conv_linear_nodes.pop(0) + + for module_name, module in ordered_conv_linear_nodes: + # Ignore all layers which are skipped by user + if module in layers_to_ignore: + continue + else: + # make sure module is in the model used by qsim. + assert(module in list(q.model.modules())) + # Analytical Bias Correction is only done for Conv layers + reference_layer = utils.get_layer_by_name(model_copy, module_name) + quantize_layer = utils.get_layer_by_name(model, module_name) + + if module in conv_bn_dict.keys(): + + bn_layer_info = conv_bn_dict[module] + + if perform_only_empirical_bias_corr or bn_layer_info is None or bn_layer_info.input_bn is None: + logger.info('Correcting layer %s using Empirical Bias Correction', module_name) + bias_correction = libpymo.BiasCorrection() + + # Get output from quantized model and reference model + + for images_in_one_batch, *_ in data_loader_n_samples_bias_corr: + reference_output_batch = get_output_data(reference_layer, model_copy, images_in_one_batch) + quantized_model_output_batch = get_output_data(quantize_layer, model, images_in_one_batch) + + if isinstance(reference_layer, torch.nn.Linear): + extended_shape = np.concatenate((reference_output_batch.shape, np.array([1, 1]))) + reference_output_batch = reference_output_batch.reshape(extended_shape) + quantized_model_output_batch = quantized_model_output_batch.reshape(extended_shape) + + bias_correction.storePreActivationOutput(reference_output_batch) + bias_correction.storeQuantizedPreActivationOutput(quantized_model_output_batch) + + call_empirical_mo_correct_bias(module, bias_correction) + + else: + logger.info('Correcting layer %s using Analytical Bias Correction', module_name) + call_analytical_mo_correct_bias(quantize_layer, bn_layer_info.input_bn, + bn_layer_info.in_activation_type) + + logger.info('Corrected bias for the layer') + + SaveUtils.remove_quantization_wrappers(model) + + logger.info('Completed bias correction')
+ + +def find_all_conv_bn_with_activation(model: torch.nn.Module, input_shape: Tuple) -> Dict: + """ + Uses searcher to find preceding and next bn layers for a conv/linear layer + :param model: PyTorch model + :param input_shape: shape of input to the model + :return: dictionary of conv/linear layers with associated bn op / activation info + """ + + activation_types = ['Relu', 'Clip'] + + # initialize all patterns to be matched and associated call back functions + patterns_with_callbacks = [] + layer_select_handler = ConvBnPatternHandler() + patterns_with_callbacks.append(PatternType(pattern=['BatchNormalization', 'Conv'], + action=layer_select_handler)) + + patterns_with_callbacks.append(PatternType(pattern=['BatchNormalization', 'ConvTranspose'], + action=layer_select_handler)) + + patterns_with_callbacks.append(PatternType(pattern=['Conv'], + action=layer_select_handler)) + + patterns_with_callbacks.append(PatternType(pattern=['Gemm'], + action=layer_select_handler)) + + for activation in activation_types: + patterns_with_callbacks.append(PatternType(pattern=['BatchNormalization', activation, 'Conv'], + action=layer_select_handler)) + + patterns_with_callbacks.append(PatternType(pattern=['BatchNormalization', activation, 'ConvTranspose'], + action=layer_select_handler)) + + device = utils.get_device(model) + connected_graph = ConnectedGraph(model, (torch.rand(input_shape).to(device),)) + + # create graph searcher instance with connected graph and patterns to search + graph_searcher = GraphSearcher(connected_graph, patterns_with_callbacks) + + # get all conv/linear and bn info + graph_searcher.find_all_patterns_in_graph_apply_actions() + convs_bn_activation_dict = layer_select_handler.get_conv_linear_bn_info_dict() + + return convs_bn_activation_dict +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/bn_reestimation.html b/releases/1.32.2/_modules/aimet_torch/bn_reestimation.html new file mode 100644 index 0000000..821d6b2 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/bn_reestimation.html @@ -0,0 +1,1308 @@ + + + + + + aimet_torch.bn_reestimation — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.bn_reestimation

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+"""BatchNorm Reestimation"""
+
+import itertools
+from typing import Iterable, List, Callable, Any
+
+from tqdm import tqdm
+import torch
+from torch.utils.data import DataLoader
+from torch.nn.modules.batchnorm import _BatchNorm
+from aimet_torch.utils import in_eval_mode, in_train_mode
+from aimet_common.utils import Handle
+
+def _get_active_bn_modules(model: torch.nn.Module) -> Iterable[_BatchNorm]:
+    for module in model.modules():
+        if isinstance(module, _BatchNorm):
+            bn = module
+            if bn.running_mean is not None and bn.running_var is not None:
+                yield bn
+
+
+def _for_each_module(modules: Iterable[torch.nn.Module],
+                     action: Callable[[torch.nn.Module], Handle]) -> Handle:
+    """
+    Apply an undoable action to each module.
+
+    :param modules: Modules to apply the action.
+    :param action: Action to be applied to the modules.
+    :returns: Handle that undos the applied action.
+    """
+
+    handles: List[Handle] = []
+
+    def cleanup():
+        for handle in handles:
+            handle.remove()
+
+    try:
+        for module in modules:
+            handle = action(module)
+            assert isinstance(handle, Handle)
+            handles.append(handle)
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise
+
+
+def _reset_bn_stats(module: _BatchNorm) -> Handle:
+    """
+    Reset BN statistics to the initial values.
+
+    :param module: BatchNorm module.
+    :returns: Handle that restores the original BN statistics upon handle.remove().
+    """
+    orig_running_mean = module.running_mean.clone()
+    orig_running_var = module.running_var.clone()
+    orig_num_batches_tracked = module.num_batches_tracked.clone()
+
+    def cleanup():
+        module.running_mean.copy_(orig_running_mean)
+        module.running_var.copy_(orig_running_var)
+        module.num_batches_tracked.copy_(orig_num_batches_tracked)
+
+    try:
+        module.reset_running_stats()
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise
+
+
+def _reset_momentum(module: _BatchNorm) -> Handle:
+    """
+    Set BN momentum to 1.0.
+
+    :param module: BatchNorm module.
+    :returns: Handle that restores the original BN momentum upon handle.remove().
+    """
+    momentum = module.momentum
+
+    def cleanup():
+        module.momentum = momentum
+
+    try:
+        module.momentum = 1.0
+        return Handle(cleanup)
+    except:
+        cleanup()
+        raise
+
+
+DEFAULT_NUM_BATCHES = 100
+
+
+
[docs]def reestimate_bn_stats(model: torch.nn.Module, + dataloader: DataLoader, + num_batches: int = DEFAULT_NUM_BATCHES, + forward_fn: Callable[[torch.nn.Module, Any], Any] = None) -> Handle: + """ + Reestimate BatchNorm statistics (running mean and var). + + :param model: Model to reestimate the BN stats. + :param dataloader: Training dataset. + :param num_batches: The number of batches to be used for reestimation. + :param forward_fn: Optional adapter function that performs forward pass + given a model and a input batch yielded from the data loader. + :returns: Handle that undos the effect of BN reestimation upon handle.remove(). + """ + forward_fn = forward_fn or (lambda model, data: model(data)) + bn_modules = tuple(_get_active_bn_modules(model)) + + # Set all the layers to eval mode except batchnorm layers + with in_eval_mode(model), in_train_mode(bn_modules), torch.no_grad(): + with _for_each_module(bn_modules, action=_reset_momentum): + handle = _for_each_module(bn_modules, action=_reset_bn_stats) + + try: + # Batchnorm statistics accumulation buffer + buffer = { + bn: {"sum_mean": torch.zeros_like(bn.running_mean), + "sum_var": torch.zeros_like(bn.running_var)} + for bn in bn_modules + } + + num_batches = min(len(dataloader), num_batches) + dataloader_slice = itertools.islice(dataloader, num_batches) + + for data in tqdm(dataloader_slice, + total=num_batches, + desc="batchnorm reestimation"): + forward_fn(model, data) + + for bn in bn_modules: + buffer[bn]["sum_mean"] += bn.running_mean + buffer[bn]["sum_var"] += bn.running_var + + for bn in bn_modules: + sum_mean = buffer[bn]["sum_mean"] + sum_var = buffer[bn]["sum_var"] + + # Override BN stats with the reestimated stats. + bn.running_mean.copy_(sum_mean / min(len(dataloader), num_batches)) + bn.running_var.copy_(sum_var / min(len(dataloader), num_batches)) + + return handle + except: + handle.remove() + raise
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/compress.html b/releases/1.32.2/_modules/aimet_torch/compress.html new file mode 100644 index 0000000..59e7106 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/compress.html @@ -0,0 +1,1236 @@ + + + + + + aimet_torch.compress — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.compress

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2018, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Top-level API to AIMET compression library """
+
+from typing import Union, Tuple
+import torch
+
+from aimet_common.defs import CostMetric, CompressionScheme, EvalFunction, CompressionStats
+from aimet_common.bokeh_plots import BokehServerSession
+
+from aimet_torch.defs import SpatialSvdParameters, WeightSvdParameters, ChannelPruningParameters
+from aimet_torch.compression_factory import CompressionFactory
+
+
+
[docs]class ModelCompressor: + """ AIMET model compressor: Enables model compression using various schemes """ + # Too many arguments in this function, disabling pylint for now +
[docs] @staticmethod + def compress_model(model: torch.nn.Module, eval_callback: EvalFunction, eval_iterations, + input_shape: Tuple, + compress_scheme: CompressionScheme, cost_metric: CostMetric, + parameters: Union[SpatialSvdParameters, + WeightSvdParameters, + ChannelPruningParameters], + trainer=None, visualization_url=None) -> Tuple[torch.nn.Module, CompressionStats]: + + """ + Compress a given model using the specified parameters + + :param model: Model to compress + :param eval_callback: Evaluation callback. Expected signature is evaluate(model, iterations, use_cuda). + Expected to return an accuracy metric. + :param eval_iterations: Iterations to run evaluation for + :param trainer: Training Class: Contains a callable, train_model, which takes model, layer which is being fine + tuned and an optional parameter train_flag as a parameter + None: If per layer fine tuning is not required while creating the final compressed model + :param input_shape: Shape of the input tensor for model + :param compress_scheme: Compression scheme. See the enum for allowed values + :param cost_metric: Cost metric to use for the compression-ratio (either mac or memory) + :param parameters: Compression parameters specific to given compression scheme + :param visualization_url: url the user will need to input where visualizations will appear + :return: A tuple of the compressed model, and compression statistics + """ + # pylint:disable=too-many-arguments + # If no url is passed in, then do not create a bokeh server session + if not visualization_url: + bokeh_session = None + else: + # create a bokeh session to publish visualizations to the server document for compression + bokeh_session = BokehServerSession(url=visualization_url, session_id="compression") + + # put model in eval mode. This is important because otherwise running a forward pass can change module buffers + # e.g. for batchnorm layers that can affect model evaluation results + if trainer is not None: + trainer.train_model(model, model, train_flag=False) + + model = model.eval() + + if parameters.multiplicity < 1: + raise ValueError('Rounding Multiplicity should be greater than 1') + + if compress_scheme == CompressionScheme.spatial_svd: + algo = CompressionFactory.create_spatial_svd_algo(model, eval_callback, eval_iterations, + input_shape, cost_metric, parameters, bokeh_session) + + elif compress_scheme == CompressionScheme.weight_svd: + algo = CompressionFactory.create_weight_svd_algo(model, eval_callback, eval_iterations, + input_shape, cost_metric, parameters, bokeh_session) + + elif compress_scheme == CompressionScheme.channel_pruning: + algo = CompressionFactory.create_channel_pruning_algo(model, eval_callback, eval_iterations, + input_shape, cost_metric, parameters, bokeh_session) + + else: + raise ValueError("Compression scheme not supported: {}".format(compress_scheme)) + + compressed_layer_db, stats = algo.compress_model(cost_metric, trainer) + return compressed_layer_db.model, stats
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/cross_layer_equalization.html b/releases/1.32.2/_modules/aimet_torch/cross_layer_equalization.html new file mode 100644 index 0000000..6620d4b --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/cross_layer_equalization.html @@ -0,0 +1,2017 @@ + + + + + + aimet_torch.cross_layer_equalization — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_torch.cross_layer_equalization

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Cross Layer Equalization
+
+Some terminology for this code.
+CLS set: Set of layers (2 or 3) that can be used for cross-layer scaling
+Layer groups: Groups of layers that are immediately connected and can be decomposed further into CLS sets
+"""
+
+from typing import Tuple, List, Union, Dict
+from enum import Enum
+import numpy as np
+import torch
+
+import aimet_common.libpymo as libpymo      # pylint: disable=import-error
+
+from aimet_common.utils import AimetLogger
+from aimet_torch import utils
+from aimet_torch.meta.connectedgraph import ConnectedGraph
+from aimet_torch.batch_norm_fold import fold_all_batch_norms
+from aimet_torch.utils import get_device, get_ordered_list_of_modules, create_rand_tensors_given_shapes
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+
+ClsSet = Union[Tuple[torch.nn.Conv2d, torch.nn.Conv2d],
+               Tuple[torch.nn.Conv2d, torch.nn.Conv2d, torch.nn.Conv2d]]
+
+ClsSupportedLayer = Union[torch.nn.Conv1d, torch.nn.Conv2d, torch.nn.ConvTranspose1d, torch.nn.ConvTranspose2d]
+
+ScaleFactor = Union[np.ndarray, Tuple[np.ndarray]]
+
+cls_supported_layers = (torch.nn.Conv2d, torch.nn.ConvTranspose2d, torch.nn.Conv1d, torch.nn.ConvTranspose1d)
+cls_supported_activations = (torch.nn.ReLU, torch.nn.PReLU)
+
+
+class ClsLayerType(Enum):
+    """Enum class to represent CLS layer types"""
+    Unsupported = 0
+    Conv = 1  # Overloaded for conv and ConvTranspose
+    DepthwiseConv = 2
+
+
+
[docs]class ClsSetInfo: + """ + This class hold information about the layers in a CLS set, along with corresponding scaling factors + and other information like if there is a ReLU activation function between the CLS set layers + """ + +
[docs] class ClsSetLayerPairInfo: + """ + Models a pair of layers that were scaled using CLS. And related information. + """ + + def __init__(self, layer1: torch.nn.Conv2d, layer2: torch.nn.Conv2d, scale_factor: np.ndarray, + relu_activation_between_layers: bool): + """ + :param layer1: Layer whose bias is folded + :param layer2: Layer to which bias of previous layer's bias is folded + :param scale_factor: Scale Factor found from Cross Layer Scaling to scale BN parameters + :param relu_activation_between_layers: If the activation between layer1 and layer2 is Relu + """ + self.layer1 = layer1 + self.layer2 = layer2 + self.scale_factor = scale_factor + self.relu_activation_between_layers = relu_activation_between_layers
+ + def __init__(self, cls_pair_1: ClsSetLayerPairInfo, cls_pair_2: ClsSetLayerPairInfo = None): + """ + Constructor takes 2 pairs if Depth-wise separable layer is being folded + + :param cls_pair_1: Pair between two conv or conv and depth-wise conv + :param cls_pair_2: Pair between depth-wise conv and point-wise conv + """ + if cls_pair_2: + self.cls_pair_info_list = [cls_pair_1, cls_pair_2] + else: + self.cls_pair_info_list = [cls_pair_1]
+ + +def get_ordered_list_of_conv_modules(model: torch.nn.Module, dummy_input: Union[torch.Tensor, Tuple]) -> List: + """ + Finds order of nodes in graph + :param model: model + :param dummy_input: Dummy input to the model. Used to parse model graph. + :return: List of names in graph in order + """ + module_list = get_ordered_list_of_modules(model, dummy_input) + module_list = [[name, module] for name, module in module_list if isinstance(module, cls_supported_layers)] + return module_list + + +class GraphSearchUtils: + """ + Code to search a model graph to find nodes to use for cross-layer-scaling and high-bias-fold + """ + + def __init__(self, model: torch.nn.Module, input_shapes: Union[Tuple, List[Tuple]], dummy_input: Union[torch.Tensor, List[torch.Tensor]] = None): + + if dummy_input is None: + inp_tensor_list = tuple(utils.create_rand_tensors_given_shapes(input_shapes, get_device(model))) + else: + inp_tensor_list = dummy_input + self._connected_graph = ConnectedGraph(model, inp_tensor_list) + self._ordered_module_list = get_ordered_list_of_conv_modules(model, inp_tensor_list) + + + @staticmethod + def find_downstream_layer_groups_to_scale(op, layer_groups, current_group=None, visited_nodes=None): + """ + Recursive function to find cls layer groups downstream from a given op + :param op: Starting op to search from + :param layer_groups: Running list of layer groups + :param current_group: Running current layer group + :param visited_nodes: Running list of visited nodes (to short-circuit recursion) + :return: None + """ + + if not visited_nodes: + visited_nodes = [] + if not current_group: + current_group = [] + + if op in visited_nodes: + return + visited_nodes.append(op) + # print("Visiting node: {}".format(op.dotted_name)) + + # If current node is Conv2D, add to the current group + if op.model_module and isinstance(op.model_module.get_module(), cls_supported_layers): + current_group.append(op.model_module.get_module()) + + # Terminating condition for current group + if not op.model_module or not isinstance(op.model_module.get_module(), + cls_supported_layers + cls_supported_activations): + + if (len(current_group) > 1) and (current_group not in layer_groups): + layer_groups.append(current_group) + current_group = [] + + if op.output: + for consumer in op.output.consumers: + GraphSearchUtils.find_downstream_layer_groups_to_scale(consumer, layer_groups, + current_group, visited_nodes) + + # Reached a leaf.. See if the current group has something to grab + if (len(current_group) > 1) and (current_group not in layer_groups): + layer_groups.append(current_group) + + @staticmethod + def convert_layer_group_to_cls_sets(layer_group): + """ + Helper function to convert a layer group to a list of cls sets + :param layer_group: Given layer group to generate cls sets + :return: List of cls sets + + Supported layer combinations for CLS are: + 1. Conv + Conv + 2. DepthwiseConv + Conv + 3. Conv + DepthwiseConv + Conv + + Can be rewritten as, + Conv + -> Conv + -> DepthwiseConv + -> Conv + DepthwiseConv + -> Conv + + If a combination is partially supported, the cls_set is completely omitted and restarted from the next + supported layer + For example: Consider Conv + DepthwiseConv + Depthwise(unsupported) + - Since Depthwise(unsupported) is the last layer encountered, we need to omit all the three layers and restart + the cls sets from the next supported layer. + + """ + + # pylint: disable=too-many-branches + def convert_to_cls_layer_type(layer: ClsSupportedLayer) -> Tuple[ClsLayerType, ClsSupportedLayer]: + """ + Given the layer, check if its supported in CLS + :param layer: layer to check + :return: Tuple of ClsLayerType and the layer + """ + if layer.groups == 1: + layer_type = ClsLayerType.Conv + elif layer.groups == layer.in_channels and layer.in_channels == layer.out_channels: + # depthwiseConv layer with depth multiplier = 1 + layer_type = ClsLayerType.DepthwiseConv + else: + layer_type = ClsLayerType.Unsupported + return layer_type, layer + + def get_next_layer() -> Union[Tuple[ClsLayerType, Union[ClsSupportedLayer, None]]]: + """ + :return: Tuple of ClsLayerType and the next layer in layer_group + """ + if not layer_group: + return ClsLayerType.Unsupported, None + layer = layer_group.pop(0) + return convert_to_cls_layer_type(layer) + + cls_sets = [] + + first_layer_to_scale = (ClsLayerType.Unsupported, None) + while layer_group: + while layer_group and first_layer_to_scale[0] is ClsLayerType.Unsupported: + first_layer_to_scale = get_next_layer() + if first_layer_to_scale[0] is ClsLayerType.Unsupported: + logger.info('Layer %s is not supported. Ignoring for cls', first_layer_to_scale[1]) + + second_layer_to_scale = get_next_layer() + if first_layer_to_scale[0] == ClsLayerType.Conv: + if second_layer_to_scale[0] == ClsLayerType.Conv: + cls_sets.append((first_layer_to_scale[1], second_layer_to_scale[1])) + first_layer_to_scale = second_layer_to_scale + elif second_layer_to_scale[0] == ClsLayerType.DepthwiseConv: + if layer_group: + # do not pop third layer yet, determine its type and then pop it + third_layer_to_scale = convert_to_cls_layer_type(layer_group[0]) + if third_layer_to_scale[0] == ClsLayerType.Conv: + cls_sets.append( + (first_layer_to_scale[1], second_layer_to_scale[1], third_layer_to_scale[1])) + # adding third_layer_to_scale for the next round of CLS set determination + first_layer_to_scale = get_next_layer() + else: + # unsupported combination encountered + first_layer_to_scale = second_layer_to_scale + else: + logger.info('Layer %s is not supported. Ignoring for cls', second_layer_to_scale[1]) + first_layer_to_scale = (ClsLayerType.Unsupported, None) + elif first_layer_to_scale[0] == ClsLayerType.DepthwiseConv: + if second_layer_to_scale[0] == ClsLayerType.Conv: + cls_sets.append((first_layer_to_scale[1], second_layer_to_scale[1])) + first_layer_to_scale = second_layer_to_scale + else: + logger.info('Layer %s is not supported. Ignoring for cls', first_layer_to_scale[1]) + first_layer_to_scale = second_layer_to_scale + + return cls_sets + + def find_layer_groups_to_scale(self) -> List[List[torch.nn.Conv2d]]: + """ + :return: List of groups of layers. Each group can be independently equalized + """ + + # Find the input node(s) in the graph + input_nodes = [] + for op in self._connected_graph.get_all_ops().values(): + if op.inputs and op.inputs[0].is_model_input: + input_nodes.append(op) + + layer_groups = [] + for op in input_nodes: + self.find_downstream_layer_groups_to_scale(op, layer_groups) + + # Sort the layer groups in order of occurrence in the model + ordered_layer_groups = [] + for _, module in self._ordered_module_list: + for layer_group in layer_groups: + if layer_group[0] is module: + ordered_layer_groups.append(layer_group) + + return ordered_layer_groups + + @staticmethod + def does_module_have_relu_activation(connected_graph: ConnectedGraph, module: torch.nn.Module) -> bool: + """ + Finds if a given module has a ReLU activation + :param connected_graph: Reference to ConnectedGraph instance + :param module: PyTorch module to find activation for + :return: True if module has a relu activation + """ + + for op in connected_graph.get_all_ops().values(): + + if op.model_module and op.model_module.get_module() is module: + assert len(op.output.consumers) == 1 + is_relu_activation = isinstance(op.output.consumers[0].model_module.get_module(), + (torch.nn.ReLU, torch.nn.PReLU)) + return is_relu_activation + + return False + + def is_relu_activation_present_in_cls_sets(self, cls_sets: List[ClsSet]): + """ + :param cls_sets: CLS sets to find relu activations in + :return: List of groups of layers. Each group can be independently equalized + """ + + is_relu_activation_in_cls_sets = [] + for cls_set in cls_sets: + + # We need to check activation functions for all layers but the last one in the set + # Because we are only interested in checking activation functions between the layers we will scale + cls_set = cls_set[:-1] + + is_relu_activation_in_cls_set = () + for module in cls_set: + is_relu_activation_in_cls_set += (self.does_module_have_relu_activation(self._connected_graph, + module), ) + + if len(is_relu_activation_in_cls_set) == 1: + is_relu_activation_in_cls_set = is_relu_activation_in_cls_set[0] + + is_relu_activation_in_cls_sets.append(is_relu_activation_in_cls_set) + + return is_relu_activation_in_cls_sets + + +class CrossLayerScaling: + """ + Code to apply the cross-layer-scaling technique to a model + """ + + @staticmethod + def scale_cls_sets(cls_sets: List[ClsSet]) -> List[ScaleFactor]: + """ + Scale multiple CLS sets + + :param cls_sets: List of CLS sets + :return: Scaling factors calculated and applied for each CLS set in order + """ + scale_factor_list = [] + for cls_set in cls_sets: + scale_factor = CrossLayerScaling.scale_cls_set(cls_set) + scale_factor_list.append(scale_factor) + return scale_factor_list + + @staticmethod + def scale_cls_set(cls_set: ClsSet) -> ScaleFactor: + """ + Scale a CLS set + :param cls_set: Either a pair or regular conv layers or a triplet of depthwise separable layers + :return: Scaling factor calculated and applied + """ + if len(cls_set) == 3: + scale_factor = CrossLayerScaling.scale_cls_set_with_depthwise_layers(cls_set) + else: + scale_factor = CrossLayerScaling.scale_cls_set_with_conv_layers(cls_set) + + return scale_factor + + @classmethod + def scale_cls_set_with_conv_layers(cls, cls_set: ClsSet) -> np.ndarray: + """ + API to invoke equalize layer params (update for weights and bias is in place) + + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized + :return: Scaling factor S_12 for each conv layer pair: numpy array + """ + on_gpu = False + for module in cls_set: + if not isinstance(module, cls_supported_layers): + raise ValueError("Only Conv or Transposed Conv layers are supported for cross layer equalization") + if module.weight.is_cuda: + on_gpu = True + module.cpu() + + # Create structs for holding layer weights and bias parameters + prev_layer_params = libpymo.EqualizationParams() + curr_layer_params = libpymo.EqualizationParams() + + # Prepare and pack data structures for cls set. + cls._pack_params_for_conv(cls_set, prev_layer_params, curr_layer_params) + + # Scales weights and bias for consecutive layers and updates data structures in-place. + scaling_factor = libpymo.scaleLayerParams(prev_layer_params, curr_layer_params) + + # Update weight and biases for cls set using updated data structures. + cls._update_params_for_conv(cls_set, prev_layer_params, curr_layer_params) + + if on_gpu: + for module in cls_set: + module.to(device="cuda") + + return scaling_factor + + @classmethod + def scale_cls_set_with_depthwise_layers(cls, cls_set: ClsSet) -> [np.ndarray, np.ndarray]: + """ + API to invoke equalize layer params for depth wise separable layers(update for weights and bias is in place) + + :param cls_set: Consecutive Conv layers whose weights and biases need to be equalized. + Second Conv layer is a depth-wise conv and third conv layer is point-wise conv + :return: Scaling factors S_12 and S_23 : numpy arrays + """ + on_gpu = False + for module in cls_set: + if not isinstance(module, cls_supported_layers): + raise ValueError("Only conv layers are supported for cross layer equalization") + if module.weight.is_cuda: + on_gpu = True + module.cpu() + + # Create structs for holding layer weights and bias parameters + prev_layer_params = libpymo.EqualizationParams() + curr_layer_params = libpymo.EqualizationParams() + next_layer_params = libpymo.EqualizationParams() + + # Prepare and pack data structures for cls set. + cls._pack_params_for_depthwise_conv(cls_set, prev_layer_params, curr_layer_params, next_layer_params) + + # Scales weights and bias for consecutive layers and updates data structures in-place. + scaling_params = libpymo.scaleDepthWiseSeparableLayer(prev_layer_params, curr_layer_params, next_layer_params) + + # Update weight and biases for cls set using updated data structures. + cls._update_params_for_depthwise_conv(cls_set, prev_layer_params, curr_layer_params, next_layer_params) + + if on_gpu: + for module in cls_set: + module.to(device="cuda") + + return scaling_params.scalingMatrix12, scaling_params.scalingMatrix23 + + @staticmethod + def create_cls_set_info_list(cls_sets: List[ClsSet], scale_factors: List[ScaleFactor], + is_relu_activation_in_cls_sets): + """ + Binds information from there separate lists into one [ClsInfoSet] data-structure + :param cls_sets: List of CLS sets + :param scale_factors: Scale-factors for each cls-set + :param is_relu_activation_in_cls_sets: Information if there is relu activation in each cls-set + :return: List of ClsSetInfo + """ + cls_set_info_list = [] + assert len(cls_sets) == len(scale_factors) == len(is_relu_activation_in_cls_sets) + + for index, cls_set in enumerate(cls_sets): + + if isinstance(scale_factors[index], tuple): + # If we are dealing with a triplet of layers, then we should have 2 scale factors and 2 relu flags + # Assert that this is true + assert len(cls_set) == 3 + assert len(scale_factors[index]) == len(is_relu_activation_in_cls_sets[index]) == 2 + + cls_pair_1 = ClsSetInfo.ClsSetLayerPairInfo(cls_set[0], cls_set[1], scale_factors[index][0], + is_relu_activation_in_cls_sets[index][0]) + cls_pair_2 = ClsSetInfo.ClsSetLayerPairInfo(cls_set[1], cls_set[2], scale_factors[index][1], + is_relu_activation_in_cls_sets[index][1]) + + cls_set_info = ClsSetInfo(cls_pair_1, cls_pair_2) + + else: + cls_pair = ClsSetInfo.ClsSetLayerPairInfo(cls_set[0], cls_set[1], scale_factors[index], + is_relu_activation_in_cls_sets[index]) + + cls_set_info = ClsSetInfo(cls_pair) + + cls_set_info_list.append(cls_set_info) + + return cls_set_info_list + + @staticmethod + def scale_model(model: torch.nn.Module, input_shapes: Union[Tuple, List[Tuple]], dummy_input: Union[torch.Tensor, List[torch.Tensor]] = None) -> List[ClsSetInfo]: + """ + Uses cross-layer scaling to scale all applicable layers in the given model + + :param model: Model to scale + :param input_shapes: Input shape for the model (can be one or multiple inputs) + :param dummy_input: Dummy input to the model. Used to parse model graph. User is expected to place the tensors on the appropriate device. + :return: CLS information for each CLS set + """ + if isinstance(model, torch.nn.DataParallel): + return CrossLayerScaling.scale_model(model.module, input_shapes, dummy_input=dummy_input) + device = get_device(model) + model.cpu() + + # Find layer groups + graph_search = GraphSearchUtils(model, input_shapes, dummy_input=dummy_input) + layer_groups = graph_search.find_layer_groups_to_scale() + + # Find cls sets from the layer groups + cls_sets = [] + for layer_group in layer_groups: + cls_set = GraphSearchUtils.convert_layer_group_to_cls_sets(layer_group) + cls_sets += cls_set + + # Scale the CLS sets + scale_factors = CrossLayerScaling.scale_cls_sets(cls_sets) + + # Find if there were relu activations between layers of each cls set + is_relu_activation_in_cls_sets = graph_search.is_relu_activation_present_in_cls_sets(cls_sets) + + # Convert to a list of cls-set-info elements + cls_set_info_list = CrossLayerScaling.create_cls_set_info_list(cls_sets, scale_factors, + is_relu_activation_in_cls_sets) + + model.to(device=device) + return cls_set_info_list + + @staticmethod + def _pack_params_for_conv(cls_set: ClsSet, + prev_layer_params: libpymo.EqualizationParams, + curr_layer_params: libpymo.EqualizationParams): + """ + Prepare and pack data structure for previous and current layer in given cls set. + + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized. + :param prev_layer_params: Data structure holding weight and bias for previous layer in cls set. + :param curr_layer_params: Data structure holding weight and bias for current layer in cls set. + """ + weight_set_0 = cls_set[0].weight + + # Transpose weights to C, N, H, W from N, C, H, W since axis are flipped for transposed conv + if isinstance(cls_set[0], torch.nn.ConvTranspose2d): + weight_set_0 = weight_set_0.permute(1, 0, 2, 3) + if isinstance(cls_set[0], torch.nn.ConvTranspose1d): + weight_set_0 = weight_set_0.permute(1, 0, 2) + + prev_layer_params.weight = weight_set_0.detach().numpy().reshape(-1) + prev_layer_params.weightShape = np.array(weight_set_0.shape) + if len(prev_layer_params.weightShape) == 3: + prev_layer_params.weightShape = prev_layer_params.weightShape + [1] + + weight_set_1 = cls_set[1].weight + + # Transpose weights to C, N, H, W from N, C, H, W since axis are flipped for transposed conv + if isinstance(cls_set[1], torch.nn.ConvTranspose2d): + weight_set_1 = weight_set_1.permute(1, 0, 2, 3) + if isinstance(cls_set[1], torch.nn.ConvTranspose1d): + weight_set_1 = weight_set_1.permute(1, 0, 2) + + curr_layer_params.weight = weight_set_1.detach().numpy().reshape(-1) + curr_layer_params.weightShape = np.array(weight_set_1.shape) + if len(curr_layer_params.weightShape) == 3: + curr_layer_params.weightShape = curr_layer_params.weightShape + [1] + + if cls_set[0].bias is not None: + prev_layer_params.bias = cls_set[0].bias.detach().numpy() + else: + prev_layer_params.isBiasNone = True + + @staticmethod + def _update_params_for_conv(cls_set: ClsSet, + prev_layer_params: libpymo.EqualizationParams, + curr_layer_params: libpymo.EqualizationParams): + """ + Update weight and biases for cls set using updated data structures. + + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized. + :param prev_layer_params: Data structure holding weight and bias for previous layer in cls set. + :param curr_layer_params: Data structure holding weight and bias for current layer in cls set. + """ + if isinstance(cls_set[0], (torch.nn.Conv1d, torch.nn.ConvTranspose1d)): + prev_layer_params.weightShape = prev_layer_params.weightShape[:-1] + cls_set[0].weight.data = torch.from_numpy(np.reshape(prev_layer_params.weight, + prev_layer_params.weightShape)) + cls_set[0].weight.data = cls_set[0].weight.data.type(torch.FloatTensor) + + + # Transpose weight back to N, C, H, W for transposed Conv2D + if isinstance(cls_set[0], torch.nn.ConvTranspose2d): + cls_set[0].weight.data = cls_set[0].weight.data.permute(1, 0, 2, 3).contiguous() + if isinstance(cls_set[0], torch.nn.ConvTranspose1d): + cls_set[0].weight.data = cls_set[0].weight.data.permute(1, 0, 2).contiguous() + + if isinstance(cls_set[1], (torch.nn.Conv1d, torch.nn.ConvTranspose1d)): + curr_layer_params.weightShape = curr_layer_params.weightShape[:-1] + cls_set[1].weight.data = torch.from_numpy(np.reshape(curr_layer_params.weight, + curr_layer_params.weightShape)) + cls_set[1].weight.data = cls_set[1].weight.data.type(torch.FloatTensor) + + # Transpose weight back to N, C, H, W for transposed Conv2D + if isinstance(cls_set[1], torch.nn.ConvTranspose2d): + cls_set[1].weight.data = cls_set[1].weight.data.permute(1, 0, 2, 3).contiguous() + if isinstance(cls_set[1], torch.nn.ConvTranspose1d): + cls_set[1].weight.data = cls_set[1].weight.data.permute(1, 0, 2).contiguous() + + if cls_set[0].bias is not None: + cls_set[0].bias.data = torch.from_numpy(np.reshape(prev_layer_params.bias, + prev_layer_params.weightShape[0])) + cls_set[0].bias.data = cls_set[0].bias.data.type(torch.FloatTensor) + + @staticmethod + def _pack_params_for_depthwise_conv(cls_set: ClsSet, + prev_layer_params: libpymo.EqualizationParams, + curr_layer_params: libpymo.EqualizationParams, + next_layer_params: libpymo.EqualizationParams): + """ + Prepare and pack data structure for previous, current and next layer in given cls set. + + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized. + :param prev_layer_params: Data structure holding weight and bias for previous layer in cls set. + :param curr_layer_params: Data structure holding weight and bias for current layer in cls set. + :param next_layer_params: Data structure holding weight and bias for next layer in cls set. + """ + if isinstance(cls_set[0], torch.nn.ConvTranspose2d): + cls_set[0].weight.data = cls_set[0].weight.data.permute(1, 0, 2, 3).contiguous() + if isinstance(cls_set[0], torch.nn.ConvTranspose1d): + cls_set[0].weight.data = cls_set[0].weight.data.permute(1, 0, 2).contiguous() + + if isinstance(cls_set[2], torch.nn.ConvTranspose2d): + cls_set[2].weight.data = cls_set[2].weight.data.permute(1, 0, 2, 3).contiguous() + if isinstance(cls_set[2], torch.nn.ConvTranspose1d): + cls_set[2].weight.data = cls_set[2].weight.data.permute(1, 0, 2).contiguous() + + assert cls_set[1].groups > 1 + + prev_layer_params.weight = cls_set[0].weight.detach().numpy().flatten() + prev_layer_params.weightShape = np.array(cls_set[0].weight.shape) + if len(prev_layer_params.weightShape) == 3: + prev_layer_params.weightShape = prev_layer_params.weightShape + [1] + + curr_layer_params.weight = cls_set[1].weight.detach().numpy().flatten() + curr_layer_params.weightShape = np.array(cls_set[1].weight.shape) + if len(curr_layer_params.weightShape) == 3: + curr_layer_params.weightShape = curr_layer_params.weightShape + [1] + + next_layer_params.weight = cls_set[2].weight.detach().numpy().flatten() + next_layer_params.weightShape = np.array(cls_set[2].weight.shape) + if len(next_layer_params.weightShape) == 3: + next_layer_params.weightShape = next_layer_params.weightShape + [1] + + + if cls_set[0].bias is not None: + prev_layer_params.bias = cls_set[0].bias.detach().numpy() + else: + prev_layer_params.isBiasNone = True + + if cls_set[1].bias is not None: + curr_layer_params.bias = cls_set[1].bias.detach().numpy() + else: + curr_layer_params.isBiasNone = True + + @staticmethod + def _update_params_for_depthwise_conv(cls_set: ClsSet, + prev_layer_params: libpymo.EqualizationParams, + curr_layer_params: libpymo.EqualizationParams, + next_layer_params: libpymo.EqualizationParams): + """ + Update weight and biases for cls set using updated data structures. + + :param cls_set: Consecutive Conv layers Tuple whose weights and biases need to be equalized. + :param prev_layer_params: Data structure holding weight and bias for previous layer in cls set. + :param curr_layer_params: Data structure holding weight and bias for current layer in cls set. + :param next_layer_params: Data structure holding weight and bias for next layer in cls set. + """ + if isinstance(cls_set[0], (torch.nn.Conv1d, torch.nn.ConvTranspose1d)): + prev_layer_params.weightShape = prev_layer_params.weightShape[:-1] + cls_set[0].weight.data = torch.from_numpy(np.reshape(prev_layer_params.weight, + prev_layer_params.weightShape)) + cls_set[0].weight.data = cls_set[0].weight.data.type(torch.FloatTensor) + if isinstance(cls_set[0], torch.nn.ConvTranspose2d): + cls_set[0].weight.data = cls_set[0].weight.data.permute(1, 0, 2, 3).contiguous() + if isinstance(cls_set[0], torch.nn.ConvTranspose1d): + cls_set[0].weight.data = cls_set[0].weight.data.permute(1, 0, 2).contiguous() + + if isinstance(cls_set[1], (torch.nn.Conv1d, torch.nn.ConvTranspose1d)): + curr_layer_params.weightShape = curr_layer_params.weightShape[:-1] + cls_set[1].weight.data = torch.from_numpy(np.reshape(curr_layer_params.weight, + curr_layer_params.weightShape)) + cls_set[1].weight.data = cls_set[1].weight.data.type(torch.FloatTensor) + + if isinstance(cls_set[2], (torch.nn.Conv1d, torch.nn.ConvTranspose1d)): + next_layer_params.weightShape = next_layer_params.weightShape[:-1] + + cls_set[2].weight.data = torch.from_numpy(np.reshape(next_layer_params.weight, + next_layer_params.weightShape)) + cls_set[2].weight.data = cls_set[2].weight.data.type(torch.FloatTensor) + if isinstance(cls_set[2], torch.nn.ConvTranspose2d): + cls_set[2].weight.data = cls_set[2].weight.data.permute(1, 0, 2, 3).contiguous() + if isinstance(cls_set[2], torch.nn.ConvTranspose1d): + cls_set[2].weight.data = cls_set[2].weight.data.permute(1, 0, 2).contiguous() + + if cls_set[0].bias is not None: + cls_set[0].bias.data = torch.from_numpy(np.reshape(prev_layer_params.bias, + prev_layer_params.weightShape[0])) + cls_set[0].bias.data = cls_set[0].bias.data.type(torch.FloatTensor) + + if cls_set[1].bias is not None: + cls_set[1].bias.data = torch.from_numpy(np.reshape(curr_layer_params.bias, + curr_layer_params.weightShape[0])) + cls_set[1].bias.data = cls_set[1].bias.data.type(torch.FloatTensor) + + +class HighBiasFold: + """ + Code to apply the high-bias-fold technique to a model + """ + + ActivationIsReluForFirstModule = bool + ScaleForFirstModule = np.ndarray + + @classmethod + def bias_fold(cls, cls_set_info_list: List[ClsSetInfo], + bn_layers: Dict[Union[torch.nn.Conv2d, torch.nn.ConvTranspose2d], torch.nn.BatchNorm2d]): + """ + Folds bias values greater than 3 * sigma to next layer's bias + + :param cls_set_info_list: List of info elements for each cls set + :param bn_layers: Key: Conv/Linear layer Value: Corresponding folded BN layer + :return: None + """ + if not bn_layers: + logger.info('High Bias folding is not supported for models without BatchNorm Layers') + return + + for cls_set_info in cls_set_info_list: + for cls_pair_info in cls_set_info.cls_pair_info_list: + + if (cls_pair_info.layer1.bias is None) or (cls_pair_info.layer2.bias is None) or \ + (cls_pair_info.layer1 not in bn_layers): + continue + + # Create data structures for holding layer weights and bias parameters. + prev_layer_params = libpymo.LayerParams() + curr_layer_params = libpymo.LayerParams() + prev_layer_bn_params = libpymo.BNParamsHighBiasFold() + + # Prepare and pack data structures for high bias fold. + cls._pack_bn_layer_params(cls_pair_info, bn_layers, prev_layer_bn_params) + cls._pack_previous_and_current_layer_params(cls_pair_info, prev_layer_params, curr_layer_params) + + # Update bias for previous and current layer and data structures in-place. + libpymo.updateBias(prev_layer_params, curr_layer_params, prev_layer_bn_params) + + # Set updated biases for previous and current layer. + cls._update_previous_and_current_layer_bias(cls_pair_info, prev_layer_params, curr_layer_params) + + @staticmethod + def _pack_bn_layer_params(cls_pair_info: ClsSetInfo.ClsSetLayerPairInfo, + bn_layers: Dict[torch.nn.Module, torch.nn.BatchNorm2d], + prev_layer_bn_params: libpymo.BNParamsHighBiasFold): + """ + Helper method to pack batch norm layer parameter for high bias fold. + + :param cls_pair_info: Layer pairs that were scaled using CLS and related information. + :param bn_layers: Dictionary with Key being Conv/Linear layer and value being corresponding folded BN layer. + :param prev_layer_bn_params: Data structure to pack batch norm parameter. + """ + scaling_parameter = cls_pair_info.scale_factor + + # Scaling gamma and beta parameter of batch norm layer + prev_layer_bn_params.gamma = bn_layers[cls_pair_info.layer1].weight.detach().numpy().reshape(-1) + prev_layer_bn_params.beta = bn_layers[cls_pair_info.layer1].bias.detach().numpy().reshape(-1) + + if len(scaling_parameter) != len(prev_layer_bn_params.gamma) or \ + len(scaling_parameter) != len(prev_layer_bn_params.beta): + raise ValueError("High Bias absorption is not supported for networks with fold-forward BatchNorms") + prev_layer_bn_params.gamma = np.divide(prev_layer_bn_params.gamma, scaling_parameter) + prev_layer_bn_params.beta = np.divide(prev_layer_bn_params.beta, scaling_parameter) + + @staticmethod + def _pack_previous_and_current_layer_params(cls_pair_info, prev_layer_params, curr_layer_params): + """ + Helper method to pack information of previous and current layer. + + :param cls_pair_info: Layer pairs that were scaled using CLS and related information. + :param prev_layer_params: Data structure to pack previous layer parameters. + :param curr_layer_params: Data structure to pack current layer parameters. + """ + prev_layer_params.activationIsRelu = cls_pair_info.relu_activation_between_layers + prev_layer_params.bias = cls_pair_info.layer1.bias.detach().numpy() + + weight = cls_pair_info.layer2.weight + + if isinstance(cls_pair_info.layer2, (torch.nn.Conv1d, torch.nn.ConvTranspose1d)): + weight = torch.unsqueeze(weight, dim=-1) + + # Transpose weights to C, N, H, W from N, C, H, W since axis are flipped for transposed conv + if isinstance(cls_pair_info.layer2, (torch.nn.ConvTranspose1d, torch.nn.ConvTranspose2d)) and \ + cls_pair_info.layer2.groups == 1: + weight = weight.permute(1, 0, 2, 3) + + curr_layer_params.bias = cls_pair_info.layer2.bias.detach().numpy() + curr_layer_params.weight = weight.detach().numpy().reshape(-1) + curr_layer_params.weightShape = np.array(weight.shape) + + @staticmethod + def _update_previous_and_current_layer_bias(cls_pair_info: ClsSetInfo.ClsSetLayerPairInfo, + prev_layer_params: libpymo.LayerParams, + curr_layer_params: libpymo.LayerParams): + """ + Update biases for previous and current layer. + + :param cls_pair_info: Layer pairs that were scaled using CLS and related information. + :param prev_layer_params: Data structure holding weight and bias for previous layer in cls set. + :param curr_layer_params: Data structure holding weight and bias for current layer in cls set. + """ + prev_layer_bias_shape = cls_pair_info.layer1.weight.shape[0] + if (isinstance(cls_pair_info.layer1, (torch.nn.ConvTranspose1d, torch.nn.ConvTranspose2d))) and \ + (cls_pair_info.layer1.groups == 1): + prev_layer_bias_shape = cls_pair_info.layer1.weight.shape[1] + + cls_pair_info.layer1.bias.data = torch.from_numpy(np.reshape(prev_layer_params.bias, + prev_layer_bias_shape)) + cls_pair_info.layer1.bias.data = cls_pair_info.layer1.bias.data.type(torch.FloatTensor) + + cls_pair_info.layer2.bias.data = torch.from_numpy(np.reshape(curr_layer_params.bias, + curr_layer_params.weightShape[0])) + cls_pair_info.layer2.bias.data = cls_pair_info.layer2.bias.data.type(torch.FloatTensor) + + +
[docs]def equalize_model(model: torch.nn.Module, input_shapes: Union[Tuple, List[Tuple]], + dummy_input: Union[torch.Tensor, Tuple] = None): + """ + High-level API to perform Cross-Layer Equalization (CLE) on the given model. The model is equalized in place. + + :param model: Model to equalize + :param input_shapes: Shape of the input (can be a tuple or a list of tuples if multiple inputs) + :param dummy_input: A dummy input to the model. Can be a Tensor or a Tuple of Tensors + :return: None + """ + if dummy_input is None: + # The use of input_shapes will be removed in a future release. It is maintained now for backward compatibility. + # Note, create_rand_tensors_given_shapes() creates all FP32 tensors where as some multi-input models might + # additionally use Integer Tensors. + dummy_input = create_rand_tensors_given_shapes(input_shapes, torch.device('cpu')) + if isinstance(dummy_input, (list, tuple)): + input_shapes = [i.shape for i in dummy_input] + else: + input_shapes = dummy_input.shape + + if isinstance(model, torch.nn.DataParallel): + equalize_model(model.module, input_shapes, dummy_input) + else: + device = get_device(model) + model.cpu() + # fold batchnorm layers + folded_pairs = fold_all_batch_norms(model, input_shapes, dummy_input) + equalize_bn_folded_model(model, input_shapes, folded_pairs, dummy_input=dummy_input) + + model.to(device=device)
+ +def equalize_bn_folded_model(model: torch.nn.Module, + input_shapes: Union[Tuple, List[Tuple]], + folded_pairs: List[Tuple[torch.nn.Module, torch.nn.BatchNorm2d]], + dummy_input: Union[torch.Tensor, Tuple] = None + ): + """ + Perform Cross-Layer Scaling (CLS) and High Bias Folding (HBF) on a batchnorm-folded model. + The model is equalized in place. + + :param model: Batchnorm-folded model to equalize + :param input_shapes: Shape of the input (can be a tuple or a list of tuples if multiple inputs) + :param dummy_input: Dummy input to the model. Used to parse model graph. User is expected to place the tensors on the appropriate device. + :param folded_pairs: List of pairs of folded layers + :return: None + """ + if isinstance(model, torch.nn.DataParallel): + equalize_bn_folded_model(model.module, input_shapes, folded_pairs, dummy_input=dummy_input) + else: + device = get_device(model) + model.cpu() + bn_dict = {} + for conv_bn in folded_pairs: + bn_dict[conv_bn[0]] = conv_bn[1] + + # replace any ReLU6 layers with ReLU + utils.replace_modules_of_type1_with_type2(model, torch.nn.ReLU6, torch.nn.ReLU) + + # perform cross-layer scaling on applicable layer sets + cls_set_info_list = CrossLayerScaling.scale_model(model, input_shapes, dummy_input=dummy_input) + + # high-bias fold + HighBiasFold.bias_fold(cls_set_info_list, bn_dict) + + model.to(device=device) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/defs.html b/releases/1.32.2/_modules/aimet_torch/defs.html new file mode 100644 index 0000000..e54250e --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/defs.html @@ -0,0 +1,1358 @@ + + + + + + aimet_torch.defs — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.defs

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2018, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Common type definitions that are used across AIMET """
+
+from enum import Enum
+from typing import List, Optional, Union
+
+import torch.utils.data
+
+from aimet_common.defs import GreedySelectionParameters, TarRankSelectionParameters, RankSelectScheme
+
+
+
[docs]class ModuleCompRatioPair: + """ + Pair of torch.nn.module and a compression-ratio + + :ivar module: Module of type torch.nn.module + :ivar comp_ratio: Compression ratio. Compression ratio is the ratio of cost of compressed model + to cost of the original model. + """ + + def __init__(self, module: torch.nn.Module, comp_ratio: float): + self.module = module + self.comp_ratio = comp_ratio
+ + +class OpToIOTensors: + """ + Data class to store the input and output tensor names of an operation as a lists. + """ + def __init__(self, node_inputs: List[str], node_outputs: List[str]): + """ + :param node_inputs: name of inputs to the node + :param node_outputs: name of output from the node + """ + + self.inputs = node_inputs + self.outputs = node_outputs + + +
[docs]class SpatialSvdParameters: + """ Configuration parameters for spatial svd compression """ + +
[docs] class ManualModeParams: + """ + Configuration parameters for manual-mode spatial svd compression + """ + + def __init__(self, list_of_module_comp_ratio_pairs: List[ModuleCompRatioPair]): + """ + :param list_of_module_comp_ratio_pairs: List of (module, comp-ratio) pairs + """ + self.list_of_module_comp_ratio_pairs = list_of_module_comp_ratio_pairs
+ +
[docs] class AutoModeParams: + """ + Configuration parameters for auto-mode compression + """ + + def __init__(self, greedy_select_params: GreedySelectionParameters, + modules_to_ignore: Optional[List[torch.nn.Module]] = None): + """ + :param greedy_select_params: Params for greedy comp-ratio selection algorithm + :param modules_to_ignore: List of modules to ignore (None indicates nothing to ignore) + """ + self.greedy_params = greedy_select_params + self.modules_to_ignore = [] if modules_to_ignore is None else modules_to_ignore
+ +
[docs] class Mode(Enum): + """ Mode enumeration """ + + manual = 1 + """ Manual mode """ + + auto = 2 + """ Auto mode """
+ + def __init__(self, mode: Mode, params: Union[ManualModeParams, AutoModeParams], multiplicity=1): + """ + :param mode: Either auto mode or manual mode + :param params: Parameters for the mode selected + :param multiplicity: The multiplicity to which ranks/input channels will get rounded. Default: 1 + """ + self.mode = mode + self.mode_params = params + self.multiplicity = multiplicity
+ + +
[docs]class ChannelPruningParameters: + """ Configuration parameters for channel pruning compression """ + +
[docs] class ManualModeParams: + """ + Configuration parameters for manual-mode channel pruning compression + """ + + def __init__(self, list_of_module_comp_ratio_pairs: List[ModuleCompRatioPair]): + """ + :param list_of_module_comp_ratio_pairs: List of (module, comp-ratio) pairs + """ + self.list_of_module_comp_ratio_pairs = list_of_module_comp_ratio_pairs
+ +
[docs] class AutoModeParams: + """ + Configuration parameters for auto-mode compression + """ + + def __init__(self, greedy_select_params: GreedySelectionParameters, + modules_to_ignore: Optional[List[torch.nn.Module]] = None): + """ + :param greedy_select_params: Params for greedy comp-ratio selection algorithm + :param modules_to_ignore: List of modules to ignore (None indicates nothing to ignore) + """ + self.greedy_params = greedy_select_params + self.modules_to_ignore = [] if modules_to_ignore is None else modules_to_ignore
+ +
[docs] class Mode(Enum): + """ Mode enumeration """ + + manual = 1 + """ Manual mode: User specifies comp-ratio per layer """ + + auto = 2 + """ Auto mode: AIMET computes optimal comp-ratio per layer """
+ + def __init__(self, data_loader: torch.utils.data.DataLoader, num_reconstruction_samples: int, + allow_custom_downsample_ops: bool, + mode: Mode, params: Union[ManualModeParams, AutoModeParams], multiplicity=1): + self.data_loader = data_loader + self.num_reconstruction_samples = num_reconstruction_samples + self.allow_custom_downsample_ops = allow_custom_downsample_ops + self.mode = mode + self.mode_params = params + self.multiplicity = multiplicity
+ + +
[docs]class WeightSvdParameters: + """ Configuration parameters for weight svd compression """ + +
[docs] class ManualModeParams: + """ + Configuration parameters for manual-mode weight svd compression + """ + + def __init__(self, list_of_module_comp_ratio_pairs: List[ModuleCompRatioPair]): + """ + :param list_of_module_comp_ratio_pairs: List of (module, comp-ratio) pairs + """ + self.list_of_module_comp_ratio_pairs = list_of_module_comp_ratio_pairs
+ +
[docs] class AutoModeParams: + """ + Configuration parameters for auto-mode compression + """ + + def __init__(self, + rank_select_scheme: RankSelectScheme, + select_params: Union[GreedySelectionParameters, + TarRankSelectionParameters], + modules_to_ignore: Optional[List[torch.nn.Module]] = None): + """ + :param rank_select_scheme: supports two options greedy and tar + :param select_params: Params for greedy/TAR comp-ratio selection algorithm + :param modules_to_ignore: List of modules to ignore (None indicates nothing to ignore) + """ + self.rank_select_scheme = rank_select_scheme + self.select_params = select_params + self.modules_to_ignore = [] if modules_to_ignore is None else modules_to_ignore
+ +
[docs] class Mode(Enum): + """ Mode enumeration """ + + manual = 1 + """ Manual mode """ + + auto = 2 + """ Auto mode """
+ + def __init__(self, mode: Mode, params: Union[ManualModeParams, AutoModeParams], multiplicity=1): + """ + :param mode: Either auto mode or manual mode + :param params: Parameters for the mode selected + :param multiplicity: The multiplicity to which ranks/input channels will get rounded. Default: 1 + """ + self.mode = mode + self.mode_params = params + self.multiplicity = multiplicity
+ + +class PassThroughOp(torch.nn.Module): + """ + This is a pass-through op, used for purpose of making an op a no-op + """ + # pylint:disable=arguments-differ + @staticmethod + def forward(inputx): + """ + Forward pass for passthrough op + """ + return inputx +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/layer_output_utils.html b/releases/1.32.2/_modules/aimet_torch/layer_output_utils.html new file mode 100644 index 0000000..901b17e --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/layer_output_utils.html @@ -0,0 +1,1521 @@ + + + + + + aimet_torch.layer_output_utils — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_torch.layer_output_utils

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" This module contains utilities to capture and save intermediate layer-outputs of a model. """
+
+import os
+from typing import Union, Dict, List, Tuple
+from enum import Enum
+import shutil
+import re
+
+import numpy as np
+import onnx
+import torch
+
+from aimet_common.utils import AimetLogger
+from aimet_common.layer_output_utils import SaveInputOutput, save_layer_output_names
+
+from aimet_torch.quantsim import ExportableQuantModule, QuantizationSimModel
+from aimet_torch import utils
+from aimet_torch import torchscript_utils
+from aimet_torch.onnx_utils import OnnxSaver, OnnxExportApiArgs
+from aimet_torch.qc_quantize_recurrent import QcQuantizeRecurrent
+from aimet_torch.v2.nn.base import BaseQuantizationMixin
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.LayerOutputs)
+
+
+
[docs]class NamingScheme(Enum): + """ Enumeration of layer-output naming schemes. """ + + PYTORCH = 1 + """ Names outputs according to exported pytorch model. Layer names are used. """ + ONNX = 2 + """ Names outputs according to exported onnx model. Layer output names are generally numeric. """ + TORCHSCRIPT = 3 + """ Names outputs according to exported torchscript model. Layer output names are generally numeric. """
+ + +
[docs]class LayerOutputUtil: + """ Implementation to capture and save outputs of intermediate layers of a model (fp32/quantsim). """ + + def __init__(self, model: torch.nn.Module, dir_path: str, naming_scheme: NamingScheme = NamingScheme.PYTORCH, + dummy_input: Union[torch.Tensor, Tuple, List] = None, onnx_export_args: Union[OnnxExportApiArgs, Dict] = None): + """ + Constructor for LayerOutputUtil. + + :param model: Model whose layer-outputs are needed. + :param dir_path: Directory wherein layer-outputs will be saved. + :param naming_scheme: Naming scheme to be followed to name layer-outputs. There are multiple schemes as per + the exported model (pytorch, onnx or torchscript). Refer the NamingScheme enum definition. + :param dummy_input: Dummy input to model. Required if naming_scheme is 'NamingScheme.ONNX' or 'NamingScheme.TORCHSCRIPT'. + :param onnx_export_args: Should be same as that passed to quantsim export API to have consistency between + layer-output names present in exported onnx model and generated layer-outputs. Required if naming_scheme is + 'NamingScheme.ONNX'. + """ + + # Utility to capture layer-outputs + self.layer_output = LayerOutput(model=model, naming_scheme=naming_scheme, dir_path=dir_path, dummy_input=dummy_input, + onnx_export_args=onnx_export_args) + + # Utility to save model inputs and their corresponding layer-outputs + self.save_input_output = SaveInputOutput(dir_path=dir_path, axis_layout='NCHW') + +
[docs] def generate_layer_outputs(self, input_batch: Union[torch.Tensor, List[torch.Tensor], Tuple[torch.Tensor]]): + """ + This method captures output of every layer of a model & saves the inputs and corresponding layer-outputs to disk. + + :param input_batch: Batch of inputs for which we want to obtain layer-outputs. + :return: None + """ + + input_instance_count = len(input_batch) if isinstance(input_batch, torch.Tensor) else len(input_batch[0]) + logger.info("Generating layer-outputs for %d input instances", input_instance_count) + + # Obtain layer-output name to output dictionary + layer_output_batch_dict = self.layer_output.get_outputs(input_batch) + + # Place inputs and layer-outputs on CPU + input_batch = LayerOutputUtil._get_input_batch_in_numpy(input_batch) + layer_output_batch_dict = LayerOutputUtil._get_layer_output_batch_in_numpy(layer_output_batch_dict) + + # Save inputs and layer-outputs + self.save_input_output.save(input_batch, layer_output_batch_dict) + + logger.info('Successfully generated layer-outputs for %d input instances', input_instance_count)
+ + @staticmethod + def _get_input_batch_in_numpy(input_batch: Union[torch.Tensor, List[torch.Tensor], Tuple[torch.Tensor]]) -> \ + Union[np.ndarray, List[np.ndarray], Tuple[np.ndarray]]: + """ + Coverts the torch tensors into numpy arrays + :param input_batch: input batch with torch tensors + :return: input batch with numpy arrays + """ + if isinstance(input_batch, (List, Tuple)): + numpy_input_batch = [] + for ith_input in input_batch: + numpy_input_batch.append(ith_input.cpu().numpy()) + return numpy_input_batch + return input_batch.cpu().numpy() + + @staticmethod + def _get_layer_output_batch_in_numpy(layer_output_dict: Dict[str, torch.Tensor]) -> Dict[str, np.ndarray]: + """ + Converts the torch tensors into numpy arrays + :param layer_output_dict: layer output dictionary with torch tensors + :return: layer output dictionary with numpy arrays + """ + layer_output_numpy_dict = {} + for output_name, output_tensor in layer_output_dict.items(): + layer_output_numpy_dict[output_name] = output_tensor.cpu().numpy() + return layer_output_numpy_dict
+ + +class LayerOutput: + """ + This class creates a layer-output name to layer-output dictionary. The layer-output names are as per the AIMET exported + pytorch/onnx/torchscript model. + """ + def __init__(self, model: torch.nn.Module, dir_path: str, naming_scheme: NamingScheme = NamingScheme.PYTORCH, + dummy_input: Union[torch.Tensor, Tuple, List] = None, onnx_export_args: Union[OnnxExportApiArgs, Dict] = None): + """ + Constructor - It initializes few dictionaries that are required for capturing and naming layer-outputs. + + :param model: Model whose layer-outputs are needed. + :param dir_path: Directory wherein layer-output names arranged in topological order will be saved. It will also + be used to temporarily save onnx/torchscript equivalent of the given model. + :param naming_scheme: Naming scheme to be followed to name layer-outputs. There are multiple schemes as per + the exported model (pytorch, onnx or torchscript). Refer the NamingScheme enum definition. + :param dummy_input: Dummy input to model (required if naming_scheme is 'onnx'). + :param onnx_export_args: Should be same as that passed to quantsim export API to have consistency between + layer-output names present in exported onnx model and generated layer-outputs (required if naming_scheme is + 'onnx'). + """ + self.model = model + self.module_to_name_dict = utils.get_module_to_name_dict(model=model, prefix='') + + # Check whether the given model is quantsim model + self.is_quantsim_model = any(isinstance(module, (ExportableQuantModule, QcQuantizeRecurrent)) for module in model.modules()) + + # Obtain layer-name to layer-output name mapping + self.layer_name_to_layer_output_dict = {} + self.layer_name_to_layer_output_name_dict = {} + if naming_scheme == NamingScheme.PYTORCH: + for name, module in model.named_modules(): + if utils.is_leaf_module(module) or isinstance(module, BaseQuantizationMixin): + name = name.replace('._module_to_wrap', '') + self.layer_name_to_layer_output_name_dict[name] = name + else: + self.layer_name_to_layer_output_name_dict = LayerOutput.get_layer_name_to_layer_output_name_map( + self.model, naming_scheme, dummy_input, onnx_export_args, dir_path) + + # Replace any delimiter in layer-output name string with underscore + for layer_name, output_name in self.layer_name_to_layer_output_name_dict.items(): + self.layer_name_to_layer_output_name_dict[layer_name] = re.sub(r'\W+', "_", output_name) + + # Save layer-output names which are in topological order of model graph. This order can be used while comparing layer-outputs. + layer_output_names = list(self.layer_name_to_layer_output_name_dict.values()) + save_layer_output_names(layer_output_names, dir_path) + + def get_outputs(self, input_batch: Union[torch.Tensor, List[torch.Tensor], Tuple[torch.Tensor]]) -> Dict[str, torch.Tensor]: + """ + This function captures layer-outputs and renames them as per the AIMET exported pytorch/onnx/torchscript model. + + :param input_batch: Batch of inputs for which we want to obtain layer-outputs. + :return: layer-name to layer-output batch dict + """ + + # Fetch outputs of all the layers + self.layer_name_to_layer_output_dict = {} + if self.is_quantsim_model: + # Apply record-output hook to QuantizeWrapper modules (one node above leaf node in model graph) + utils.run_hook_for_layers_with_given_input(self.model, input_batch, self.record_outputs, + module_type_for_attaching_hook=(ExportableQuantModule, QcQuantizeRecurrent), + leaf_node_only=False) + else: + # Apply record-output hook to Original modules (leaf node in model graph) + utils.run_hook_for_layers_with_given_input(self.model, input_batch, self.record_outputs, leaf_node_only=True) + + # Rename outputs according to pytorch/onnx/torchscript model + layer_output_name_to_layer_output_dict = LayerOutput.rename_layer_outputs(self.layer_name_to_layer_output_dict, + self.layer_name_to_layer_output_name_dict) + + return layer_output_name_to_layer_output_dict + + def record_outputs(self, module: torch.nn.Module, _, output: torch.Tensor): + """ + Hook function to capture output of a layer. + + :param module: Layer-module in consideration. + :param _: Placeholder for the input of the layer-module. + :param output: Output of the layer-module. + :return: None + """ + layer_name = self.module_to_name_dict[module] + if isinstance(output, torch.Tensor): + self.layer_name_to_layer_output_dict[layer_name] = output.clone() + else: + logger.info("Skipping constant scalar output of layer %s", layer_name) + + @staticmethod + def rename_layer_outputs(layer_name_to_layer_output_dict: Dict[str, torch.Tensor], + layer_name_to_layer_output_name_dict: Dict[str, str]) -> Dict[str, torch.Tensor]: + """ + Rename layer-outputs based on the layer-name to layer-output name map + + :param layer_name_to_layer_output_dict: Dict containing layer-outputs + :param layer_name_to_layer_output_name_dict: Dict containing layer-output names + :return: layer_output_name_to_layer_output_dict + """ + layer_names = list(layer_name_to_layer_output_dict.keys()) + + for layer_name in layer_names: + if layer_name in layer_name_to_layer_output_name_dict: + # Rename the layer-output by using layer-output name, instead of layer-name + layer_output_name = layer_name_to_layer_output_name_dict[layer_name] + layer_name_to_layer_output_dict[layer_output_name] = layer_name_to_layer_output_dict.pop(layer_name) + else: + # Delete the layer-output as it doesn't have a name + layer_name_to_layer_output_dict.pop(layer_name) + + return layer_name_to_layer_output_dict + + @staticmethod + def get_layer_name_to_layer_output_name_map(model, naming_scheme: NamingScheme, dummy_input: Union[torch.Tensor, Tuple, List], + onnx_export_args: Union[OnnxExportApiArgs, Dict], dir_path: str) -> Dict[str, str]: + """ + This function produces layer-name to layer-output name map w.r.t the AIMET exported onnx/torchscript model. If a + layer gets expanded into multiple layers in the exported model then the intermediate layers are ignored and + output-name of last layer is used. + + :param model: model + :param naming_scheme: onnx/torchscript + :param dummy_input: dummy input that is used to construct onnx/torchscript model + :param onnx_export_args: OnnxExportApiArgs instance same as that passed to quantsim export API + :param dir_path: directory to temporarily save the constructed onnx/torchscrip model + :return: dictionary of layer-name to layer-output name + """ + + # Restore original model by removing quantization wrappers if present. + original_model = QuantizationSimModel.get_original_model(model) + + # Set path to store exported onnx/torchscript model. + LayerOutput._validate_dir_path(dir_path) + exported_model_dir = os.path.join(dir_path, 'exported_models') + os.makedirs(exported_model_dir, exist_ok=True) + + # Get node to i/o tensor name map from the onnx/torchscript model + if naming_scheme == NamingScheme.ONNX: + exported_model_node_to_io_tensor_map = LayerOutput.get_onnx_node_to_io_tensor_map( + original_model, exported_model_dir, dummy_input, onnx_export_args) + else: + exported_model_node_to_io_tensor_map = LayerOutput.get_torchscript_node_to_io_tensor_map( + original_model, exported_model_dir, dummy_input) + + layer_names_list = [name for name, module in original_model.named_modules() if utils.is_leaf_module(module)] + layers_missing_in_exported_model = [] + layer_name_to_layer_output_name_map = {} + + # Get mapping between layer names and layer-output names. + logger.info("Layer Name to Layer Output-name Mapping") + # pylint: disable=protected-access + for layer_name in layer_names_list: + if layer_name in exported_model_node_to_io_tensor_map: + # pylint: disable=protected-access, unused-variable + layer_output_names, intermediate_layer_output_names = QuantizationSimModel._get_layer_activation_tensors( + layer_name, exported_model_node_to_io_tensor_map) + layer_name_to_layer_output_name_map[layer_name] = layer_output_names[0] + logger.info("%s -> %s", layer_name, layer_output_names[0]) + else: + layers_missing_in_exported_model.append(layer_name) + + if layers_missing_in_exported_model: + logger.warning("The following layers were not found in the exported model:\n" + "%s\n" + "This can be due to below reason:\n" + "\t- The layer was not seen while exporting using the dummy input provided in sim.export(). " + "Ensure that the dummy input covers all layers.", + layers_missing_in_exported_model) + + # Delete onnx/torchscript models + shutil.rmtree(exported_model_dir, ignore_errors=False, onerror=None) + + return layer_name_to_layer_output_name_map + + @staticmethod + def get_onnx_node_to_io_tensor_map(model: torch.nn.Module, exported_model_dir: str, dummy_input: Union[torch.Tensor, Tuple, List], + onnx_export_args: Union[OnnxExportApiArgs, Dict]) -> Dict[str, Dict]: + """ + This function constructs an onnx model equivalent to the give pytorch model and then generates node-name to i/o + tensor-name map. + :param model: pytorch model without quantization wrappers + :param exported_model_dir: directory to save onnx model + :param dummy_input: dummy input to be used for constructing onnx model + :param onnx_export_args: configurations to generate onnx model + :return: onnx_node_to_io_tensor_map + """ + LayerOutput._validate_dummy_input(dummy_input) + LayerOutput._validate_onnx_export_args(onnx_export_args) + + onnx_path = os.path.join(exported_model_dir, 'model.onnx') + + OnnxSaver.create_onnx_model_with_pytorch_layer_names(onnx_model_path=onnx_path, pytorch_model=model, + dummy_input=dummy_input, onnx_export_args=onnx_export_args) + onnx_model = onnx.load(onnx_path) + onnx_node_to_io_tensor_map, _ = OnnxSaver.get_onnx_node_to_io_tensor_names_map(onnx_model) + + return onnx_node_to_io_tensor_map + + @staticmethod + def get_torchscript_node_to_io_tensor_map(model: torch.nn.Module, exported_model_dir: str, + dummy_input: Union[torch.Tensor, Tuple, List]) -> Dict[str, Dict]: + """ + This function constructs a torchscript model equivalent to the give pytorch model and then generates node-name to i/o + tensor-name map. + :param model: pytorch model without quantization wrappers + :param exported_model_dir: directory to save onnx model + :param dummy_input: dummy input to be used for constructing onnx model + :return: torchscript_node_to_io_tensor_map + """ + LayerOutput._validate_dummy_input(dummy_input) + + ts_path = os.path.join(exported_model_dir, 'model.torchscript.pth') + + with utils.in_eval_mode(model), torch.no_grad(): + torchscript_utils.create_torch_script_model(ts_path, model, dummy_input) + trace = torch.jit.load(ts_path) + torch_script_node_to_io_tensor_map, _ = \ + torchscript_utils.get_node_to_io_tensor_names_map(model, trace, dummy_input) + + return torch_script_node_to_io_tensor_map + + @staticmethod + def _validate_dir_path(dir_path: str): + """ + Validate directory path in which onnx/torchscript models will be temporarily saved + :param dir_path: directory path + :return: + """ + if dir_path is None: + raise ValueError("Missing directory path to save onnx/torchscript models") + + @staticmethod + def _validate_dummy_input(dummy_input: Union[torch.Tensor, Tuple, List]): + """ + Validates dummy input which is used to generate onnx/torchscript model + :param dummy_input: single input instance + :return: + """ + if not isinstance(dummy_input, (torch.Tensor, tuple, list)): + raise ValueError("Invalid dummy_input data-type") + + @staticmethod + def _validate_onnx_export_args(onnx_export_args: Union[OnnxExportApiArgs, Dict]): + """ + Validates export arguments which are used to generate an onnx model + :param onnx_export_args: export arguments + :return: + """ + if onnx_export_args is None: + onnx_export_args = OnnxExportApiArgs() + if not isinstance(onnx_export_args, (OnnxExportApiArgs, dict)): + raise ValueError("Invalid onnx_export_args data-type") +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/model_preparer.html b/releases/1.32.2/_modules/aimet_torch/model_preparer.html new file mode 100644 index 0000000..e4347ab --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/model_preparer.html @@ -0,0 +1,1904 @@ + + + + + + aimet_torch.model_preparer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.model_preparer

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2021-2024, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  From PyTorch:
+#
+#  Copyright (c) 2016-     Facebook, Inc            (Adam Paszke)
+#  Copyright (c) 2014-     Facebook, Inc            (Soumith Chintala)
+#  Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
+#  Copyright (c) 2012-2014 Deepmind Technologies    (Koray Kavukcuoglu)
+#  Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
+#  Copyright (c) 2011-2013 NYU                      (Clement Farabet)
+#  Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)
+#  Copyright (c) 2006      Idiap Research Institute (Samy Bengio)
+#  Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)
+#
+#  From Caffe2:
+#
+#  Copyright (c) 2016-present, Facebook Inc. All rights reserved.
+#
+#  All contributions by Facebook:
+#  Copyright (c) 2016 Facebook Inc.
+#
+#  All contributions by Google:
+#  Copyright (c) 2015 Google Inc.
+#  All rights reserved.
+#
+#  All contributions by Yangqing Jia:
+#  Copyright (c) 2015 Yangqing Jia
+#  All rights reserved.
+#
+#  All contributions by Kakao Brain:
+#  Copyright 2019-2020 Kakao Brain
+#
+#  All contributions by Cruise LLC:
+#  Copyright (c) 2022 Cruise LLC.
+#  All rights reserved.
+#
+#  All contributions from Caffe:
+#  Copyright(c) 2013, 2014, 2015, the respective contributors
+#  All rights reserved.
+#
+#  All other contributions:
+#  Copyright(c) 2015, 2016 the respective contributors
+#  All rights reserved.
+#
+#  Caffe2 uses a copyright model similar to Caffe: each contributor holds
+#  copyright over their contributions to Caffe2. The project versioning records
+#  all such contribution and copyright details. If a contributor wants to further
+#  mark their specific copyright on a particular contribution, they should
+#  indicate their copyright solely in the commit message of the change when it is
+#  committed.
+#
+#  All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+#  3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories America
+#     and IDIAP Research Institute nor the names of its contributors may be
+#     used to endorse or promote products derived from this software without
+#     specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Implementation to automatically prepare pytorch models for AIMET features """
+
+# --------------------------------------------------------------------------------------------------------
+# Reference : https://github.com/pytorch/pytorch/blob/main/torch/fx/proxy.py#L26
+#             https://github.com/pytorch/pytorch/blob/main/torch/fx/proxy.py#L57
+
+# Above PyTorch code is used to get node_name_to_scope information by overriding call_module and create_node methods
+# of torch.fx.Tracer base class:
+# TODO: node_name_to_scope should be removed and instead use node.meta[] after upgrading to torch 2.0
+# ----------------------------------------------------------------------------------------------------------
+
+import copy
+import re
+from typing import Any, Optional, Dict, Union, List, Callable, Tuple
+import torch
+import torch.fx
+from aimet_common.utils import AimetLogger
+from aimet_torch.utils import in_eval_mode
+from aimet_torch.utils import replace_modules_of_type1_with_type2
+import aimet_torch.elementwise_ops as elementwise_ops
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.ModelPreparer)
+
+# this is a map of torch.nn.functional type to corresponding module type
+functional_op_to_module_map = {
+    torch.nn.functional.relu: torch.nn.ReLU,
+    torch.nn.functional.gelu: torch.nn.GELU
+}
+
+# In this functional --> module map, corresponding model is of type torch.nn and stateful.
+functional_with_stateful_api = {
+    'relu'          : torch.nn.ReLU,
+    'relu6'         : torch.nn.ReLU6,
+    'hardtanh'      : torch.nn.Hardtanh,
+    'hardwish'      : torch.nn.Hardswish,
+    'elu'           : torch.nn.ELU,
+    'selu'          : torch.nn.SELU,
+    'celu'          : torch.nn.CELU,
+    'leaky_relu'    : torch.nn.LeakyReLU,
+    'prelu'         : torch.nn.PReLU,
+    'rrelu'         : torch.nn.RReLU,
+    'glu'           : torch.nn.GLU,
+    'gelu'          : torch.nn.GELU,
+    'logsigmoid'    : torch.nn.LogSigmoid,
+    'hardshrink'    : torch.nn.Hardshrink,
+    'tanhshrink'    : torch.nn.Tanhshrink,
+    'softsign'      : torch.nn.Softsign,
+    'softplus'      : torch.nn.Softplus,
+    'softmin'       : torch.nn.Softmin,
+    'softmax'       : torch.nn.Softmax,
+    'softshrink'    : torch.nn.Softshrink,
+    'log_softmax'   : torch.nn.LogSoftmax,
+    'tanh'          : torch.nn.Tanh,
+    'sigmoid'       : torch.nn.Sigmoid,
+    'hardsigmoid'   : torch.nn.Hardsigmoid,
+    'silu'          : torch.nn.SiLU,
+}
+
+
+# Function that requires special transformation.
+functional_with_special_handling = {
+    'cat'           : elementwise_ops.Concat,
+    'conv2d'        : torch.nn.Conv2d
+}
+
+# In this functional --> module map, corresponding custom module is of type torch.nn and uses stateless API.
+functional_with_stateless_api = {
+    '_pad'                      : elementwise_ops.Pad,
+    'pad'                      : elementwise_ops.Pad,
+    'sum'                       : elementwise_ops.Sum,
+    'add'                       : elementwise_ops.Add,
+    'subtract'                  : elementwise_ops.Subtract,
+    'sub'                       : elementwise_ops.Subtract,
+    'mul'                       : elementwise_ops.Multiply,
+    'div'                       : elementwise_ops.Divide,
+    'truediv'                   : elementwise_ops.Divide,
+    'floordiv'                  : elementwise_ops.FloorDivide,
+    'matmul'                    : elementwise_ops.MatMul,
+    'exp'                       : elementwise_ops.Exponential,
+    'interpolate'               : elementwise_ops.Interpolate,
+    'max_pool2d'                : elementwise_ops.MaxPool2d,
+    'max_pool2d_with_indices'   : elementwise_ops.MaxPool2d,
+    'adaptive_avg_pool2d'       : elementwise_ops.AdaptiveAvgPool2d,
+    'avg_pool2d'                : elementwise_ops.AvgPool2d,
+    'norm'                      : elementwise_ops.Norm,
+    'batch_norm'                : elementwise_ops.BatchNorm,
+    'group_norm'                : elementwise_ops.GroupNorm,
+    'mean'                      : elementwise_ops.Mean,
+    'pow'                       : elementwise_ops.Pow,
+    'where'                     : elementwise_ops.Where,
+    'addmm'                     : elementwise_ops.Addmm,
+    'bmm'                       : elementwise_ops.Bmm,
+    'baddbmm'                   : elementwise_ops.Baddbmm,
+    'cumsum'                    : elementwise_ops.CumSum,
+    'masked_fill'               : elementwise_ops.MaskedFill,
+    'square'                    : elementwise_ops.Square,
+    'rsqrt'                     : elementwise_ops.RSqrt,
+}
+
+
+class Scope:
+    """
+    Code adapted from: https://github.com/pytorch/pytorch/blob/main/torch/fx/proxy.py#L26
+
+    Scope object that records the module path and the module type of module.
+    Scope is used to track the information of the module that contains a Node
+    in a Graph of GraphModule.
+    """
+    def __init__(self, module_path: str, module_type: Any):
+        super().__init__()
+        self.module_path = module_path
+        self.module_type = module_type
+
+
+class ScopeContextManager:
+    """
+    Code adapted from: https://github.com/pytorch/pytorch/blob/main/torch/fx/proxy.py#L57
+
+    A context manager to track the Scope of Node during symbolic tracing.
+    When entering a forward function of a Module, we'll update the scope information of
+    the current module, and when we exit, we'll restore the previous scope information.
+    """
+    def __init__(self, scope: Scope, current_scope: Scope):
+        super().__init__()
+        # Keep a copy of prev scope.
+        self._prev_scope = copy.copy(scope)
+        # Update scope to current scope
+        scope.module_path = current_scope.module_path
+        scope.module_type = current_scope.module_type
+        # Save a reference so, we can restore tracer.scope with prev scope on exit.
+        self._scope = scope
+
+    def __enter__(self):
+        return
+
+    def __exit__(self, *args):
+        self._scope.module_path = self._prev_scope.module_path
+        self._scope.module_type = self._prev_scope.module_type
+
+
+def conv2d_create_node(traced_model: torch.fx.GraphModule, module_name: str, node: torch.fx.node) \
+        -> torch.fx.node:
+    """
+    Create the node to be inserted in the graph model.
+
+    :param traced_model: Symbolically traced model
+    :param module_name: Qualified module name in symbolic_traced_model hierarchy corresponding to new node
+    :param node: Current node in the graph after which new node will be inserted
+    :return: torch.fx.node to be inserted in the graph
+    """
+
+    n_args = len(node.args)
+    # input tensors must be passed as args, not kwargs for QcQuantizeWrapper
+    input_tensor = []
+    # input and weight is guaranteed to exist, but bias can be None
+    # Since None cannot be passed as args in QcQuantizeWrapper, do not add it to input_tensor
+    for index, key in [[0, 'input'], [1, 'weight'], [2, ' bias']]:
+        value = None
+        if n_args > index:
+            value = node.args[index]
+        elif key in node.kwargs:
+            value = node.kwargs[key]
+
+        if value is not None:
+            input_tensor.append(value)
+        else:
+            break
+
+    with traced_model.graph.inserting_after(node):
+        if check_dynamic_conv2d(traced_model, module_name):
+            new_node = traced_model.graph.call_module(module_name, args=tuple(input_tensor))
+        else:
+            new_node = traced_model.graph.call_module(module_name, args=tuple([input_tensor[0]]))
+        return new_node
+
+
+def check_dynamic_conv2d(traced_model: torch.fx.GraphModule, module_name: str) -> bool:
+    """
+    return True if the module is dynamic conv2d.
+    """
+    m = traced_model
+    for name in module_name.split('.'):
+        m = getattr(m, name)
+
+    return isinstance(m, elementwise_ops.DynamicConv2d)
+
+
+def conv2d_create_module(node: torch.fx.node) -> torch.nn.Module:
+    """
+    Create the replacement module.
+
+    :param node: Current node in the graph after which new node will be inserted
+    :return: New module.
+    """
+
+    # Get weight and bias from argument
+    params = merge_args_and_kwargs(node, {1: 'weight', 2: 'bias'})
+
+    # Convert F.Conv2D arguments to nn.Conv2D arguments
+    kwargs = merge_args_and_kwargs(node, {3: 'stride', 4: 'padding', 5: 'dilation', 6: 'groups'})
+
+    # If weight or bias is from activation of another layer, use dynamic_conv2d
+    use_dynamic_conv2d = False
+    for key, param in params.items():
+        if param.op != 'get_attr':
+            use_dynamic_conv2d = True
+            break
+
+    if use_dynamic_conv2d:
+        module = elementwise_ops.DynamicConv2d(**kwargs)
+    else:
+        for key, param_node in params.items():
+            params[key] = get_node_attr(param_node)
+
+        # Fetch additional info using parameters
+        out_channels, in_channels, kernel_size, _ = params['weight'].shape
+        bias = 'bias' in params
+
+        # For Depthwise Conv, multiply in_channels by number of groups
+        # if groups is not passed as arg, use its default value 1
+        kwargs['in_channels'] = in_channels * kwargs.get('groups', 1)
+        kwargs['out_channels'] = out_channels
+        kwargs['kernel_size'] = kernel_size
+        kwargs['bias'] = bias
+
+        module = torch.nn.Conv2d(**kwargs)
+        # Replace nn.Conv2D params using F.Conv2D arguments
+        module.weight = torch.nn.Parameter(params['weight'])
+        if bias:
+            module.bias = torch.nn.Parameter(params['bias'])
+    return module
+
+
+def merge_args_and_kwargs(node: torch.fx.node, arguments_to_fetch: Dict) -> Dict:
+    """
+    Merge args and kwargs into a single kwargs and return it
+    :param node: node to fetch args and kwargs from
+    :param arguments_to_fetch: dictionary containing arguments' indices in args and keys in kwargs
+    :return: single merged kwargs
+    """
+    n_args = len(node.args)
+    kwargs = {}
+    for index, key in arguments_to_fetch.items():
+        value = None
+        if n_args > index:
+            value = node.args[index]
+        elif key in node.kwargs:
+            value = node.kwargs[key]
+
+        if value is not None:
+            kwargs[key] = value
+    return kwargs
+
+
+def get_node_attr(node: torch.fx.node):
+    """
+    Codes modified from https://pytorch.org/docs/stable/fx.html#the-interpreter-pattern
+
+    :param node: node to fetch data from
+    :return: value returned from node
+    """
+    def fetch_attr(target: str):
+        target_atoms = target.split('.')
+        attr_itr = node.graph.owning_module
+        for i, atom in enumerate(target_atoms):
+            if not hasattr(attr_itr, atom):
+                raise RuntimeError(f"Node referenced nonexistant target {'.'.join(target_atoms[:i])}")
+            attr_itr = getattr(attr_itr, atom)
+        return attr_itr
+
+    assert node.op == 'get_attr'
+
+    return fetch_attr(node.target)
+
+
+def concat_create_node(traced_model: torch.fx.GraphModule, module_name: str, node: torch.fx.node) \
+        -> torch.fx.node:
+    """
+    Create the node to be inserted in the graph model.
+
+    :param traced_model: Symbolically traced model
+    :param module_name: Qualified module name in symbolic_traced_model hierarchy corresponding to new node
+    :param node: Current node in the graph after which new node will be inserted
+    :return: torch.fx.node to be inserted in the graph
+    """
+
+    with traced_model.graph.inserting_after(node):
+        # call_module only accepts tuple as args but node.args[0] can be a list. Convert it into a tuple
+        # If node.args[0] is already a tuple, tuple() will do nothing
+        new_node = traced_model.graph.call_module(module_name, args=tuple(node.args[0]))
+        return new_node
+
+
+def concat_create_module(node: torch.fx.node) -> torch.nn.Module:
+    """
+    Create the replacement module.
+
+    :param node: Current node in the graph after which new node will be inserted
+    :return: New module.
+    """
+
+    num_args = len(node.args)
+    if num_args == 1 and 'dim' not in node.kwargs:
+        # Handle torch.cat being called with default parameter dim
+        kwargs = node.kwargs
+        module = elementwise_ops.Concat()
+    else:
+        axis = node.args[1] if num_args > 1 else node.kwargs['dim']
+        module = elementwise_ops.Concat(axis)
+        kwargs = {'axis': axis}
+
+    for key, value in kwargs.items():
+        setattr(module, key, value)
+
+    return module
+
+special_handler_functions = {
+    # Special handling functions for creating node and module
+    'cat': {'node_fn': concat_create_node, 'module_fn': concat_create_module},
+    'conv2d': {'node_fn': conv2d_create_node, 'module_fn': conv2d_create_module}
+}
+
+
+
[docs]def prepare_model(model: torch.nn.Module, + modules_to_exclude: List[torch.nn.Module] = None, + module_classes_to_exclude: List[Callable] = None, + concrete_args: Optional[Dict[str, Any]] = None) -> torch.fx.GraphModule: + """ + Prepare and modify the pytorch model for AIMET features using torch.FX symbolic tracing API. + + 1. Replace torch.nn.functional by module of type torch.nn.Module + 2. Create new independent torch.nn.Module instances for reused/duplicate module + + :param model: pytorch Model to be modified. + :param modules_to_exclude: List of modules to exclude when tracing. + :param module_classes_to_exclude: List of module classes to exclude when tracing. + :param concrete_args: Allows you to partially specialize your function, whether it's to remove control flow or + data structures. If the model has control flow, torch.fx won't be able to trace the model. Check + torch.fx.symbolic_trace API in detail. + :return: Modified pytorch Model + """ + with in_eval_mode(model): + traced_model, node_name_to_scope = \ + _trace_model(model, modules_to_exclude, module_classes_to_exclude, concrete_args) + + # Prepare model and perform checks to make sure the graph is well-formed. + _prepare_traced_model(traced_model, node_name_to_scope) + return traced_model
+ + +def _trace_model(model: torch.nn.Module, + modules_to_exclude: Optional[List[torch.nn.Module]], + module_classes_to_exclude: Optional[List[Callable]], + concrete_args: Optional[Dict[str, Any]]) -> [torch.fx.GraphModule, Dict]: + """ + Returns traced model and dictionary of node name to the scope of module which contains the node. + + :param model: pytorch Model to be modified. + :param modules_to_exclude: List of modules to exclude when tracing. + :param module_classes_to_exclude: List of module classes to exclude when tracing. + :param concrete_args: Concrete arguments that should not be treated as Proxies. + :return: (Traced model, node_name_to_scope) + """ + class Tracer(torch.fx.Tracer): + """ + Override is_leaf_module(), call_module() and create_node() methods of parent class. + """ + def __init__(self): + super().__init__() + self.scope = Scope("", None) + self.node_name_to_scope = {} + + def is_leaf_module(self, m: torch.nn.Module, module_qualified_name: str) -> bool: + return ( + modules_to_exclude and m in modules_to_exclude + or module_classes_to_exclude and type(m) in module_classes_to_exclude # pylint: disable=unidiomatic-typecheck + or super().is_leaf_module(m, module_qualified_name) + ) + + def call_module(self, m: torch.nn.Module, forward: Callable[..., Any], args: Tuple[Any, ...], + kwargs: Dict[str, Any]) -> Any: + module_qualified_name = self.path_of_module(m) + with ScopeContextManager(self.scope, Scope(module_qualified_name, type(m))): + return super().call_module(m, forward, args, kwargs) + + def create_node(self, kind: str, target, args, kwargs, name: Optional[str] = None, + type_expr: Optional[Any] = None) -> torch.fx.Node: + node = super().create_node(kind, target, args, kwargs, name, type_expr) + self.node_name_to_scope[node.name] = (self.scope.module_path, self.scope.module_type) + return node + + # Symbolic tracing frontend - captures the semantics of the module + tracer = Tracer() + graph = tracer.trace(model, concrete_args=concrete_args) + traced_model = torch.fx.GraphModule(tracer.root, graph) + return traced_model, tracer.node_name_to_scope + + +def _prepare_traced_model(traced_model: torch.fx.GraphModule, + node_name_to_scope: Dict[str, Tuple[str, type]] = None): + """ + Helper for prepare_model(). This prepares the given traced_model in-place. + + :param traced_model: Symbolically traced model. + :param node_name_to_scope: Mapping from node name to the scope of module which contains the node. + """ + unique_nodes = set() + + # Modify the symbolically traced model by iterating over all the nodes + for node in traced_model.graph.nodes: + + # Create new module for functional nodes + if node.op in ['call_function', 'call_method']: + functional_name = _find_functional_name_for_node(node.name) + if functional_name: + # Instantiate new module for functional node + new_module = _create_module_for_functional_node(node, functional_name) + parent_module, new_module_name, new_module_qualified_name = \ + _get_info_for_functional_node(traced_model, node, node_name_to_scope) + setattr(parent_module, new_module_name, new_module) + # Insert the node for new module in the graph + _insert_node_for_new_module(traced_model, node, new_module_qualified_name, functional_name) + logger.info("Functional : Adding new module for node: {%s} ", new_module_qualified_name) + + # Create new module for reused/duplicate nodes + elif node.target in unique_nodes: + if node.op == 'call_module': + # Instantiate new module for reused node + new_module = _create_module_for_reused_node(node, traced_model) + parent_module, new_module_name, new_module_qualified_name = \ + _get_info_for_reused_node(traced_model, node, node_name_to_scope) + setattr(parent_module, new_module_name, new_module) + # Insert the node for new module in the graph + _insert_node_for_new_module(traced_model, node, new_module_qualified_name) + logger.info("Reused/Duplicate : Adding new module for node: {%s} ", new_module_qualified_name) + else: + unique_nodes.add(node.target) + + _verify_traced_model(traced_model) + + # Replace SiLU with CustomSiLU + replace_modules_of_type1_with_type2(traced_model, torch.nn.SiLU, elementwise_ops.CustomSiLU) + + +def _verify_traced_model(traced_model: torch.fx.GraphModule): + """ + Does some checks to make sure the graph is well-formed and recompile the forward() method of symbolic_traced + model from its graph + + :param traced_model: Symbolically traced model + """ + traced_model.graph.lint() + traced_model.recompile() + + +def _insert_node_for_new_module(traced_model: torch.fx.GraphModule, + node: torch.fx.node, + module_qualified_name: str, + functional_name: str = None): + """ + Insert 'call module' node into graph and replace all the uses of 'node' with newly added node and erase the + old node from graph + :param traced_model: Symbolically traced model + :param node: Current node in the graph after which new node will be inserted + :param module_qualified_name: Qualified module name in symbolic_traced_model hierarchy corresponding to new node + :param functional_name: Original functional name + """ + with traced_model.graph.inserting_after(node): + if functional_name: + if functional_name in functional_with_special_handling: + new_node = special_handler_functions[functional_name]['node_fn'](traced_model, module_qualified_name, node) + elif functional_name in functional_with_stateless_api: + new_node = traced_model.graph.call_module(module_qualified_name, args=node.args, kwargs=node.kwargs) + elif functional_name in functional_with_stateful_api: + new_node = traced_model.graph.call_module(module_qualified_name, args=node.args) + else: + raise ValueError("Unsupported module: {}".format(functional_name)) + else: + new_node = traced_model.graph.call_module(module_qualified_name, args=node.args) + + node.replace_all_uses_with(new_node) + traced_model.graph.erase_node(node) + + +def _find_functional_name_for_node(node_name: str) -> Union[str, None]: + """ + For given node name, find corresponding functional name from combined lookup + + :param node_name: torch.fx Node name + :return: corresponding functional name if found, else None + """ + combined_lookup = {**functional_with_stateful_api, **functional_with_special_handling, **functional_with_stateless_api} + + # Functional operations with similar names are differentiated using "_count" suffix + # when symbolically traced. For example, two add operations will have name 'add' and 'add_1'. + # Split given node name by occurrence of pattern. \d is used to match [0-9] followed by '_'. + strings = re.split(pattern=r'_\d', string=node_name) + for string in strings: + if string in combined_lookup.keys(): + return string + + logger.debug("Couldn't find functional: %s in the lookup. If functional op isn't math invariant," + " add an entry in the lookup.", node_name) + return None + + +def _create_module_for_functional_node(node: torch.fx.node, functional_name: str) -> torch.nn.Module: + """ + For given node and functional name, create torch.nn.Module with same parameters as functional node parameters + :param node: torch.fx Node + :param functional_name: Functional name for given node + :return: New module + """ + # Instantiate new module from lookup + if functional_name in functional_with_stateful_api: + module = functional_with_stateful_api[functional_name]() + # Set the parameters for module from node.kwargs + for key, value in node.kwargs.items(): + setattr(module, key, value) + elif functional_name in functional_with_special_handling: + module = special_handler_functions[functional_name]['module_fn'](node) + elif functional_name in functional_with_stateless_api: + module = functional_with_stateless_api[functional_name]() + else: + raise ValueError("Unsupported module: {}".format(functional_name)) + return module + + +def _create_module_for_reused_node(node: torch.fx.node, symbolic_traced_model: torch.fx.GraphModule) ->\ + torch.nn.Module: + """ + For given reused/Duplicate node in symbolically traced model, create new module with same parameters as + original module + :param node: Reused/Duplicate torch.fx Node + :param symbolic_traced_model: Symbolically traced model + :return: New module + """ + # Get the original module and return newly deep copied module + module = _get_module_for_dotted_name(symbolic_traced_model, node.target) + new_module = copy.deepcopy(module) + + return new_module + + +def _get_module_for_dotted_name(module: torch.fx.GraphModule, dotted_name: str) -> torch.nn.Module: + """ + For given dotted name, find the module + :param module: module to be found + :param dotted_name: dotted name of module + :return: module + """ + if '.' in dotted_name: + module_name, _, remainder = dotted_name.partition('.') + return _get_module_for_dotted_name(module._modules[module_name], remainder) # pylint: disable=protected-access + + return getattr(module, dotted_name) + + +def get_module_for_activation_fn(act_fn: torch.nn.functional): + """ + returns module instance for functional tyoe handled within PT transformers for activation functions + :param act_fn: activation function implemented as a functional. + :return: module equivalent for the activation function. + """ + + if act_fn not in functional_op_to_module_map: + logger.error("Unsupported activation function {%s}", act_fn) + return None + module = functional_op_to_module_map[act_fn]() + return module + + +def prepare_pt_transformer_for_quantsim(transformer_model: torch.nn.Module): + """ + Replaces functionals with modules for activation function, updates model in-place + :param transformer_model: model with PyTorch nn.Transformer layer + :return: updated model with modules for activation function. + """ + + for module in transformer_model.modules(): + + # encoder layer or decoder layer type is the leaf level node to be updated within nn.transformer layer + if isinstance(module, torch.nn.TransformerEncoderLayer) and not isinstance(module.activation, torch.nn.Module): + module.activation = get_module_for_activation_fn(module.activation) + + if isinstance(module, torch.nn.TransformerDecoderLayer) and not isinstance(module.activation, torch.nn.Module): + module.activation = get_module_for_activation_fn(module.activation) + + +def _get_info_for_functional_node(traced_model: torch.fx.GraphModule, + node: torch.fx.Node, + node_name_to_scope: Dict[str, Tuple[str, type]])\ + -> Tuple[torch.fx.GraphModule, str, str]: + """ + For functional node, get module which contains the node, corresponding new module's name and fully qualified name. + This information will be used to add new module at either module-level scope or model-level scope. + + NOTE: If node_name_to_scope is not provided, then the corresponding new module will be added at model-level scope. + Also, if exception is raised, new module will be added at model-level scope. + + :param traced_model: Traced model + :param node: torch.fx Node + :param node_name_to_scope: Mapping from node name to the scope of module which contains the node. + :return: (parent_module, new_module_name, new_module_qualified_name) + """ + parent_module = traced_model + new_module_name = "module_" + node.name + new_module_qualified_name = new_module_name + + if node_name_to_scope: + try: + module_path, _ = node_name_to_scope[node.name] + parent_module = traced_model.get_submodule(module_path) + if module_path == "": + new_module_qualified_name = new_module_name + else: + new_module_qualified_name = module_path + "." + new_module_name + except (KeyError, AttributeError): + pass + + return parent_module, new_module_name, new_module_qualified_name + + +def _get_info_for_reused_node(traced_model: torch.fx.GraphModule, + node: torch.fx.Node, + node_name_to_scope: Dict[str, Tuple[str, type]])\ + -> Tuple[torch.fx.GraphModule, str, str]: + """ + For reused node, get module which contains the node, corresponding new module's name and fully qualified name. + This information will be used to add new module at either module-level scope or model-level scope. + + NOTE: If node_name_to_scope is not provided, then the corresponding new module will be added at model-level scope. + Also, if exception is raised, new module will be added at model-level scope. + + :param traced_model: Traced model + :param node: torch.fx Node + :param node_name_to_scope: Mapping from node name to the scope of module which contains the node. + :return: (parent_module, new_module_name, new_module_qualified_name) + """ + parent_module = traced_model + new_module_name = "module_" + node.name + new_module_qualified_name = new_module_name + + if node_name_to_scope: + try: + module_path, _ = node_name_to_scope[node.name] + if "." in module_path: + parent_name, child_name = module_path.rsplit(".", maxsplit=1) + else: + parent_name, child_name = "", module_path + parent_module = traced_model.get_submodule(parent_name) + new_module_name = "module_" + child_name + "_" + node.name.rsplit("_", maxsplit=1)[1] + if parent_name == "": + new_module_qualified_name = new_module_name + else: + new_module_qualified_name = parent_name + "." + new_module_name + except (KeyError, AttributeError): + pass + + return parent_module, new_module_name, new_module_qualified_name +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/peft.html b/releases/1.32.2/_modules/aimet_torch/peft.html new file mode 100644 index 0000000..ed334bc --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/peft.html @@ -0,0 +1,1569 @@ + + + + + + aimet_torch.peft — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.peft

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Implementation for handling LoRA adapters added using PEFT """
+from typing import Dict, Type
+import os
+import pickle
+from collections import defaultdict
+import torch.nn as nn
+import torch
+import onnx
+from safetensors.torch import save_file
+from safetensors import safe_open
+
+# pylint: disable=import-error
+# pylint: disable=no-name-in-module
+from peft.tuners.lora.layer import LoraLayer as PeftLoraLayer
+from peft.tuners.lora.layer import Conv2d as PeftConv2d
+
+from aimet_torch.utils import replace_modules_of_type1_using_constructor
+from aimet_torch.elementwise_ops import Add
+from aimet_torch.v2.quantsim import QuantizationSimModel
+from aimet_torch.quantsim import ExportableQuantModule
+from aimet_torch.v2.nn import BaseQuantizationMixin
+from aimet_torch.onnx_utils import OnnxSaver, get_layers_in_io_tensor_map
+
+
+class LoraLayer(torch.nn.Module):
+    """
+    Quantizable lora layer
+    """
+    # pylint: disable=too-many-instance-attributes
+    def __init__(self, lora_layer: PeftLoraLayer):
+        """
+        :param lora_layer: Lora layer we want to replace
+        """
+        super().__init__()
+        self.base_layer = lora_layer.base_layer
+        self.r = lora_layer.r
+        self.lora_alpha = lora_layer.lora_alpha
+        self.scaling = lora_layer.scaling
+        self.lora_dropout = nn.ModuleList({})
+        self.adapter_name_to_index = {}
+        self.index_to_adapter_name = {}
+        self.lora_A = nn.ModuleList([])
+        self.lora_B = nn.ModuleList([])
+        self.active_adapters = {}
+        self._swap_module_dict_with_list(lora_layer)
+        self.in_features = lora_layer.in_features
+        self.out_features = lora_layer.out_features
+        self.add_lora_to_res = Add()
+
+    def _swap_module_dict_with_list(self, lora_layer):
+        for index, adapter_name in enumerate(lora_layer.lora_A):
+            self.lora_A.append(lora_layer.lora_A[adapter_name])
+            self.lora_B.append(lora_layer.lora_B[adapter_name])
+            self.lora_dropout.append(lora_layer.lora_dropout[adapter_name])
+            self.adapter_name_to_index[adapter_name] = index
+            if adapter_name in lora_layer.active_adapter:
+                self.active_adapters[adapter_name] = True
+            else:
+                self.active_adapters[adapter_name] = False
+        for adapter_name in self.adapter_name_to_index:
+            self.index_to_adapter_name[self.adapter_name_to_index[adapter_name]] = adapter_name
+
+    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:
+        """ Forward pass for replaced layer"""
+        result = self.base_layer(x, *args, **kwargs)
+        torch_result_dtype = result.dtype
+        for active_adapter in self.active_adapters:
+            if active_adapter not in self.adapter_name_to_index:
+                continue
+            lora_A = self.lora_A[self.adapter_name_to_index[active_adapter]]
+            lora_B = self.lora_B[self.adapter_name_to_index[active_adapter]]
+            dropout = self.lora_dropout[self.adapter_name_to_index[active_adapter]]
+            scaling = self.scaling[active_adapter]
+            x = x.to(lora_A.weight.dtype)
+
+            result = self.add_lora_to_res(result, lora_B(lora_A(dropout(x)) * scaling))
+
+        result = result.to(torch_result_dtype)
+        return result
+
+
+def replace_lora_layers_with_quantizable_layers(model: torch.nn.Module):
+    """
+    Utility to replace lora layers with Quantizable Lora layers
+
+    :param model: PEFT model
+    """
+    replace_modules_of_type1_using_constructor(model, PeftLoraLayer, LoraLayer)
+    replace_modules_of_type1_using_constructor(model, PeftConv2d, LoraLayer)
+
+
+def save_lora_weights_after_adaptation(model: torch.nn.Module, path: str, filename_prefix: str):
+    """
+    Utility to save model weights after model adaptations
+
+    :param model: PEFT model
+    :param path: path where to store model pth and encodings
+    :param filename_prefix: Prefix to use for filenames
+    """
+    param_to_name = {}
+
+    for name, param in model.named_parameters():
+        param_to_name[param] = name
+
+    lora_weights = {}
+    for name, module in model.named_modules():
+        if isinstance(module, LoraLayer):
+            for _, param in module.lora_A.named_parameters():
+                name = param_to_name[param]
+                lora_weights[name] = param
+            for _, param in module.lora_B.named_parameters():
+                name = param_to_name[param]
+                lora_weights[name] = param
+
+    filename_prefix = filename_prefix + '.safetensor'
+    model_params_path = os.path.join(path, filename_prefix)
+    save_file(lora_weights, model_params_path)
+
+
+
[docs]class AdapterMetaData: + """ + Tracks meta data for lora layers. Tracks names of lora_a & b as well as alpha values + Attributes: + lora_A, lora_B, alpha + """ + def __init__(self): + self.lora_A = [] + self.lora_B = [] + self.alpha = None
+ + +def track_lora_meta_data(model: torch.nn.Module, path: str, filename_prefix: str, + replaced_module_type: Type[torch.nn.Module] = None) -> Dict[str, AdapterMetaData]: + """ + Utility to track and save meta data for adapters. The meta data has adapter names and corresponding lora layers & alphas + + :param model: PEFT model + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames + :param replaced_module_type: If lora linear layer is replaced by another torch module, then replaced_module_type + represents the type with which linear layer was replaced. Otherwise pass None + """ + module_to_name_d = {} + + for name, module in model.named_modules(): + module_to_name_d[module] = name + + adapter_name_to_meta_data = defaultdict(AdapterMetaData) + for name, module in model.named_modules(): + if isinstance(module, LoraLayer): + for index, lora_layer in enumerate(module.lora_A): + if replaced_module_type and isinstance(lora_layer, replaced_module_type): + lora_layer = lora_layer.conv2d + adapter_name_to_meta_data[module.index_to_adapter_name[index]].lora_A.append( + module_to_name_d[lora_layer]) + for index, lora_layer in enumerate(module.lora_B): + if replaced_module_type and isinstance(lora_layer, replaced_module_type): + lora_layer = lora_layer.conv2d + adapter_name_to_meta_data[module.index_to_adapter_name[index]].lora_B.append( + module_to_name_d[lora_layer]) + for lora_adapter_name in module.lora_alpha: + adapter_name_to_meta_data[lora_adapter_name].alpha = module.lora_alpha[lora_adapter_name] + + + file_name = os.path.join(path, f"{filename_prefix}.pkl") + with open(file_name, 'wb') as file: + pickle.dump(adapter_name_to_meta_data, file) + return adapter_name_to_meta_data + + +
[docs]class PeftQuantUtils: + """ + Utilities for quantizing peft model + """ + def __init__(self, adapater_name_to_meta_data: Dict[str, AdapterMetaData], name_to_module_dict=None): + """ + Init for Peft utilities for quantization + + :param adapater_name_to_meta_data: Dict mapping adapter name to meta data. Output of track_meta_data + :param name_to_module_dict: PT Name to module prepared model name mapping + """ + self.adapter_name_to_meta_data = adapater_name_to_meta_data + self.lora_layers = self._get_lora_layers() + self.pt_name_to_prepared_name, self.prepared_name_to_pt_name = None, None + self.pt_to_lora_name = dict.fromkeys(self.lora_layers, '') + if name_to_module_dict: + self.pt_name_to_prepared_name, self.prepared_name_to_pt_name = self._get_pytorch_name_to_prepared_name(name_to_module_dict) + self.lora_to_pt_name, self.pt_to_lora_name = self._get_lora_name_to_pytorch_name() + + @staticmethod + def _get_pytorch_name_to_prepared_name(name_to_module_dict): + """ + Gets onnx names to pytorch names mapping and vice versa + + :param model: PT model + """ + pt_name_to_onnx_name = {} + onnx_name_to_pt_name = {} + for pytorch_name in name_to_module_dict: + onnx_name = name_to_module_dict[pytorch_name][0] + pt_name_to_onnx_name[pytorch_name] = onnx_name + onnx_name_to_pt_name[onnx_name] = pytorch_name + return pt_name_to_onnx_name, onnx_name_to_pt_name + + def _get_lora_name_to_pytorch_name(self): + """ + Gets most similar pytorch name for every lora name + """ + lora_to_pytorch_name = {} + pytorch_to_lora_name = {} + for pt_name in self.pt_name_to_prepared_name: + for lora_name in self.lora_layers: + if pt_name in lora_name: + lora_to_pytorch_name[lora_name] = pt_name + pytorch_to_lora_name[pt_name] = lora_name + return lora_to_pytorch_name, pytorch_to_lora_name + + def _get_lora_layers(self) -> set: + """ + Gets all lora layers + """ + lora_layers = set() + for adapter_name in self.adapter_name_to_meta_data: + for lora_module in self.adapter_name_to_meta_data[adapter_name].lora_A: + lora_layers.add(lora_module) + for lora_module in self.adapter_name_to_meta_data[adapter_name].lora_B: + lora_layers.add(lora_module) + return lora_layers + + @staticmethod + def _freeze_quantizer(quantizer): + """ + Disables compute encodings and gradient update for a quantizer + + :param quantizer: Param, output or Input quantizer + """ + # pylint:disable = protected-access + quantizer._allow_overwrite = False + quantizer.requires_grad_(False) + +
[docs] def freeze_base_model_param_quantizers(self, sim: QuantizationSimModel): + """ + Freeze parameter quantizers of base model + + :param sim: QuantSim model + """ + for module_name, module in sim.model.named_modules(): + if self.prepared_name_to_pt_name and module_name in self.prepared_name_to_pt_name: + module_name = self.prepared_name_to_pt_name[module_name] + if isinstance(module, BaseQuantizationMixin) and module_name not in self.pt_to_lora_name: + for _, param_quantizer in module.param_quantizers.items(): + if param_quantizer: + self._freeze_quantizer(param_quantizer)
+ +
[docs] def freeze_base_model_activation_quantizers(self, sim: QuantizationSimModel): + """ + Freeze activation quantizers of base model + + :param sim: QuantSim model + """ + for module_name, module in sim.model.named_modules(): + if self.prepared_name_to_pt_name and module_name in self.prepared_name_to_pt_name: + module_name = self.prepared_name_to_pt_name[module_name] + if isinstance(module, BaseQuantizationMixin) and module_name not in self.pt_to_lora_name: + for input_quantizer, output_quantizer in zip(module.input_quantizers, module.output_quantizers): + if input_quantizer: + self._freeze_quantizer(input_quantizer) + if output_quantizer: + self._freeze_quantizer(output_quantizer)
+ +
[docs] def freeze_base_model(self, sim: QuantizationSimModel): + """ + Freeze entire base model + + :param sim: QuantSim model + """ + self.freeze_base_model_activation_quantizers(sim) + self.freeze_base_model_param_quantizers(sim)
+ +
[docs] def set_bitwidth_for_lora_adapters(self, sim: QuantizationSimModel, + output_bw: int, param_bw: int): + """ + Sets output and param bitwidth for all Lora adapters added to the model + + :param sim: QuantSim model + :param output_bw: Output BW + :param param_bw: Parameter BW + """ + for module_name, module in sim.model.named_modules(): + if self.prepared_name_to_pt_name and module_name in self.prepared_name_to_pt_name: + module_name = self.prepared_name_to_pt_name[module_name] + if isinstance(module, BaseQuantizationMixin) and module_name in self.pt_to_lora_name: + self._set_bitwidth_for_module(module, output_bw, param_bw)
+ +
[docs] def get_quantized_lora_layer(self, sim: QuantizationSimModel): + """ + This function can be used to generate lora quantized layers + Use cases: 1) New quantizers can be created and assigned to lora quantized layer. + New quantizers may be required if changing - Changing dtype, per channel to per tensor + and vice versa + 2) Assign new values to symmetric, bitwidth + + :param sim: QuantSim model + """ + for module_name, module in sim.model.named_modules(): + if self.prepared_name_to_pt_name and module_name in self.prepared_name_to_pt_name: + module_name = self.prepared_name_to_pt_name[module_name] + if isinstance(module, BaseQuantizationMixin) and module_name in self.pt_to_lora_name: + yield module_name, module
+ + @staticmethod + def _set_bitwidth_for_module(module: BaseQuantizationMixin, output_bw: int, param_bw: int): + """ + Sets bitwidth for a QcQuantizeWrapper module + + :param module: QcQuantize wrapper module + :param output_bw: Output BW + :param param_bw: Parameter BW + """ + for output_quantizer in module.output_quantizers: + output_quantizer.bitwidth = output_bw + for _, param_quantizer in module.param_quantizers.items(): + param_quantizer.bitwidth = param_bw + +
[docs] def export_adapter_weights(self, sim: QuantizationSimModel, path: str, filename_prefix: str, onnx_model_path: str): + """ + Exports adapter weights to safetensor format + + :param sim: QuantSim model + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param onnx_model_path: Path from where we can load the exported onnx model. This can be the same path to where + QuantSim exported the ONNX model + """ + # pylint: disable=too-many-locals + assert os.path.exists(onnx_model_path), 'The onnx model does not exist in the location specified' + + onnx_model = onnx.load(onnx_model_path) + onnx_node_to_io_tensor_map, _ = OnnxSaver.get_onnx_node_to_io_tensor_names_map(onnx_model) + layers_to_onnx_op_names = get_layers_in_io_tensor_map(onnx_node_to_io_tensor_map) + + tensors = {} + + for module_name, module in sim.model.named_modules(): + if not isinstance(module, ExportableQuantModule): + continue + + if module_name in layers_to_onnx_op_names: + onnx_name = layers_to_onnx_op_names[module_name][0] + if self.prepared_name_to_pt_name and module_name in self.prepared_name_to_pt_name: + pt_name = self.prepared_name_to_pt_name[module_name] + if pt_name in self.pt_to_lora_name: + module_name = self.pt_to_lora_name[pt_name] + if module_name in self.lora_layers: + for param_name, param in module.named_parameters(): + if param_name in ['weight', 'bias']: + tensor_name = onnx_name + '.' + param_name + tensors[tensor_name] = param + filename_prefix = filename_prefix + '.safetensor' + model_params_path = os.path.join(path, filename_prefix) + save_file(tensors, model_params_path)
+ +
[docs] def enable_adapter_and_load_weights(self, sim: QuantizationSimModel, adapter_weights_path, + use_safetensor: bool = True): + """ + Enables adapter effect on base model by loading weights to model + + :param sim: QuantSim model + :param adapter_weights_path: Path to adapter weights (adapter weights should be either bin file or safetensor) + :param use_safetensor: True if adapter weights path point to a safetensor file. False if points to bin file + """ + tensors = {} + if use_safetensor: + with safe_open(adapter_weights_path, framework="pt", device=0) as f: + for key in f.keys(): + tensors[key] = f.get_tensor(key) + else: + tensors = torch.load(adapter_weights_path) + + onnx_names_tensors = {} + for key in tensors.keys(): + tensor_name = key + if self.prepared_name_to_pt_name: + temp_key = key[0:key.find('.weight')] + tensor_name = self.pt_name_to_prepared_name[self.lora_to_pt_name[temp_key]] + '.weight' + onnx_names_tensors[tensor_name] = tensors[key] + + sim.model.load_state_dict(onnx_names_tensors, strict=False)
+ +
[docs] def disable_lora_adapters(self, sim: QuantizationSimModel): + """ + Disables adapter (zero out weights for lora A & B) effect on base model by loading weights to model + + :param sim: QuantSim model + """ + tensors = {} + for module_name, module in sim.model.named_modules(): + org_name = module_name + if self.prepared_name_to_pt_name and module_name in self.prepared_name_to_pt_name: + pt_name = self.prepared_name_to_pt_name[module_name] + if pt_name in self.pt_to_lora_name: + module_name = self.pt_to_lora_name[pt_name] + if module_name in self.lora_layers: + for param_name, param in module.named_parameters(): + if param_name in ['weight', 'bias']: + tensor_name = org_name + '.' + param_name + tensors[tensor_name] = torch.zeros_like(param) + + sim.model.load_state_dict(tensors, strict=False)
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/quant_analyzer.html b/releases/1.32.2/_modules/aimet_torch/quant_analyzer.html new file mode 100644 index 0000000..79737e4 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/quant_analyzer.html @@ -0,0 +1,1886 @@ + + + + + + aimet_torch.quant_analyzer — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.quant_analyzer

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Quant Analyzer """
+
+import os
+import contextlib
+from collections import OrderedDict, defaultdict
+from typing import Union, Tuple, Dict, List, Collection, Type, Generator
+import torch
+from torch.utils.data import DataLoader
+
+from aimet_common.quant_analyzer import save_json, export_per_layer_sensitivity_analysis_plot,\
+    create_and_export_min_max_ranges_plot, export_per_layer_mse_plot, export_stats_histogram_plot
+from aimet_common.utils import AimetLogger, CallbackFunc
+from aimet_common.defs import QuantScheme
+from aimet_torch import utils
+from aimet_torch.tensor_quantizer import TensorQuantizer, StaticGridTensorQuantizer
+from aimet_torch.qc_quantize_op import QcQuantizeWrapper
+from aimet_torch.qc_quantize_recurrent import QcQuantizeRecurrent
+from aimet_torch.quantsim import QuantizationSimModel
+from aimet_torch.batch_norm_fold import fold_all_batch_norms
+
+_logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.QuantAnalyzer)
+
+DEFAULT_BOKEH_FIGURE_HEIGHT = 300
+
+
+
[docs]class QuantAnalyzer: + """ + QuantAnalyzer tool provides + + 1) model sensitivity to weight and activation quantization + 2) per layer sensitivity analysis + 3) per layer encoding (min - max range) + 4) per PDF analysis and + 5) per layer MSE analysis + """ + def __init__(self, + model: torch.nn.Module, + dummy_input: Union[torch.Tensor, Tuple], + forward_pass_callback: CallbackFunc, + eval_callback: CallbackFunc, + modules_to_ignore: List[torch.nn.Module] = None, + ): + """ + :param model: FP32 model to analyze for quantization. + :param dummy_input: Dummy input to model. + :param forward_pass_callback: A callback function for model calibration that simply runs + forward passes on the model to compute encoding (delta/offset). This + callback function should use representative data and should be subset of + entire train/validation dataset (~1000 images/samples). + :param eval_callback: A callback function for model evaluation that determines model + performance. This callback function is expected to return scalar value + representing the model performance evaluated against entire test/evaluation dataset. + :param modules_to_ignore: Excludes certain modules from being analyzed. + """ + if not isinstance(forward_pass_callback, CallbackFunc): + raise ValueError('forward_pass_callback and its argument(s) are not encapsulated by CallbackFunc class.') + if not isinstance(eval_callback, CallbackFunc): + raise ValueError('eval_callback and its argument(s) are not encapsulated by CallbackFunc class.') + + self._model = model + self._dummy_input = dummy_input + self._forward_pass_callback = forward_pass_callback + self._eval_callback = eval_callback + self._unlabeled_dataset_iterable = None + self._num_batches = None + self._modules_to_ignore = modules_to_ignore + +
[docs] def analyze(self, + quant_scheme: QuantScheme = QuantScheme.post_training_tf_enhanced, + default_param_bw: int = 8, + default_output_bw: int = 8, + config_file: str = None, + results_dir: str = "./tmp/", + ): + """ + Analyze model for quantization and point out sensitive parts/hotspots of the model by performing + 1) model sensitivity to quantization, + 2) perform per layer sensitivity analysis by enabling and disabling quant wrappers, + 3) export per layer encodings min - max ranges, + 4) export per layer statistics histogram (PDF) when quant scheme is TF-Enhanced, + 5) per layer MSE analysis + + :param quant_scheme: Quantization scheme. Supported values are + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced. + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs and outputs. + :param config_file: Path to configuration file for model quantizers. + :param results_dir: Directory to save the results. + """ + sim = self._create_quantsim_and_encodings(quant_scheme, + default_param_bw, + default_output_bw, + config_file) + + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + # Check model sensitivity to weight and activation quantization individually. + self.check_model_sensitivity_to_quantization(sim) + + # Perform per layer analysis by enabling each quant wrapper (OPTION-1). + self.perform_per_layer_analysis_by_enabling_quant_wrappers(sim, results_dir) + + # Perform per layer analysis by disabling each quant wrapper (OPTION-2). + self.perform_per_layer_analysis_by_disabling_quant_wrappers(sim, results_dir) + + # Export encoding min-max range. + self.export_per_layer_encoding_min_max_range(sim, results_dir) + + # Export PDF of statistics. + if quant_scheme == QuantScheme.post_training_tf_enhanced: + self.export_per_layer_stats_histogram(sim, results_dir) + + # Export per layer MSE loss between fp32 and quantized output activations. + if self._unlabeled_dataset_iterable: + self.export_per_layer_mse_loss(sim, results_dir)
+ +
[docs] def enable_per_layer_mse_loss(self, unlabeled_dataset_iterable: Union[DataLoader, Collection], num_batches: int): + """ + Enable per layer MSE loss analysis. + + :param unlabeled_dataset_iterable: A collection (i.e. iterable with `__len__`) + that iterates over an unlabeled dataset. The values yielded by this iterable are expected + to be able to be passed directly to the model. + :param num_batches: Number of batches. Approximately 256 samples/images are recommended, + so if batch size of data loader is 64, then 4 number of batches leads to 256 samples/images. + """ + # TODO: Make per layer MSE loss analysis as part of top level API. + if len(unlabeled_dataset_iterable) < num_batches: + raise ValueError(f'Can not fetch {num_batches} batches from ' + f'a data loader of length {len(unlabeled_dataset_iterable)}.') + + self._unlabeled_dataset_iterable = unlabeled_dataset_iterable + self._num_batches = num_batches
+ + def _create_quantsim_and_encodings(self, quant_scheme: QuantScheme, default_param_bw: int, + default_output_bw: int, config_file: str) \ + -> QuantizationSimModel: + """ + Create Quantsim and compute encodings. + + :param quant_scheme: Quantization scheme. + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters. + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs and outputs. + :param config_file: Path to configuration file for model quantizers. + :return: Quantsim model. + """ + if isinstance(self._dummy_input, torch.Tensor): + input_shape = tuple(self._dummy_input.shape) + else: + input_shape = [tuple(x.shape) for x in self._dummy_input] + _ = fold_all_batch_norms(self._model, input_shape, dummy_input=self._dummy_input) + + kwargs = dict( + quant_scheme=quant_scheme, + default_output_bw=default_output_bw, + default_param_bw=default_param_bw, + config_file=config_file, + ) + sim = self._get_quantsim_cls()(self._model, self._dummy_input, **kwargs) + if self._modules_to_ignore: + self._exclude_modules_from_quantization(self._model, sim, self._modules_to_ignore) + + self.patch_quantsim_to_store_histogram(sim) + sim.compute_encodings(self._forward_pass_callback.func, self._forward_pass_callback.args) + return sim + + def _eval_weight_quantized_model(self, sim: QuantizationSimModel)-> float: + """ + Evaluate weight quantized model performance. + For weight quantized model performance, disable enabled activation quantizers, measure + eval score and enable again. + + :param sim: Quantsim model. + :return: Quantized model performance. + """ + with self._disable_activation_quantizers(sim): + eval_score = self._eval_model(sim.model) + return eval_score + + def _eval_activation_quantized_model(self, sim: QuantizationSimModel)-> float: + """ + Evaluate activation quantized model performance. + For activation quantized model performance, disable enabled param quantizers, measure + eval score and enable again. + + :param sim: Quantsim model. + :return: Quantized model performance. + """ + with self._disable_param_quantizers(sim): + eval_score = self._eval_model(sim.model) + return eval_score + + def _eval_model(self, model: torch.nn.Module) -> float: + """ + Evaluate the model performance. + + :param model: PyTorch model to be evaluated. + :return: Scaler value representing model performance. + """ + with utils.in_eval_mode(model), torch.no_grad(): + return self._eval_callback.func(model, self._eval_callback.args) + + def _sort_quant_wrappers_based_on_occurrence(self, sim: QuantizationSimModel) -> Dict: + """ + Sort quant wrappers based on occurrence for given quantsim model. + + :param sim: Quantsim model. + :return: Ordered dictionary which maps wrapped module name to quant wrapper. + """ + def sorting_hook(quant_wrapper: torch.nn.Module, *_): + """ + Hook-function to sort quant wrappers based on occurrence. + + :param quant_wrapper: Quant wrapper. + :param _: Additional args. + """ + quant_wrapper_name = module_to_name_dict[quant_wrapper] + sorted_quant_wrappers_dict[quant_wrapper_name] = quant_wrapper + + module_to_name_dict = {} + for name, module in sim.model.named_modules(): + module_to_name_dict[module] = name + + sorted_quant_wrappers_dict = OrderedDict() + utils.run_hook_for_layers_with_given_input(sim.model, self._dummy_input, sorting_hook, + module_type_for_attaching_hook=self._get_quant_wrapper_type(), + leaf_node_only=False) + return sorted_quant_wrappers_dict + + @classmethod + def _get_enabled_quantizers(cls, sorted_quant_wrappers: Dict)\ + -> Dict[Union[QcQuantizeWrapper, QcQuantizeRecurrent], List[TensorQuantizer]]: + """ + For given sorted quant wrappers dict, get enabled quantizers. + + :param sorted_quant_wrappers: Dictionary containing quant wrappers sorted based on occurrence. + :return: Dictionary which maps a quant wrapper to a list of enabled quantizers in it. + """ + enabled_quant_wrappers = defaultdict(list) + + for quant_wrapper in sorted_quant_wrappers.values(): + for quantizer in quant_wrapper.param_quantizers.values(): + if cls._is_quantizer_enabled(quantizer): + enabled_quant_wrappers[quant_wrapper].append(quantizer) + for quantizer in quant_wrapper.output_quantizers: + if cls._is_quantizer_enabled(quantizer): + enabled_quant_wrappers[quant_wrapper].append(quantizer) + for quantizer in quant_wrapper.input_quantizers: + if cls._is_quantizer_enabled(quantizer): + enabled_quant_wrappers[quant_wrapper].append(quantizer) + + return enabled_quant_wrappers + + @classmethod + def _get_enabled_param_quantizers(cls, sim: QuantizationSimModel) -> List[TensorQuantizer]: + """ + For given quantsim model, get all enabled param quantizers. + :param sim: Quantsim model. + :return: List of enabled param quantizers. + """ + enabled_param_quantizers = [] + for quant_wrapper in cls._get_quantized_modules(sim): + for quantizer in quant_wrapper.param_quantizers.values(): + if cls._is_quantizer_enabled(quantizer): + enabled_param_quantizers.append(quantizer) + + return enabled_param_quantizers + + @classmethod + def _get_enabled_activation_quantizers(cls, sim: QuantizationSimModel) -> List[TensorQuantizer]: + """ + For given quantsim model, get all enabled activation quantizers. + :param sim: Quantsim model. + :return: List of enabled activation quantizers. + """ + enabled_activation_quantizers = [] + for quant_wrapper in cls._get_quantized_modules(sim): + for quantizer in quant_wrapper.input_quantizers: + if cls._is_quantizer_enabled(quantizer): + enabled_activation_quantizers.append(quantizer) + for quantizer in quant_wrapper.output_quantizers: + if cls._is_quantizer_enabled(quantizer): + enabled_activation_quantizers.append(quantizer) + + return enabled_activation_quantizers + + @staticmethod + def _enable_disable_quantizers(quantizers: List[TensorQuantizer], enabled: bool): + """ + For given list of quantizers, set (enable/disable) quantizer's enabled. + + :param quantizers: List of quantizers. + :param enabled: Enabled flag. + """ + for quantizer in quantizers: + quantizer.enabled = enabled + + def _perform_per_layer_analysis(self, + sim: QuantizationSimModel, + disable_all_quantizers: bool, + enabled_before: bool, + enabled_after: bool, + ) -> Dict: + """ + Helper function for perform_per_layer_analysis_by_enabling_quant_wrappers() and + perform_per_layer_analysis_by_disabling_quant_wrappers() + + :param sim: Quantsim model. + :param disable_all_quantizers: Flag to disable all the quantizers before per-layer analysis. + :param enabled_before: Flag to set enabled for quantizers before computing encodings. + :param enabled_after: Flag to set enabled for quantizers after computing encodings. + :return: layer wise eval score dictionary. dict[layer_name] = eval_score. + """ + # Validate input arguments + assert (disable_all_quantizers, enabled_before, enabled_after) in \ + ((True, True, False), (False, False, True)) + + # Sorted quant wrappers based on occurrence. + # maps wrapped module name to a quant wrapper. + sorted_quant_wrappers = self._sort_quant_wrappers_based_on_occurrence(sim) + + # quant wrappers and it's enabled quantizers. + # maps quant wrapper to a list of enabled quantizers in it. + enabled_quant_wrappers = self._get_enabled_quantizers(sorted_quant_wrappers) + + eval_score_dict = {} + for name, quant_wrapper in sorted_quant_wrappers.items(): + if quant_wrapper not in enabled_quant_wrappers: + continue + + with contextlib.ExitStack() as stack: + if disable_all_quantizers and enabled_before: + # Disable all quantizers except quant_wrapper + for enabled_quant_wrapper in enabled_quant_wrappers.keys(): + if enabled_quant_wrapper == quant_wrapper: + continue + stack.enter_context(self._disable_quant_wrapper(enabled_quant_wrapper)) + else: + # Disable only quant_wrapper + stack.enter_context(self._disable_quant_wrapper(quant_wrapper)) + + # Record eval score. + eval_score_dict[name] = self._eval_model(sim.model) + _logger.debug("For layer: %s, the eval score is: %f", name, eval_score_dict[name]) + + return eval_score_dict + + # pylint: disable=no-self-use + def _create_and_export_stats_histogram_plot(self, + quantizer: StaticGridTensorQuantizer, + results_dir: str, + title: str, + ): + """ + For given quantizer, create and export histogram (PDF) of statistics in html format. + + :param quantizer: Quantizer. + :param results_dir: Directory to save the results. + :param title: Title of the plot. + """ + os.makedirs(results_dir, exist_ok=True) + + histograms = quantizer.get_stats_histogram() + encodings = quantizer.encoding + if not isinstance(encodings, List): + encodings = [encodings] + + for index, (histogram, encoding) in enumerate(zip(histograms, encodings)): + export_stats_histogram_plot(histogram, encoding, results_dir, title=f"{title}_{index}") + +
[docs] def check_model_sensitivity_to_quantization(self, + sim: QuantizationSimModel, + ) -> Tuple[float, float, float]: + """ + Perform the sensitivity analysis to weight and activation quantization + individually. + + :param sim: Quantsim model. + :return: FP32 eval score, weight-quantized eval score, act-quantized eval score. + """ + # pylint: disable=protected-access + fp32_eval_score = self._eval_model(self._model) + _logger.info("FP32 eval score (W32A32): %f", fp32_eval_score) + + weight_quantized_eval_score = self._eval_weight_quantized_model(sim) + _logger.info("Weight-quantized eval score (W%dA32): %f", sim._default_param_bw, + weight_quantized_eval_score) + + act_quantized_eval_score = self._eval_activation_quantized_model(sim) + _logger.info("Activation-quantized eval score (W32A%d): %f", sim._default_output_bw, + act_quantized_eval_score) + + return fp32_eval_score, weight_quantized_eval_score, act_quantized_eval_score
+ +
[docs] def perform_per_layer_analysis_by_enabling_quant_wrappers(self, + sim: QuantizationSimModel, + results_dir: str, + ) -> Dict: + """ + NOTE: Option 1 + + 1. All quant wrappers' parameters and activations quantizers are disabled. + 2. Based on occurrence for every quant wrappers + - Each quant wrapper's parameters and activations quantizers are enabled as per JSON config file and set to bit-width specified. + - Measure and record eval score on subset of dataset. + - Disable enabled quantizers in step 1. + 3. Returns dictionary containing quant wrapper name and corresponding eval score. + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer wise eval score dictionary. dict[layer_name] = eval_score + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + _logger.info("\nOPTION-1:\nAll the quant wrappers are disabled.\n" + "Starting per-layer analysis by enabling quant wrappers as per config file.") + layer_wise_eval_score_dict = self._perform_per_layer_analysis(sim, + disable_all_quantizers=True, + enabled_before=True, + enabled_after=False) + export_per_layer_sensitivity_analysis_plot(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_enabled") + save_json(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_enabled.json") + _logger.info("Exported per-layer quant analysis (enabled) plot.") + return layer_wise_eval_score_dict
+ +
[docs] def perform_per_layer_analysis_by_disabling_quant_wrappers(self, + sim: QuantizationSimModel, + results_dir: str, + ) -> Dict: + """ + NOTE: Option 2 + + 1. All quant wrappers' parameters and activations quantizers are enabled as per JSON config file and set to bit-width specified. + 2. Based on occurrence for every quant wrappers + - Each quant wrapper's parameters and activations quantizers are disabled. + - Measure and record eval score on subset of dataset. + - Enable disabled quantizers in step 1. + 3. Returns dictionary containing quant wrapper name and corresponding eval score. + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer wise eval score dictionary. dict[layer_name] = eval_score + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + _logger.info("\nOPTION-2:\nAll the quant wrappers are enabled as per config file.\n" + "Starting per-layer analysis by disabling quant wrappers.") + layer_wise_eval_score_dict = self._perform_per_layer_analysis(sim, + disable_all_quantizers=False, + enabled_before=False, + enabled_after=True) + export_per_layer_sensitivity_analysis_plot(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_disabled") + save_json(layer_wise_eval_score_dict, + results_dir, + title="per_layer_quant_disabled.json") + _logger.info("Exported per-layer quant analysis (disabled) plot.") + return layer_wise_eval_score_dict
+ + # pylint: disable=no-self-use +
[docs] def export_per_layer_encoding_min_max_range(self, + sim: QuantizationSimModel, + results_dir: str, + ) -> Tuple[Dict, Dict]: + """ + Export encoding min and max range for all weights and activations. results_dir should have + html files in following format. + + -results_dir + -activations.html + -weights.html + + If per channel quantization(PCQ) is enabled then, + + -results_dir + -activations.html + -{wrapped_module_name}_{param_name}.html + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return: layer wise min-max range for weights and activations. + """ + # pylint: disable=too-many-locals + min_max_ranges_dir = os.path.join(results_dir, "min_max_ranges") + + module_to_name_dict = {} + for name, module in sim.model.named_modules(): + module_to_name_dict[module] = name + + min_max_range_for_activations_dict = {} + min_max_range_for_weights_dict = {} + for quant_wrapper in self._get_quantized_modules(sim): + wrapped_module_name = module_to_name_dict[quant_wrapper] + for index, quantizer in enumerate(quant_wrapper.input_quantizers): + if self._is_quantizer_enabled(quantizer): + name = f"{wrapped_module_name}_input_{index}" + encoding = self._get_quantizer_encodings(quantizer)[0] + min_max_range_for_activations_dict[name] = (encoding.min, encoding.max) + for index, quantizer in enumerate(quant_wrapper.output_quantizers): + if self._is_quantizer_enabled(quantizer): + name = f"{wrapped_module_name}_output_{index}" + encoding = self._get_quantizer_encodings(quantizer)[0] + min_max_range_for_activations_dict[name] = (encoding.min, encoding.max) + for param_name, quantizer in quant_wrapper.param_quantizers.items(): + if self._is_quantizer_enabled(quantizer): + name = f"{wrapped_module_name}_{param_name}" + encodings = self._get_quantizer_encodings(quantizer) + if len(encodings) > 1: # per-channel + per_channel_encodings = {} + for index, encoding in enumerate(encodings): + per_channel_encodings[f"{name}_{index}"] = (encoding.min, encoding.max) + min_max_range_for_weights_dict[name] = per_channel_encodings + else: # per-tensor + min_max_range_for_weights_dict[name] = (encodings[0].min, encodings[0].max) + + create_and_export_min_max_ranges_plot(min_max_range_for_weights_dict, + min_max_ranges_dir, + title="weights") + create_and_export_min_max_ranges_plot(min_max_range_for_activations_dict, + min_max_ranges_dir, + title="activations") + save_json(min_max_range_for_weights_dict, min_max_ranges_dir, title="weights.json") + save_json(min_max_range_for_activations_dict, min_max_ranges_dir, title="activations.json") + _logger.info("Exported per layer encodings min-max ranges plot(s).") + return min_max_range_for_weights_dict, min_max_range_for_activations_dict
+ +
[docs] def export_per_layer_stats_histogram(self, + sim: QuantizationSimModel, + results_dir: str, + ): + """ + NOTE: Not to invoke when quantization scheme is not TF-Enhanced. + + Export histogram that represents a PDF of collected statistics by a quantizer for every + quant wrapper. After invoking this API, results_dir should have html files in following + format for every quantizers of quant wrappers. + + -results_dir + -activations_pdf + name_{input/output}_{index}.html + -weights_pdf + -name + param_name_{channel_index}.html + + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + """ + weights_pdf_dir = os.path.join(results_dir, "weights_pdf") + activations_pdf_dir = os.path.join(results_dir, "activations_pdf") + + module_to_name_dict = {} + for name, module in sim.model.named_modules(): + module_to_name_dict[module] = name + + for quant_wrapper in self._get_quantized_modules(sim): + wrapped_module_name = module_to_name_dict[quant_wrapper] + for index, quantizer in enumerate(quant_wrapper.input_quantizers): + if quantizer is not None and self._get_quantizer_encodings(quantizer): + self._create_and_export_stats_histogram_plot(quantizer, + activations_pdf_dir, + title=f"{wrapped_module_name}_input_q{index}") + for index, quantizer in enumerate(quant_wrapper.output_quantizers): + if quantizer is not None and self._get_quantizer_encodings(quantizer): + self._create_and_export_stats_histogram_plot(quantizer, + activations_pdf_dir, + title=f"{wrapped_module_name}_output_q{index}") + for param_name, quantizer in quant_wrapper.param_quantizers.items(): + if quantizer is not None and self._get_quantizer_encodings(quantizer): + self._create_and_export_stats_histogram_plot(quantizer, + os.path.join(weights_pdf_dir, wrapped_module_name), + title=f"{wrapped_module_name}_{param_name}") + _logger.info("Exported per layer stats histogram plot(s).")
+ +
[docs] def export_per_layer_mse_loss(self, + sim: QuantizationSimModel, + results_dir: str, + ) -> Dict: + """ + NOTE: Need to pass same model input data through both fp32 and quantsim model to + tap output activations of each layer. + + Export MSE loss between fp32 and quantized output activations for each layer. + :param sim: Quantsim model. + :param results_dir: Directory to save the results. + :return layer wise MSE loss. dict[layer_name] = MSE loss. + """ + results_dir = os.path.abspath(results_dir) + os.makedirs(results_dir, exist_ok=True) + + name_to_quant_wrapper_dict = {} + for name, module in sim.model.named_modules(): + name_to_quant_wrapper_dict[name] = module + + modules = utils.get_ordered_list_of_modules(self._model, self._dummy_input) + mse_loss_dict = {} + for name, module in modules: + quant_wrapper = name_to_quant_wrapper_dict[name] + loss = self._compute_mse_loss(module, quant_wrapper, self._model, sim) + mse_loss_dict[name] = loss + + export_per_layer_mse_plot(mse_loss_dict, + results_dir, + title="per_layer_mse_loss") + save_json(mse_loss_dict, results_dir, title="per_layer_mse_loss.json") + _logger.info("Exported per layer MSE loss plot.") + return mse_loss_dict
+ + def _compute_mse_loss(self, module: torch.nn.Module, quant_wrapper: torch.nn.Module, + fp32_model: torch.nn.Module, sim: QuantizationSimModel) -> float: + """ + Compute MSE loss between fp32 and quantized output activations for each batch, add for + all the batches and return averaged mse loss. + + :param module: module from the fp32_model. + :param quant_wrapper: Corresponding quant wrapper from the QuantSim model. + :param fp32_model: PyTorch model. + :param sim: Quantsim model. + :return: MSE loss between fp32 and quantized output activations. + """ + # output activations collector. + orig_module_collector = utils.ModuleData(fp32_model, module) + quant_module_collector = utils.ModuleData(sim.model, quant_wrapper) + + total = 0 + loss = 0.0 + batch_index = 0 + for model_inputs in self._unlabeled_dataset_iterable: + assert isinstance(model_inputs, (torch.Tensor, tuple, list)) + _, quantized_out_acts = quant_module_collector.collect_inp_out_data(model_inputs, + collect_input=False, + collect_output=True) + _, fp32_out_acts = orig_module_collector.collect_inp_out_data(model_inputs, + collect_input=False, + collect_output=True) + loss += torch.nn.functional.mse_loss(fp32_out_acts, quantized_out_acts).item() + total += fp32_out_acts.size(0) + batch_index += 1 + if batch_index == self._num_batches: + break + + average_loss = loss/total + return average_loss + + @staticmethod + def _exclude_modules_from_quantization(model: torch.nn.Module, sim: QuantizationSimModel, + modules_to_ignore: List[torch.nn.Module]): + """ + For the modules in the modules_to_ignore, remove the corresponding quant wrappers. + + :param model: Original model. + :param sim: Quantsim model. + :param modules_to_ignore: The list of modules for which the quant wrappers are removed. + """ + name_to_quant_wrapper_dict = {} + for name, module in sim.model.named_modules(): + name_to_quant_wrapper_dict[name] = module + + module_to_name_dict = {} + for name, module in model.named_modules(): + module_to_name_dict[module] = name + + quant_wrappers_to_ignore = [] + for module in modules_to_ignore: + name = module_to_name_dict[module] + quant_wrapper = name_to_quant_wrapper_dict[name] + quant_wrappers_to_ignore.append(quant_wrapper) + + sim.exclude_layers_from_quantization(quant_wrappers_to_ignore) + + @staticmethod + def patch_quantsim_to_store_histogram(_): + """ + Placeholder function to prevent patching v1 quantsim + """ + + @staticmethod + def _get_quantsim_cls() -> Type[QuantizationSimModel]: + return QuantizationSimModel + + @staticmethod + def _get_quant_wrapper_type() -> Tuple[Type]: + return (QcQuantizeWrapper, QcQuantizeRecurrent) + + @staticmethod + def _is_quantizer_enabled(quantizer: TensorQuantizer): + return quantizer.enabled + + @staticmethod + def _get_quantizer_encodings(quantizer: TensorQuantizer): + if quantizer.encoding and not isinstance(quantizer.encoding, List): + return [quantizer.encoding] + return quantizer.encoding + + @classmethod + @contextlib.contextmanager + def _disable_param_quantizers(cls, sim: QuantizationSimModel): + enabled_param_quantizers = cls._get_enabled_param_quantizers(sim) + cls._enable_disable_quantizers(enabled_param_quantizers, enabled=False) + yield + cls._enable_disable_quantizers(enabled_param_quantizers, enabled=True) + + @classmethod + @contextlib.contextmanager + def _disable_activation_quantizers(cls, sim: QuantizationSimModel): + enabled_activation_quantizers = cls._get_enabled_activation_quantizers(sim) + cls._enable_disable_quantizers(enabled_activation_quantizers, enabled=False) + yield + cls._enable_disable_quantizers(enabled_activation_quantizers, enabled=True) + + @staticmethod + def _disable_quant_wrapper(module: QcQuantizeWrapper): + return utils.disable_all_quantizers(module) + + @staticmethod + def _get_quantized_modules(sim: QuantizationSimModel) -> Generator[QcQuantizeWrapper, None, None]: + for module in sim.model.modules(): + if isinstance(module, (QcQuantizeWrapper, QcQuantizeRecurrent)): + yield module
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/quantsim.html b/releases/1.32.2/_modules/aimet_torch/quantsim.html new file mode 100644 index 0000000..79f2e5f --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/quantsim.html @@ -0,0 +1,3346 @@ + + + + + + aimet_torch.quantsim — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.quantsim

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019-2024, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Implementation for simulating models running on Quantized hardware """
+# pylint: disable=too-many-lines
+from itertools import chain
+import contextlib
+import os
+import io
+import copy
+import pickle
+from typing import Tuple, List, Union, Dict, Callable, Optional, Any, runtime_checkable, Protocol, Mapping
+from collections import OrderedDict, defaultdict
+import json
+import torch
+import onnx
+from packaging import version  # pylint: disable=wrong-import-order
+
+import aimet_common.libpymo as libpymo
+from aimet_common import quantsim
+
+from aimet_common.connected_graph.connectedgraph_utils import CG_SPLIT
+from aimet_common.utils import AimetLogger, save_json_yaml, log_with_error_and_assert_if_false
+from aimet_common.defs import QuantScheme, QuantizationDataType, SupportedKernelsAction, QuantDtypeBwInfo
+from aimet_common.quantsim import validate_quantsim_inputs, extract_global_quantizer_args
+from aimet_common.quant_utils import get_conv_accum_bounds
+
+from aimet_torch import elementwise_ops
+from aimet_torch.quantsim_config.quantsim_config import QuantSimConfigurator
+from aimet_torch.qc_quantize_op import QcQuantizeStandAloneBase, QcQuantizeWrapper, QcQuantizeOpMode, \
+    StaticGridQuantWrapper, LearnedGridQuantWrapper, NativeTorchQuantWrapper, QUANTIZER_TYPE_INPUT, QUANTIZER_TYPE_OUTPUT
+from aimet_torch.tensor_quantizer import initialize_learned_grid_quantizer_attributes, TensorQuantizer
+from aimet_torch.qc_quantize_op import get_encoding_by_quantizer as _get_encoding_by_quantizer
+from aimet_torch import torchscript_utils, utils, onnx_utils
+from aimet_torch.utils import deprecated
+from aimet_torch.onnx_utils import (
+    OnnxSaver,
+    OnnxExportApiArgs,
+    CustomMarker,
+    save_initializer_restored_onnx_graph,
+)
+from aimet_torch.meta.connectedgraph import ConnectedGraph, Op
+from aimet_torch.qc_quantize_recurrent import QcQuantizeRecurrent
+from aimet_torch.quantsim_config.builder import LazyQuantizeWrapper
+from aimet_torch.experimental.v2.quantsim.export_utils import VALID_ENCODING_VERSIONS, _export_to_1_0_0
+
+
+logger = AimetLogger.get_area_logger(AimetLogger.LogAreas.Quant)
+
+# If a torch module type is in this dictionary, call the corresponding quantized module constructor instead of wrapping
+# it with QcQuantizeWrapper.
+qc_quantize_modules_dict = {
+    torch.nn.RNN: QcQuantizeRecurrent,
+    torch.nn.LSTM: QcQuantizeRecurrent,
+    torch.nn.GRU: QcQuantizeRecurrent
+}
+
+# Length of the string '._module_to_wrap'
+MODULE_TO_WRAP_STRING_REVERSE_INDEX = -16
+
+MAP_PYMO_TO_ROUND_MODE = {libpymo.RoundingMode.ROUND_NEAREST: 'nearest',
+                          libpymo.RoundingMode.ROUND_STOCHASTIC: 'stochastic'}
+
+SUPPORTED_KERNELS_ACTION = SupportedKernelsAction.warn_on_error
+
+
+
+
[docs]class QuantParams: + """ + Data type to hold quantization related params. + """ + + def __init__(self, + weight_bw: int = 8, + act_bw: int = 8, + round_mode: str = 'nearest', + quant_scheme: Union[QuantScheme, str] = QuantScheme.post_training_tf_enhanced, + config_file: str = None): + """ + Constructor + + :param weight_bw: Weight bitwidth (4-31) to use for quantizing layer weights. Default = 8 + :param act_bw: Activation bitwidth(4-31) to use for quantizing layer activations. Default = 8 + :param round_mode: Rounding mode. Supported options are 'nearest' or 'stochastic' + :param quant_scheme: Quantization scheme. Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced + :param config_file: Path to Configuration file for model quantizers + """ + + self.weight_bw = weight_bw + self.act_bw = act_bw + self.round_mode = round_mode + self.quant_scheme = quant_scheme + self.config_file = config_file
+ + +@runtime_checkable +class ExportableQuantModule(Protocol): + """ + Defines the minimum interface requirements for exporting encodings from a module. + """ + + def export_input_encodings(self) -> List[List[Dict]]: + """ + Returns a list of input encodings, each represented as a List of Dicts + """ + + def export_output_encodings(self) -> List[List[Dict]]: + """ + Returns a list of output encodings, each represented as a List of Dicts + """ + + def export_param_encodings(self) -> Dict[str, List[Dict]]: + """ + Returns a dict of {param name: param encodings}, with each encoding represented as a List of Dicts + """ + + def import_input_encodings(self, + encodings: Mapping[str, Mapping], + strict: bool, + partial: bool, + requires_grad: Optional[bool], + allow_overwrite: bool): + """ + Import input encodings represented in below format: + { + '0': dict, + '1': dict, + ... + } + """ + + def import_output_encodings(self, + encodings: Mapping[str, Mapping], + strict: bool, + partial: bool, + requires_grad: Optional[bool], + allow_overwrite: bool): + """ + Import output encodings represented in below format: + { + '0': dict, + '1': dict, + ... + } + """ + + def import_param_encodings(self, + encodings: Mapping[str, Mapping], + strict: bool, + partial: bool, + requires_grad: Optional[bool], + allow_overwrite: bool): + """ + Import parameter encodings represented in below format: + { + 'param_name_0': [dict, dict, ...], + 'param_name_1': [dict, dict, ...], + ... + } + """ + + def get_original_module(self) -> torch.nn.Module: + """ + Returns the floating point version of quantized module + """ + + +# Types of modules which cannot be quantized +unquantizable_modules = ( + QcQuantizeWrapper, + QcQuantizeStandAloneBase, + QcQuantizeRecurrent, + ExportableQuantModule, + torch.nn.Identity, +) + + +
[docs]class QuantizationSimModel: + """ + Implements mechanism to add quantization simulations ops to a model. This allows for off-target simulation of + inference accuracy. Also allows the model to be fine-tuned to counter the effects of quantization. + """ + + # pylint: disable=too-many-arguments, too-many-instance-attributes, too-many-locals, too-many-public-methods + def __init__(self, model: torch.nn.Module, dummy_input: Union[torch.Tensor, Tuple], + quant_scheme: Union[str, QuantScheme] = QuantScheme.post_training_tf_enhanced, + rounding_mode: str = 'nearest', default_output_bw: int = 8, default_param_bw: int = 8, + in_place: bool = False, config_file: str = None, + default_data_type: QuantizationDataType = QuantizationDataType.int): + + """ + Constructor for QuantizationSimModel. + + :param model: Model to add simulation ops to + :param dummy_input: Dummy input to the model. Used to parse model graph. If the model has more than one input, + pass a tuple. User is expected to place the tensors on the appropriate device. + :param quant_scheme: Quantization scheme. The Quantization scheme is used to compute the Quantization encodings. + There are multiple schemes available. Please refer the QuantScheme enum definition. + :param rounding_mode: Rounding mode. Supported options are 'nearest' or 'stochastic' + :param default_output_bw: Default bitwidth (4-31) to use for quantizing all layer inputs and outputs + :param default_param_bw: Default bitwidth (4-31) to use for quantizing all layer parameters + :param in_place: If True, then the given 'model' is modified in-place to add quant-sim nodes. + Only suggested use of this option is when the user wants to avoid creating a copy of the model + :param config_file: Path to Configuration file for model quantizers + :param default_data_type: Default data type to use for quantizing all layer inputs, outputs and parameters. + Possible options are QuantizationDataType.int and QuantizationDataType.float. + Note that the mode default_data_type=QuantizationDataType.float is only supported with + default_output_bw=16 or 32 and default_param_bw=16 or 32. + """ + # Perform sanity checks on inputs + validate_quantsim_inputs(quant_scheme, rounding_mode, default_output_bw, default_param_bw, + default_data_type) + # save some parameters + if in_place: + self.model = model + else: + self.model = copy.deepcopy(model) + + try: + self.connected_graph = ConnectedGraph(self.model, dummy_input) + except (torch.jit.TracingCheckError, AssertionError): + self.connected_graph = None + + if isinstance(quant_scheme, str): + if quant_scheme == 'tf': + quant_scheme = QuantScheme.post_training_tf + elif quant_scheme == 'tf_enhanced': + quant_scheme = QuantScheme.post_training_tf_enhanced + elif quant_scheme == 'percentile': + quant_scheme = QuantScheme.post_training_percentile + self._quant_scheme = quant_scheme + self._rounding_mode = rounding_mode + self._default_output_bw = default_output_bw + self._default_param_bw = default_param_bw + self._config_file = config_file + self._is_conditional = False + self._module_marker_map = {} + self._percentile_value = 100 # default percentile value + self._excluded_layer_names = [] + + # Add quantization layers + inout_tensor_shape = utils.get_inout_tensor_shape_per_module(self.model, dummy_input) + num_inout_tensors = self._get_num_inout_tensors_from_tensor_shape_dict(inout_tensor_shape) + inout_tensors_dtypes_for_cast_ops = utils.get_inout_tensors_dtypes_for_cast_modules(self.model, dummy_input) + + self._add_quantization_wrappers(self.model, num_inout_tensors, default_data_type) + self._set_tensor_quantizers_for_consts(inout_tensor_shape) + + # Disable bias quantization + self.exclude_param_from_quantization("bias") + + quantsim_configurator = self.configure_quantization_ops(config_file, default_output_bw, default_param_bw, + default_data_type) + + self.quant_args = extract_global_quantizer_args(quant_scheme, quantsim_configurator) + + self._enable_output_quantizers_for_specific_cast_ops(inout_tensors_dtypes_for_cast_ops) + + # pylint: disable=protected-access + self._hw_version = quantsim_configurator._get_hw_version() + self._supported_kernels = quantsim_configurator.get_supported_kernels() + self._validate_supported_kernels_for_quantizers(SUPPORTED_KERNELS_ACTION) + + self._apply_exception_rules() + + # Initialize real wrappers using collected information + self._realize_quant_wrappers_in_model(self.model) + + def _realize_quant_wrappers_in_model(self, model: torch.nn.Module): + """ + Prepare QuantSim for compute encodings. Resets encodings for each quantizable layer and sets mode to Analysis. + Realize quant wrappers using collected information in LazyQuantWrapper. + + :param model: model containing modules wrapped with LazyQuantWrapper + """ + for module_name, module_ref in model.named_children(): + if isinstance(module_ref, LazyQuantizeWrapper): + quantized_module = self._realize_quant_wrapper(module_ref) + setattr(model, module_name, quantized_module) + + elif not utils.is_leaf_module(module_ref): + self._realize_quant_wrappers_in_model(module_ref) + + @staticmethod + def _realize_quant_wrapper(module: torch.nn.Module) -> QcQuantizeWrapper: + return module.realize_v1_wrapper() + + def get_supported_kernels(self) -> Dict: + """ + Return _supported_kernels parsed from the config file + :return: Dictionary containing supported_kernels + """ + return self._supported_kernels + + def __str__(self): + """ + Pretty-printed output indicating where in the model, quantizers have been activated + :return: + """ + + def print_quantizer_state(stream, quantizer, prefix_string): + if quantizer.enabled: + stream.write(f' {prefix_string}: bw={quantizer.bitwidth}, ' + f'encoding-present={bool(quantizer.encoding)}\n') + + if quantizer.encoding: + stream.write(f' {quantizer}') + else: + stream.write(f' {prefix_string}: Not quantized\n') + + stream.write(' -------\n') + + stream = io.StringIO(newline='\n') + stream.write("-------------------------\n") + stream.write("Quantized Model Report\n") + stream.write("-------------------------\n") + + for layer_name, layer in self._get_qc_quantized_layers(self.model): + stream.write('----------------------------------------------------------\n') + stream.write('Layer: {}\n'.format(layer_name)) + + # Inputs + if isinstance(layer.input_quantizers, dict): + for name, quantizer in layer.input_quantizers.items(): + print_quantizer_state(stream, quantizer, prefix_string=f"Input[{name}]") + else: + for index, quantizer in enumerate(layer.input_quantizers): + print_quantizer_state(stream, quantizer, prefix_string=f"Input[{index}]") + + # Params + for param_name, quantizer in layer.param_quantizers.items(): + print_quantizer_state(stream, quantizer, prefix_string=f"Param[{param_name}]") + + # Outputs + if isinstance(layer.output_quantizers, dict): + for name, quantizer in layer.output_quantizers.items(): + print_quantizer_state(stream, quantizer, prefix_string=f"Output[{name}]") + else: + for index, quantizer in enumerate(layer.output_quantizers): + print_quantizer_state(stream, quantizer, prefix_string=f"Output[{index}]") + + return stream.getvalue() + + @staticmethod + def prepare_sim_for_compute_encodings(sim: 'QuantizationSimModel'): + """ + Prepare QuantSim for compute encodings. Resets encodings for each quantizable layer and sets mode to Analysis. + + :param sim: QuantSim to prepare + """ + # pylint: disable=protected-access + quantized_layers = sim._get_qc_quantized_layers(sim.model) + + for _, layer in quantized_layers: + # Clear stats and encodings if they are present + layer.reset_encodings() + + # And set the mode to analysis + layer.set_mode(QcQuantizeOpMode.ANALYSIS) + + for _, layer in quantized_layers: + # call only when quant scheme is percentile + if sim._quant_scheme == QuantScheme.post_training_percentile: + layer.set_percentile_value(sim._percentile_value) + + @staticmethod + def compute_layer_encodings_for_sim(sim: 'QuantizationSimModel'): + """ + Compute encodings for each quantizable layer in sim after forward pass has been called. + + :param sim: QuantSim to compute encodings for + """ + # pylint: disable=protected-access + quantized_layers = sim._get_qc_quantized_layers(sim.model) + # Get the computed per-layer encodings and log them + for name, layer in quantized_layers: + layer.compute_encoding() + + # Before we return we set the mode to active - meaning ready for quantize/de-quantize + # for layers with valid_encoding, otherwise we set to pass through + if isinstance(layer, QcQuantizeRecurrent): + sim.set_mode_for_recurrent_module(layer, name) + else: + # By default we want to set the Quantization wrappers to ACTIVE mode + layer.set_mode(QcQuantizeOpMode.ACTIVE) + + sim.replace_wrappers_for_quantize_dequantize() + +
[docs] def compute_encodings(self, forward_pass_callback, forward_pass_callback_args): + """ + Computes encodings for all quantization sim nodes in the model. It is also used to find initial encodings for + Range Learning + + :param forward_pass_callback: A callback function that simply runs forward passes on the model. This callback + function should use representative data for the forward pass, so the calculated encodings work for all + data samples. This callback internally chooses the number of data samples it wants to use for calculating + encodings. + :param forward_pass_callback_args: These argument(s) are passed to the forward_pass_callback as-is. Up to + the user to determine the type of this parameter. E.g. could be simply an integer representing the number + of data samples to use. Or could be a tuple of parameters or an object representing something more complex. + If set to None, forward_pass_callback will be invoked with no parameters. + :return: None + + """ + + QuantizationSimModel.prepare_sim_for_compute_encodings(self) + + # Run forward iterations so we can collect statistics to compute the appropriate encodings + with utils.in_eval_mode(self.model), torch.no_grad(): + _ = forward_pass_callback(self.model, forward_pass_callback_args) + + QuantizationSimModel.compute_layer_encodings_for_sim(self)
+ + @classmethod + def set_mode_for_recurrent_module(cls, layer: QcQuantizeRecurrent, name: str): + """ + Sets Recurrent module to active or pass through mode based on quantizer state + + :param layer: Qc Quantizer layer for recurrent module + :param name: layer name + :return: True if the encoding is invalid + + """ + for quantizer_name, output_quantizer in layer.output_quantizers.items(): + if output_quantizer.enabled: + if output_quantizer.encoding: + encoding = output_quantizer.encoding + logger.debug("Encoding for %s-%s: min=%f, max=%f, offset=%f. delta=%f, bw=%f", + name, quantizer_name, encoding.min, encoding.max, + encoding.delta, encoding.offset, encoding.bw) + + for quantizer_name, input_quantizer in layer.input_quantizers.items(): + if input_quantizer.enabled: + if input_quantizer.encoding: + encoding = input_quantizer.encoding + logger.debug("Encoding for %s-%s: min=%f, max=%f, offset=%f. delta=%f, bw=%f", + name, quantizer_name, encoding.min, encoding.max, + encoding.delta, encoding.offset, encoding.bw) + + layer.set_mode(QcQuantizeOpMode.ACTIVE) + + def set_percentile_value(self, percentile_value: float): + """ + Set the percentile value to be used while computing encodings + """ + if percentile_value < 90 or percentile_value > 100: + raise ValueError("Percentile value must be in range [90, 100]") + self._percentile_value = percentile_value + +
[docs] def export(self, path: str, filename_prefix: str, dummy_input: Union[torch.Tensor, Tuple], + onnx_export_args: Optional[Union[OnnxExportApiArgs, Dict]] = None, propagate_encodings: bool = False, + export_to_torchscript: bool = False, use_embedded_encodings: bool = False, export_model: bool = True, + filename_prefix_encodings: str = None): + """ + This method exports out the quant-sim model so it is ready to be run on-target. + + Specifically, the following are saved: + + 1. The sim-model is exported to a regular PyTorch model without any simulation ops + 2. The quantization encodings are exported to a separate JSON-formatted file that can + then be imported by the on-target runtime (if desired) + 3. Optionally, An equivalent model in ONNX format is exported. In addition, nodes in the ONNX model are named + the same as the corresponding PyTorch module names. This helps with matching ONNX node to their quant + encoding from #2. + + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param dummy_input: Dummy input to the model. Used to parse model graph. It is required for the dummy_input to + be placed on CPU. + :param onnx_export_args: Optional export argument with onnx specific overrides provided as a dictionary or + OnnxExportApiArgs object. If not provided, defaults to "opset_version" = None, "input_names" = None, + "output_names" = None, and for torch version < 1.10.0, "enable_onnx_checker" = False. + :param propagate_encodings: If True, encoding entries for intermediate ops (when one PyTorch ops results in + multiple ONNX nodes) are filled with the same BW and data_type as the output tensor for that series of + ops. Defaults to False. + :param export_to_torchscript: If True, export to torchscript. Export to onnx otherwise. Defaults to False. + :param use_embedded_encodings: If True, another onnx model embedded with fakequant nodes will be exported + :param export_model: If True, then ONNX model is exported. When False, only encodings are exported. User should + disable (False) this flag only if the corresponding ONNX model already exists in the path + specified + :param filename_prefix_encodings: File name prefix to be used when saving encodings. + If None, then user defaults to filename_prefix value + """ + + warning_str = 'Exporting encodings to yaml will be deprecated in a future release. Ensure that your ' \ + 'code can work with the exported files ending in ".encodings" which are saved using json ' \ + 'format. For the time being, if yaml export is needed, set aimet_common.utils.SAVE_TO_YAML to ' \ + 'True.' + logger.warning(warning_str) + + if not filename_prefix_encodings: + filename_prefix_encodings = filename_prefix + + if quantsim.encoding_version not in VALID_ENCODING_VERSIONS: + raise NotImplementedError(f'Encoding version {quantsim.encoding_version} not in set of valid encoding ' + f'versions {VALID_ENCODING_VERSIONS}.') + # save the quantized model and encodings + model_filename = filename_prefix + '.pth' + model_path = os.path.join(path, model_filename) + + # Create a version of the model without any quantization ops + model_to_export = QuantizationSimModel.get_original_model(self.model) + + torch.save(model_to_export, model_path) + + if onnx_export_args is None: + onnx_export_args = {'opset_version': None, + 'input_names': None, + 'output_names': None} + if version.parse(torch.__version__) < version.parse("1.10.0") and isinstance(onnx_export_args, dict): + onnx_export_args['enable_onnx_checker'] = False + log_with_error_and_assert_if_false(isinstance(onnx_export_args, (OnnxExportApiArgs, dict)), + logger, + f'unsupported opt_args type={type(onnx_export_args)}') + + if use_embedded_encodings: + QuantizationSimModel.save_model_with_embedded_quantization_nodes(self.model, path, filename_prefix, dummy_input, + onnx_export_args, export_to_torchscript, self._is_conditional) + else: + if export_to_torchscript: + self.export_torch_script_model_and_encodings(path, filename_prefix, filename_prefix_encodings, + model_to_export, self.model, + dummy_input, + self._excluded_layer_names) + else: + self.export_onnx_model_and_encodings(path, filename_prefix, model_to_export, self.model, + dummy_input, onnx_export_args, propagate_encodings, + self._module_marker_map, self._is_conditional, + self._excluded_layer_names, quantizer_args=self.quant_args, + export_model=export_model, + filename_prefix_encodings=filename_prefix_encodings)
+ + @staticmethod + def export_torch_script_model_and_encodings(path: str, filename_prefix: str, + filename_prefix_encodings: str, + original_model: torch.nn.Module, + sim_model: torch.nn.Module, + dummy_input: Union[torch.Tensor, Tuple], + excluded_layer_names: List = None): + """ + This method exports a torchscript mode and the corresponding encodings + + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param filename_prefix_encodings: File name prefix for encodings. Can be same as filename_prefix + :param original_model: model without the quantsim wrappers + :param sim_model: model with the quantsim wrappers + :param dummy_input: Dummy input to the model. Used to parse model graph. + :param excluded_layer_names: List of names of layers that have been excluded from quantization. + :return: None + """ + # Create torchscript model and obtain node to i/o tensor name map + ts_path = os.path.join(path, filename_prefix + '.torchscript.pth') + with utils.in_eval_mode(original_model), torch.no_grad(): + torchscript_utils.create_torch_script_model(ts_path, original_model, dummy_input) + + trace = torch.jit.load(ts_path) + torch_script_node_io_tensor_map, valid_param_set = \ + torchscript_utils.get_node_to_io_tensor_names_map(original_model, trace, dummy_input) + + # Export encodings + QuantizationSimModel._export_encodings_to_files(sim_model, path, filename_prefix_encodings, + torch_script_node_io_tensor_map, valid_param_set, + excluded_layer_names, propagate_encodings=False) + + @staticmethod + def export_onnx_model_and_encodings(path: str, filename_prefix: str, original_model: torch.nn.Module, + sim_model: torch.nn.Module, dummy_input: Union[torch.Tensor, Tuple], + onnx_export_args: Union[OnnxExportApiArgs, dict], propagate_encodings: bool, + module_marker_map: Dict[torch.nn.Module, torch.Tensor] = None, + is_conditional: bool = False, excluded_layer_names: List = None, + quantizer_args: Dict = None, export_model: bool = True, + filename_prefix_encodings: str = None): + """ + This method exports a onnx model and the corresponding encodings + + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param original_model: model without the quantsim wrappers + :param sim_model: model with the quantsim wrappers + :param dummy_input: Dummy input to the model. Used to parse model graph. + :param onnx_export_args: Additional onnx export args including export api overrides + :param propagate_encodings: If True, encoding entries for intermediate ops (when one PyTorch ops results in + multiple ONNX nodes) are filled with the same BW and data_type as the output tensor for that series of + ops. + :param module_marker_map: Maps module names to traced custom markers (only used for conditional models) + :param is_conditional: True if model is conditional, False otherwise + :param excluded_layer_names: List of names of layers that have been excluded from quantization. + :param export_model: If True, then ONNX model is exported. When False, only encodings are exported. User should + disable (False) this flag only if the corresponding ONNX model already exists in the path + specified + :param filename_prefix_encodings: File name prefix to be used when saving encodings. + If None, then user defaults to filename_prefix value + :return: None + + """ + # pylint: disable=too-many-locals + if not filename_prefix_encodings: + filename_prefix_encodings = filename_prefix + onnx_path = os.path.join(path, filename_prefix + '.onnx') + if export_model: + if version.parse(torch.__version__) >= version.parse("1.13.0") and onnx_utils.EXPORT_TO_ONNX_DIRECT: + logger.debug('Exporting quantsim using torch.onnx.export directly') + original_model.cpu() + if isinstance(onnx_export_args, OnnxExportApiArgs): + kwargs = onnx_export_args.kwargs + else: + kwargs = onnx_export_args + torch.onnx.export(original_model, dummy_input, onnx_path, **kwargs) + save_initializer_restored_onnx_graph(onnx_path, onnx_path) + else: + # Create onnx model and obtain node to i/o tensor name map + OnnxSaver.create_onnx_model_with_pytorch_layer_names(onnx_path, original_model, dummy_input, is_conditional, + module_marker_map, onnx_export_args) + + assert os.path.exists(onnx_path), 'The onnx model does not exist in the location specified. Please re-run export' \ + 'with export_model flag as True or check path/file_name' + onnx_model = onnx.load(onnx_path) + onnx_node_to_io_tensor_map, valid_param_set = OnnxSaver.get_onnx_node_to_io_tensor_names_map(onnx_model) + + # Export encodings + QuantizationSimModel._export_encodings_to_files(sim_model, path, filename_prefix_encodings, + onnx_node_to_io_tensor_map, valid_param_set, + excluded_layer_names, propagate_encodings, + quantizer_args=quantizer_args) + + def save_encodings_to_json(self, path: str, filename_prefix: str): + """ + Save encodings in the model to json. + + :param path: Path to save file + :param filename_prefix: Filename to use for saved file + """ + activation_encodings, param_encodings = self.get_activation_param_encodings() + encodings_dict = {'activation_encodings': activation_encodings, 'param_encodings': param_encodings} + with open(os.path.join(path, filename_prefix + '.json'), 'w') as encoding_json: + json.dump(encodings_dict, encoding_json, sort_keys=True, indent=4) + + def get_activation_param_encodings(self): + """ + Get activation and param encodings from sim.model. + + :return: Tuple of activation and param encodings dictionaries mapping torch module names to encodings + """ + activation_encodings = OrderedDict() + param_encodings = OrderedDict() + + for module_name, module in self.model.named_modules(): + if not isinstance(module, ExportableQuantModule): + continue + + activation_encodings[module_name] = defaultdict(OrderedDict) + + for i, encoding in enumerate(module.export_input_encodings()): + if not encoding: + continue + if len(encoding) == 1: + encoding = encoding[0] + activation_encodings[module_name]['input'][i] = encoding + + for i, encoding in enumerate(module.export_output_encodings()): + if not encoding: + continue + if len(encoding) == 1: + encoding = encoding[0] + activation_encodings[module_name]['output'][i] = encoding + + if not activation_encodings[module_name]: + del activation_encodings[module_name] + + for param_name, encoding in module.export_param_encodings().items(): + if not encoding: + continue + param_encodings[f'{module_name}.{param_name}'] = encoding + + return activation_encodings, param_encodings + + def exclude_layers_from_quantization(self, layers_to_exclude: List[torch.nn.Module]): + """ + Excludes certain layers from being quantized-dequantized by the simulator + :param layers_to_exclude: List of torch layers to exclude + :return: None + """ + # Save the excluded layer names. Do not save the modules since the wrapper removal depends on + # reference count to automatically remove the layers. + module_to_name_dict = utils.get_module_to_name_dict(self.model) + quant_layers_to_exclude = [] + quant_cls = (QcQuantizeRecurrent, + LazyQuantizeWrapper, + ExportableQuantModule) + for layer in layers_to_exclude: + for module in layer.modules(): + if isinstance(module, quant_cls): + quant_layers_to_exclude.append(module) + excluded_module_name = module_to_name_dict.get(module) + self._excluded_layer_names.append(excluded_module_name) + + self._remove_quantization_wrappers(self.model, quant_layers_to_exclude) + + def exclude_param_from_quantization(self, param_name_to_exclude: str): + """ + Excludes all parameters matching 'param_name' from quantization + :param param_name_to_exclude: Name of the parameter to exclude + :return: None + """ + for module in self.model.modules(): + if isinstance(module, (QcQuantizeWrapper, QcQuantizeRecurrent, LazyQuantizeWrapper)): + if param_name_to_exclude in module.param_quantizers: + module.param_quantizers[param_name_to_exclude].enabled = False + + def _replace_quantization_wrapper(self, model, device): + """ + Recursively remove quantization wrappers from all appropriate modules starting with a given module + :param model: model for which PostTrainingWrapper gets replaced with Trainable wrapped module + :param device: device on which model is present + :return: None + """ + for module_name, module_ref in model.named_children(): + + if isinstance(module_ref, StaticGridQuantWrapper): + # Create a Trainable wrapper and copy properties of PostTrainingWrapper to the Trainable wrapper + quantized_module = self._construct_and_initialize_trainable_wrapper(module_ref, device) + setattr(model, module_name, quantized_module) + + elif isinstance(module_ref, QcQuantizeRecurrent): + # Set Recurrent layer for training mode + module_ref.construct_and_initialize_trainable_quantizers(self._quant_scheme) + + # Recursively call children modules if present + if not utils.is_leaf_module(module_ref): + self._replace_quantization_wrapper(module_ref, device) + + def _construct_and_initialize_trainable_wrapper(self, post_training_module: StaticGridQuantWrapper, + device: torch.device) -> LearnedGridQuantWrapper: + """ + Copies following tensor quantizer attributes from StaticGridQuantWrapper to LearnedGridQuantWrapper + to avoid any mismatch. + - enabled + - bitwidth + - encoding + - use_symmetric_encodings + - use_strict_symmetric + - use_unsigned_symmetric + + :param post_training_module: StaticGridQuantWrapper wrapped module + :param device: device on which model is present + :return: trainable_module: QcTrainable wrapper module + """ + + # pylint: disable=protected-access + module = post_training_module._module_to_wrap + + num_inputs = len(post_training_module.input_quantizers) + num_outputs = len(post_training_module.output_quantizers) + + # Creating a LearnedGridQuantWrapper module + trainable_module = LearnedGridQuantWrapper(module, self._default_param_bw, + self._default_output_bw, self._rounding_mode, self._quant_scheme, + device=device, num_inputs=num_inputs, num_outputs=num_outputs, + data_type=QuantizationDataType.int) + # Copy user settable attributes for outputs + for index, quantizer in enumerate(post_training_module.output_quantizers): + initialize_learned_grid_quantizer_attributes(trainable_module.output_quantizers[index], quantizer) + if trainable_module.output_quantizers[index].encoding_min_max_fixed_vals is not None: + trainable_module.output_quantizers[index].freeze_encoding() + # Copy user settable attributes for inputs + for index, quantizer in enumerate(post_training_module.input_quantizers): + initialize_learned_grid_quantizer_attributes(trainable_module.input_quantizers[index], quantizer) + if trainable_module.input_quantizers[index].encoding_min_max_fixed_vals is not None: + trainable_module.input_quantizers[index].freeze_encoding() + # Copy user settable attributes for params + for name, quantizer in post_training_module.param_quantizers.items(): + learned_grid_quantizer = trainable_module.param_quantizers[name] + initialize_learned_grid_quantizer_attributes(learned_grid_quantizer, quantizer) + if learned_grid_quantizer.encoding_min_max_fixed_vals is not None: + learned_grid_quantizer.freeze_encoding() + + return trainable_module + + def replace_wrappers_for_quantize_dequantize(self): + """ + Replaces StaticGridWrapper with LearnedGridWrapper + """ + if self._quant_scheme == QuantScheme.training_range_learning_with_tf_init or self._quant_scheme == \ + QuantScheme.training_range_learning_with_tf_enhanced_init: + try: + device = utils.get_device(self.model) + except StopIteration: + # Model doesn't have any parameter. + # Set device to cpu by default. + device = torch.device('cpu') + + self._replace_quantization_wrapper(self.model, device) + + @staticmethod + def _validate_quantsim_inputs(quant_scheme: Union[str, QuantScheme], rounding_mode: str, default_output_bw: int, + default_param_bw: int, data_type: QuantizationDataType = QuantizationDataType.int): + """ + Perform sanity checks on inputs to QuantSim + + NOTE: This method will be deprecated. + Call aimet_common.quantsim.validate_quantsim_inputs directly instead. + + :param quant_scheme: Quantization scheme. Supported options are 'tf_enhanced' or 'tf' or using Quant Scheme Enum + QuantScheme.post_training_tf or QuantScheme.post_training_tf_enhanced + :param rounding_mode: Rounding mode. Supported options are 'nearest' or 'stochastic' + :param default_output_bw: Default bitwidth (4-31) to use for quantizing layer inputs and outputs + :param default_param_bw: Default bitwidth (4-31) to use for quantizing layer parameters + :param data_type: Data type of the quantized values (int or float). + """ + validate_quantsim_inputs(quant_scheme, + rounding_mode, + default_output_bw, + default_param_bw, + data_type) + + @staticmethod + def _find_next_downstream_modules(op): + downstream_modules = [] + for succeeding_op in list(op.output.consumers): + if succeeding_op.get_module(): + downstream_modules.append(succeeding_op.get_module()) + + elif succeeding_op.type == CG_SPLIT: + downstream_modules += QuantizationSimModel._find_next_downstream_modules(succeeding_op) + + return downstream_modules + + @staticmethod + def _export_encodings_to_files(sim_model: torch.nn.Module, path: str, filename_prefix: str, + op_to_io_tensor_map: Dict, valid_param_set: set, excluded_layer_names, + propagate_encodings: bool, quantizer_args: Dict = None): + """ + Save the quantized model weight encodings + + :param sim_model: Quantsim model to export encodings for + :param path: path where to store model pth and encodings + :param filename_prefix: filename to store exported weight encodings in json format + :param op_to_io_tensor_map: Dictionary of layer to I/O tensor mapping from onnx or torch script model + :param valid_param_set: a set of valid param input names in model + :param excluded_layer_names: List of names of layers that have been excluded from quantization. + :param propagate_encodings: If True, encoding entries for intermediate ops (when one PyTorch ops results in + multiple ONNX nodes) are filled with the same BW and data_type as the output tensor for that series of + ops. + :param quantizer_args + """ + + # pylint: disable=too-many-locals + + # Create a dictionary to export to JSON + activation_encodings_onnx = {} + activation_encodings_torch = {} + param_encodings = {} + layers_to_onnx_op_names = onnx_utils.get_layers_in_io_tensor_map(op_to_io_tensor_map) + tensor_to_consumer_map = onnx_utils.get_tensor_to_consumer_map(op_to_io_tensor_map) + layer_names_not_found = [] + tensor_to_quantizer_map = {} + + for layer_name, layer in sim_model.named_modules(): + if not isinstance(layer, (ExportableQuantModule, QcQuantizeRecurrent)): + continue + if not has_valid_encodings(layer): + continue + # TODO: specifically call out dropout layers here since they are specifically switched out during export. + # These ops should eventually be reworked as part of math invariant ops to ignore quantization altogether. + # pylint: disable=protected-access + if isinstance(layer, ExportableQuantModule) and isinstance(layer.get_original_module(), utils.DROPOUT_TYPES): + continue + + if layer_name not in layers_to_onnx_op_names.keys(): + layer_names_not_found.append(layer_name) + else: + QuantizationSimModel._update_encoding_dicts_for_layer(layer, layer_name, activation_encodings_onnx, + activation_encodings_torch, + param_encodings, op_to_io_tensor_map, + valid_param_set, propagate_encodings, + tensor_to_consumer_map, layers_to_onnx_op_names, + tensor_to_quantizer_map) + + if layer_names_not_found: + logger.warning("The following layers were not found in the exported onnx model. Encodings for these layers" + " will not appear in the exported encodings file:\n" + "%s\n" + "This can be due to several reasons:\n" + "\t- The layer is set to quantize with float datatype, but was not exercised in compute " + "encodings. Not an issue if the layer is not meant to be run.\n" + "\t- The layer has valid encodings but was not seen while exporting to onnx using the dummy " + "input provided in sim.export(). Ensure that the dummy input covers all layers.", + layer_names_not_found) + + if quantsim.encoding_version == '0.6.1': + encodings_dict_onnx = {'version': quantsim.encoding_version, + 'activation_encodings': activation_encodings_onnx, + 'param_encodings': param_encodings, + 'excluded_layers': excluded_layer_names} + + if quantizer_args: + encodings_dict_onnx.update({'quantizer_args': quantizer_args}) + + logger.info("Layers excluded from quantization: %s", excluded_layer_names) + + # export weight encodings to output json file + encoding_file_path = os.path.join(path, filename_prefix + '.encodings') + save_json_yaml(encoding_file_path, encodings_dict_onnx) + else: + _export_to_1_0_0(path, filename_prefix, activation_encodings_onnx, param_encodings, tensor_to_quantizer_map, + excluded_layer_names, quantizer_args) + + # Export torch.encodings used for saving/loading common to 0.6.1 and 1.0.0 versions + encodings_dict_pytorch = {'version': quantsim.encoding_version, + 'activation_encodings': activation_encodings_torch, + 'param_encodings': param_encodings, + 'excluded_layers': excluded_layer_names} + + if quantizer_args: + encodings_dict_pytorch.update({'quantizer_args': quantizer_args}) + + encoding_file_path_pytorch = os.path.join(path, filename_prefix + '_torch' + '.encodings') + save_json_yaml(encoding_file_path_pytorch, encodings_dict_pytorch) + + @staticmethod + def _update_param_encodings_dict_for_layer(layer: ExportableQuantModule, layer_name: str, param_encodings: Dict, + valid_param_set: set, tensor_to_quantizer_map: Dict): + """ + :param layer: layer as torch.nn.Module + :param layer_name : Name of the layer + :param param_encodings: dictionary of param encodings + :param valid_param_set: a set of valid param input names in model + """ + + for orig_param_name, param_encoding in layer.export_param_encodings().items(): + param_name = layer_name + '.' + orig_param_name + if param_encoding is None: + continue + if param_name not in valid_param_set: + logger.error('Param tensor {%s} not found in valid param set', param_name) + continue + param_encodings[param_name] = param_encoding + tensor_to_quantizer_map[param_name] = layer.param_quantizers[orig_param_name] + + @staticmethod + def _update_encoding_dicts_for_layer(layer: ExportableQuantModule, layer_name: str, activation_encodings_onnx: Dict, + activation_encodings_torch: Dict, param_encodings: Dict, + op_to_io_tensor_map: Dict, valid_param_set: set, propagate_encodings: bool, + tensor_to_consumer_map: Dict[str, str], + layers_to_onnx_op_names: Dict[str, str], + tensor_to_quantizer_map: Dict): + """ + Add given layer param and activation encodings to respective dictionaries to be used for exporting encodings + :param layer: layer as torch.nn.Module + :param layer_name: Name of the layer + :param activation_encodings_onnx: dictionary of activation encodings which maps onnx attribute to encodings + :param activation_encodings_torch: dictionary of activation encodings which maps pytorch names to encodings + :param param_encodings: dictionary of param encodings + :param op_to_io_tensor_map: ONNX or Torch Script map of layer name to it's input/output tensors + :param valid_param_set: a set of valid param input names in model + :param propagate_encodings: If True, encoding entries for intermediate ops (when one PyTorch ops results in + multiple ONNX nodes) are filled with the same BW and data_type as the output tensor for that series of + ops. + :param tensor_to_consumer_map: Dictionary mapping tensor names to op names which consume the tensor + :param layers_to_onnx_op_names: Dictionary mapping PyTorch layer names to names of corresponding ONNX ops + """ + + if isinstance(layer, ExportableQuantModule): + + # -------------------------------------- + # Update encodings for Input activations + # -------------------------------------- + QuantizationSimModel._update_encoding_dict_for_input_activations(layer, layer_name, op_to_io_tensor_map, + activation_encodings_onnx, + activation_encodings_torch, + layers_to_onnx_op_names, + tensor_to_quantizer_map) + # --------------------------------------- + # Update encodings for output activations + # --------------------------------------- + QuantizationSimModel._update_encoding_dict_for_output_activations(layer, layer_name, + op_to_io_tensor_map, + activation_encodings_onnx, + activation_encodings_torch, + propagate_encodings, + tensor_to_consumer_map, + layers_to_onnx_op_names, + tensor_to_quantizer_map) + # --------------------------- + # Update encodings for Params + # --------------------------- + QuantizationSimModel._update_param_encodings_dict_for_layer(layer, layer_name, param_encodings, + valid_param_set, tensor_to_quantizer_map) + + if isinstance(layer, QcQuantizeRecurrent): + # Update encodings for Recurrent layers + QuantizationSimModel._update_encoding_dict_for_recurrent_layers(layer, layer_name, op_to_io_tensor_map, + activation_encodings_onnx, + param_encodings, propagate_encodings, + tensor_to_quantizer_map) + + @staticmethod + def find_op_names_for_layer(layer_name: str, op_to_io_tensor_map: Dict, + tensor_to_consumer_map: Optional[Dict[str, str]], + layers_to_onnx_op_names: Optional[Dict[str, str]]) -> Tuple[List[str], List[str]]: + """ + This function returns the last ONNX op and the list of ONNX Ops that were mapped from a PyTorch Op. + + :param layer_name: Name of the PyTorch layer + :param op_to_io_tensor_map: ONNX or Torch Script map of layer name to it's input/output tensors + :param tensor_to_consumer_map: Dictionary mapping tensor names to op names which consume the tensor + :param layers_to_onnx_op_names: Dictionary mapping PyTorch layer names to names of corresponding ONNX ops + :return: tuple(end op names, all op names) + """ + if version.parse(torch.__version__) < version.parse("1.13.0") or not onnx_utils.EXPORT_TO_ONNX_DIRECT: + op_names = [key for key in op_to_io_tensor_map if (key.startswith(layer_name) and layer_name+'#' in key) + or key == layer_name] + if len(op_names) == 1: + return op_names, op_names + + end_op_names = [op_name for op_name in op_names if op_name.endswith('.end')] + return end_op_names, op_names + + assert tensor_to_consumer_map is not None + assert layers_to_onnx_op_names is not None + # Get all ops which correspond to the current PyTorch layer being processed. + op_names = layers_to_onnx_op_names.get(layer_name, []) + op_name_set = set(op_names) + + end_op_names = [] + end_op_names_set = set() + for op_name in op_names: + # Loop through outputs of each op and check whether the output leads to an op not in + for output in op_to_io_tensor_map[op_name].outputs: + assert output in tensor_to_consumer_map.keys() + if not tensor_to_consumer_map[output]: + if op_name not in end_op_names_set: + # output has no consumers, and can either be a model output or an unused op output. + # List it as an end_op_name all the same. + end_op_names.append(op_name) + end_op_names_set.add(op_name) + else: + for consumer in tensor_to_consumer_map[output]: + if consumer not in op_name_set and op_name not in end_op_names_set: + end_op_names.append(op_name) + end_op_names_set.add(op_name) + + return end_op_names, op_names + + @staticmethod + def _update_encoding_dict_for_output_activations(layer: ExportableQuantModule, layer_name: str, op_to_io_tensor_map: Dict, + activation_encodings_onnx: Dict, activation_encodings_torch: Dict, + propagate_encodings: bool, tensor_to_consumer_map: Dict[str, str], + layers_to_onnx_op_names: Dict[str, str], + tensor_to_quantizer_map: Dict): + # pylint: disable=too-many-locals + output_tensors, propagate_tensors = QuantizationSimModel._get_layer_activation_tensors(layer_name, + op_to_io_tensor_map, + tensor_to_consumer_map, + layers_to_onnx_op_names) + output_encodings = layer.export_output_encodings() + + if len(output_tensors) != len(output_encodings): + logger.warning("number of output quantizers: %d available for layer: %s " + "doesn't match with number of output tensors: %d", len(output_encodings), layer_name, + len(output_tensors)) + + for index, (output_tensor, encoding) in enumerate(zip(output_tensors, output_encodings)): + + if encoding is not None: + activation_encodings_onnx[output_tensor] = encoding + tensor_to_quantizer_map[output_tensor] = layer.output_quantizers[index] + if layer_name not in activation_encodings_torch: + activation_encodings_torch[layer_name] = {} + if QUANTIZER_TYPE_OUTPUT not in activation_encodings_torch[layer_name]: + activation_encodings_torch[layer_name][QUANTIZER_TYPE_OUTPUT] = {} + activation_encodings_torch[layer_name][QUANTIZER_TYPE_OUTPUT][index] = encoding[0] + + if propagate_encodings: + valid_encodings = [enc for enc in output_encodings if enc is not None] + if valid_encodings: + encoding = valid_encodings[0] + for activation_tensor in propagate_tensors: + activation_encodings_onnx[activation_tensor] = utils.get_propagated_encoding_dict(encoding) + + + @staticmethod + def _update_encoding_dict_for_input_activations(layer: ExportableQuantModule, layer_name: str, op_to_io_tensor_map: Dict, + activation_encodings_onnx: Dict, activation_encodings_torch: Dict, + layers_to_onnx_op_names: Dict[str, str], + tensor_to_quantizer_map: Dict): + input_encodings = layer.export_input_encodings() + # skip layer if it has no input encodings. + if all(encoding is None for encoding in input_encodings): + return + + input_tensors = QuantizationSimModel._get_layer_input_tensors(layer, layer_name, op_to_io_tensor_map, + layers_to_onnx_op_names) + + if len(input_tensors) != len(input_encodings): + logger.warning("number of input quantizers: %d available for layer: %s " + "doesn't match with number of input tensors: %d", len(input_encodings), layer_name, + len(input_tensors)) + + for index, (input_tensor, encoding) in enumerate(zip(input_tensors, input_encodings)): + if encoding is not None: + activation_encodings_onnx[input_tensor] = encoding + # TODO: Modify this so quantsim does not make assumptions about the length of input_quantizers + tensor_to_quantizer_map[input_tensor] = layer.input_quantizers[min(index, len(layer.input_quantizers) - 1)] + # Check if layer exists in the pytorch encoding dictionary + if layer_name not in activation_encodings_torch: + activation_encodings_torch[layer_name] = {} + if QUANTIZER_TYPE_INPUT not in activation_encodings_torch[layer_name]: + activation_encodings_torch[layer_name][QUANTIZER_TYPE_INPUT] = {} + # Store encodings for a particular index so that they can be used to check if a quantizer was + # enabled or not + activation_encodings_torch[layer_name][QUANTIZER_TYPE_INPUT][index] = encoding[0] + + @staticmethod + def _get_layer_input_tensors(layer: torch.nn.Module, layer_name: str, op_to_io_tensor_map: Dict, + layers_to_onnx_op_names: Dict[str, str] = None) -> List[str]: + """ + This function returns the list of input tensor names mapped from a PyTorch Op. + + :param layer: layer as torch.nn.Module + :param layer_name: Name of the PyTorch layer + :param op_to_io_tensor_map: ONNX or Torch Script map of layer name to it's input/output tensors + :param layers_to_onnx_op_names: Dictionary mapping PyTorch layer names to names of corresponding ONNX ops + :return: list of input tensor names. + """ + + param_inputs = [layer_name + '.' + param_name for param_name, _ in layer.named_parameters()] + if version.parse(torch.__version__) < version.parse("1.13.0") or not onnx_utils.EXPORT_TO_ONNX_DIRECT: + start_op_names = [key for key in op_to_io_tensor_map + if (key.startswith(layer_name) and '#0' in key) or key == layer_name] + else: + assert layers_to_onnx_op_names is not None + op_names = layers_to_onnx_op_names.get(layer_name, []) + op_name_set = set(op_names) + start_op_names = set() + for op_name in op_names: + # For each op's inputs, if the input comes from an op not associated with this layer, add it to + # start_op_names. + for inp in op_to_io_tensor_map[op_name].inputs: + if inp not in op_name_set: + start_op_names.add(op_name) + + input_tensors = [] + input_tensors_set = set() + for name in start_op_names: + for input_tensor in op_to_io_tensor_map[name].inputs: + if input_tensor not in param_inputs and input_tensor not in input_tensors_set: + input_tensors.append(input_tensor) + input_tensors_set.add(input_tensor) + + return input_tensors + + @classmethod + def _get_layer_activation_tensors(cls, layer_name: str, op_to_io_tensor_map: Dict, + tensor_to_consumer_map: Dict[str, str] = None, + layers_to_onnx_op_names: Dict[str, str] = None) -> Tuple[List[str], List[str]]: + """ + This function returns the list of output tensor and intermediate tensor names mapped from a PyTorch Op. + + :param layer_name: Name of the PyTorch layer + :param op_to_io_tensor_map: ONNX or Torch Script map of layer name to it's input/output tensors + :param tensor_to_consumer_map: Dictionary mapping tensor names to op names which consume the tensor + :param layers_to_onnx_op_names: Dictionary mapping PyTorch layer names to names of corresponding ONNX ops + :return: tuple containing list of output tensor names and list of intermediate tensors + """ + end_op_names, op_names = cls.find_op_names_for_layer(layer_name, op_to_io_tensor_map, tensor_to_consumer_map, + layers_to_onnx_op_names) + + if len(end_op_names) > 1: + output_op_map_str = cls._get_output_map_str(end_op_names, layer_name, op_to_io_tensor_map) + logger.info("layer_name: %s, has multiple output onnx ops: %s", layer_name, output_op_map_str) + + output_tensors = [] + intermediate_tensors = [] + for name in op_names: + if name in end_op_names: + output_tensors.extend(op_to_io_tensor_map[name].outputs) + else: + intermediate_tensors.extend(op_to_io_tensor_map[name].outputs) + + return output_tensors, intermediate_tensors + + @staticmethod + def _get_output_map_str(end_op_names, layer_name, op_to_io_tensor_map) -> str: + """ + This function returns formatted list of output ops tensor mapping + + :param end_op_names: list of output onnx ops + :param layer_name: Name of the PyTorch layer + :param op_to_io_tensor_map: ONNX or Torch Script map of layer name to it's input/output tensors + :return: formatted string with output ops and their corresponding output count. + """ + num_output_ops = len(end_op_names) + op_map_str = ','.join([f'{name.replace(layer_name, "")}:{len(op_to_io_tensor_map[name].outputs)}' + for name in end_op_names[:5]]) + if num_output_ops > 5: + op_map_str += ', ..' + return f'{num_output_ops},[{op_map_str}]' + + @staticmethod + def _update_encoding_dict_for_recurrent_layers(layer: torch.nn.Module, layer_name: str, op_to_io_tensor_map: Dict, + activation_encodings_onnx: Dict, param_encodings: Dict, + propagate_encodings: bool, tensor_to_quantizer_map: Dict): + """ + + :param layer: + :param layer_name: + :param op_to_io_tensor_map: + :param activation_encodings_onnx: + :param param_encodings: + :param propagate_encodings: + :return: + """ + + # pylint: disable=too-many-nested-blocks + # pylint: disable=too-many-locals + + onnx_activations_to_quantizers, onnx_params_to_quantizers = \ + layer.get_activation_param_quantizers_for_onnx_tensors(op_to_io_tensor_map[layer_name + + '#root_node']) + # ------------------ + # Activations + # ------------------ + quantizer = None + for tensor, quantizer in onnx_activations_to_quantizers.items(): + quantizer_encoding = _get_encoding_by_quantizer(quantizer) + encoding = QuantizationSimModel._create_encoding_dict(quantizer_encoding, quantizer, + propagate_encodings=False) + activation_encodings_onnx[tensor] = [encoding] + tensor_to_quantizer_map[tensor] = quantizer + + if propagate_encodings and quantizer: + _, op_names = QuantizationSimModel.find_op_names_for_layer(layer_name, op_to_io_tensor_map, None, None) + for op_name in op_names: + io_tensor_list = op_to_io_tensor_map[op_name] + if not isinstance(io_tensor_list, list): + io_tensor_list = [io_tensor_list] + + for io_tensors in io_tensor_list: + + if io_tensors.outputs: + for output_tensor in io_tensors.outputs: + if output_tensor in onnx_activations_to_quantizers: + continue + quantizer_encoding = _get_encoding_by_quantizer(quantizer) + encoding = QuantizationSimModel._create_encoding_dict(quantizer_encoding, quantizer, + True) + + activation_encodings_onnx[output_tensor] = [encoding] + tensor_to_quantizer_map[output_tensor] = quantizer + + # ------------------ + # Params + # ------------------ + for tensor, quantizer in onnx_params_to_quantizers.items(): + quantizer_encoding = _get_encoding_by_quantizer(quantizer) + encoding = QuantizationSimModel._create_encoding_dict(quantizer_encoding, quantizer, + propagate_encodings=False) + param_encodings[tensor] = [encoding] + tensor_to_quantizer_map[tensor] = quantizer + + @staticmethod + def _get_qc_quantized_layers(model) -> List[Tuple[str, QcQuantizeWrapper]]: + quantized_layers = [] + for name, module in model.named_modules(): + if isinstance(module, (QcQuantizeRecurrent, LazyQuantizeWrapper, ExportableQuantModule)): + quantized_layers.append((name, module)) + return quantized_layers + + @staticmethod + def _is_quantizable_module(module_ref): + """ Function to check if a module is eligible for quantization. + If the module is NOT an PyTorch module type or if the module was already + Quantized or if the module is in the layers_to_ignore list, don't quantize. + """ + + if isinstance(module_ref, unquantizable_modules): + logger.debug("Module %s not quantizable", module_ref) + return False + + logger.debug("Module %s is quantizable", module_ref) + return True + + def _create_quantizer_module(self, module_to_quantize: torch.nn.Module, num_inout_tensors: Dict, + data_type: QuantizationDataType) -> torch.nn.Module: + """Instantiates wrapper based on quant scheme + """ + assert self._quant_scheme in [QuantScheme.post_training_tf, QuantScheme.post_training_tf_enhanced, + QuantScheme.training_range_learning_with_tf_enhanced_init, + QuantScheme.training_range_learning_with_tf_init, + QuantScheme.post_training_percentile] + + # We lookup the number of input and output tensors already determined + # Special case, we are adding a wrapper for a module not in the forward pass: Use default of 1, 1 + num_in_tensors, num_out_tensors = num_inout_tensors.get(module_to_quantize, (1, 1)) + + # Set quantizer to be a module replacer if it is in qc_quantize_modules_dict, otherwise set as + # StaticGridQuantWrapper. + quantizer_wrapper_type = qc_quantize_modules_dict.get(type(module_to_quantize), LazyQuantizeWrapper) + + if quantizer_wrapper_type == LazyQuantizeWrapper: + quant_scheme_for_initialization = self._quant_scheme + else: + quant_scheme_for_initialization = utils.get_v1_quant_scheme_for_initialization(self._quant_scheme) + + # TODO add quant_scheme_for_initialization for FP8 case + quantized_module = quantizer_wrapper_type(module_to_quantize, self._default_param_bw, self._default_output_bw, + self._rounding_mode, quant_scheme_for_initialization, num_inputs=num_in_tensors, + num_outputs=num_out_tensors, data_type=data_type) + + return quantized_module + + def _add_quantization_wrappers(self, module, num_inout_tensors, default_data_type: QuantizationDataType): + """Recursively add quantization wrappers to all appropriate modules starting with module + """ + for module_name, module_ref in module.named_children(): + logger.debug("nn.Module found : %s", module_ref) + + # check if the module already quantized then ignore + if not self._is_quantizable_module(module_ref): + continue + + # check if the module is leaf or not + if utils.is_leaf_module(module_ref): + + # Create a new QcQuantize wrapper module + quantized_module = self._create_quantizer_module(module_ref, num_inout_tensors, default_data_type) + + setattr(module, module_name, quantized_module) + + # recursively call children modules + else: + self._add_quantization_wrappers(module_ref, num_inout_tensors, default_data_type) + + def _set_tensor_quantizers_for_consts(self, inout_tensor_shape_dict: Dict): + """ + Identify and set is_const for tensor quantizers which correspond to constant inputs in the model. + """ + + if self.connected_graph is not None: + for _, qc_quantize_wrapper in self.quant_wrappers(): + if isinstance(qc_quantize_wrapper, (QcQuantizeWrapper, LazyQuantizeWrapper)): + # Only handling QcQuantWrappers and not QcQuantizeRecurrents + # pylint: disable=protected-access + conn_graph_op = self.connected_graph._module_to_op_dict.get(qc_quantize_wrapper._module_to_wrap) + input_tensor_shape_list = inout_tensor_shape_dict.get(qc_quantize_wrapper._module_to_wrap) + if conn_graph_op is not None: + for idx, (input_quantizer, inp) in \ + enumerate(zip(qc_quantize_wrapper.input_quantizers, conn_graph_op.inputs)): + input_quantizer.is_const = inp.is_const + input_quantizer.is_singleton = (input_tensor_shape_list is not None \ + and input_tensor_shape_list[0][idx] is not None \ + and input_tensor_shape_list[0][idx].numel() == 1) + + @staticmethod + def _create_encoding_dict(encoding: libpymo.TfEncoding, quantizer, propagate_encodings: bool) -> Union[Dict, None]: + """ + Create encoding dictionary from encoding object + :param encoding: Encoding of the quantizer + :param quantizer: Tensor Quantizer + :param propagate_encodings: If True, encoding entries for intermediate ops (when one PyTorch ops results in + multiple ONNX nodes) are filled with the same BW and data_type as the output tensor for that series of + ops. + :return: Encoding Dictionary + """ + return utils.create_encoding_dict(encoding, quantizer, propagate_encodings) + + @classmethod + def _remove_quantization_wrappers(cls, starting_module, list_of_modules_to_exclude): + """ + Recursively remove quantization wrappers from all appropriate modules starting with a given module + :param starting_module: Module to recursive search downstream from + :param list_of_modules_to_exclude: List of torch modules to remove quantization wrappers from (if present) + :return: None + """ + for module_name, module_ref in starting_module.named_children(): + + # If modules is in the exclude list, remove the wrapper + if module_ref in list_of_modules_to_exclude: + + if isinstance(module_ref, ExportableQuantModule): + # Remove the wrapper, gets auto-deleted + # pylint: disable=protected-access + setattr(starting_module, module_name, module_ref.get_original_module()) + + elif isinstance(module_ref, QcQuantizeStandAloneBase): + setattr(starting_module, module_name, torch.nn.Identity()) + + elif isinstance(module_ref, QcQuantizeRecurrent): + module_ref.update_params() + setattr(starting_module, module_name, module_ref.module_to_quantize) + + # Recursively call children modules if present + if not utils.is_leaf_module(module_ref): + cls._remove_quantization_wrappers(module_ref, list_of_modules_to_exclude) + + @staticmethod + def get_original_model(model: torch.nn.Module): + """ + This function returns the model with all quantization wrappers removed. + :return: Model without quantization wrappers. + """ + original_model = copy.deepcopy(model) + # pylint: disable=unnecessary-comprehension + all_modules_in_original_model = [module for module in original_model.modules()] + QuantizationSimModel._remove_quantization_wrappers(original_model, all_modules_in_original_model) + return original_model + + def _get_leaf_module_to_name_map(self): + """ + Returns a mapping from leaf modules to module name, where any ExportableQuantModule is considered a leaf module, + and is therefore not further recursed (since we do not want to retrieve all internal quantizers/modules). + """ + def recursively_populate_map(starting_module, module_map, start_str): + for name, module in starting_module.named_children(): + if isinstance(module, ExportableQuantModule) or utils.is_leaf_module(module): + module_map[module] = start_str + name + else: + recursively_populate_map(module, module_map, start_str + name + ".") + module_to_name_map = {} + recursively_populate_map(self.model, module_to_name_map, "") + return module_to_name_map + + def _add_inputs_hook(self, hooks): + module_to_name_map = self._get_leaf_module_to_name_map() + + def inputs_hook(module_ref, inputs, _): + # Need to remove hook here, otherwise the jit trace of CustomMarker with module ref will error since the + # hook will be recursively hit. + hooks[module_ref].remove() + del hooks[module_ref] + module_name = module_to_name_map[module_ref] + if isinstance(module_ref, ExportableQuantModule): + module_ref = module_ref.get_original_module() + marker_layer = torch.jit.trace(CustomMarker(module_ref, module_name, 'True'), + inputs) + self._module_marker_map[module_name] = marker_layer + + for name, module in self.model.named_modules(): + if name in module_to_name_map.values(): + hooks[module] = module.register_forward_hook(inputs_hook) + + def _validate_module_marker_map(self): + """ + Check to make sure all leaf modules have traced Custom Markers associated with them. + """ + all_leaf_modules = self._get_leaf_module_to_name_map().values() + missing_inputs_entries = [] + + for leaf_module in all_leaf_modules: + if leaf_module not in self._module_marker_map.keys(): + missing_inputs_entries.append(leaf_module) + + if missing_inputs_entries: + logger.info('In order to export a conditional model, all leaf modules need to be run with some input so ' + 'torch trace can be done.') + logger.info('The following modules were not run during compute encodings:') + logger.info(missing_inputs_entries) + logger.info('Please use the sim.run_modules_for_traced_custom_marker(<module list>, dummy_input) api to ' + 'pass dummy inputs to these modules.') + logger.info('Modules which can take the same dummy input can be ' + 'grouped as a list. For groups of modules with different input shapes, please call ' + 'sim.run_modules_for_traced_custom_markers() for each group.') + logger.info('Exiting quantsim export early.') + return False + return True + + def _export_conditional(self, path: str, filename_prefix: str, dummy_input: Union[torch.Tensor, Tuple], + forward_pass_callback: Callable, forward_pass_callback_args, + onnx_export_args: Union[OnnxExportApiArgs, None] = OnnxExportApiArgs(), + propagate_encodings: bool = False): + """ + Export function for conditional models. Performs another round of forward passes to create and store traced + CustomMarker info for each leaf module to be later used when scripting the model for export. + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param dummy_input: Dummy input to the model. Used to parse model graph. It is required for the dummy_input to + be placed on CPU. + :param forward_pass_callback: A callback function that simply runs forward passes on the model. This callback + function should use representative data for the forward pass, so the calculated encodings work for all + data samples. This callback internally chooses the number of data samples it wants to use for calculating + encodings. The callback should exercise all paths of the conditional model. + :param forward_pass_callback_args: These argument(s) are passed to the forward_pass_callback as-is. Up to + the user to determine the type of this parameter. E.g. could be simply an integer representing the number + of data samples to use. Or could be a tuple of parameters or an object representing something more complex. + If set to None, forward_pass_callback will be invoked with no parameters. + :param onnx_export_args: onnx specific export arguments + :param propagate_encodings: If True, encoding entries for intermediate ops (when one PyTorch ops results in + multiple ONNX nodes) are filled with the same BW and data_type as the output tensor for that series of + ops. + :return: None + """ + self._is_conditional = True + if onnx_export_args is None: + onnx_export_args = OnnxExportApiArgs() + + # If model is conditional, we need to create traced CustomMarkers to be used later during export. Create hooks + # here for creating a traced CustomMarker for each leaf module during the forward pass callback. + hooks = {} + if self._is_conditional: + self._add_inputs_hook(hooks) + + with utils.in_eval_mode(self.model), torch.no_grad(): + _ = forward_pass_callback(self.model, forward_pass_callback_args) + + # Any hooks that were hit during forward pass callback would have removed themselves. Remove the remaining + # hooks that were not run. + for h in hooks.values(): + h.remove() + + # Check that all paths were exercised + if not self._validate_module_marker_map(): + return + self.export(path, filename_prefix, dummy_input, onnx_export_args, propagate_encodings) + + def configure_quantization_ops(self, config_file: str, default_output_bw: int, default_param_bw: int, + default_data_type: QuantizationDataType) -> QuantSimConfigurator: + """ + Configure inserted quantize ops using config file and fill in all the supported kernels + :param config_file: Configuration file to use + :param default_output_bw: default bitwidth for activations + :param default_param_bw: default bitwidth for params + :param default_data_type: default data type + :return: QuantSimConfigurator object + """ + if self.connected_graph is None: + error_msg = ('A connected graph failed to be built.\n' + 'Unable to proceed with automatically configuring quantization ops using the config file.\n' + 'Please configure quantization ops manually by redefining ' + 'QuantizationSimModel.configure_quantization_ops()') + logger.error(error_msg) + raise AssertionError(error_msg) + return QuantSimConfigurator(self.model, self.connected_graph, config_file, default_output_bw, + default_param_bw, default_data_type) + + def load_encodings(self, encodings: Union[Mapping, str, os.PathLike], + strict: bool = True, + partial: bool = True, + requires_grad: Optional[bool] = None, + allow_overwrite: bool = True): + """ + :param encodings: Encoding dictionary or path to the encoding dictionary json file. + :param bool strict: If True, an error will be thrown if the model doesn't + have a quantizer corresponding to the specified encodings. + :param bool partial: If True, the encoding will be interpreted as a partial encoding, + and the dangling quantizers with no corresponding encoding will be kept untouched. + Otherwise, the dangling quantizers will be removed from the model. + :param bool requires_grad: Whether or not the quantization parameters loaded from the + encodings require gradient computation during training. + If None, ``requires_grad`` flag of the quantization parameters will be kept unchanged. + :param bool allow_overwrite: Whether or not the quantization parameters loaded from the + encodings can be overwriiten by :ref:`compute_encodings` or another :ref:`load_encodings`. + If None, whether the quantizer is overwrieable will be kept unchanged. + """ + if isinstance(encodings, (str, os.PathLike)): + with open(encodings, mode='r') as f: + encodings = json.load(f) + + self._load_encodings_impl(encodings, strict, partial, requires_grad, allow_overwrite) + + def _load_encodings_impl(self, encodings: Mapping, + strict: bool, + partial: bool, + requires_grad: Optional[bool], + allow_overwrite: bool): + if 'param_encodings' not in encodings: + param_encodings = encodings + activation_encodings = {} + logger.warning("An older AdaRound exported encoding file type has been detected! " + "Please regenerate it using the AdaRound export function from the latest " + "AIMET (version 1.32 or higher) if necessary. " + "Support for this encoding file will be deprecated in AIMET version 1.33.0.") + else: + param_encodings = encodings.get('param_encodings', {}) + activation_encodings = encodings.get('activation_encodings', {}) + + if not param_encodings and not activation_encodings: + raise RuntimeError + + if strict is True: + encoding_keys = param_encodings.keys() | activation_encodings.keys() + model_keys = set(name.replace("._module_to_wrap", "") for name, _ + in chain(self.model.named_modules(), utils.get_all_named_parameters(self.model))) + keys_not_found = encoding_keys - model_keys + if keys_not_found: + keys_not_found = ', '.join(sorted(keys_not_found)) + msg = f"Encoding dictionary contains modules/parameters that doesn't exist in the model: {keys_not_found}" + raise RuntimeError(msg) + + if param_encodings is not None: + self._set_param_encodings(param_encodings, + strict, partial, requires_grad, allow_overwrite) + + if activation_encodings is not None: + self._set_activation_encodings(activation_encodings, + strict, partial, requires_grad, allow_overwrite) + + @deprecated(f"Use {load_encodings.__qualname__} instead.") + def load_and_freeze_encodings(self, encoding_path: str, ignore_when_quantizer_disabled: bool = False): + """ + Functionality to set encodings (both activation and parameter) as per the given encodings JSON file and + freeze them. + .. note: + The encodings JSON file should be the {prefix}_torch.encodings json exported during sim.export() + + :param encoding_path: JSON file path from where to load the encodings. + :param ignore_when_quantizer_disabled: ignore raising RuntimeError while setting encodings, + when quantizers are disabled. + """ + self.load_encodings(encoding_path, + strict=not ignore_when_quantizer_disabled, + partial=True, + requires_grad=False, + allow_overwrite=False) + + def _set_param_encodings(self, + encoding_dict: Mapping, + strict: bool, + partial: bool, + requires_grad: Optional[bool], + allow_overwrite: bool): + for name, quant_module in self.model.named_modules(): + if isinstance(quant_module, ExportableQuantModule): + param_encoding = { + param_name: encoding_dict[f'{name}.{param_name}'] + for param_name, _ in quant_module.param_quantizers.items() + if f'{name}.{param_name}' in encoding_dict + } + quant_module.import_param_encodings(param_encoding, + strict, + partial, + requires_grad, + allow_overwrite) + + def _set_activation_encodings(self, + activation_encoding_dict: Mapping, + strict: bool, + partial: bool, + requires_grad: Optional[bool], + allow_overwrite: bool): + for module_name, module in self.model.named_modules(): + if not isinstance(module, ExportableQuantModule): + continue + + try: + input_encoding = activation_encoding_dict[module_name]['input'] + except KeyError: + input_encoding = {} + + module.import_input_encodings(input_encoding, + strict, + partial, + requires_grad, + allow_overwrite) + + try: + output_encoding = activation_encoding_dict[module_name]['output'] + except KeyError: + output_encoding = {} + + module.import_output_encodings(output_encoding, + strict, + partial, + requires_grad, + allow_overwrite) + + + @deprecated(f"Use {load_encodings.__qualname__} instead.") + def set_and_freeze_param_encodings(self, encoding_path: str): + """ + Set and freeze parameter encodings from encodings JSON file. + .. note: + The loaded json file should contain ONLY weight encodings. This is different from the json file used in + `load_and_freeze_encodings`, which contains both weight and activation dictionaries. + + :param encoding_path: path from where to load parameter encodings file + """ + with open(encoding_path, mode='r') as f: + encodings = json.load(f) + + if 'activation_encodings' in encodings: + del encodings['activation_encodings'] + + self.load_encodings(encodings, + strict=True, + partial=True, + requires_grad=False, + allow_overwrite=False) + + def named_qmodules(self): + """Generator that yields all quantized modules in the model and their names + """ + for name, module in self.model.named_modules(): + if isinstance(module, (QcQuantizeRecurrent, LazyQuantizeWrapper, ExportableQuantModule)): + yield name, module + + def qmodules(self): + """Generator that yields all quantized modules in the model + """ + yield from (module for _, module in self.named_qmodules()) + + quant_wrappers = named_qmodules + + def run_modules_for_traced_custom_marker(self, module_list: List[torch.nn.Module], dummy_input): + """ + Given a list of modules to run and dummy input for the module, create a traced CustomMarker for each module + and store it in the module_marker map. The same dummy input will be used for all modules. + + :param module_list: List of modules to create traced CustomMarkers for + :param dummy_input: Dummy input for all modules + """ + + module_to_name_map = self._get_leaf_module_to_name_map() + + for module in module_list: + # Only perform init and trace if the given module is a leaf module, and we have not recorded it before + if module in module_to_name_map and module_to_name_map[module] not in self._module_marker_map: + name = module_to_name_map[module] + module = module.get_original_module() if isinstance(module, ExportableQuantModule) else module + with utils.in_eval_mode(module), torch.no_grad(): + marker_layer = torch.jit.trace(CustomMarker(module, name, True), dummy_input) + self._module_marker_map[name] = marker_layer + + def _validate_supported_kernels_for_quantizers(self, action: SupportedKernelsAction): + """ + Validate supported kernels for all the Quantizers in the QuantSimModel + :param action: The action to be performed when incorrect candidate is set in a quantizer + """ + + def apply_act_param_rules(curr_candidate: QuantDtypeBwInfo, allowed_supported_kernels: List[QuantDtypeBwInfo], module_name): + """ + helper function to validate both activation and param against the supported_kernels passed + :param curr_candidate: candidate of interest + :param allowed_supported_kernels: List of supported kernels for the given module + :param module_name: name of the module + """ + if action != SupportedKernelsAction.allow_error: + for k in allowed_supported_kernels: + if curr_candidate == k: + return + + if action == SupportedKernelsAction.warn_on_error: + logger.warning("candidate:%s is not under the supported_kernels for the module %s", curr_candidate, + module_name) + + if action == SupportedKernelsAction.assert_on_error: + error_msg = f'candidate: {curr_candidate} is not under the supported_kernels for the module {module_name}' + raise RuntimeError(error_msg) + + def apply_act_rules(act: Tuple[int, QuantizationDataType], allowed_supported_kernels: List[QuantDtypeBwInfo], module_name): + """ + helper function to validate both activation only against the supported_kernels passed + :param act: act of the candidate to be validated + :param allowed_supported_kernels: List of supported kernels for the given module + :param module_name: name of the module + """ + if action != SupportedKernelsAction.allow_error: + for k in allowed_supported_kernels: + if k.is_same_activation(act[1], act[0]): + return + + if action == SupportedKernelsAction.warn_on_error: + logger.warning("activation:%s is not under the supported_kernels for the module %s", act, module_name) + + if action == SupportedKernelsAction.assert_on_error: + error_msg = f'activation: {act} is not under the supported_kernels for the module {module_name}' + raise RuntimeError(error_msg) + + # retrieve all the act and param quantizer candidates, and validate them against supported_kernels + for name, module in self.model.named_modules(): + if isinstance(module, (QcQuantizeWrapper, LazyQuantizeWrapper)) and module.supported_kernels: + supported_kernels = [] + for supported_kernel in module.supported_kernels: + # ((activation bitwidth, activation data type), (param bitwidth, param data type)) + # TODO modify this once reformat_supported_kernels generates of type QuantDtypeBwInfo + if isinstance(supported_kernel[1], tuple): + supported_kernels.append( + QuantDtypeBwInfo(supported_kernel[0][1], supported_kernel[0][0], + supported_kernel[1][1], supported_kernel[1][0])) + else: + supported_kernels.append( + QuantDtypeBwInfo(supported_kernel[1], supported_kernel[0])) + act_candidates = [] + param_candidate = () + for quantizer in module.input_quantizers + module.output_quantizers: + act_candidates.append((quantizer.bitwidth, quantizer.data_type)) + + if 'weight' in module.param_quantizers: + param_candidate = (module.param_quantizers['weight'].bitwidth, + module.param_quantizers['weight'].data_type) + + if param_candidate: + # we need to check weights against all the activations + for act_candidate in set(act_candidates): + apply_act_param_rules(QuantDtypeBwInfo(act_candidate[1], act_candidate[0], param_candidate[1], + param_candidate[0]), supported_kernels, name) + else: + for candidate in set(act_candidates): + apply_act_rules(candidate, supported_kernels, name) + + @staticmethod + def _replace_quantization_wrapper_with_native_torch_quantization_nodes(quant_sim_model, device: torch.device): + """ + Recursively remove quantization wrappers from all appropriate modules starting with a given module + :param quant_sim_model: model for which QcQuantizeWrapper gets replaced with wrapped module using + native torch quantization nodes + :param device: device on which model is present + :return: + """ + # Recursively replace quantization wrappers to native torch quantization nodes + for module_name, module_ref in quant_sim_model.named_children(): + # Create a native torch quantization node + if isinstance(module_ref, QcQuantizeWrapper): + embedded_module = NativeTorchQuantWrapper(module_ref, '_module_to_wrap', device) + setattr(quant_sim_model, module_name, embedded_module) + + elif isinstance(module_ref, QcQuantizeRecurrent): + logger.error('Do not support save model embedded native torch quantization nodes using QcQuantizeRecurrent.') + raise AssertionError + + # Recursively call children modules if present + if not utils.is_leaf_module(module_ref): + QuantizationSimModel._replace_quantization_wrapper_with_native_torch_quantization_nodes(module_ref, device) + + # pylint: disable=protected-access, too-many-branches, too-many-locals + def _apply_exception_rules(self): + """ + Apply exception rules to specific op. For example, a rule can override high bitwidth to Embedding module + """ + if self._hw_version not in {'V66', 'V68', 'V69', 'V73', 'V75', 'V79'}: + return + + module_to_quant_wrapper = {} + for _, wrapper in self.quant_wrappers(): + module_to_quant_wrapper[wrapper._module_to_wrap] = wrapper + + for name, wrapper in self.quant_wrappers(): + original_module = wrapper._module_to_wrap + + # A module that doesn't require exception rules + if not isinstance(original_module, (torch.nn.Embedding, torch.nn.GroupNorm, elementwise_ops.MatMul)): + continue + + if isinstance(original_module, torch.nn.Embedding): + if self._hw_version not in {'V73', 'V75', 'V79'}: + continue + weight_quantizer = wrapper.param_quantizers['weight'] + output_quantizer = wrapper.output_quantizers[0] + + weight_quantizer.bitwidth = output_quantizer.bitwidth + weight_quantizer.use_symmetric_encodings = output_quantizer.use_symmetric_encodings + elif isinstance(original_module, torch.nn.GroupNorm): + if self._hw_version not in {'V73', 'V75', 'V79'}: + continue + if 'weight' in wrapper.param_quantizers: + output_quantizer = wrapper.output_quantizers[0] + for _, param_quantizer in wrapper.param_quantizers.items(): + param_quantizer.bitwidth = output_quantizer.bitwidth + param_quantizer.use_symmetric_encodings = output_quantizer.use_symmetric_encodings + elif isinstance(original_module, elementwise_ops.MatMul): + first_input_quantizer, second_input_quantizer = wrapper.input_quantizers + + op = self.connected_graph._module_to_op_dict[original_module] + first_input_op = op.input_ops[0] if (not first_input_quantizer.enabled) else None + second_input_op = op.input_ops[1] if (not second_input_quantizer.enabled) else None + + target_quantizer_for_first_input = self._get_target_quantizer(first_input_quantizer, first_input_op, module_to_quant_wrapper) + target_quantizer_for_second_input = self._get_target_quantizer(second_input_quantizer, second_input_op, module_to_quant_wrapper) + + if not target_quantizer_for_second_input: + continue + + # According to opdef for Matmul in HTP: + # 16bit Weight(second input for dynamic MatMul) must have 16bit Activation(first input for dynamic MatMul). + # 16bit Activation and 16bit Weight require minimum arch V73. + # 16bit Weight must be symmetric quantized. + + # Below are the possible combinations for MatMul with 8/16 bitwidth: + # If version is V73/V75: {input0->8, input1->8 symm/asymm} {input0->16 , input1->8 symm/asymm} {input0->16, input1->16 symmetric} + # If version is lesser than V73: {input0->8, input1->8 symmetric} {input0->16, input1->8 symmetric} + + if self._hw_version in {'V66', 'V68', 'V69'}: + target_quantizer_for_second_input.use_symmetric_encodings = True + target_quantizer_for_second_input.bitwidth = 8 + elif self._hw_version in {'V73', 'V75', 'V79'}: + if target_quantizer_for_second_input.bitwidth == 16: + target_quantizer_for_second_input.use_symmetric_encodings = True + if target_quantizer_for_first_input: + target_quantizer_for_first_input.bitwidth = 16 + else: + raise ValueError(f'Not expected hardware version to apply exception rules: {self._hw_version}') + + else: + raise ValueError(f'A module not expected to apply exception rules: {name}') + + def _get_target_quantizer(self, input_quantizer: TensorQuantizer, input_op: Op, module_to_quant_wrapper: Dict[torch.nn.Module, QcQuantizeWrapper]) -> TensorQuantizer: + """ + Returns input quantizer if enabled otherwise returns closest enabled parent output quantizer. + + :param input_quantizer: Input quantizer + :param input_op: Input Op + :param module_to_quant_wrapper: Dict of module to quant wrapper + :return: Target quantizer + """ + target_quantizer = None + if input_quantizer.enabled: + target_quantizer = input_quantizer + elif input_op: + closest_producer_wrapper = self._get_closest_producer_wrapper( + input_op, module_to_quant_wrapper + ) + if closest_producer_wrapper: + target_quantizer = closest_producer_wrapper.output_quantizers[0] + else: + logger.warning("The closest wrapper could not be found. MatMul exception rule does not apply. " + "If you haven't used model preparer, consider using it.") + return target_quantizer + + + def _get_closest_producer_wrapper(self, + op: Op, + module_to_quant_wrapper: Dict[torch.nn.Module, QcQuantizeWrapper]) -> \ + Optional[QcQuantizeWrapper]: + """ + Find the closest producer QcQuantizeWrapper and return it + + :param op: Target operation + :param module_to_quant_wrapper: Module to Wrapper dictionary + :return: QcQuantizerWrapper if exists else None + """ + def get_quant_wrapper() -> Optional[QcQuantizeWrapper]: + module = op.get_module() + return module_to_quant_wrapper.get(module) if module else None + + wrapper = get_quant_wrapper() + if wrapper and wrapper.output_quantizers[0].enabled: + return wrapper + + if wrapper and not wrapper.output_quantizers[0].enabled: + # pylint: disable=no-else-return + if len(op.input_ops) == 1: + return self._get_closest_producer_wrapper(op.input_ops[0], module_to_quant_wrapper) + else: + logger.warning("A wrapper of %s with output quantization disabled has no input or more than one input exists. " + "It's ambiguous to find the nearest producer in this case", str(op.get_module())) + return None + + if not wrapper: + if not op.input_ops: + logger.warning("No input exists for navigation for traversal, it's not possible to find the closest producer") + return None + + if len(op.input_ops) > 1: + logger.warning("Multiple input ops exist, traversal to find closest producer is performed based on the first input") + + return self._get_closest_producer_wrapper(op.input_ops[0], module_to_quant_wrapper) + + @staticmethod + def save_model_with_embedded_quantization_nodes(sim_model, path: str, filename_prefix: str, dummy_input: Union[torch.Tensor, Tuple], + onnx_export_args: Optional[Union[OnnxExportApiArgs, Dict]] = None, + export_to_torchscript: bool = False, is_conditional: bool = False): + """ + Export model embedded with native torch quantization nodes. These nodes will be exported + as default onnx or torch script quantized nodes. + :param sim_model: model with the quantsim wrappers + :param path: path where to store model pth and encodings + :param filename_prefix: Prefix to use for filenames of the model pth and encodings files + :param dummy_input: Dummy input to the model. Used to parse model graph + :param onnx_export_args: optional export argument with onnx specific overrides if not provide export via + torchscript graph. Int16 can only be exported by torchscript + :param export_to_torchscript: If True, export to torchscript. Export to onnx otherwise. Defaults to False. + :param is_conditional: True if model is conditional, False otherwise + :return: + """ + def _validate_torchquantizer(quant_sim_model): + # To avoid non 8 bit TorchQuantizer are exported to ONNX + for _, module in quant_sim_model.named_modules(): + if isinstance(module, NativeTorchQuantWrapper): + quantizers = module.input_quantizers + module.output_quantizers + if 'weight' in module.param_quantizers: + quantizers += [module.param_quantizers['weight']] + if 'bias' in module.param_quantizers: + quantizers += [module.param_quantizers['bias']] + + for quantizer in quantizers: + if quantizer.enabled and quantizer.data_type == QuantizationDataType.int and quantizer.bitwidth != 8: + raise ValueError('Only 8 bit quantizers are supported by exporting to ONNX model.' + 'Please enable export_to_torchscript if you want to export non 8 bit quantizers.') + + model_filename = filename_prefix + '_embedded' + '.onnx' + model_path = os.path.join(path, model_filename) + quant_sim_model = copy.deepcopy(sim_model) + + device = utils.get_device(quant_sim_model) + if isinstance(dummy_input, torch.Tensor): + dummy_input = dummy_input.to(device) + else: + dummy_input = tuple([input.to(device) for input in dummy_input]) # pylint: disable=consider-using-generator + QuantizationSimModel._replace_quantization_wrapper_with_native_torch_quantization_nodes(quant_sim_model, device) + + if export_to_torchscript: + with utils.in_eval_mode(quant_sim_model), torch.no_grad(): + trace = torch.jit.trace(quant_sim_model, dummy_input) + ts_path = os.path.join(path, filename_prefix + '_embedded' + '.torchscript.pth') + trace.save(ts_path) + else: + _validate_torchquantizer(quant_sim_model) + OnnxSaver._export_model_to_onnx(quant_sim_model, dummy_input, model_path, is_conditional, onnx_export_args) # pylint: disable=protected-access + + def _enable_output_quantizers_for_specific_cast_ops(self, inout_tensors_dtypes: Dict[torch.nn.Module, Tuple[torch.dtype, torch.dtype]]): + """ + Enable output quantizer for Cast Ops where datatype of input tensor is int/bool + and data type of output tensor is float. + """ + # pylint: disable=protected-access + model_prefix = self.connected_graph._model_name + '.' + torch_int_dtypes = {torch.int8, torch.int16, torch.int32, torch.int64, torch.bool, torch.uint8} + torch_float_dtypes = {torch.float16, torch.float32, torch.float64} + + for module, inout_dtypes in inout_tensors_dtypes.items(): + input_tensor_dtype = inout_dtypes[0] + output_tensor_dtype = inout_dtypes[1] + # pylint: disable=protected-access + module_name = self.connected_graph._module_to_name[module].split(model_prefix)[-1] + + if input_tensor_dtype != output_tensor_dtype and input_tensor_dtype in torch_int_dtypes and output_tensor_dtype in torch_float_dtypes: + logger.info("Enabling output quantizer for module %s", module_name) + wrapped_module = getattr(self.model, module_name) + for output_quantizer in wrapped_module.output_quantizers: + setattr(output_quantizer, 'enabled', True) + + @staticmethod + def _get_num_inout_tensors_from_tensor_shape_dict(inout_tensor_shape_dict): + """ + Convert tensor shape dictionary to num inout tensors dictionary + """ + num_inout_tensors = {} + + for module, inout_tensor_shape in inout_tensor_shape_dict.items(): + input_tensor_shape_list, output_tensor_shape_list = inout_tensor_shape + num_inout_tensors[module] = (len(input_tensor_shape_list), + len(output_tensor_shape_list)) + + return num_inout_tensors
+ + +def save_checkpoint(quant_sim_model: QuantizationSimModel, file_path: str): + """ + This API provides a way for the user to save a checkpoint of the quantized model which can + be loaded at a later point to continue fine-tuning e.g. + See also load_checkpoint() + + :param quant_sim_model: QuantizationSimModel to save checkpoint for + :param file_path: Path to the file where you want to save the checkpoint + :return: None + """ + with open(file_path, 'wb') as file: + pickle.dump(quant_sim_model, file) + + +def load_checkpoint(file_path: str) -> QuantizationSimModel: + """ + Load the quantized model + + :param file_path: Path to the file where you want to save the checkpoint + :return: A new instance of the QuantizationSimModel created after loading the checkpoint + """ + with open(file_path, 'rb') as file: + sim = pickle.load(file) + return sim + + +def check_accumulator_overflow(model: torch.nn.Module, quant_bw: int, accum_bw: int): + """ + Checks for any potential for accumulator overflow across all the layers of the given model + :param model: Model + :param quant_bw: Bitwidth the layers are quantized at + :param accum_bw: Bitwidth of the accumulator + :return: Name of the layer with the most accumulator range used and range used + """ + + most_accum_range_used = 0 + most_accum_range_used_layer = None + + for layer_name, layer in model.named_modules(): + + if isinstance(layer, torch.nn.Conv2d): + was_accum_range_exceeded, accum_range_used = get_conv_accum_bounds(layer.weight.detach().numpy(), + quant_bw, accum_bw) + if accum_range_used > most_accum_range_used: + most_accum_range_used = accum_range_used + most_accum_range_used_layer = layer_name + + if was_accum_range_exceeded: + logger.info('Possible accumulator overflow for layer: %s', layer_name) + + if most_accum_range_used < 1: + logger.info('No overflow detected. Layer %s had the most accumulator range used: %f%%', + most_accum_range_used_layer, most_accum_range_used * 100) + else: + logger.info('Overflow detected. Layer %s had the most accumulator range used: %f%%', + most_accum_range_used_layer, most_accum_range_used * 100) + + return most_accum_range_used_layer, most_accum_range_used + + +@deprecated(f"Use {QuantizationSimModel.load_encodings.__qualname__} instead.") +def load_encodings_to_sim(quant_sim_model: QuantizationSimModel, pytorch_encoding_path: str): + """ + Loads the saved encodings to quant sim model. The encoding filename to load should end in _torch.encodings, + generated as part of quantsim export. + + :param quant_sim_model: Quantized model to load encodings for. Note: The model configuration should be the same as + when encodings were exported. + :param pytorch_encoding_path: Path of the encodings file to load. + """ + for module in quant_sim_model.model.modules(): + if isinstance(module, QcQuantizeWrapper): + module.set_mode(QcQuantizeOpMode.ACTIVE) + + quant_sim_model.load_encodings(pytorch_encoding_path, + strict=True, + partial=False, + requires_grad=None, + allow_overwrite=None) + + if isinstance(quant_sim_model, QuantizationSimModel): + # Only for V1 quantsim + quant_sim_model.replace_wrappers_for_quantize_dequantize() + + +def has_valid_encodings(qc_quantize_op: ExportableQuantModule) -> bool: + """ + Utility for determining whether a given qc_quantize_op has any valid encodings. + + :param qc_quantize_op: Qc quantize op to evaluate + :return: True if any input, param, or output quantizers have valid encodings, False otherwise + """ + if not isinstance(qc_quantize_op, (ExportableQuantModule, QcQuantizeRecurrent)): + logger.error("has_valid_encodings only supported for QcQuantizeWrapper and QcQuantizeRecurrent " + "modules") + assert isinstance(qc_quantize_op, (ExportableQuantModule, QcQuantizeRecurrent)) + if isinstance(qc_quantize_op, ExportableQuantModule): + all_encodings = qc_quantize_op.export_output_encodings() + qc_quantize_op.export_input_encodings() + \ + list(qc_quantize_op.export_param_encodings().values()) + return any([encoding is not None for encoding in all_encodings]) # pylint: disable=consider-using-generator,use-a-generator + input_quantizers = list(qc_quantize_op.input_quantizers.values()) + output_quantizers = list(qc_quantize_op.output_quantizers.values()) + + for quantizer in input_quantizers + output_quantizers + list(qc_quantize_op.param_quantizers.values()): + if quantizer.enabled and (quantizer.encoding is not None or quantizer.data_type is QuantizationDataType.float): + return True + + return False + + +def compute_encodings_for_sims(sim_list: List[QuantizationSimModel], forward_pass_callback: Callable, + forward_pass_callback_args: Any): + """ + Compute encodings for a list of QuantSims. + + :param sim_list: List of QuantSims to compute encodings for. + :param forward_pass_callback: A callback function that simply runs forward passes on the models. This callback + function should use representative data for the forward pass, so the calculated encodings work for all + data samples. This callback internally chooses the number of data samples it wants to use for calculating + encodings. + The callback expects exactly two inputs: + - List of models which are involved in the forward pass. The models are taken directly from calling + sim.model for each sim in sim_list, passed in the same order in which the sims appear in sim_list. + - Forward pass callback args + :param forward_pass_callback_args: These argument(s) are passed to the forward_pass_callback as-is. Up to + the user to determine the type of this parameter. E.g. could be simply an integer representing the number + of data samples to use. Or could be a tuple of parameters or an object representing something more complex. + If set to None, forward_pass_callback will be invoked with no parameters. + """ + ctx_managers = [torch.no_grad()] + for sim in sim_list: + ctx_managers.append(utils.in_eval_mode(sim.model)) + QuantizationSimModel.prepare_sim_for_compute_encodings(sim) + + with contextlib.ExitStack() as stack: + for mgr in ctx_managers: + stack.enter_context(mgr) + _ = forward_pass_callback([sim.model for sim in sim_list], forward_pass_callback_args) + + for sim in sim_list: + QuantizationSimModel.compute_layer_encodings_for_sim(sim) +
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/visualize_model.html b/releases/1.32.2/_modules/aimet_torch/visualize_model.html new file mode 100644 index 0000000..6a18ab7 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/visualize_model.html @@ -0,0 +1,1283 @@ + + + + + + aimet_torch.visualize_model — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for aimet_torch.visualize_model

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019-2021, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Top level API for visualizing a pytorch model. """
+import os
+from typing import List
+import torch
+from bokeh import plotting
+from bokeh.layouts import column
+from aimet_torch import plotting_utils
+from aimet_torch.utils import get_layer_by_name
+
+
+
[docs]def visualize_changes_after_optimization( + old_model: torch.nn.Module, + new_model: torch.nn.Module, + results_dir: str, + selected_layers: List = None +) -> List[plotting.figure]: + """ + Visualizes changes before and after some optimization has been applied to a model. + + :param old_model: pytorch model before optimization + :param new_model: pytorch model after optimization + :param results_dir: Directory to save the Bokeh plots + :param selected_layers: a list of layers a user can choose to have visualized. If selected layers is None, + all Linear and Conv layers will be visualized. + :return: A list of bokeh plots + """ + file_path = os.path.join(results_dir, 'visualize_changes_after_optimization.html') + plotting.output_file(file_path) + subplots = [] + if selected_layers: + for name, module in new_model.named_modules(): + if name in selected_layers and hasattr(module, "weight"): + old_model_module = get_layer_by_name(old_model, name) + new_model_module = module + subplots.append( + plotting_utils.visualize_changes_after_optimization_single_layer( + name, old_model_module, new_model_module + ) + ) + + else: + for name, module in new_model.named_modules(): + if hasattr(module, "weight") and\ + isinstance(module, (torch.nn.modules.conv.Conv2d, torch.nn.modules.linear.Linear)): + old_model_module = get_layer_by_name(old_model, name) + new_model_module = module + subplots.append( + plotting_utils.visualize_changes_after_optimization_single_layer( + name, old_model_module, new_model_module + ) + ) + plotting.save(column(subplots)) + return subplots
+ + +
[docs]def visualize_weight_ranges( + model: torch.nn.Module, + results_dir: str, + selected_layers: List = None +) -> List[plotting.figure]: + """ + Visualizes weight ranges for each layer through a scatter plot showing mean plotted against the standard deviation, + the minimum plotted against the max, and a line plot with min, max, and mean for each output channel. + + :param model: pytorch model + :param selected_layers: a list of layers a user can choose to have visualized. If selected layers is None, + all Linear and Conv layers will be visualized. + :param results_dir: Directory to save the Bokeh plots + :return: A list of bokeh plots + """ + + file_path = os.path.join(results_dir, 'visualize_weight_ranges.html') + plotting.output_file(file_path) + subplots = [] + if selected_layers: + for name, module in model.named_modules(): + if name in selected_layers and hasattr(module, "weight"): + subplots.append(plotting_utils.visualize_weight_ranges_single_layer(module, name)) + else: + for name, module in model.named_modules(): + if hasattr(module, "weight") and\ + isinstance(module, (torch.nn.modules.conv.Conv2d, torch.nn.modules.linear.Linear)): + subplots.append(plotting_utils.visualize_weight_ranges_single_layer(module, name)) + + plotting.save(column(subplots)) + return subplots
+ + +
[docs]def visualize_relative_weight_ranges_to_identify_problematic_layers( + model: torch.nn.Module, + results_dir: str, + selected_layers: List = None +) -> List[plotting.figure]: + """ + For each of the selected layers, publishes a line plot showing weight ranges for each layer, summary statistics + for relative weight ranges, and a histogram showing weight ranges of output channels + with respect to the minimum weight range. + + :param model: pytorch model + :param results_dir: Directory to save the Bokeh plots + :param selected_layers: a list of layers a user can choose to have visualized. If selected layers is None, + all Linear and Conv layers will be visualized. + :return: A list of bokeh plots + """ + + file_path = os.path.join(results_dir, 'visualize_relative_weight_ranges_to_identify_problematic_layers.html') + plotting.output_file(file_path) + subplots = [] + # layer name -> module weights data frame mapping + if not selected_layers: + for name, module in model.named_modules(): + if hasattr(module, "weight") and\ + isinstance(module, (torch.nn.modules.conv.Conv2d, torch.nn.modules.linear.Linear)): + subplots.append(plotting_utils.visualize_relative_weight_ranges_single_layer(module, name)) + else: + for name, module in model.named_modules(): + if hasattr(module, "weight") and\ + isinstance(module, (torch.nn.modules.conv.Conv2d, torch.nn.modules.linear.Linear)) and\ + name in selected_layers: + subplots.append(plotting_utils.visualize_relative_weight_ranges_single_layer(module, name)) + + plotting.save(column(subplots)) + return subplots
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/aimet_torch/visualize_serialized_data.html b/releases/1.32.2/_modules/aimet_torch/visualize_serialized_data.html new file mode 100644 index 0000000..0f20a75 --- /dev/null +++ b/releases/1.32.2/_modules/aimet_torch/visualize_serialized_data.html @@ -0,0 +1,1214 @@ + + + + + + aimet_torch.visualize_serialized_data — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for aimet_torch.visualize_serialized_data

+# -*- mode: python -*-
+# =============================================================================
+#  @@-COPYRIGHT-START-@@
+#
+#  Copyright (c) 2019, Qualcomm Innovation Center, Inc. All rights reserved.
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions are met:
+#
+#  1. Redistributions of source code must retain the above copyright notice,
+#     this list of conditions and the following disclaimer.
+#
+#  2. Redistributions in binary form must reproduce the above copyright notice,
+#     this list of conditions and the following disclaimer in the documentation
+#     and/or other materials provided with the distribution.
+#
+#  3. Neither the name of the copyright holder nor the names of its contributors
+#     may be used to endorse or promote products derived from this software
+#     without specific prior written permission.
+#
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+#
+#  SPDX-License-Identifier: BSD-3-Clause
+#
+#  @@-COPYRIGHT-END-@@
+# =============================================================================
+
+""" Class for visualizing after compression is completed"""
+import pickle
+import pandas as pd
+from bokeh.models import ColumnDataSource, DataTable, TableColumn
+from aimet_common.compression_algo import CompressionAlgo
+from aimet_common.bokeh_plots import BokehServerSession
+from aimet_common import plotting_utils
+
+
+
[docs]class VisualizeCompression: + """ Updates bokeh server session document and publishes graphs/tables to the server with session id compression. """ + + def __init__(self, visualization_url): + self.bokeh_session = BokehServerSession(visualization_url, session_id="compression") + self.__document = self.bokeh_session.document + +
[docs] def display_eval_scores(self, saved_eval_scores_dict_path): + """ + Publishes the evaluation scores table to the server. + + :param saved_eval_scores_dict_path: file path to the evaluation scores for each layer + :return: None + """ + with open(saved_eval_scores_dict_path, 'rb') as infile: + eval_scores_dict = pickle.load(infile) + + eval_scores_data_frame = pd.DataFrame.from_dict(eval_scores_dict).T + eval_scores_data_frame.columns = eval_scores_data_frame.columns.map(str) + eval_scores_data_frame.insert(0, 'layers', eval_scores_data_frame.index) + + source = ColumnDataSource(data=eval_scores_data_frame) + columns = [TableColumn(field=Ci, title=Ci) for Ci in eval_scores_data_frame.columns] # bokeh columns + eval_scores_data_table = DataTable(source=source, columns=columns, width=1500) + + self.__document.add_root(eval_scores_data_table)
+ +
[docs] def display_comp_ratio_plot(self, comp_ratio_list_path): + """ + Publishes the optimal compression ratios to the server. + + :param comp_ratio_list_path: Path to the pkl file with compression ratios for each layer + :return: None + """ + layer_comp_ratio_list = CompressionAlgo.unpickle_comp_ratios_list(comp_ratio_list_path=comp_ratio_list_path) + + # visualize comp ratios vs layers in a plot and add it to a server session document. + comp_ratios = [] + layer_names = [] + for layer_name, comp_ratio in layer_comp_ratio_list: + comp_ratios.append(comp_ratio) + layer_names.append(layer_name) + + plot = plotting_utils.plot_optimal_compression_ratios(comp_ratios, layer_names) + self.__document.add_root(plot)
+
+ +
+
+
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_modules/index.html b/releases/1.32.2/_modules/index.html new file mode 100644 index 0000000..a18828f --- /dev/null +++ b/releases/1.32.2/_modules/index.html @@ -0,0 +1,1163 @@ + + + + + + Overview: module code — AI Model Efficiency Toolkit Documentation: ver 1.32.2 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+ +
+ +
+ +
+

© Copyright 2020, Qualcomm Innovation Center, Inc..

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/1.32.2/_static/_sphinx_javascript_frameworks_compat.js b/releases/1.32.2/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8549469 --- /dev/null +++ b/releases/1.32.2/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,134 @@ +/* + * _sphinx_javascript_frameworks_compat.js + * ~~~~~~~~~~ + * + * Compatability shim for jQuery and underscores.js. + * + * WILL BE REMOVED IN Sphinx 6.0 + * xref RemovedInSphinx60Warning + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/releases/1.32.2/_static/basic.css b/releases/1.32.2/_static/basic.css new file mode 100644 index 0000000..eeb0519 --- /dev/null +++ b/releases/1.32.2/_static/basic.css @@ -0,0 +1,899 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} +dl.field-list > dt:after { + content: ":"; +} + + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/releases/1.32.2/_static/brain_logo.png b/releases/1.32.2/_static/brain_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..72de002b17fa85736694295bb93880ffedd24abc GIT binary patch literal 10266 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_static/css/badge_only.css b/releases/1.32.2/_static/css/badge_only.css new file mode 100644 index 0000000..c718cee --- /dev/null +++ b/releases/1.32.2/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/releases/1.32.2/_static/css/fonts/Roboto-Slab-Bold.woff b/releases/1.32.2/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..6cb60000181dbd348963953ac8ac54afb46c63d5 GIT binary patch literal 87624 zcmaI71zemx*C#x!Tp zndIaoGr4k-bN9U&_Lhd8SbF`U&{aS5&tGC24eIF6>x)sAOb&v zfVhIZGKkgz05Gxu09p-Ln#TZfWmRDSfawxMKLh|EoVkQZ`Q(-Vma{B@>M4POeg`;B zkdcjnJpjN;2LM2A0syd<0h`_}My}4p000*vh=&mrIB6Qd!%gkYY(O+#0043i0Dy~+ zMDP?cGjIac*g%2((WW-Z z97F_wef;$GNYK zfxA5bOcYe@pSr|Q_wavg4Qxz6G!PGXCa5nlCp;7+_I6Ir05EaTdqH{!{e&2vHVd-7 zqY0?4Du@P%1cew_u&6xu6(fCPef=#1e*gtEa_Fq!$Vh2VDfAaI9A$rFawGD%3Zn{` zgy^VfK}VWhXJU_#D|iSpz)(AE6ae79l9T`z{7Dgec+=K{^=9K?!wUkQ%eaTrpjIC> zLC8Nb@pFsd7ck_Sk!=816dlWeVYWSNRMZzZ%}6%bZDUA)+~NZV;g9^cr|GFKyZe`} zidYTZm7dU!k6>K<5q`*>Dao$Y2>XfSh@4lX_chMROUufP07Bu;w~|>J@*~h z8aP=_3{}bwwX%57OdFGJj?3eh?_+r|_=znRWSa|kViSC$RK)Ok@HyQrquqh1QhUm2 zD#axlDzU|}+qJuj4PN`wdW1Q8w#UyVncX4X1;k;KqNy&nG-avs3m&sQqsS_7#K?e| z)9F;OQ!VEQ%1Qf(Y|eN+2lxU}?rMDt1nhIO>18ni9TBcQ4`8!U*6eXw%5OuafEU=M zwS%l$`22YQyA8YF*h3ZaT_6lZIAm*v7dFfhg1$5=H^f)z%E@iat(7w-QOoT{3(4)~ z>cHV9nMzvk=|x;0r~8FU5u%2{?xjU`UU^#WHgM&BANT1*`K1sX!83!8KiG*V82yx5 zBx8pm+K>F!(2D-b6Co81jUK2|S8E@zTp#2Ufm(hT5V@_Z#HZsaf1oaKyOv{%w0H5_ zF}kq>VThTK0kHmIOHDSb|MS6asI}pF(lz)h3>i=(L~5xZ5%ZO4hJ>e&6bqi1`$qxf zPTr?6Vz4nNi~<%Q37jRQ@=rM?^5Z;yB?B2Iqyy+#Lx?6~f+hnP79({gynD#{T|p)o zE{8-e&8OK-0s?8KfNj9tEK4B8RC$x-Zs2hl zAp%2Vnc`G2)ij&Z?P;4h& z%<3zlRmIRw#E=zlj%7Z@PCA7ZOO6$=cqgRTid)aJ*mNh^)QV8gDgbk<6Vn2X|4&Ik zY*WE@yAd}X`%_M8*u61)~Lr`Cu}mS*kN&o^z+?JT)oEtJwN%`de{ zVV>CI9!cW0fy3_Tw4QBdHKB)(uvSlLu?{uzk2GPAejn44UHjTur#xN#)V|xzS;r{v zJ#o#?|rTB2Nzj~0wg0)B;Y#eq$=S|I=H05;jlVrq)OouufyhCVv;G4ikyye zt9q-1t4$@If8|ZvNPa&3zQx9AskF&!-ihX(=c0qn&$u%+orBbFAUaBYypyzpbOL_c z*PY#7AjL9BvkGHSftjR&+ZpD8JnlJ%7|jvtVNhYUmpHpEvYE-CD(rE+XuXd|Z6hJS zvLj?n&L%}=GSS(ko?AI{$pWil$->0!=c5EonyH#sgUWN`B;tY^#&}h{imd_c1B(QD zL$vZnQa1XCB`RWbX7Y;dLZFM`?oO-fi%eE<8YCS1DAQN>V61MQONDas4iiV=ysO`y zPFV|%GlZ;SC>gCNUrg>lX8F zy_yfLhE{;u%TviO#PqKJrbQVu4`B*EUA6-0De%WuSFgR)+}qiuLfrYt)hnrA~eu9CPLJY7CI>6paS zWnopw;$U)dp^e}K+3}Y&a@*xhfM}R|{p`3LBacr-0@@jdb$DYK?&I$w^NSzRrP_ObwH`u$VHUzG=(mgYH-8BkFliqhRIf0BGd z#SQg;0fKNb#@807bm?Drgy!lpM{LR48+WFs5(5dCRWWRk+F6%u!UC!_e|G-NAr_e& zkhjKs_ucr>s~%Vl?bq@7jQ0$36KTUBuL?@_DYrCJsOXJ$Y<%D<#UD9hAiKhziB?l{ z+@3`ziu0ITPg|%c2ncA@g=VtiSPCbJ6n%WEhX-?xw^!rQv@vT8nwRq?U+&teVHix6 z?zsBZFV{XuCaJAy)0DX&{jBMtI-uo7(#+pMpP{GQ%-HqM&}N zunOPt%jUEFRew`XR|b8$R#@!TW*RD)Lmyx8k9~^#iXhmW%OvI9{o5gwvKwbxO-Pr9 zrHL8uC0;lh1-W>*+wP)oZXv-n8PSUr9c@>~L*?3tB`{h`R5jcBC;`!sC*ay}P3YF- zOHx+}f^xY%^qt^rl;*2M-0sVu0O`#xK|d|V2Qchx2z-oqKg=uf{9PTB-=1CMHOX}w z5ik+PI%J9ATOLj_NS9a6sqdVXRmc$`@|{FPde3Ld@i=>DCcZ9vU4_8Pt@60L=3{Ddonu+Kt8=A&#Vn{1Ypkd|)aXDP#76Yobb7n%}Flnxrd9qH4- zWI~QjPwDfrhjA9no=4E%bL6QaE@56ZdTHg}5v+wEZ3?%SxQv=RuOi0^w~E>&huyhO z<&aJvb9)GNqf>5R2$CP~*2xmZXFtOc67KBLCroJ-^HXR(Q@yh1Ym~M$BF}dXymZb; zk>B~hz{vA7M=mt7RyFZ=*!h6O412ly#z@538Xo1Q%QXY_ zis@n>*p35+Jl|D=G8Wpv4CII7V^V(+HiL=1WJu)d#D2=;A^ULM(34*W-VzRN^APY1 zkhD6f&96yS+dXkE;QJKLjtK>wH@ItlmA*cE0+Tn$X1zfoxOK#8Y4e!KSQ016l1FTS_y;IU~ zH0H@KQe66>d{J0yJF!U30V2p|jjwpP~RQcZ^;^$KDSF(j~Z6 zm9$oU#i>!atd#+3?Gb6T65}nLkV@-?ZE6^KF87fk5twD`FPTW)uDAlX;VGsO6izN0 z^Zi9Jr}G(4_W~ix1M(=E*;L`Y@`9b|Z2{J5;X$4yw4?MBL<>5=7ipHZ#He$Bqkw_h z>4)%&V#x$ZWi(mi=BQKlg!ONdCONiu3p90^w&(fiDJNQ-2N{i*E`OJRb7xXANuFPP zVjbTG#N|@OJ2&oQu6BsxlSt>6I9Z#v zu$#o3+v4i?$vn9P%7?nx1O>)%-!huKh1e5ei4WyQ{69$o*73?hEi4^L|PM6o3OZtv{obc z&^9FkXsSNueb?fEWGBaqZYg-?9Qn2HM|E(mEA%4SDm-WRD+CQ*>BTHu_sCe zEtvvN11~9xQ;IPTSwyAbnKP=K5s6$OK;z-+S*|Q88@U2xmolu#**gnC5nKlfGY9rV zdxpco&ZC=Fe*_EMZh4N~d?JoQ#(VzBeWE?`x)AH5mQ+t&+GVY#cpDR*Wj)tIR^67U z@gpgY)%J11x{_0J&>yI)?jUKBh@B%W@(Jru-XOn7F{-F=h%yW0k~4%?PM?xFNV_3@ zQBO0A%1qcBMv_GG(4vz&9`2MBS?2W3&B|N<#-pA?r2R$qY_ZR`(%eS0Df&C*ne~Mr zCAXI>*0SuqQO#R*?R4Wkk>x9HdeV}K4-Zj$_{=(WXD)GN$W#jAL$20vwPD&q*& zK6rc#Y2OZv}J>(0U_y@);yb6iiTJo;V=z!?!ju|Jm2_o zeZI|odXun6**3LT8a}ZYBi?#LNzbO*)~oWrGO0CemvCPDZ z1(^{WXJFJ+&azKH<)Mk2kSY^ zs_$-lh>7D>*`2%tSFhX~ToY9-EVe&G0ec~2T10UPwF?%n|KQT*k>M1Ur@yL($D8Or z)F&&Q#7w$_DuBlT{iTg?5>b6 zYI7KuM$~c#OI*9xvk7l^EQ^^VO}s~>Vp=v4zEY&#-xi|;?RGi;Uw&cd&HLDA)S{sP zLl=9j5^2bH^Z0$FOIYKAE;p%JVi&ebtG%nIoo|6Y?R;51!W5 z4I~R;7{UWIc#X+n?>@7NeJA#h*Ynkmm!{kFtik21{?@1+x$~ISgwU^f5GXgWP!$J8 z{M)Px*Ib#q><@;GJ4AEY*9kVy>MKsQ*YWO{TclTJc(4wN8)>!f7IE>_Yv%VIyuKyAL;H1Rq5w!h1 zZ3dp0Cd~Z8wS`U4=kabMC9TDrQ8r;rZ8iB5-o;#yOs)j(4EtM1y2|z!xr0x@nFO_l zJc9Kv{y7B*P}H^thk@Ac1kxpe%J z?z4G+@&$3N#InXh@s5(_Y-?iP@G{mVb#9muk>f`e)PcufO+CCAn~ZE{Ev->nohPzA zlx4J+d{4(6Tz^d`8ycfJq#EX&LaFt5Ce3hy`&{dh@GGeoG^PiaoHrUhiF7+SIVQ~0 zH>A>&yH#=faF(iV9xT895kg+G`^8ri?7pvWniK3zG7KE|c{-ysM&i7YaB~j>HMJ8( ze4R)A`qw+1W!|Bzf$>**n{P1x(GhyQas0UmEpf$HIL07TCx{)F&2+-ZVT_ zbJ&9`s^g||GWesGPnS(}}GYKk(r;UoZ) z6}B*CNMKeQ!>V>1^_kNMYD%T7US;bviJKM*_+9+&q|}#SzPjMqMWs!pNLuyZNU#V& zr9x#;O7*`*f{jwD<^Mz~$?z(rf+3(N27X>Kj~l4`lLiW?@Dm;sZDAxoe=FiwER$C` z{$I&0jL(nXpnBU7bLy{~-PF{dihLS7rkY4z?-{IG-#0fb=IXmH;zbHxkdNjUUgMpWGnm6Db@C4DYp!#4C1!9gGMp3NT0*>ixyB&R zBxMYWeQVdI!F;)%Ro|}{f`JXuqP|wL4sR=XI^7eNshR|^B72VTHjJc3FKW5BCy&{h zgqL2{Khn>yGb^a(19;`vZg8ex#fI3D7dg~FoLPqk@^3kZSXUqMjjCKEi8JvJ^O~$r zfu4C|O);X9ct+WGAAh_GGEc3%1dfh;S^NXm@JqflV~^LOT`i-$38<-)I@c6fQ!|L7jN(7}5EZUu~;6m0s| zrqi%14?Y3i18989elP}u(YTUBcw`E%E)Lcyd||y`&hJze?Y>9!iamRw-X<=>&yOm= z-wlQ@DZ^q^xOysESRvT^Tt}%s#A5bSlO}gNO5fP}0I?%(O7+U%pOrD%9{)45wtwNHWt9ByY zo#Zu}_4iV``Kb(@Jw=s0MVBiDCJ)AHe=_0#2>gu;zkG_XjolPWw(^XnH_Ur31cU_kp_LQ2fz5B%l*`Fo_a{Vnln~e>#6}#BP93D9^)@Yw zs_(KRF#8{kXQ0k?VWdZOhZ(ok;@p?LW?r`WB-t;yUPuy?5@^R9xW+zwEeoz3d z7Qf&*q3C8uyY&O+I}-wQO8P`JrdFRrny_lcy#&bd3zI~W9FmN(!Z(X%T22(7+>|RD zc}8fBryq5>Q;W}IGMHs}{tl0fHwRzL)dcfPo9Tu|Q_Ka$StHMk=7)S8?Rvutv&4&- z?eD3>4@-f8e?-0QA5lj>0lnd<=^LeaPK`exYra?Nywd@yzl|yr5%c|Cz4gGl&=Hg!_dL#Oj(iKoa^q7eX z11JO35!+{3*s)a|FVz})_8NO$wRx+oeV3~2W?T4PMq{eNZ1k3_;YYskJ>u@6Q_8gB zANpPM>R-k)wck-cOjVpy@0y36X&c|Wn%}$Bx1;{asUAg1nW=Cay`3Q&^>gK*W|er# zT1e8qqBO8xRv!Cdh@HrT6z*v|$aqGu`Ci^B*Dm1|c}tImJmUCKoe9rXMswZ=9ObUd zsfDgXE13;W8Cn@dzLt7Hn&BrM|BpUXX{iVHNoGw@s}!Y}m1BiuIXf}r71jRl769|r z>OZpfGGP*b1%H8|%IMCX8JtxZ>e}RLlX2Yq%TDy<(Pn0GN#AJkc(cMUvm={#w;*bB z)clP(s-HuWW!~41nLm?@cZwJD@=K(9sF~)(O~;6mnrE!4_W&+`QJl-C+5p7Nr9Qoz zC2_bZ*?kV>kk@ivwC>3DO^!f#`=^%K}HM`PYgIBz{T zbh0iz^YfaVr5Qy>AmG#VuG8%TzP!h2XycLB-mtJ>hWFO>%rT6T0I~%>zz7?CNE6fZ zzI)u&`w)>Qd7UxWBdh4GPh7pl5wvRzZ-x{%6n;Jr7k2af6cF%IQfB&RVWt@D~I23E1I$WZhcfCB}R>nOS&Es=nE5-K9_M6eF zT&nEIye;MG_{Ob4+`ImhTdnl5t5oSFpH4_3XS#B!6yGN2zj)AeEuBBIo-53Wi}74C zcN$7ZVzz~PJt}2mSE<^9Tzj0ouF@LRPKN7M_`wT*M&lsm1pq8WMDeJAh z(*GM=yIldV)+JXTkKG$~jDG#*OCyjN;#jFeDUd4a*tuvI_kAR4jf!J*vdJ!9`>y-? zse7BJsXlT2G;fLb!O0)~h7T=w%2NOA`$Z=2ONkXFfk@>qNe1S7^pKU4C{;byeaxoN z<7Br*7;DCd$xQg=GD{7cvJ~g7F$G$e0S%me{C(`mmEB2r_@ z-V!O}rU|&lgq3UIZt_gr@(wlJ6Iz&)O}ZOwTkE8EkX86r`bNo;KCCjXN}X=-$~e(9 zjZbJsh~S+cA6lB~Odi$ymkLx%lYM*3ktvqLU%bYH zYYNFt4tY|C!0QBsQr!W05G+<%Gsju%-bEglutKx9`4ter*<0VTb3(|c=6Ruu=u-!7wkn7h8 z7c8(wqt^NsS}5_uy_Bi7#2!v`aNIJEkXhGr{x&{LVA@6oXPk)fFTYXKY9jly&)p4n z)f*sog*|?B;@1a4{jMJCM*L|(uwykJrkg30BPZKA+YP}s9qXp)LHUGdrsf6HiH&LJ zScTgw?}=eO1N-0HWW^+>E$gn0X~!g@`WtV%jcGFt&J@I}uUh$pWtisY%u#k$O%sap z3FENzPhrodiWRP5lle=C_|eF<8a~J+!z2Gp&NX*VIAi6^g^kAQ38R1EuGumn102N8 zf;~AzD+wW@-8kPTtBchCrctz&Ewr4V_;weZ8Tv=eILUSv3K`ChMu>KM_dseRs3jh4 zh;Z+(%5XM4CQ32EUyO0EQllZ905Vu5oISp~Q86H>wlbuIkkG}Nls)ean*3{OJAe*L zHQR8UbY}5p(`|1H{B%-4BhmclkTpP3CNJ#`-#)5B;hcIU$R zMVs)BsQ=Rk`mLODM}2U~##|63KF`iGZ%_s1mVy4leD(Z2@h$C2{6 zqMjF}+wgp{d?Vf%MZ@elG0!LiV$pROTepwlTaC}qnE0OGzJ*J`o7xR??j?@ZQ`RQ` z=tjkbg{%9-Qz;J6F+{KV(f5xWis$wRU;q5|;$hng2t_--C0`4!mCjt0fS0u>Ha5TA zTB{5E3wTEn*p&Yo3}hmc&P`JL_B4%L(cE)Idfo!MxzJw=(LRPg`rn_|9t^9WAn04> zx+*QCy|`!68FYsBor`$*j%2_4-uSf%2tfFDUw^pL=7LF=_uzPg(jGjcV~0K0-*X@q zWk7b5Rersd_I|zoUx2|AwK>T53|c%;yt-?z(Vkw+`Yv8VSJNgMKQJcDNaU}+e)I@j z<1^L-r@Akn{4W51MfA3L>$%#kPnLPtJhsUzet*`+oOOL;HxyKsw8^ea;LubNN9nzo zWvR_!1^nV%0@K-&VKHHdLsXXlk*CHJ3;2=DCCC_x z{txVgC!H{BE>79Tl%$O_#J4v57G(mo%Jz6kYD`Go|Nnp@sgOm_u40--o#d*>i!c(p zlC_e$zFAp|A^c=p8MC(EvDzblVRoO&g%;i473~e9c5kud0){rXi?Kvw^<$z$>2(t0 zag*0Y;L(oP#m!{fO@94Om)7rNZ+%(L!ID?!$tDL*l`npj?5~MbSc3nC<4-A^{84>r zLsiV{yY;w9LFOJ;_RPBPK+_;UfYR~NoV*y5Z%p&q-B!n=Av&gsIa&NK?2+(ee8cJK z@jIBn)!%{-{4>{N6V@1*p=guoa9sMsDpTm6Q|zV1)P7^X4?;?h4^!6`r$`7JrDAz` zzfn#`GZ$)VQPD3j=er2UyReq%hI;y_#TggaeKCWw?m}5#a*jt1u^G6`Psn)DEDcS) zO4n$2Xbc8-==65bD28-jj3oVg{7~qaIW}JCvwTaKq47Y#aYBw6aC*p!H>9|#Br&AV zR=zoLhRD~QuE$aRZ(rhSc@D7YNfc{V#z`ENUP^-jPEX#fN4jPFjQMZ2YrUGR z1MPj6pJjK$JBW)1$;F_6PpkYENRf)e^y03{l0kRagIX zeubVE=Zo`?#?$$`xI|*`jCGx8HwY_7DqJYBgYAT;@x{9wSfb=r8Q!=;SRRb~N8p;} zKEDSogq717k++(ycA#drrgsT8rc{ictlGKAmMD3L>-=fDB<{SPdKDReJ1dmoo(f52 z0dT?nWKuFq`6&2{WDDACpGUq&dqPXd;e<{_#k>nXlIidd^O9nZthovvG%H2?iKxT( z?6AbD_Q)mR%!ps`8pMbm7$9WZ>EdF$`L7rpn%Y@3oiPn8H^nn&8jRGtaXV>Ugq5#F zG#@@hf7mPyg!}10d71XbYZ61E)qMM!K%xsaMJ0sOq0n1M+auo=D4?au#QiG*)wux6 zAg;=vU@4jk-@t*hcgG=y{14K>HyxAFmR==$1h@DfFLW3vnwW(3*1RTM?o*Ce3H#e@ zAe!V&O;=%1y?X_6#Ws8UN6$QAR{@`ba%g?RpeC;P1*#Ws|uD=b_R9Bc~@ zxABJ=VuEfW&bLPIx!3dvX0?#WI@PyEcnVxmgXXOao*wTFYopu*<;N-@TeM$@j}bQ;K2hj0MOP`2v_ zoCcEDA*75kXppq)7o7&GGDRzCu=p)8`z_T2IO_nxED#10=-U(EXcO?i!vi8T7El}} zkgqCG(Boh+BqzW}D;Q_e*;q6LjO*S<3}Z%2??()fM@;0X3>c_PY^jW@O7+i6O$k9e zeSVo~lo{!n>|4>u2SIWNA+`sRga;vd2PLX41~B!#45oQD?iP52E1{W9Xr(r3E1`V0 z%oxq-1m{c`Zt3+4hL-fj3+Sbdke2jKT9MTYJH?HV+ZYIaW(UQSkQS^$I+1w1NN)WE zZ%8N%!;#|=JFLIOzFJ3NSBINza8wt{TpesBImFe( z#+!xT=Wq)@&I+!dc%}JeYGBI6dexOgOZ4<~XITsr*Yz!=dTPmRO@e|DeL5VLLP(4* zKw}I(Y1V+L)bO)%sZoZ-Tv$}X*UaT8MD3*jI-cbqaIfVsd>GCx{xHrx?mo0d#Te32 z=9s)3IaX$Q`@T~djGIp-6LRd#)AmEB-WVg|kG!M|_Fxtaj=wtw$ZuFuCuwzuDrI79zZY#UZ>| z^6ta9p_ZRC9_uTT3!qb}F<{}lTQzFf~9F|^Moi;*E%F?zXS zCZ$|D+fW?8P+`hf$u&t*{7(eqh7(+Q5bTscY zHQ%wPv|(RxK;LY+aYIbxar;J@& zJ2dFap_C|1{8AEtwjXVte6PSfx1Ya@-~)!eMc&>$;xnb8n;F0N!BHevC}8UR3UN>zvy~$n;Aj)N?>07Uu*G zgUg632*7FbA>GKRLw~J6bpYh7BUAaxC>Rk70YNFIQLh64CnO^6( zIpsL3`|AmpPg7y^iP>tv)J9v;X1MWegM0IQBAV+-J`Q6K^gy@ny>(0u_->dA_+(O( z6q`Y&h)XcUg~iLGDOi6_(nwG${~47bNKaeTBt(EvChhYx;H_)z*AmOuJg#4T!dkcu zb#V*OHguxe<0aYqzc%WQ^hKQ;9Jw{mb6?g&as(NrXIFosyoLXjB4O4pfhaf#g=AT(9inJv;j_mEz>Y2Q|CXb7C}u1j;TF@o&r8jXWS}Up-)~j zCak7CfE(1P*2B#Xz^hD>#jIPFTJDq6PZd37UoryoT1N4c+94kH-_0W4DeR@D-TG?g zU!O9~g}`OE6WA*{eu%E_U#>RAW((kuU8_U4b%JTJ3R&9)yZp7o%i?aG>|uDBWH#Vo zJJ_+6{9qNtfqAvC(@~Fo@wD|8FW+Mpc{8|GKKL}`7KbK@KKO%LOh*%5Fi%+6gcfD* zzC;BI2oU`NyI)5l&45?;Sv^Y-jvO{w1wBb=jHmKzJjzCpu`zAGrA+t5Z+PCHn;Q8cQD z9kJUfpV%`;=~+S%W-x#}juf^Z+V9wJ(7MeuaOA-KgALlMLc^$L=zmWPcsLL`W)U5h zGlnC~VGV^GNA8f`4La05C$xO?vCsi_(b?*4nCU5P4OY>da;K(gM}JaTx1qJ5ZPM9T(LCm9rD>OZw@|l1b5hAc7&{DxS7p;r zj#stLw00Z1UHoCkc^7$wj>Ll^w5ksSi`yWiFx?VZRrTjf zU8WuFO|a5-B#=f<(a99S7tXWwS0iXY1zIhXa!wfZOp%${L+hWB$2h9+4Kb^v5OMXw z-4#y2WZKOg1WhhZ7j%a5icJM&r+U<7!SFDydMKZD#AI_A9)8XlQ&!aWYPdfRy-#Rd zY`p)`sD2}p6Jd}u=mf|acT!yS8+||7hw1>-fO~nMF)ED*9!tB!>7zB#_Zg$fZ6|lY z*C3QEh5XbVIVt^I;=*Z2V7f7)4LGT}WZwwQXud)2QR3}WlIh5FE4U=w2%7NnAkybK z2qjo;GO8mm;BmDct~!IA%2&(B+=D%Ir>7AI9*)M>kRf0>py|tETGbiJy0&J~f>rI% z%;`+dAG7HMt&B~mQMBfq%!3>^L-1PBmd`TQeBON}nes~GYCJB%@?P6CmB8G)8C6qNfs4WN zJ)rOJarGzFw>qpErHW@&MgtSgyA!+I8UOos!y+YPUSSDg8Q{ zG**gjt+T-q=Kmuh`2f)~G|A3jvu3?J^Z%b{P1c@YZ9xiIZPo1z;+f-VRql*zpCh^! zF}6y3O(QB7*rudPaTsT*qT5X|(Q)8#gIMe5JMLU7-x&5eep{>N?}0cD;w|ML5IOGW ztyq9ZOIBTP0w(^?2%|dz*lYJhZ@G&5nllp_!j~*?E#5PAzO=0S-uIm;y8Buk(r?%9 zc=L&;?>+QQcXgBCr9G2W7D_3ZW{#ah$?jNHdgJ(gu9{E+;*VsI+Ohi-LYYAa>BgVr_ezF+Ga?CQ9Y1q8aiH9MWxQc0 zx?vNzX$BxP5F<40VjAXQnr>qn#ABLJo)%`;&AL+L>V7|~$V$9%6k-@NX(d(P&(KN5 zb5yn+wP~e&*z4kr3%iyeT*Uyn-|w|{#HFIsGo#ZwpfkcHP)R1xQ76z?TubSV<9X0t z>~(s_#a>JDk7GSqZtk_e#u+gs341gEei4#wMa|CutcplBulR7U3fKfOtgLlwmfBYJ zE1C`13B0U}>4Tap8&o+htj>t#u-w0I@#UDjXXI;59hKxUNja8Jov#&lVo~WjzQ-Q_ z0HN<|G@={o+$%2Sw6U+)u#`zqbyg95YmiclytQLLgZDCy3e7=YDm~akEVw{nQ58{< z261u33DqNiVHrafj5306dADtCDi40jXcrftaW>L7Z5?a~3rG$KaKS8RhJYyG4L0o> zi5nX5MUuv;Amn=>J;;WIY&;R`DZQ;kNgEuh>8 z9B>kis{2=VqGBOFtxJ6poz6~IUzMSJ>i#be{C3?^o7FLCoAya*JDbx+SI!l{9;H!0 z4`dk_-1B8s;2xMg4j(FHBLFryG{QD5fL!CpxR`WR5=m}O35d^fv>fA|*KxcQ@?|YF ztz+ds%C&&4$ED9@BF7DmbF4&9eNUvg#>O1axUo@`L*<;JE)oQqcq=nk&hXhaMCPS==>GO03P_=zpXcgEg2INif8f+D94i9{r?_yBA(|5dE z$_1f=(X6cwI8FK-F6nmQPk_R7IGVL{bQw$8pi*dw~1y4k5-~5XRi^Zq2(d z_9vVhxWLW8Q9Ogw{dMYKXmFEF?R^gWJ#&bg2sZ+6(~+#Kbc400T}HH%K52FpQ302o zD>F@YWXNo{rWosYLCIL#R_WZu68fk z^X2&rVe8D&m5V1Vd+279Cp{MdusEg{>Fu&OpQ=u)>*LE7tc+$a#W|RrFPB4Gn?} z)aqZIrOycVDXOun7P%|nSP|hB8hCH+dV&Narxx-@C$Ih0age8qhA-9b)lxXvBHMnWX$3- zMY>@Ij%j+LwC#bWemr@~etha@HBF;zB=-HpTpQOVlUN_*PYQ7&F`Ng%${`iJii%6X zANE6BSUQe_jrnW#;{*@9mm?U{Kd7e=synWxU~;{w^S*4pUXBxea3(3?auB{k!lKt@ z%vTO$;?(Vp><)xr<-*g$B z-Ekj^?*YGodmEGgkmP+CUnj3ps&tdijr867ZqiNQ^)`}%zWXgtHjIJK?}%0Z4-wgr zOxp8wl)R@@DU^R7Q`^VQS^xMNWSxx{c(W2$*l#c2mw2&QRw?($m+w5nwpR<tdPs!! zX+}9vY{1bEudIyuo$fc3=C!BqA0=ujnuZ~&3mRr3HkOAuFilHpVcg3Gix_;8x~Cp2 zFZkw4$~ni>TDuZ>E58}|ZndaTSwR!^luvVutLaT<`ec&coCHC8ARp7~3oIcrKImeZ z|Gu9XNU24?4O{F?wxi^BdB0qpOn3YLjH?MRO=}4*OlpX#$m$5pPpJC=%xDWOPHBp% z%IONoi?59+OK%M+N^Xp<%-NUV=6&ukAnED!P&9AiT4r}93h zAegU#Ybm>4JXCK_xKQP%p-WL0WWm#vhU zifUI3YG;vaPlmZcx!#JW}j;caDK1!iq_xMJvXwtj1XlmoM)!A<_;qfT?jSUB^}a=+wslVgq~^QWGqGEs-rg z(zDN;t(;@_1*6^J2kg;CuqWf3SA3gA!j~#+0ZEMsTkn)F0ZDXuaz!a%!fY$iMPqqU z_J2I}Nab)PmRT-;St#-$OS&;oWGnRt;VH^-jeU*;W>Lh2RvJtYp0z3ykukSszQ2`3j-vCIvh<(JduLoImwdDV(tKBr`P znDzU}zraBih6HOp^sG>4w_?8AeFAgdQah{S^GJ(mxWrIF>{m48un3tymPF-n72xSL zx7vgFC)04aqsB=}Il^9BNX9e1-q=_LaAt&`#!ro*xoVoWK>9F6fzwedXFu83+!mHCWg?pj`G;M{x| zU9|u4fmv+%Q+aQ5tM-EIS?+_?Io}nwVF}kc?+Kz3dX}5qs#iz_9TVeXLJX_jaJN~vm2p9{5aH$69``7IYg0Jf6pcFn~weNhR9C3%e znh=i8n44#Xo*_E$NNvwj^hQM9*`nhhF!M#$CDgnfI^CX?j*oBhOW{a2=M%3SR$rYv zU5tYd%MeXC=33c^^rKTuUn7#fyI%h?m&k{yIMr!=u3tkYV*w0n`ADM?J))N88k2J~ zqGQ4G1;Sui;9%g+wL&!FxNr-i%$6t5{QP7^KSUamY)Rjb<)BmY$FlSIaXp$ZwQ~<> zh(3a`FA}bD0>R&boFUJKxQ1_7-LG3&Z749?LQ0D?#~kL6xUlSmh6Am5n&Hh>!GDUP z^%DH@1BJr;C(Q{qACYrZXkGDhE&x+x|GP$U@yx~6Q$xc}d;3DIF6AgEm!Bz0UOqxa zg^o3K&9Ww~IHshbCD@a$}USiQ)4(>4Fj6C?{ z!amQ;OQ_jR$#zL;L?nEe%qP|b=cq72MbLzn8iaF)n(MQm%Od{nL$yKt-Mjat4Ld)K zq=2=?5lh%ViBd(QM!`nRpvmh9*&e<(hN`0?e+uCbnjB<8Rf^H9=vmdN^{Un zaIlXL01C+V)q>GcQNQOuOyM9laaYDZ{=m4_G1rhEt3PK!DAF;jf`L(CgtupTwkzk>M=Mod$@BAVV`Hp+vTODvy zDWX@gjJ6c;5DDGkhj3s$81^mud6h=a4h^Xg(Fp(`Sz3uWTIu`+1syVmz6%FNOFAkt z)j1To zT?$Nfpac9x3{DQc;WrT^*>j7mPS&5 zR|RZQLCEf^_OvFZzD(q1ajFM&wtP`YI!=1*eKz0T!m#Kdo-t-);n(wEFjP3`{GgR|X%6QJ;C<{3vm>Euq(><=7- z2t-?n!jHAoV&zax32XvD*6>281ds|nL8X|)=(m;9`Q(ve!tCP|mUs95Zm{A8a_IqOa#J(tbk@@erDy7!iqH7PMPTiDsEj`!QC)t;i;e~uMjt}Ff zp9SAKxE)WO)N?<93n0kRe!5tK=(0+LhabATL^)gcL)~EavN|jD66bR{A zK34!Wu8sySJX|b}#CcgUD9K%_kFC81gsgVW$FAdgBE@4f3Yzr*4f$qw!;fl@@_82ED|oCyilg-*VCoMT1# z=hv;7@N=2kR=N$|U*)wg$n-6*>1HV~jRZSXIMK~$cKgqs%)+m1BD~~ca=O}*j+d?& z+TSgV~rEHzD}$&)>AC^Ctt3o6ATWOCn7;7TELAO zmvxaKAgKdx(JWkR1ON*M*$NP8m4s@v0#*f#Iazsbj=huDmfJzL0t^(j!I>Mysd^ie zl`+=X)GNHW@Uh0LuDW8(^|JJ6XnXxUCe6L(=EdUFh1bO?PB3%sq^YxRy8bbG`HU+k zOslKVww^wI;EJu?3!a&M;G<)Ew998)Uw6}V*KKyYnUaz$IOUE9OM@OideEc$E%eF9AKwspVq@g5$)pzZB5QDzmPXvW z*1DUT+-uj;y)DBhg2f{7FlI!6lavF12Ryn>`ZL$7x0BxVduT~XX^GA0Acp&V(tR-pTYPqpP6uR& zxg9&+IPk5HBVQg6=Q+W&YpWaT8?UaawhM7N9mKAx7h$&_sc8B1EphSv9X$EU8S7^* zy7#i6P7B0y%6~O-4HYsDGQbbRLqjMcFeI2D*%)ynXNnS7P;nd;08pi&(J(nTV!=tv zvoaC9o=kt1-)Xld#c7a%8FAJEEJ}4*@(i%964@~2I$~LFmybDPt09k$Sve@sZ`#0R z4N2nrBOX*;M#TQHa7I*=j7qng1x|N3RPiB%T0EsTTd7CVR}U+> zxYd^|K1j|vyF1dFaF%g)M0_do#M5`)iTz3XxpjDh!7s|B-@MXqF7QG(=oad1rG#)C zpjrXtqy`xK*MgTTe>&x>&})+!!QWT~Lt}eQ=g>CSjLe)m^N-@oQ>Vojx6W+1Q5-#r zAjC~IHP>HXTXREB?Wob!6Dvp6u&y&UcPo5h)@vtDyf*v!!fu;q?0WazmS^f`&#u4f zrkUjYgz48zteHL?WLuH=v!nYyEHv1Sa;1nY4FO$9feo-A0~HH3zrus|FV7sVd&k=WPX{dT$w-zx38@u4T4ns>`a0BCK6 z8US3xdO{A%l$UvsauU!2DXk}I&uH&4cHUanw!g_A<}NVapCxD4XwkxcC{CW-YI#2uJy+HVg)-!%5$ z4ShmAlhGi12o$hRL&|~jhBh6Fb5;qAC9!eiSSdn16 zM2v&5^5(%~ubepSYLrciB0YMx^{(st<`Hoc^YFn{%W8Z5v1(G|gt6L=H!kd6e0*rP zE2>2OuL@(4=&ilYS3m&D;PO!AWqo^TjJ5Nl2Ki{wWTT>_9iiq?rxw$zBa){K33QiTTd9u_7RLu%dO=VoE z4Lluy67a}tmwZJBup1Ad`E+qf&~B7BZFl^aUsT+f)_M7a)%V!bzuYo&)mX{{mQJ}h zt&B?%N5oEXRNP~=;b1Hp`+WbrvLjQ(Oi`uV@Fd=f%W-3~XxB5;qb3(SySk-aHz_SiufOp>9cuvLS+o#HdaTxMCnckdcXs43|-J*4A~q-EPyIk_({+ zjlSsjSmZ5wsJCMy{tXN8rACo5H6-#wQ$-3%!HUPUCM)~4IoaCOWIJ%c)9rP z0C1K2BGmoC0O}sIG5TWsf^0{`4$~W!FBhLjBE=gvY`|PhnmMoWdU5KlS&J4g zI>5sR_D|iEpY_tsZysxMGp9S;@{X7^b;|S`UaOllwGJ+Eq;oPy+C$G!Nqa=i zi70~V>jWuj07PRjb}0BUUgY!IeO`lPc>O9&h#Z4$DsCic)0hkgu7sQ z^|nKAyfSXB-+f|&_-c!IU#!5H=-+}V)pYN!f+F$x>A-1mv8Z5|INNYD-i? z{!}xUm9IM+JueM2&iFiHTk~nVLo1SD?wt5^>Z#j{=F(Uo^7QCdzi0^>{~ zLP81F0R_d;s(}!w1jAVd8@H=A;ZQlDY)4HyJ!($qv0(%IKWWy7LXeG-$A2?=-8pf+ zoEi|i$@uxo&>;GS`XnJmDQ8i}0f8x&O*tjJ5jdlqH2|eCzQ7nO7=<{5tjsi*!=7S|qsn6nJ+g_! zh$)W7ZrSb5fL)hB?Lm*zqI-;u3dk#?jL7@uZ4Xkjk&M~65xpBXN|#BNE&p%e5DvS= zBz(**Z<{|;OdHoJ7b=%3T%`bHy~LFO?L%2|nAf<83kR56WsY$=(GBx4qot(AFv21B zvBt*%f?Mv(Y90nB$Z5-NBgl}(BSAIJCCYIw4UiHU6$~jg(k8YanW1#`6h+ebFV9tn z5{wH+j@`#)Ta-9{KlrEsVyicbFW!>#EGL+CZEfWZ8*w|A@LJw}`=`^#wVSS4ID>X^ zht0j<_eqRd&?{7$oX}3`7Z!vRWSEhj>a-zPD5L*rH&X5PSkxLG37~O{W?4sXG=NFf zor^JT9O?g{xF6TAk8GbPK7I7gh?&u9Q|9A6iQ#aj$cgMsZ)!@!$Hfd8*|D5jZ1kAo zP+_}xMi~KuMwZ9Y8z7p|%!CC1R

!pma|lSQ?8FBe{DRl|@FzhU7Cb>&@ataZS{g zrCQo@Lushkm71KyL3$%QD?KeSADp!x{f z=8g-xggQyFIyp&U(+DO4!2ygCg$vPu1pqEc^*Qa)IPstXB!i@fDLx<-```)5UsmT$Yl%a2onC zAFmUqUVZ7M=U;sB~=#ZhJ zS2lbGii8+5IZ#kxQUi*iaRi9X

#R4x5a04mzf2YJ>#U<-Nc81}`=EFMdUjIP>d| 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

b(7>T&1{%W+D%3_gwxcBR7_myM-&X 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 DnuPx& literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_static/css/fonts/Roboto-Slab-Regular.woff b/releases/1.32.2/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f815f63f99da80ad2be69e4021023ec2981eaea0 GIT binary patch literal 86288 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 z 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

msZ%O|+*Z+LS;;x4v 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%0AU9xwl*jMUcB+ zt@vIc<(}v5kuSe6$bvY`~h`D0iy3JA6JcMdg%p z7ZV?fwcIXkzQGvQfljSBy_~edTDG4|t~?+?P=QU>nCTXlJUQN%QP zY_Q6febHS88{5dJH8vMy;cSk2^Irtx?WL{3VXK{4Htlz6-g7_{V61RmcnSS7x4{n@# z56xxVYj;->6hTYrd+%O;i@{3f5F{a1Wo;1W=%WTRQHHO1~Dn z46~nN+F+BY=i~|-aRX}m;5(EZzhg*$%hewRLNENt(WjG3Aq+(CQ`5oo^jUttAN#ej z!mJfM5iFo-Z$O&c8Zj|+u(myy-cXe5i!8R44$2R=MbR?Vzy1E>*%|?w-AfZ3U@!%$4}9AtfyB5J^dwdhLk>t@sm6bCgOhD$sHk| zgkyU#nh$9h;XpxRBGhwK*cC0wFyLntAUPxYhLH!Fi)OAi18*XZ1sKpV;@YXD*&3^g zXaLJ*L`T%2@nz-MHx`WBxu9l1gFYGi0&FZEQ}0`|sJo31S|K%-&e%3FTJO#ltHhf& zqA9|djv>{T9$2*M^txWL9OKizgCY<91$BUMigmiaeG5q z2}39y1uiC=b~sHMf_@Wt>qZp}7}5}d6<-CME-|C#*MY%Ss)M)%){RVb`IAh<)QSfM7{)&E`c!C{{*KYZvXTqMhu#qMw z{opCWVD|VKI-7CjnZyL!7;_caB^2YW9bduF3N<5kx&csGecDKaDX+>?Ftox6Anh&G zNMalPvdEmI&7_ldgB^t4?Deq{sVig@L(7i33T+aK_STKBpw=PEE;oq@*PB9+@UU{{ ze^O=~XXzB%1qTW_R1I$1HWQbFyC6OSwt0(C+!tyfkAo=s>^?=U7ClCPA!1-Ik>fTW z0p6Ro2ur8^;@<4s=ujzc024`_GpN(KjS`a7Is7`k$0+5pNSzCVQj*j={aT&ZB&Ak^ z#UU^E{uYDZu2R|k24m2nRy%^mUcb@&UQAsrng!bgs2dWm)A3fqYo`(|-<@<9I@Qd2 zql#ooJC-&z&1-csq|I;*O&UTpqx9C~hs=?YpNH;U zIfV{HS52}d9ZMUV<_&PMq}6y0LmBdz<#KmbIL{nuFR@rk+9T$?aFtt*=+5JQ0S#J$ z<^^PgbRRtQ$peh!yW5a$cE7>h7M~LTEk65`JTJ}N=gpB!Ut_i_p02Q%zgFVY(V+W! zn099T8I+d4RR9^ot=w5nj(NjgRnS|>oz*J7G9#1W=EwIEQmPWC#WPZrgI`#hJ+p~N z%~iqKWT=R0^cP|o26A2T6Y)c+PhqqdNb(EN9B+NpwSv~^YQ72&*(=wKo z(Tiy*u4mnTZdZI?{0JJakizITaoL3?GPz4`l(bV~ijmN>E%w{KeVyBtEuT$GSyoEV zHUfT~qI(W^OMG|y7#^SUXQq1=W4USVGh#~i4vN(flY0pi_WI)s7dUnr3Kup)TH?5aE!zx z>oWK1l#Nc6{6=aLn3d<@KE-9hT@TZZ7t)cwXeH2aZ?-ZP=f*6U&fv*ImkOXVi&J;O z`nZ>`H<@%j!|b82WBnBa1H7u;^hP#NIWUkDE%4JrGw7P&s;QBp8CajL{##al2cK(9 zQ7ns_!9uH`Sa8OvQeL-qaz6?NOJHul08{apg9|~Pc|XF_>&BYkiux~10<3Lip_cmL zsRSxd9_H5w`JuSOW)#b`zdZI)CK~Xa&z8U`-l(IzQDaR9bE09t+M2`kBNMR=7lEUv z2wb_mPO7L5(G+Zd&VDUWD2Hz=hG#HDvx)$Ar&_sj?Uc+032KnVfmu91ALQpx@atz3 zKnrE?O~Ufa5JP8TFrX$t-r5#i0vQ3qu1C=PK^ zX5EwBcT&?t590cF!Ts*t7i~la4>sVPKXb??r||I~bDmw+eVViciY%sFI|R{IttHPP zr>23as1EGU6cjAwcLsSR0JjO}ljkfhhAa^H3F5%o!R`5RaiBb3QP+r2JZy`oK-Ab@ z+e4m5yl77s01HfG#_dwYpg>M6>_34bf0)yy1B)rVUzwN4hb3f}Gq<{OdzT=$^vC4~ z+!1bR{MYfv(S1WS+Nu&_s{3Nx%l9i8lix&YF1wU`{aNlc?kOuz)=e<=All(|kHiU%{v2 zw{QF)2E0fW56c4vtxL{ztpk2Qp*N|E_sZ2$38>n@aUYe661-CL=HdxNu#D$~*N6TY z^L>zi^=(j{@}A`XwRi5(Q5AU}@4C-UI^F5pk95+VekJL=g`|@v1cD@i5X}ZK0cK5* zM@9_d%7SP1=(w{k@)$v81Yy@120?UrijYNM;$x1Aqq}-Mq9{9ia8Qpj_*{h{&WH}V zm959UeQ)3HbcZ>|-GBUpLwCA=zpDGIy7l?~s_Ry%bp&`$51Ywd>%c917I&OP@(E`C z2KXwHPLF^QQ?gwaGE_tI1l)%#9hS#QC|5J{Kn*gry5SjSyD8Z=rnlV-40{;4n-{h{_0s^QKEbe zoZ~MGdD&wv@-*gfrzyQ3Kq~!sPHjN-;~yfS`V~Cm2~alRL^;BTI z>Se+^>I$A z^&pt*!lnziad#5imV}tc)R^x$v4;*UA4cUDm~|%gyJ`CMqx{6ONP_^kp8#eWaptG; z$>Q;qA?}mt@M3mLcRC+5+_>2kAMVTKQiou-zl^$wG8@7A%sz0FDL%?RB0d)279&2c zdnn|DwOMU`(-_`!u$rHgmW?;xZQ{ z_HVHa;Boo4>%a^;x*psBf-(9%{ry*rZa;i-9S-ul@aQ_Q)E0IrBl1Ofb^~a#;P#jSwNIM`LX+CUv7U@u=c%aGwlZcqhL$5Q3GwTM$nCb@5 zL`|PUBuZjGDAmaZTQ;_$ssT~R;>2bTK8z@2oJj1^lz3j>F@xUuZ{w}Oy7)@dQ#7&SK!eBa4Q-`R4&Pb zz08kYUXY?smnCxPGx%TBRKwCq`4X`vSW2?b0*Ndbh8L*=9g|*#Vd6o7Qj!nACi?gc zQWqMNnD<~SaiQg79R?;De7rYAeZ-l>Lio4Dg)TQs)&P=D1F#dZ22l08%0O#;ycLNO zCjjF_4(>n@j?Iksw1YP)e%yHj?gd|*Aa0Rj#Wo! zNCcOuj?lQ6K?B5fM4XPHcZr8MB9ocS>NEg`9?}3+phW}TAX7IZopw+`r)dWQIiwvF zzGc)7`IR;mQzFt1m{6HCK!SE?Q=|g{R3;68S-9aKDI$#q@WlB<0el72XnaBtp1k2K z8|=)aBh(=;QAbcd5hqAT;A~0rVdPUp;ZvfDzizRD_ zrRb*mwL&Ot_6jRHXGoxz8cN=r~c zsaoQFnkQYYmY{fwYYBv>q%ki=o|K>_FqsrJagyXos(o^vlprJ&8A0=;=_#4CA0@F$ zx4gcE-EGL275M< zNki}t)Lw_A1G0lS(DJ0|nYi|6>O=>n!}2uZM1hjgM-r1R$kc_#q!V&K@t|W;vIdZJ z8UWqFZ}l>Z$wY@y<4G7u6DX06!ktLqSsW^lcF0?MnU!uUrqQU{K~lBD64V=27RgT` zLr;LPXmsr$soDXXYA8A>4-sn>MPt+tOX%I8vWV!1mH1{LFv`e&tRJw8IE$F~v3x)t zbop9(_5&HQKR_h7j(tj;Sph{_nLo_7!tLuo516N7D>oayvH^@|elWw7iu-Sl&nwC z2+F8aPk(+OQ*}wKj~Q5BkJEjUPo?KP<`0GBB``_j4@tI9bDiCpw1SjMD^UIrAMdgu zB|o}atw8ys%sE`9^K=VG<4;88Poi3QQTG!CNsV+qk{OgB7L@4*%Al5%4BB%7EFmFV zE58usKIl%I7fr#Sr{SR!;1;2wRAtbWIZ^I>xEko~QZwjH_!2eM7&LfgFR@k_WSj?0 z9M?XA?@)UkgZ|~pSHywFp!7a2!~dZ^bO_ow93?)qyvQ(@nmoRKL!D?4+A`cne5epg z#e7M}eAK;e5E_8H5b!`&o=Tx@!wXy3yQdzXp^Y_8Ghh2c}ggF>U^IfJ+ly>P%jbTB#~OT>wq z8Ksyr$TIj*!~=GuA!$HvC4ThzQF`{HI})>>OjIPXpVioZnEWIJIMAyyNxmP^kK>rd zhPi`8-5@3D26m#R8%FsZD~)zw?ozZv!tYoaw1bAE*W=n@raT!{~}KLiB=w+`Ma~cIN6`0%*r5i1syoouVlA$rqc^#oV7Txt)dq&zT8%9Tf@v# zG~HDLB*l&=L(gHX?Tx8hY0Kg zT^i*ExktJ)@jg)}P_hlO%VlvBsi}-!q zma%Lh<@mWxBaf3aXmlsgz^_V*vinzigSMCBr_G>ppF~KE z^S(X4LJ7)Z8+9MmbwYR7(l->MQ2lSy$M5`*ufdgkj*H zT;<+>d?~L!!v5x>yb z+%TtCv{;3#P+dn|p&j6bP5&Qj`@V}ciep|MIp+12-^E(b?`U1B+`}9+wX;V?kLRyL z6~bY0+>D-R`LxEGyil3&q*&A56Rnswv4)*rR6S|ov=U#?S5iG`(Xo32nHT!?vx=t33L;OD^eqsumYRSG3x;<#rqtD{o>Xa%WOgzi3!WnSq zFsu1seS1~)wb4qC3%v(xxo`}tM{y<3IJ{v=^1HKYS^CPA#juh$BuN2R zw(z0N?X#A))rSfK1vZb*8ksQxzdYp(7uaH@&Y}XFt)K|>JHiFIxdmYd`UCpEh>RZs z|B~sncotp5)X}fNIm+MbTtSbG`I!)D>>M|~rLMZb9m=yZKNljC(EHZ9s!6U8`h25M z(l~S6xR!eKdC;T(Tv#IcitN#w+ABkm5W3^-wF}y-f~7&=K$mTg&QJI|dTC2+rUIYt)}De-RG=Feab$xj+#&D48yL}zu9U7Bu)b{ATB^{v!xip(cXNwJF7aoT zzDGtqfH(9D0I{XmOE=p8P*e!{P|9^#lrJ@3Iem5VzWIz_=Skv z7n-xpIoVW4Jj(ycR4T^E-T>-|n(X`0@QS8I^UZ8Qq{i!6ZjDy4Oei1)^4(@jHZQ>Z zU}uxBGVC$euMmBbGv916=UAwg8iE_(w<9~q87YY|`kKQxEe;14Kkedz;eZM1<0*a! ztQRYA&W81FG2X-+tK{|Yn7gPzKIs5Mw_99!g$}U-{=s2>V2#a=lrn(3xQ9kwL-#By zJ8@*0#09Tu4ESq{>>L-Up6CxmizU7`)L2wU;uuJC9eR*~$z2Uru^+BU2ppwd*D)Tk(kbP$mm5fKmp=^`Z{O{6yo zLXr&#C{;lPq(l@10SSooK{nz`Q>)K>^ z=E*&?*35b)$*lWcW#FLWtcL^%H1=;D0b_H|s&*sKA|xJsA14j$8IHM5iozk?FnI;3 zSiD;RsKJMe#zeU(GZk}lbUsL}P0l_&mX#yID>R2^$4htk3E$%9N%2h{nV4pbq+drz26$$nhZe)GwNt8}2eXa?#Wa6>{;s_=;( zk?FD*u=|3q*z~q)n*Y>P?`58{k@AywmC2{NL9cF6BP>oz#Qm5iM|^*w9ub$q(f^6> zoI#y^a7;aVk6d%B;fiU&=q0RB$B{$pMy0U>Uqm?+`>y(G`p+LTdPtD8{mxZT9COdw z=uWI@rkTVeZe{*YbJQ8A*6)2$ik=7#x%I<1GlKWT;lT;husIX2X|9DV;( zAy4xC%~Naf_oukMADcHV=e-@AI{qf<`6A%TUT@Nlm7%HcrnQ589ko2A?oIMjrMjR9 zv6Ba%6%b6PXLT#`LwNGq)dKkL@d0E}{4ZoreYkT11@(J=|K1Qv@V&0S9NOEf;A^2) zl!tlUL;9G_^Fu4M^ykett9;v5n(0aTrnPg{>s)@|BOPWt`Dggpfw|q3mxW2nHu+- z>)BlnS1tVOmv39=-8}dtqAifL5HheM7C*7`{E_?fw3Rq3tA)o% zQ#-lShF5weBr~{;jG%0@RmMkcj>mlba+pV_o_jo2^QlVQLMvxwLukgU&ki-%4a*Y= z+R9(fc16C4E>Q2dulJ*tOXd*7;vAv5sYgKX1BOpb+4O=Ek?&x>ypfY$jpf3bwl{h_ zsgo>`Q$C2=bczslh5;Q5 zPTeBmWhyg8AI=dW-QTC?;y=tyekwEUv_GwA_|7xzI{0|Dv=UE7;cf+Z>BF zj53}pWWC7)=DRX^_mI(Wf4q2|RkCpJf!(|V6)7K6UDn^VhYbOdN6>&@mP`&PH&j75 z$hEH2+7QebX?gu^(MUDR2R2hrF+#F#UwMT3lPSl#7!~EsI;WYCU8(Y?EwaiaPfv;; zaa%2TgT%W+0-Iq(C0~`;X4h?K_YbXpcrgQmLf@NX@2-< zE`Igsh$%l4;8R=Eu=_o6J^A~tq?MtMjkQXGjq3N$f!7%VV|t<+g0hy%P}e&6e7xst zD)mN%74P(d9U*gz%+VFM)?~2^^cN$!J z;kDi|sZX5Eyb|(2-~C<`Zq+reuk*P8p>~L*4d@J>ZNeoszKj)sN3Er1@B;$)sfVNj zXGV2;G@8tTAG3TWfmhzfV9ecL-M!;*$K?%)F!ew>U`i=ke$(e@W7ZGOOuUMi*#VU% z<)sHlEUxSd6y%3g0ICTkKs*&b54tvds5{9{Qsy!;$0J@k;E-gejNl6wdmn2*JL%HU zGn%7Mv9D0+m&>pMxN{k@(+9UlYNt&Rh(MLg56A0uUrL9rPb?mdVCsdTDvCT7*IhT) zyZf>!Ak9q#Xl1o)V@}B@%*}?jVxep()3Y%fu9zMBOUv;B!qVEymk%=vwcpfTyu|@0 zs7S_ctj9`bYWi|&2A(q?e}p=4VGkA(;I-U~T7tbR4IS24_L6k7vU;mmg()wtBcvQpMh~`Q{+ko zh*N#*04qyB9Xar2z98i1dO_X;lY7-P+n2Mi03b)^kJkF66q1D(R{!efp9A1Rc|$ z4zF6^d_N?-dp!Qdx9XegE&8x?3CM@Z0@)YduO!WJK~f$C8cML#O!DG>G56z0tFWwP z$;&RsTr8`mJy%$PN)*-Vhqwu@TC}0W?S~>FOzm;X9akliUl;LXQ><oIutP=_^g)2l{-aZ1EVU^l&2JPiG{`Z7rIZk%$*jnXMLq7oZruN9vv9< zl7N6yCoUN76`HRYzJT_zezTEu?;BM}Ci@0`*z}hq04mNs2{fKiGhBY&QhH}OP$W84 zPxg^l=@F-O!Oj)4QQ!;HlGb+{l2=J>hHYZ z*rPL)icPzh)`k!?CFYwsOWvowCn4m*^DDqYz{~ZOQ|-``^hw6B@&*?kuIioJVN&e1 z5lg6tJ@%q`j_jl>nu%RrmGg1cdljk>o9aHnhL8g+)Vd~l<)`v7r=6S1D+S&TrQDwEsGdbBesIXed@A;_9O_h{mRbW7cBct;PYUVZ=_%CPcG zWY5U`^Q*#n=;<}@b58;`(hX~q&DmVi>Q@+DtAN2qde-A(&e1n=_{266mCjCleuG*< zx^RrvEM>oN_R;VN$^>HYb)&ft3qF2hO*jL;0{E6^{I11dE?3R^L_NQ{Sr0GdE%)~> ze@V(SEz}H))$B7>Z}E^}JDGqiL(`k%QtX*GC3s^~?)Jf5-fWb_oAN6hzpkR#t6IUa zZov4$>Ox)c4aO?XkCDS4ypvT5OMB?e$pujZPbwjJh?L#ntgete*d-GD30 z0s2MX)VAs!d$;r267$}jh50JSOsPo!{zE5T%OKeh?-%ACy)r`GRL+<>P#jb58@;~x zRQy@Z8+VC=Oj)jT=ZjB4G%mjF^UIA49t-k|jIh zV(D%;L0^vJ>y-3)-seCLr>k~(Ro>@kkz$+r8Z}=G<$M;TX8_5^_X@1FvpSkFA9une z8Id>JrEa)`Pl+uD+4PMWL>OWfcA?YvO*}IOCFa;8IM;!w2?EDyzRU9PM%{N zgbZ9cI}meeq>^_Qrh0YMlZJ|1S9ahI)%JQ^wUJi;hCVt)%i3$b&GEJ`?cfXd%H|`T zghkg^0E=j|G+cam%{S}UpVP6mnb^^jwu?Hul;`NTR42Lg(79Weba_$+yn&-)`QBsf z(`~cQ&Xp!_Zgp0as(L>e%kS<=MdI${AADH*BJ8tB`IjfBGP(o?^%@>{bPW}6S@d~! z7j{{03m1Kb{}QZo(`iP2wzi<&>iV5U_NAoI`JJ|&EQ$Hlb+OML1{jQVS8crC z{0{FAo#R{Q7eBqpjpCH!Md+Nd%#YSJklYLir5t|vL+=PAI_TR$;Sjxt4=o>@#dLTM z8TK02oK{Sb-V*M0cDBxOKq)raEr($-^FGLq4h=j+bx70l=ZK{rlhZp~N8o3>*D-Z+5L zuQos|k{>QvObD8G*<7Wdd-ycrdjk$`JSLHO&+zCmNWvw<$ZoN(*7V2O6f4J>3!529 zE20XR2K0b!u;7+NRndeow(?feSh2ryn$B3tQl(sI5M=K$H27<;+x;B=w{v<OmJmA-V5M&MW7@BnxZBnlv0N-|Kw(@XK?yGRqb}!s*b(UQ;fc*V)R}_(z^7Z>*i7 z#Ar0N#Ji!YTCmr@9)n!53q&axLkXZ&ogEQl$8EG@m}e)48+W z>H6y;epu&6U$vsu0)B8_da4;YK{|H6qXdr?d(8-cDuUNvU%g@xICXkk!>Zj0p?S~C zsOnc3W5mF1ZOLb#&~9t;e7or|=v-rjQ^xc(y58_(hS^~R6V z*fO7PqIq+}f({%QpY74Ze=j5bHPuK^EFH0RZ>iq>1aTSSa`4cb~X z0UUF6zIduL+sK0-|9qA<>c9zfIMeB9B<{Yf-dlc0%V6Y7XK|(1wfwEJZN=sJxU8?8 z@9$BkdRiW=h}QRSwYV>GAvg4bgfHz_PUOesZovHRAGj2%wp+Aul(r#5(ve8-Yq)Ro@@`akD$E)bLODAVbXkg-C3E7;afJbyJjQmtE0^y z%1&D+t)z;X0h;Dk&PI)~$`UpfX6G7lMloJv7%x)`0a6>EAeJ zpEXRF1cG%N=eDSA)}I93`s@^b6y0-;vGk=pSjdO9YTlM{|6#qxi_i?>`{@0_ivn>_ zOg-(jb0n~CoOSH$^WYa(?KKofi`*~0rX2;7@?I+gNO-L!JddmX{IMPNghWs)>>~;s z*K-16IVP$!Hh~SbxiVF!D==-Q+Qs;^BU?AAQ9VJ8FTu%dREC ze5y*%f~wge$z64_$r)RBt6%N;^n)Hi#y{T~J*|ZFn!gu#?jh{C%x9QoitVNogIiaP zYL#_dN!$?ptyzbokDEgss-xaYk+P61IyyVdw<6KG&-)*_v4kZNm5B!pl^r4UGOg#*?gXdUX9_8vz(J%nsU$Sp2Jpaspl74Lk4X_Fig+Jc(g1iSHua~k zhf4p*^d3|2+;K6b?X*G#9mt^rK3+)djPV=zyU+D<+%M&D*@WmDd_J+8!5L{-KZG7+ zL`fucjj6(v*$*?cbfl$UP-D<*(=2#l;XzBE!Lx(583Mkj!kZyho8BRtj%T(fj=8^y zPLnR=B01=mx7azmK58EL0u)Sjw#%3205zw?YZ-=KpA>Q`?E*Afj$Am0EGo@2J#Xx4 zf3DokuQFVrY4_|w)kU}5=cFey4~F!GJrlxIb*|$D&!S+7?+xJ(QqK;IM}~^G+yZkk zH(?3aedqXDj9cvbMK34)P;3+S6~rY;<)_1BBo4Jj2HaqpL3e&Urn?vDyDSxin94Ss zAvG4s3A&nU9=M(?!j$D87k>mFAD!xOrk^>Td3;LeB*zZZ(B67{%BOK1GUHT8VFyefA#qje*< zb6Zlnv*q8eer0;aGIVFHXXRGYU=Ky)OwOSiN%O;XxyPK^HKqI?@CZ2|gx_V!Gi4_xC$qp+>n6 z>>*bk>W*gfl%Y*1Gwj>8Q=VpM9L8oRsN|3ayk1F1TF#cB%SpzKZg6IWmuO~E()e>p5G`pR`FzmEoF{CGZbcxGb`*rJw^94O`Uw0 zrNT|p6s(_P+eDS$4RwmkEwdU&Nb0Kv+Ih9Vr$4Lfd@R4`YB|PVdfTRi{s5lPmM=xi zj&hq@3yT_TJ~v=XQAQK2w;1XsL%-)zII5ZJY9fZ6z4%9bx#U2(;pNBG{4;Y$gR~mr zOI#Z^hdLj0FYSCf?V3dUK$1^y$%LV^?mr0eYMqC5hXqSvZHLIOtMm+Z`0?uQ9Irt( zKXxp-iZNLVPeZm3-)ww|DZcb7FDEj&8OCh_%+Oz9`;N0NZ>HRdRh{j<l>Aj?3xf8E5m zNF#X^nsEwovgM2Fmz()x*=XgbtDV*jAC-l(cG9~{Prtumhj$acY7~ijHgU+>H#rPC zW2`mt68~h1CG|!F9?tK4L61 zp`vG4@_n$x^|WsWpq9QOp%6a%Iiwn&`-YhwiZf1@0J2MT4@cjBY5hbj=mVv*-C8A=L06(ee9 zo*bfePG=%2Ri7_fA{P_!r0}H#Gwb=qR~sSr#@j;|#J(mdk6sq^EN@WvtO%4W$C7rW zzQZdOY$owF7@bLLzoX; z5=oQYHYHMrmu`cWb>~mF_nU>nEdv z*xSirRNmkZ=81d#Iw~wTLoLjw^;22Nc(-R!jeEmyw;DDOe5@-q2S;7ywxHLu%Z8o; zOznU9X!2dt{K&fx<-^w~>uxtWF|u&R@5mP}%hqGV(aYwyV^1YD`JFuU!rV-vF!2@F zN_&AUjUhYYm1)z?Dvg)xoMxcKF-8LX8I9(<`r;Y994aMqy8G<-0qb$v1ACd+;mBS9 z#{jBPzM{LBqXd`KCQlaAP!Y`c6)Rg~PdC-|TFc8jP&so6I5+jk-O)+7uk6$*H|y<9 z=G(yyJ?+=Y7mfy22EPAg@}X48bnxt#4R=Ar)JCNFhGvRtYRk~UgAX64FLpd2=Lag1 zWV%$#(Mgx<&SKoKKgCjQ`Zfosb zM&78^eA;eViSc|Jl*Amg%8nO_AKY@%q|zVD_W>0Ja2l{!*_;JD(kS=m82fyA&{Cu4 z2oR8WtuoNB|7mWCPLjQcSkuDBP_MP~>BmEh=em+Y%4|Dc5wi$Rt`WD>fyuYW5)!Iv zPR)s_g+PE>tb#rP2X%Ad08om%(T~fSx5@F8IY3;NUyOer=iPh$cb)FvExUNhvOOs& zWH{5mJU3d=V49qkn!e6gf9u96xOv8`zMIBSYP#8_=r+<-vG;~^?5u7p0YrJ}7tRg^ zDqaT9`5YYz3O`lXBhRI)9B**s^Y_Iit%XR2OM(N2PjyZ|9XP(Ee70}q zl4es^)L4@eD4EvXF8Q=7%;ntf&eOLC+)?ADF>b2L&(P7&f0=6vGVnXeONIl`S3u6V zL(bP$H=G1b!A6dcyW}0PLX{?N2T%3-b)P68F?{4hUKzF5p5R27q~f~OOV{PodNeLE zPpi2_{0L5C#F*HRY#*GZbPh4)0{F@}YYuHcqe{$+N>VN#$xTW~Ep@qM&#>Tx6}vm+ zMLsmp(Qa}I;;GI=cPug`eZ)MTYF_Hw-!6UET`)LYJtm>)axhGZ27!3qWFCm2rp1LZ zcmlnzG_VSKW-<@7-;c+Q*ENDijiEwOdEy(G_5<;kwnzO2V2D@>LwDVrW?qyJu`tIl3ko2N6L8p#u=Er|}e?qz{?ap`Odz8oq zA72D_m8SBd4_0McO&%-twkeTfI*}AIDaAgJ;yJQcP`s*tcJaK27{}6%?3@-aHbn<^ zZBNuJN2;{sV_K@U@Od2nv)RVmx&^5^B+)AEGh;_8B7Gcl%O{RHOkC&ntxQiB4!W%> zDjTsb)*1I&ohjt_^P#U^veD}@od#>V681&6v#naIbbk(r>(hp5CUVZ<*5|`|@57ijzV>-+dgk8Utn+^PLHWc4TLVevOmFrv zYnIOrK$koRrZI8fTsOE1?AB*-v7(S4&~R3-24@qp+Tk#MEpKb&H4UgusR2fk}dm0qU?V9~!8x zNoZ(%5?=L!nXg1f_-L5Z!tF^LFO;+=ZKScATE`&Eu8s;cp~W`B@E{Se)l8${9tu!h zh!XRySpMvZ!Y;v>>_<@-3H20ZX8WYoRRjn5%FJZw^f2>hVi&c}0EY%0$EeYQh_}WR zkxC7!wrv96%fbyk9R=0GKX2CDg#W&Y`5ah%^Pd=EM8CyryzH%6rjkb1%#G&op&i5# z+hLgQWF9z#UIe9ZS;<~bL_=|)AFYZJ6oqIX+6Eo3W{_P#DfphVk1bjPC9E#e>?c7n zcVs0$bg-vQUhl|FbM&Se7KU|h_fkGHC{F>~H5gH`x*V!dxg;JIpF|RiGFEqut88V` z%f7xPyKb7Fc{R~ZqyXsim3rqHmMY1Qh~x2uO_z>S?yAp_Rx zTSf_=!Lk!EpeEAVLGlHtFe-d>ErWPU^AV=m2OCVEBS{9ziAn-C0;ZD)$H@{@3wm;bTH6Ro90SY|Tv}N6te8ZWK>XlN zs@s~JNYh&|Thb0j0Q`~G*JxI0jO9mUw?StjPH;?~>TB5rYkj-d#QOF+tNkO{cGk5# zu=Y2PrUW9C%qoQiO@ngWZ3$Y%ue)p=6!<)^Db_T`OLvwvX56K*YC4l##~uONlP0D2 zcF#lEfQhgn5Px->JiO6(+6$~U5e`eD{SrK#?;U$-nlSg6G>v)MiKiOg-n zDlvr206o6iB&#E1E0hGP=7uNXunOwDyU4b(6r6NZ9x+TExDKP7zxlDL@%Va+QqfdB)!6_SKW2m#fX3m`j zrLg{@({G#WuAb4Ehz@RZy2=|B93>fGH(B|#hc8NUBXL0IbQFE_(J0Xti=!GbMcgOX z#f1Rt;_LtH(jLXza<98tOzvOb5-U^;rUNj^xu#1zOy#Bt)?JQC>Oh~^Oc;v_B|IT6 zTwTAW8Kvo?m)!|T98QWM{B{+w`sz{nYi#t(=d733c~Gb|qo6u(StYYe(b^6Z` zSg_Qoqhe`yqg8mT2iGi$9fbvdwDMM#aS>nLqD(i^ckYA_J;Fbm?YyP2#5pL+byL1Y zh;*$XoVO|9ds=g}r+~4S)h;<^{U<>t@hC&m!VozD)heX6(cKYC3 zvC7hftVW(f#4Sh^UeX+tvv+jRs-WTO*6%>w^dH6*$q#R+7x0LG)7&4lDr&g1HCTwS zgjC>*EI=Rj{xwAT$mGG&CsBVK!>3wv#y7;dK+wABkXesh#~A{;xeh8$FXT6v-2(b5 zjUEu+>{4K+_&+SBpgBrw>)$mdTY?s-f79GZn?R&~Uv#V&`FBkuUeFx#dXITfxu8L7 zi@nh27UW+;*#&>})gW&U3z_ss7SQVQ5^^3ot0%6y1GPKb!^IDZnA?w7z?2Ig&E3RfZ#QVX% zJ4Xx6?hjD^+Yl(fZ_wW|Ec7vjq~J5mF}ZtUgTDg-?0xkYvIlgpatl}vMp z<)6EKXkyx~3Opn|5fm3Z{`c;~p$`*5MZx2EyQ;r)y-EgtE?r(F|M#*y5mXmEzG7Du zI`sFhE_i5^F;zD@_`iz%wQgmzM6G_&Xtnn5T&g^Bv9NLW*_7Qgo||%QYynaX02zof za%XB_#|!AcT^Bx1En12Yd9nqO^C)o zJ3%{26OgPHQFe$Bl&7CI@(A#eG8S`Sn18q1P zR)$+C4`l?ppi$Rl!gS3Yr+A2c4mR>UC+<|x^Lm^$9V zD!E;}ijwlxhPgQ0MPI*(<(8)Z)@Bg2!HV9^s3uffFVT^Fcp{=|T6fKf=tou?i}>sP zy!SGY)#fBEYn{;Sm)WSlePUGocyd>(sf7`@0}`s1 z%H5j^=i9`bBrduEdB6u72us6_e8aT6VNW(}?~(F|sK^dZPICLOT{vn%9Tg?Z+Muak zI=1bDUEQR~5rVx?LZB}wIl>uSSYEkZ*n?mPvdENgXF@QueQfFuM!1?8b8>wjXw1>o z9uX3G$hOlOz@ZUt+-|J8X|9gzm&J+;@4Z;gU*jJWTwf;iYmSoE4v554*o5hWY&AG3 zw8%wHP70j(Bsy{O3w5NCD^Z0XG1xCLn!gtBlpSZ~Gw(^$38zqP3}SFErqglktrK(X z?V33DwheSf%tn3fscf%_W^i_hPdpql0SH-D?LaLrM3?_h+vqF0C|Q~6~v zG;w)jrPzN`Av{L2^^vmsC0(zqClL~)42!CK;Ts1n+{0ezD32yB3w zvJL0I&5h6IzkQ+voi2w)9Yr1hot(qDNQ)Igx&91^kIZ4`oDD z5ZpUG8A+_uR9^}wv%Ndo0vx1{MtV$dlNp~)6;h!KJ%pj=+6S)04k8zseCJs1Dn*>A4^C`^bE4!uBD$pYqY;I87<2J_4K_{C29D^hKo z`&GZ)Ar^rvUr$;vZoIi3UL^YVdbrlx@PH*?2lb}`mD7fnX!Oqez0@I2woNORh8&pR zWFb|O(Q34zXFHUH;6&0pEvv0{=ESUZJeyLdsS$!G8!Yy)zWThZ@SPXgN069p#=QD) zpo9hwQO{Nli;!Z#-93@DQB6@>!g!Hz+W<)o5ioKyaFYIwGeC17p~Me#zO{H`ym2jj zhslTy={32vX2l!sBPGllRyz!7Ov69s;D(Y1*L)AJV~5pakV2;n~1S zBb`fE0;*s!%j1yE@`*>qJ(_I3YsU08h8QXFA2M>V7uE1(5+pU zYHas<)f*fcUgQ!6dJh@z1gi<*lNY_?BQr)Mcchf1EP<3!ie0=%1SL|a0u zIEx?j4ffTHs934tT>3)N1MKHAQ&s-IuE;0i+eVA2w9hSDN%2E8{~_ACFQuhuYEPF+ zFCWeKW;Hc@Y9m@>YNH{GoeB6iA2-SH{{fPxx=6 zStk6AYBp;cIbUi5ZvU8YCeb-1E7He7fj|wfV+5SM$3%5@I7@gI4!$`=tqFhMsA~W^ z95z;@hO7;JEkX=Hh)DM`iv;vx`$Fhl$iwql-Z7$ICbA)2h@31XtYM2+LUTh8c4o~iq*0@Vth0AaeJ-Jisl zLcnxW?>0FynI*|m!oKnt$>ftDB*K4NfiOY9t3~!9I2Fkglf`u5&EJ-be?l+v?QL8VgaId|WdE*hXuY>6^l?nX#=lW>vH9OmY#=(y8_qL9v=|X9}wR3(MLu z&A6Dg!y;`?U?JnlzcTK>6-+#uSl4ujcf*d@KbFwLrOzf__)vAP6aB+svm z8#DEja~pn%_i$CamicEdg7)O#l62{XY02=*G{u2AE{8jGuc9~ld*%jiw0yEjkLlG^22?*v#@7ZGG+CdsvD1o?WuhvG@WW8tU;}3|#dPu#Sz#h> zXUd8I4Lg8}1$FpLJ|K%}KIWXN+VeR~egON|x(7Xv7`Uy(-9$@hk>FZ#u+8gk(aO0^#JOe*FNwMwUb^=k}Diij&2xs!z`8iY!54wmNFpQe+VY=Li?)- zkquFRO=^E+|wu-g5L*yhHgZZe6RMv?Ecr&aG)?$pcET*fLM1G+r z6VK~;yp^TGFYJCa$yNm2 z44T=y(k{+|_aY&HlG9jTRz>XfoXjRZ;nh5jMiKPK0CjfrcxgJx#qN}bqaUF^YEWZO z$r*inz*VvD5y;dy#?&a$st(ZcL)5)tVG_*Xg;XMgf(KQmvTNMmFfoG2O5XumYP^fR@3 zgf7X0(fIP5GtzR+>QMM^a)a#8VqmxT_r07jx}Rap^zQx&7aF9cZbQ%6A+vq?onPp0 z-hNs?fuH5HU#Pcoq;I4{+CNk7$C;iFU1d0l3-~nwdU@`rH%XTl_P2>p;ovO8g`dZR z#o4vd!*xln55NCDXW2EV&U*Z3jLvEbV|eJns^;8zy9j{k$bA~$^j5B?@%yhQF<9wF zXNEaVF76dYi?FHe#x}O)bVo88?4kIGD5O^GGMc8WiK#)8NUrb#pON(ukVoc4^&}Q4HJB}sO+xy{cp@0u? zwr@Oo5<4nRa9$GcxjCkpfNq;;{)7yfZ+d!XiYOUd zOWH1IVLH)K!%(?<0)0Xk*()O6JzGoBC;u5?&B<+B&<5;YME8`}Q7#xtebQ?jT*b^a-)vvD zPiy~m?@jvN3Vk!SX=F-i@n(wl^&01PtRmkLb%*PqcO1ZXV<)=i9xx zq;k`41{xUE@-52COxX=D!df&_5nkl0WFNiCzOea&E-|PHmAAJ z(U!w$sLmV&Hj=p9ImI3hNJ2e1ibQMz!*@oZjoZdIfb3zppVUe{Xqn3$%NWPd zs%7}7rsbaf1-lj5X0ZrhpRM$7X$vMW&^jjVEt>8*#=Amp3OwBxP2}EOFi=MTV|_e zHAmU#txj++=HIG)^B`y+svY+z{Ie)Fp!qMU!ZD9Axh(c0upt6MCx{_ZH9T17`u@6Q zEjZhcq%f+L)%e=T;g&ezAshY>^prv&y|AzQe8~y-z&_^Ugq&(|I`Y?^9`tlL{Dv(g zy9gby6;h&!9>mq`sawJSTVS>(`YSGEPu&=fTi8&CWapzdHbee9VBBVn9{hi9wrXy} z+oOkYYt$Jj}KT@eQD>qm;LLbvWC?3V{UkPj2A5NmiP`}+2x zp@&;{5cZ3M9`z4DSRuad2C1U@o(-w2tLob0Iv1&{&s0%HxS<8IY8Fh68dX3SFi^t3 z_THd(M&beM(_Vy2u9@1p(C&wU=*kgIwP2%(sMg;2&wB8zA$r(hzWrn#>6 zD4lgI(zw-FfYxn0X*OTpK|gqP6}<`%7u{h=g~(9{5si`b+BxSiO-iI)6wIA8wMMmJ zG>(3<=Rp4KuwTKm`l*G`Pv$TEKm^+8nGnx}$rjl3*?}gny$m&;Hr|Xub5nm#xF^Xuh9V?Wz5sps{>}I4~!a zE+Nt1?Q1B2)Ty#gqSYKj>ZECyW;TGI);;E{6K(FS_ow+^jDdi8u9nUpHpQ|U127AR zDjG{TkQIIp;%-a}W`rN^pyN+a%@B%3%VJDBcDw(YI`p2Hh|0w{cm*v0Y&=7L3ziyF zE&)(=#_S2o#42La-;w16TVmo5T(cx03w(}F=&(v)Y5SPf=3s0nA!*H+P!HB<;G}WW z*nAoV*C@n;(ZU2U*GbUti1U zUv)_1-;_wgC{Z}NkmM~|T(thPd`nEiDal;#zV8{LTT)vY}Z zCGpY;Mk(#pZ%xdKKbx2Zr((SxV;Y$3X9lfCV1Bf%7QyK%pK#+gjkVFLM$j-+0NwtlM>59>ITt|6u_!7swqr^@92RMZG+&3+$%uPj5v2 z3H|>TiLHyL{@L>4^m{ga7rhJGru@m>PtBuq{Y760z8}+@y?#O2wB}iNg1PrkD1EGR z=DL`&Ld~pP$v$0bj=*`Wrnll70u;2tw(i2!4{Sg+FMfy+*E0&2-SO?)d z(MpOgg(t=DZ+S^)6jBUTQ>knA|J7=u3T3RqDz9mU9Y*ndbnzfd@`huYV%F;HDI!n+ z>=$4wU`mu|M)p~n7Sa>}8tiYcqfgFt9B8-i8t0$|X|X#0yv3O(?yoE>2n+H%@{?of zsJ5g0j^Ca%JZ(|A?|}noz2O<2u#>=us>z?dC;z7JmK&_fxqqxwZbuz*~AOM<~47-h5v;9U?c>Bzg53&7gky+@Y79D zyFX@vP5cx3gOSKm!;hKZ5>69V4t zhVeAQ7eutexkc}@z>vnTlf)jECGiWSiqJpBU9 zW1lcISpgPqV8tY?HUZm#M*^tnQL7b@e@u-%DhPwc564}QRX-_b%ENiF9yih?@Bqug_EtCi$AEX|GabLc=bG$aG zAM$8LG!T$OIy|mBulb({y$uB9kIF3VW^G z3((C_8yWjDmv|}o)1S~Ei-hXfm#IXK;K1s)EyBVp^S-(vxrYUvM|$z1u5gtT^!)Ef6gB38Hp;jc-D#>M9~{}Z8< zKzJ_c?6~-Xrv8q8t?>XPdF4M6(%F%yHU0vLT`>!Uzaept=g({YCqiEX;qOQn$MY97 z4R_pYjlV)(t^7wq+B^KU=zd7_ieex z0+ag#)`&Ufl+V#XHTw8TwBX~8o(!K*Ep^w47nO)+k26@>mE+)3-kh)xwB$wr)|lW{ zJz8Y!BHXIm})J(lLwMsR~yiEa~+S&p!(&5!+FRiEhH`cYxkYD5t!T@IMs z3ZTRxfa?6XKS!WY{maD z@1#O%0sh}LY51h~)PL7>(2iXEIeEnf0lNlcV3*Qurz8J(w86?PNDN-h9Fw!hF&JFX zpuHtrxcWO#VT0LLR^h5SBp1Q%EZQcOZ?z zRTD@OKGYoZc28t*r=UT1>vtfe@fDGilFXVRe1^g-NK(w|~<$-hvda znnB=rk~t=SPjhhReZ%iSh&|}wPEiABi&D611wr9S7MOnx0d7%#!LyhHU+*0p}d^h{%a`49GJUzdXV!yRBubW5MWAqivJzR%>rh* z^=}$r@t)%#XA$)FR!bqkl2VF~vG_g6gz^}#YYu#~cYH9Z0D5gpv=Hz+P$ATO>un*x zf>MCjwE!0GnG7cVYpBB<_-;>rFzG$?=9W_-z>JcH{~ZWh2(Y45<2x*XC3}8@NkvfG zt>1x;3>p_euWoS_!f#O?;l<5?IeWhY<>JLHfbaM82aOA%rduh6aC6Gz~6yPDDikVbKu)O{y}sB^!k=! zA^dlsLa60dc_G|_QjB-A02b|857JPHE9$ifq$X!+g=5$D&O}^CHaEghkT3S^XG0^2 z%(GWsn!P;zC|&=C@*QjQx|!RdkuD)Ad|m8E4(Ti2cVoS%bz;O6>4stKi+b*>nv4`& z{Xguzd03KPxcA#^WoEOPsSTEyrj_$ZW@csTuR%>sDND&5$PodR(#&$qOw9pFO)V!% z98y41b40-*QBy%v1Vcpu2L$2exA(jEyU*UIbAErk?{&@}oBO)%`~G|{;Nn{FtYC;4>$Ljg;jQZ=q!hc8n1+8vr-iH6j z@R~(e4=^SAR-6}KF9!|121(p$Nc(7oMM#IH;cr&!q%_Bp|0c|-{unT|*6os3o?K5H z(~@@#wj2NQkLV6NhkxgGU8_*8FK)V-_a{v6wVp2E-Gr&(-@0AXD)=MDyIt1GPwycz zJ$UC~^7ua?SY7<2XSjowj31wH@*`^R<@%&zC;f(w8hbdVDOBn`^6mclzRKJ?in66l z##tgf_WkkmW7Q4se9Gmr1ZRaRiO~D=L)BI96w1jm8|SP_Juit+TIJ-8p?H>cIcHVr zdHYf%f~9vHzY#-?&{xe{k$o zpHAgngZ&9hnD)HWu>JU0H%oM$W6vMa23_dbS2EqtdkoXXXS)3fXLdRWY0o)Jv(kGRN# z!A$WvZg%LRfj-vspAh_BzgvMR!`lMeh<`@C@JBq3Po`c0f6(t$m`>nbhW!b%m^QqV zu)X+K)Jxzz{hmMKb#S46U)FRN&l9GN&!GMZ55T1H(bS9J+?s9|<{91}vDam~jOPGT z$EQ-SfeUK>gbCEk;QX4NVWuxn52k?s6VCENV8(bP)fQY-(>FZ*C!`_8qi83;l+&k_)f50_^e`?{+%`PhECUsjekMnk~Zv7+X^KPu33V&;M zO}QYc*J}EYn4i?s%6z~(w|X!<-t4mSpD>P(>LLbYm1+nd^8Y2TI7$|hr#${Vyg_>y z+A0?%^|ek<@cdT|!n4i(gj%3g!M~i@mDR)ng$&8CsSt!B^GyCUaFV>UIqJP#w<>cl zZ`i;nh`@@Hb{xQ6KDjRi{&Uf5e_5<}IGu>b~$;GfPyS-JdYi%m!6x*H<*% z$Mag%3I7vn^W;}|gugJeK;@FVLCim50l616jo~@1YJ{hmS)=}hhr<)itWf#n9tJaz zXSn)DoR%zmT9vGSGP6S!NmfMt0Y&}S5oSbRsHa0tSwQ;88RLgVGaa1glx<~uomDGs zA0fMqa)U3jo>Q)tr8uir**-@8F!~gHll4I&+;T3ewDm&v8WjXzW4)!Q{Vi14dLt=D zWx>v@N{UxmpF|)%LiQNt2VZ8zQ{>CEok5inq2H(^*nw3_aVo<&gQ`f6B|=fKEi0R1 zSQhBas3dtI`y@hx9dR?@jGWNt?mWi7f!wkgpzy!IvMkP7u1fQ<>yNsR!8cfW6w5Me z=k!WVFW26>55ZSiZzw1J7OFJ8T`6^?!A`6SibokyB9uRJ?WxNPwq(Up_Lr$UJ61}B z{<`8|dsZ>UzO2OAv8w#BL?{flVP#Tu%evDrFB!W#@ma~49-{a9Ab)SN7u?i)Ei*rq-pVw$_T|uxlD~)pI zZ=uT1dz4aF7VN^Rrudc(ON6;cqdj%`!B(t9iej0uGo(@?^w*UHJF?0tu4PzfNY&h9 ziBJ@5$I79YmcgBuE9bmM`y>L8RZj^o6F4td&3TUw)S)H9Gs?y?DQDSArAMaSu=k4> zB!Wd*jI(T&(qq#fu#by>v2rDXm2*<1l9y>O?8D*}Rx;)I-$Ip=wF*)kmdv(-BMXNz|D zPewUiX75~5>EKn?>s(NE%{x^h^gEYSIe3>*oXe`5y{jmXC4zS)CnC1*{DYu;My#7P- zUyl!4Z#)H7w&={NqIj1LIHRlFBtoCFowsS(VKylzwo2b}8h^ADWLT}94mtnGj| z^wq{f4U}e>3Q_rV*jXZ?Lde&k9o5&+0@d~~^xM1Y$p@6dsp87{R~m>=zI&RubD7WJ zSZ!Bs3&=_mM~8vNX`XydWwAAXt}#tRJ)C@+RtDqWOk=B=py+UE0E#Y{6iA~wIU6}q z(Wov?5m$qch(>jAf}y(NoD&0+i$X_d4pInD8)-unoX`&sv!vr>F2S=L^>L9!(6bqw;GIXtW^uB8qcS#7#{lHX5E)d*Y zC8S+!4u-0O?MKoebkpf&!Y_Z(La{U_WXT(WKh<7OW?6b;fNa(fnbGz4SMm@bi-=?*5gxn!EBT54>u1)S>aM-t2 z!$kf=YbF?40jfAOoL<{Vewfh#ZUYmo`2(f66I@i<01a7O>wlM{&(NXurY;2H(0M?*he$-EA`IaO5x=Xx@TP-Y&Zn>0zOGCBnYAGh zP8_f#n$aE-V8{=>QxJEjCWMaue?NBt!{M7?Qrk);&uVpx7$R!H`5sz?Y`lrMsAdwv z?F>0WCbwx#X1KyU?MFHZE+GW6!=zZ5Vyw;)%c_$*e5C#*zA)hetZpZZ5qF?-Z?GOQ zGjCl3ehehF%T2~{PVg(jEbC7LiJY<;S@b-z7GHQm8Mwq}m)+^)2-N*N_#2f8RljaDyQl*ye_cyc?jndgv<`%yCTi_B zy|v)bY*!lkjxOaGrbU$HuVe@(>`|IHM1SV~{%GZ{0BmWpxOhIrN%T>u&%txTIjwZN zHoN`B7$42B^F+NNO-MVCqx<(~=JEZmB_+Y7#YV(>lQ_RA;H??;IAag6NS9A5$)ex$ z+poO9Cr<%^!dju=tt$y|E95v?$nJEl@}z?qC?Fp(=}6xOy_xf-h%OIx5G4v-`EbrM zUAYbL7NH`(BYGvg#RqZ7bYL6dEieU`&Y=F|xj zc_nU87izNPz=8tJUdz&t^Y4ht!fr*_MF2&T&W68{FX=IAHKd_w=+~ANchWk}^Am+M zNB)-D8-8!H=m%=;DN|w!hhV5rG;-2Xc$n|=CZhLW&|$i$e8kRGq|fl2W|WQC-Ka(7 zaWsd{z#pP#Qs55>BkEFAy;Lcf)`E-s_0^y869e zwcN~q@m0xxOaG@@f*`d=Z2EeI{p>qJRz(CqvOwGT%HxWLg}eM7;_EvvzMoe~JNjkE z|BZywgxQU6bgHkJpKz+Tt0&BBJ4IZG_&k3-4R8ja0muY3yEuvZW5EYHDufQ>rcM#q zc?&1a135&_#c{p{dY@Siz5n8kw1Mr-PHyQmHKBW&{&un_v=215(t(YJl&_Y&(V9Z3 z@dK!*GhU~darYahgNCB-s=>9zq4ZP}BI2kVQH)JOIEiHW>KqKmk&bRBx08uLGUgY9 z1GH{#rIU$vZ6JCe2g;Y`$k7QYsJCJ_krZEinu0{;{!d)M$}l7MRY{UVuiWh z6rpCnO@&i+o5Rq_VY(*YI^dMpwfJBf;TS+2VK2%QW(#q`VE*QRJwZ#RyIbkvw_@x1 zY;jg`sAYYoIIAr5-%i#vjy@gSu0`Bts8%%TI9ZvUj0vzM5ou|v98`8}3g@lK8FCwj zlPy%_V>!!{Y$D(_;*|J`=!xa2x!E&FlS4J&= zYu9{+2uzyuxa#==pcWn5=Q70DYpV1%j>0iu!> zUaeafnw>fTeU}(40L-)M3vQp@cIM_=(+>x4r+rC69($;<|Hku~hY81ydZ6U3wpuHaslWMaRn$j~%W`!+3GZa=szyDbv8`T0+rq51p;Eq}AEN3?!-tdZ7> z32oQNF(*EGPCD{e-lezmrJE8@6mBuUI&v*>FYN8jTiZRo$ktlBE8n)1Xb3BWr(Mo% z&6#Kq{Fl37m4Agvv;k#gY<0d5&DI@BYNT(sGQdr63V-=Q+@WRL3S zY!#Md5UuH(G_@9{JR)$NF^(qiW>E05?xT%)7IdyQUxII>t>$ww`gV(HU@f?9u?Qs_f?K zazneqS-3o_U6tq1dXI<4ICZ0;id5EWw#JsC@#*m(QGRrZ)ojiArv%bgycEk!w&XAwFdA{ptK$EiJ!wFp4t9Q;rEsn5*M2p8%@pLqm`9cGkg&SYy5K;MC+C} zE*|_SK4K!(B=4gYGiLOha`efIF|+4sxtth|&%4$8bAS(Yi@KNzqr0T72FFK|&eD>X z9(`clSV`#hek<%*O=N5J zn|Z_a)FRHw%$`feYZ;JV+JVUD11j*dPNNSOZ-weK5A6%R^&`xd#t5?2C4cgqk4B0v ziqfg+UeqD4AUkfv^%&hI4baDoX=K)?Rt-#MfnQqP&^%~DHzv(64B5m!hUN}INNtusjJCLNtw}Ogqq{? zx)`$?!s_#;)fa(8*R9}OR;YHIeo83Y0+($WbmFUW!>CJxkx%k+;TV=$ng-lPg&(uOAonJ+a0}c}=D7 zRCV<;Qk<^GYOlP#Z!5oaDoRV9qdiZ24~SaY;RgCf{+uMw1BJ%u8PnqX4zNcK(BxcZ zCmasdWK8I}`ApapiZUK+FLwOUk4w~8ankW=1z~^AhK=k5#|+JU);I2atSSzvqk1{k zr;5vdvUw|RqsvbqJ$NEt^KOVS&DUyaFv&FJL6YHIKL|a74;z$%DBCRw+y;{ndI>{1 z9$bbLA282Yhua7{Jjp+rqkNuh@pvb9`s~c%uz)e8hQ*gTR$eBtjW>KApQwZn|^Y4S$oUqO^1!%)Uu6xTIi=bYi)h;vE6F>&4$ zj?1klkg^8Q)HtB4ICdEgyZdc95+pb2HZR;j*5v%ki;!dA?F&n$SR1%jc&E<`Y`VZ9 zOnpqP#&X4IeS9n3TAZN1#EV^3p9*PSvtM?k1MS6HLNT4M8$9r+{xVT_aUk1uqKl0a zkBWqT=<>cGq$*-eEM+Htx~Q6i_!Yd7Bt!O_A3s^9?@H4dMl{uW6xPgz^+ph}TxBz( z?IO+$*hHk4HS8JaLPN~V0W!=_ebf+bznEKo%xr7)@#arQ-g<}bs#8z8B6G1eE7sMV zIalAvFfC~Qa^!7mcn;T`Nj)_#sy}MZ6vZA>-AbQ5p}9F%%2_H`szlmA)_(6m)L&-M z2*Gou7vd)YyE@oV(I<0e@`eqR;~OLYdKTsm+r?2hb^9;!Mc2sge9O(*t-oJ=IKm6H z_SfEOx?Aq~_7e3{T8eb!U&$fAF6@F8XW!ZVJSSwS5|cL(`PaGd95toqIbG^c)Dl7d ztJcgL0YSS?H^=nO6Wi1_mdvD`}bg_;g+Q zR>5YR+w;Xd)-|5Pf!(0UzxIo6H?vRtbmMe_k=^Rnk$(l>>0kWVFmQmu6+*J1URvM5h`lQ|E8VwkwW<2~ zRq~`RSN(L_MOSIJs;_}%cGjRX`cke_F!yoX zEtlF^rM;%laZ9V!MSK}I$P?aJpze}XuKw(|tW|uK z_EvmZy*hIA9>KyIvI?KCmMT@k!5q=c%rM!a<;kUecpl4=E#Oe?_8BbcrBHJg&*huV zuQF+lzQBXZ^Ya^n*LX~{c%9+KyOL^27qEui*-{ISUPEPmv5sgTzRul+Jum5ENiTlu z1_5^+@*FVxF1Gjycq=%X(9{L`iW}#}|E0ZQIhkbDsOU9!e75nF&}v-w8tIWzqJyzB z_2AEzZtWM!%Fx!9pW6s77a#a5SPvNFB;4YjJEIIo0Fw2U(ih5A-z{%~qI$WXkZW(J zUai`G_s?5qXfsltAU`ZWG*u;Lx?(_YimbDf@mh^Se<&)QTQDvEtLqGev|McTn^_a7}V)d}XStbNagC%1J~r3XR{ z$dJ~sItKT_Gc!rSsptVm4&lXut`?y%{Ag!1>^oe4qAO&#)`9Vy3)UN`+d@x<*5B!J z50@MMa>C^9#pOM#Y4eXhnOS?e6ffW8-sy-cFwnS#xh^`tLZoX9APnQ_1{wnoYQvp& z!Z**V&)>=QJb_gAaw-s?77#KM`=2-xt$%3m79GNVZdudExq8b{IG{7^H@tac)wj=6 zXyINusvbP;Y_1KJYh!lH-=;u!|A0=YS7ia$pvld1EIXIx zN%eX0W%Jwt<9d6lo=Htl)+fkGYQ_`Hq(={4kv%(w-`KK~9P+Ng77sBJIMBddY-4i0 zK8oGto^FPv&pBYEmXwTZ(-Xs2XH&4W2+xU?jcCN!=z49FQ{p3?Q80nxZlmYo`!HD| z`HO{N(BWr@OQSa!R`-QW(Lq|`xc^~_ztHZR;d-`;qAJw?Ch01>UyTodMmW!UnMO>p z3w3zwWz$HU^w(_P}7>6CGz7?cpLV z0i;U_n9qk$-3G))XAmy|i(Et~(@q!B8@_QsL5KDf+N3o46wxF=>=oHyp?lGY60trQ z%*WBgSCiP0ghy-EXo9~m3sAElXk7%fMm{-fpS`Uy_o%tSh~`#C$MMxzmibEg33G!Q z7B;{6>5(wI<|ElwRD8f(*N(>J;Qhu?^J|OW3yx&#n{5Srw#$}nlx+-e3$CYZxNH_G ztF^U}uO8Rq?zn3S0a@8SxH&fVab5xQXtvzDGkZ1*HxzyEI&$|c>Rax6T;y5l-#7lU zH4oqJCes+5Ef?U{20hA%KDl|^%369vDSvU{$}{o=%*5>O7}r2CX+p56v@u{ii~AwR zZfYwT6$Dg4fBSMJxFP@8@3{HgwoT7KyYZ+)s)f=@CaEf8X2BQcm(&j0ac8_D%#a#m z0@vM|rwJd0d7QX$*Bzec-ZhK1Hz7|`_54l zt!DB~NKT*gwQ#TOwUgV@rz|pBFUcJx#B(do5;9Ivgx=$q+Vv^G z|Nc~J*7lLpeU2GR9R?11eI1`qXPJA19p7-@@mS~i4a-}(31b$U2**}-Jp*srxjQUj z%=|g@c0p`lGE? zuu(C$Xp67z56ZW)Ei;)p{Q-*Y=~vwP9bB@&!9RZFV#<|*{mU6RCFJ5_F`2gItNxf* zl%`lANN?=^#t5D7Uyi!U+}FK5{F-uV`NmxSJ^egPvRi_e@3ER~z^q2^SZi%iS7&}k z-PBio@TyqeK)7l~PqCHwPKXP28{UqLQGv}f+i(F*9MtMFphwh~n| zym)$ZzFa;23F`!5pkLe~Akk`~@C(0Z>-4j!VYB%V;K=IFxcaY%_j4Ns-AT(4(k}!H zc$C>1oi|WK_$hk4IvgXKmtyKZEnGjPv#w>`$d)$cM{-*_bSq}|k>-JHw64foXCn9_}fV8tQAjiwa#UAW#*{7II! zd{H}<*j_JH$Q0K)h3^Cvi-7aX(kS36b>&TqSLpR9W0@8mT+u@KA=kc6SRFpcb~uOz z=-r)H ze3J1XY3d`&0unFZJeY7$JAMIq(86Lz=|OH%gWBaJ$%*SpY{Sts{V!oJqvfQv4!CLH z?u16z#XNxSE`gLTpQDJr_bOUJ4k!5IUTTYLe^2$A$&qX8(Tv~PjtMmCIP?jlN1u#= z=5%p=>PPS1QziUjI2s^)#r4%7U|;nvR5VZPJL0IObhz>vo~A}6Sh_3dD0N|_nWcxvEuhJZ|#DyjFuqrS0n3q)m6Wk@n78f75E% zae(O5ncj?Z*)aeX&fly{FLrs%PUD2ADMbv#r1#Wx3M#LU28ha^VtYp%ewL)pI~KdP z6H}+^_r#=5)pbzI1Mt5|RfeSwgiK2RRAnZk1X_`)`f5olIp>l=1UF{yxJu*I+gTq& zWOjOYPAZs{7U;ebsqn8Fs5IPRz>uuq-vgh3MG>a;tVI_z4Yo#M)wq=tWE)vs_oC!| z&PK_2RyM#hd~Dl;PL^0Zq?c+sxmI8jaD#1e33K|5Lt9&Ed&d)=+#Hi!>pV-j2#$5V z{>4#kD#JbJU)>5gFEB+ZYtomq(>Jo_D(NJ=W}8DX_cl%O)6%j241!(bCs@Jn)ZZpH zXdTSeCRG`f&Oxswjjm;v%#05WSGnTAL!@cmhl#i4jz+fA1_hD?_&<|e(2E>-nCD>g z4v{AlnY-*+?>EKptj(hPor^iM^e7HF;(owoX7T{Gx_NG8_!Q0_U1s3h?4@q&;{P+Y zPtUkc2JIW_@hi1G>be<-W0*n~C2j}(EYT3W^H9dj*r(w;&XYCPFrC^&vxh@c2w-## zk(Njcq53eoLZ~y{keGU7Xl0*C$S>|0U)rx_BvnM+&aPO-hRwBj>$_o1X~z+=Yj7ql zimbE(U#X0-gHO)XrbI2f;g)~l<=A-6Qpa#ytDDKvuP=7wa1&}#2?Z|C(i2loZW0s$o}Cpu$T;yUM@aiuk$M>ub??PRp`R zebMX>FXQ0Mnj-p|j~}3KNxL2}0dHAzS|xQX*Z8lL3NajV2Y^V#c>3>LG8`m)6K!77 znnU;_sB6%J3@=eCK`z_%v#eY{@HXPcn&qNg7v~LwFodFY^7RGWta`$@e@09?G&Dm* zG;o#dnvGG<;Ts!=Ng^a?+CLiY2n|ZLlDPdOLYSL&zPHZZ{P9CF1CLe|V`%>W=2&OZ zO}L$0*+4Quin{p=$0lcl|d-Fg+iKW-K~Ud%GZb*Ar`V-I9D$}S*LpQyW|qn zG3R$)RkwbU(sD7@ku2ch>`37ObHgV{lKHv2%M(ukLIHggaiRO2Tsm%bs`-SLCe*(@ z&f4t|w|C{+gS@<_%jqBK5;k&3&H#Sf#zM5SUSX2U@Th)i)DJ{?Vy8&+4e2X|{)@J_>70q{g zH`S;kSIEEmGgh)^R_RO3F;c97`mfThoyX3iBKiAf?K1lMLIE;_M{Y;aA8~n{*beoR z=!3M_42yI4xbeH!+3qla1z8&hr|dvA*M5yS(V71o`u1$no{;kANOgbHHv2sxSASaf zy6vfX6JY(zK@wnTk-+T{YKsMnr^>9nOs^GfcT1bPC2yAc%ymnM{Gi9Z^k=S=(vD1f zC(LOgqarj_w}jF8+YkfutCS3gqwdn3W0e{)0XeDMQj-ymP>U>gSdz`J^&bSTaVbZd%L|n?W|G>RccWm*c zPSO>_+5A!DC-r;VKrA}O$PIWIfHPZoBBMH>9vFga-Sk7gIh<%ic?79_q5QR>Qil%3yydE#(FppGzcCFpt2 zjif|g$cLKactx-2E7n%dMwvj>cgQExD(JnMl5iDJ}`dh)>~gY*TxrP`hc#8l{Nm^byJegtWA-*c5u^!U29R(N;82k$wzZ!bAz{% zEV}NW0>5aGZ;853t&&|7@1j0gX9W=8@elkP3R>|9{h4Z9zR32nDv0|KM{(2cO*X-3UH`HsH{tJ5%| zI(EL{?#VXs+kw4&lODJ5En;m{3NzzF>qE2aEuih$Y9?757=d8`{S>l4>al9!FOyVR zAd?^MD%`Ln_k{3a+&U-hYLgDRXaSxHc~G}HU1_&WCC!Juz{v-7zW3jvseP~OwXua* zzMkwkIFUgmW*BsR4=;4;d;_o+Y49=3cQPP7Tg-h@L-5Y>z)tlR?m^vi0g@p%9bW1h z8?0#Ma=6og`x4{g|Fx?Cq?uhi$5?w6~K1TtEGSHI<$!%?g zUb&gkyjJ750aYse>lL!4j@J2fOVWX!xA#DM9$o1+en#5lra9H*elU(t7*smb;PJ}U z**(H~rG8&}fhX?A+Rd-T(27oz^abw>MYru2_1h` z_xhDS|FXU1G}pzW$RUG!+OTA{{qbGL5~o?S8#c$vU-49WYg^V1QPB+#Wa7b0!Haa- zH(|?~^E>Zp*Alk#LGLcD_V7K*DJz+mhK-yl3lWNIteIArwu>DRw#?#xQCgPy3V!-! zJ^G=UYF}FE$qed4m_AHPua3qvesDZ~ANxYAscr6w%`GP*d?LTRO0y9Tes8*+Q<&*k zjK8iMqZ8hTqj?4NKC#xH2s$`@wwFCJ{Ax$|`Oq|T@C!lLS8z)(#&qO5`v9!wUEcwQ z%LusnfjXf2SN;BFU*S+8TQA4ADOe%?`n!y;px!sH;Axo};TT@~uLo%iCj-wR>@2Ce zuikYngj~b=(j=Psc3%ogY5#M)rlyj^%H!EP^2`c`7>kzQX?ECEqxm~ z4n{-S^k%a|OBn+ZIWrJEs(x)1)I?0n@|CLaCoUy=WRYc8#P7xHL#1XG%~4X}N^cNt zSjaoFVR_)Ba*y~FEwMw~qqO#sd~PHWo^IP69KaQ?v#7>KuUo%voiusf?7Cg+GS+Qb zw_)91>+Y?CtXn5J%GRyhxNd!D_N=2Fc%)@N%4VO_n+cr@eaB{x9%QN3@Yo1<>@kdKUaO<>N`~}7M%k7hGF~pxUS29HTYYarxbhi6$jan&R#R>V1I5x zg>$=q1eS0bxyYb&<@lC~qhX2*?b!mpcD`lm0%q#&S7{ORV*AX+g0Q0b`g#I^R_*(X zp{sV{liD%_S`yZPvR0kF?kW88$pmriT6+!ox&H7rz^zZEhY#!8pFFc1J*j0&Ug>jo zFgHFuvtU;c+;KZBJ6>+R>tp*_*I#dKmgxsrzjL)`}O|QOP zz6@MCZ+(#rRXZwEuNdZ&Z+*(Kc7qY*_xfWe6l3CV-KSUfydJ%@?$GN}?F-pIFPwJU zW^%FGV9J!4m^p4b+=2fEx+kY4*Z zq7*aeRv^Q)nA4{JxJ2C9Q&?VLvw4rHqxMyDCC}~Wr!NK42{#)#7YBQ9bGr|m3A}W2 zTs24IaAKO{iO>ceWEv-IDA>2tP^;N+OdWK3lonn&+Souz4foB*;jG; zHf~2+GS=IrE`&X<)I0NG(;2VQ6Rq>e%{ti{{oR=_w!Xcp^)}?Y*z%R;kL%-`QP)0w z$$!70QZxLERH(Y*S%2ywgDC5i)s}0Q4thUx$G=;5$?QVZ{;U@JUUNHJ^}N%X6;1d% z+6zkFU1j@}CO5Z29+m%9^17}?ryTXg)x9)hz3g1#<$PIaIU{(z$FG!Y_HSzTq!&wD zlswWhI2N|K&F~SR`}@MVpBr`-$M$XNBr7CaUl4CiRBH62+*|#v7IV@0ldc=!%V2OP zhc~nhEq&{%UBhSj=jVJ+?@amDyrb^u>zG@g8=d<$OoxpcZ3({RhF^zciyo7)|xesX*hT8)2+rsO^f63lx|r@StzW2mk7ZMxR|ZHM#crF-o|f%8*i1P^Tv zap*yJiDWQ&&!zDesrsnwdh(7d+dQIsPB3d9_5Zbx*VL}>-i4Be+w%i11-@UWwn2;EmR$qF4Ho)l_sPlVD+NOF!In0W3|JaYb$CK=Rwl{w*zCCuF^~6&< z^GG)5G$}GKQM2g%`q}fO%gmXN=>-pgPs`)E+@=|}rd|u^wz22v#U$0|uJaX{>1*cL z4**8C`xc!i8+qJ8w}U)o^QM_4n7i_+}o{?cntwn{10qSN1^6VnDIK?nOW2-vKKI zHZzC6V~_cL_Iw8Zh}aN;`HHnrU2w7(sFu?{9{;#Fr2gioSM064nBb7TA0NFTXjK<# za0gvy7B}}JyKiq=`tX6y)JYKSR=3zXY@mFHtAu>HqEXPfpgCriFWmp5u$_I{O5t;< zT9VHBUHJPp+D2?%H)Ze5wCdE&J4QM#sl~p^vh7xz(gS83;3aDrq;zY};}7~RP#TRo z-dV>K9*19bndOvvzXUONKxoiO^oQS=wiu5OpLf@(9;+XyL-y|3Gr*4VJN|sZBU8L}380ZA1UbM1E>TilQ!{tox4 zsd*q1yg`+zc{>s%tLA6}{&Fk?)A#A4{+r@AalqpHte}h%Dtq(5@VxzGc3huw^|qgh za{e2Y&$j%=s?7)wYiyoHe_P9cw0KtJM>+R9xY{J-!wH|oU!uLg|9ZE$lXxri0df~& z`>*u)VZUH+O(;%i(>!6k9*r?jaQ`A(bk1R5K*#U1$y}>4mt_#D|NTvtcmr;lCZ(S= zFD3+w6hsuhzJ_?S7SQyRyyvxUmyNYLTd#lyce z#`iGpfUbhnK#`bAZU!da8tH+gXVYD$O2+~~mY@?L4@S77fv##$xN1ORV0o}RLtWMX zX3?B*?qPXQfTLkFCKgkS$;8z4O>ZI9+D_lLB^Wmn*bEOlcsrUd8 zgzhnG zT%co+V}N4_CD@w;^J88nt@_R2ew`$3@%!z=q#$KSI)~bZ2D^|p+1zYawha=E?8-hz znj$ItjhFvAJXQYNXS{r>e6D=Fe7c;jH?p&4I>gAOt^kvYslp^+$}q^lw7_bYT5l}t zYyL>^=;FxYsLY7WXwTf`xt6(;bA@xBa|a=T5NU`tL>=M{QGmEWj3IDHDK<*-M|F1o zh(D=hE|g&ki5#BAP1y#i)~1XqF=QZCj583`ngQf5+{BV0xNeO!Ov29HhJYa76oX<$ z?nC4tnb;C+78Z+*!4_fDu{GEvEEe*RHmuv-OR<;x}CL4={XA`rD$f4{nq#{x#NrSXVlCg~md?`rWYj8YUH@hl( z7O9w>OcIgSNDZW1+otJ&w@rtqHRcYF*Ru}K9iFad93C5?*RvzWwlXd-jx1X+9xfkW zez3eZ28*gg)uOP#ufRHBEf7olN~@#Q(y)N9fI2`e0898vs3X*h0}&AM6LF9@K)iIA zyl9eSfH4j<2s8>b3^e8%a1EtHe>_lHe$IgR-f|mDn7<6uhHAqxp%@qjih&1)2EqcN zfpBgp7siEh;nD^Wm^4gUvI8m2fM!%<6lc(CkZvGt9A~6zplYOQCVGT4676*-kTZdZ1tfAI$Vki+tgc9NEq3SSos5)F%i+4WpicYWz%JJUEEIebTF*I5$X+Rh34ae@r$@cybMkT-$T7jZK0l|7E(Q_2f=}0 zX|Od|9qbKO0K0&V!EkVCP1FEAf!hM#i}RC|^k~nTSqwFX8AI{ZeP}Xkxe#Uy-$;G0 zKPdyphW6oH@uRp=yeZBUkH_Kh;ka=88g3205w{T^g^R*l;4JV>xF-B@+;Mz9E+78@ z_W(bEo51hI?Zv0yQt-EMxA1+qKD;(g8;`+Z@PW8MJQv5sOXH;Rakx0VHO?AO#1Zk5 z)rI&HTnXMA=Z$CKSa=1T0zM0ug?GWZ;D>R;cw?L~9*e``B|mb!E!74V-Igs9CXUoFi%slPA-t#LhDp<*eR#}G8 z=O*t295&3!zF@1Onw-+EHhDYXkRdYLoTLIu#cOHYub$`T{%in zRM-VG73JilcGbyS9C?1Wq)3YjFd5yhKk33zJ$WL_GBLj+Fy6t zHKE*g;JtTm)uX78?vt}0PLwf!1}PfFmRk?xv-)J1FM@PNU;16w&&}%XVjiqB9F6q5 zT9fC}=gX`PGOjaKw1&KQ4LYo7r`qjjlx&-q;+4de9!;LR1fSmb(@HRXyG~p2eN@oP zoqeuMojUc=ggM*g_wZgklNzL4r!|^1XD9n!syB++z}p2oWg4$!oAlnQH=o(VI|$P- zO;ob8d#~D?!ffa5gPk@_$gw5A2lZl@L%hQZND-X2Nat9UnC^n1tN z5@x@okkT1Rr6M~?d7<7cW|yRpkGiD#j;*8uPA`@@DycQ2B`FYNC#k^F8^dgp)X_K< z-YGxZ$?9aUkT#Q+NwOpe$&QpnB9r)}CQ0>*O_C}SmZ(BWHHYayNs)yO;mP%vfQ9I8 z$7yd~@amTElzK~AA-fwg4d;cgu3vi{aS2d}>b9E(@d8&juf2(|BoxxR!P5{Pe0Aem zvgi_`kkAdB2J;X+$g0#@ipWyzxic`Mb!&e7InpL>#>3dnKARNUJ>9i2PJ^XBdV0oL zQC;m*?tvKSAkN2358(3jOxpo>X^iDyp3k{z1DD7%?P>1T7>~gUAH!-BmuF>d4({rh zL()#)-P1n5?RRPkaQJLLSnQ))ZR8SF)=qJkp)_Qcrlgj-dt-tJPgQHWB$bi%?kQCC z_#Cf3H~ieUL+`J!7UzFpP#hbv|WmwYsap9O#M_c6)(RyTA>@0E?GsgG6l zUY5tLJIXB3ts#=nQ<;jRdYvKn`v%K>^s9}Bqh{Ne+~Jt;!FnG+HNg0(V%tu4DU8Kn z?#$T`1LH`=_C$9p%!9!%GX^0h#?O##w(hE!TZ5lwbV7`bqmb<+cMv9Uuy)2I#0>k? zwN2Aq4r4u7Fmpb{5F6>*UheLQ@gA(2F$yuoJ{xWGbJxeX43^F4g&1R_M%(AyAsF}| ze#R^W0Do%QrsOV*u^P;uIk#j0k2G!1aks;O1~D^+OD6DV_%=6pEsWz}$&Buj5j+at zPIU)kAcNQ$(;`5Pp?!7kuCtwuR|+(I*dPuSJ^eZWkurgS=SfzID9Sx~$Om@yFAc3g@3ya-3q z&f!L)8y)E-3;p~c z4;My=)*)U?HglRvGC**wkOck%p}%Mo;tik~HAS8W@dJfW(FRFR`W+aO^P~=G#aAay z2<=6O5J*A;Z4$gt!#5VXij)v2#5cgC@fmH-9XLU4jR6bas9g+du z&-G=Gk&L~v)|z`wSs_3cP;7QT!kSvBI!gn=zfI~D+tI&d%_LNxrG*fnepBF4;9WpY zD6JJ2(cfoH)>vt%&dZ-csuo+;KWRJrF<`pN)jUCC0v5ucJ z1+%nKn#9x&h+CU9=Kl))Rr4#)D?#KXSYR-gQ85$9H5i9qVxmr&+HX6-=1VCPV=kn0 z784|-cfgC&Uj!uoVof8Yalq|M(G~Z!zrb3c5jLlMz;i)y6Nl9wvhm2HK~j-{8$b~i z$JU>+@z|q962!ohNbxm}B9CMsW`o_MNm40~Ta%(9PNYA3gV&=?QaO)jlwv22us>pS zcr&|w_A``aWx78l?CSu<#>>+*KVw<80;;i?odLoPrPB|7 z^S=#0v6@rW$IK4Uk0xp+HK&RU>`}SL!t$P-w)rW4;#r|Mjw9)h+F(0vyiyG0z8|S^ z0{xjAJg2Q!pg^8(iq$yg{-h1A)8;FsKiokSXbO0oTz}!H#fHEv8RRDM__{zV5G7K0 z(|7rPkH^8mp-N;8ceF^Zk9luwYwTcbV+=L6J$5v+XB*Kim)9H{JK$cifMY&flJN-47Z+Na*UJ)*09D)LSNqGK330 zTexxg`}R&3;sEJkK8yNe1)+iDz^mc8@Gf{1yaJvHhryGYtKs$VLO2`}3@L&nLmD8_ z&0Wp8%~8#n%@vSJNEW0W5)SzYNrSXN;vqGVJjf?VD5M1P0n!ACg;YUuAf1p%NI4_} z(gsO{)Ika$-H;GSF(d`j2#J9}A=!`)NCcz|k`8HwBtU8*`H;_$Fi0sR719iegH%Iu zAzhFtNX4%dNG1dZNrKeh4`etx_}*`ljBY?j--mT%q1*2xUOuAJ&@JeAbPYNW{Rth4 zEcj?O^0p%c+{_d~rK9fB@Kr=T0rF=!|{8{L79K$oG@o0FPh z&G+sKbSpXmU5m~~e@2I)OVO$5W^^378l8)lL%&6nptaBfX!ku8gMbez+}T^&Di*3x z+egaZQam}On)3#JYmcIq_#IN4ho!diJo%+ydCH?aJE^~hA8v(?a(S|JG?*&#bJL{8 z4RdUL@O;wIVhZBt$xIy{rrL`2wI^0bF$15(2l`=+t#VHhDUcgKEZJnJc5CL|z^z@< zbQAbG#Autz!1Z+)zsW>1Ep^Lwp6zX#%y)AsrHk)DQhG!y;SRKY9JzWR(ke#!`2N3AZACvidiA#ePyW=N3rK9Ol_d|Hg6!*R@hIL-wlC^&$yXWlZLsr zQhz@A-4Y18uLqMlHvE5=<4CO^me|Vu$@jZ0P`R6DHT8IyWGm_?+waCdib34>OVO~v zR_0Hh->rW@K|J@X%P{j+(oe46&3}~cxFMRZ58G6IeA4mdcrPdF|Mo8UCR;p^nvZ^}a^lJIq5`DdDC=yBMtkIg`TnRwx=2z*a z8=KUYf}lRg0O$9uAq%e(^y#4qNKR*+)@-^`aRZY|KBT_0OKZY{zH3FBfejK+rIw(x ziNr?Ma#p=`ZbH45smj-_&ndaqh38cH>SH;-B8FPE#^sdz>UBYvkxb57t(glZhou*K zH_%%oChECQva}&%2|zCj`UOdbQt?TXHfAhM)cXqEMB<|qeLhGV<(FvcRY0eZv?z6- z3~7`6(oww~=r80$l)O($r=eL1zg{ME7)gav^-1qEHY=^un}zNpiBTY*)J~)25;r{< zbP>sj()7vfG+8b^(z}G-AhA#{&XWTSpO!G`B|*O;DNrxZ(*lg2mKNxZL3faZD5dic z0Y;xo%=PM_vq*ZB#(747$>-7)y<_Ml5*MX#o^oyYzT}x+A#@B$gHk(Bzczkf+I?R^ z{1{1sQa(?;Ho7ed(t|_M&{ZTeO6xrHTIS6IiIWH9wJ%9K@kQGRaphPer z$Psi1Y6KI43_**aLNFpI5cCKd1T!xwFOZj#mw}g@myVa3mx-5*mzI}`mywr(m!6k~ zm$`@f5&tg#pH!a$H8 z$gGan85Yy~(b99A;sAI+d4{7C+Fc}A?h0SEv906u^iKnNg7#7iVfBuE4#;wKU(5+;&p;%O3T5@-T6@imDx z2{lPZ@kWV82}S{<_@l(5grg+F~C1pEMge12knLVl7uygH&ff;vDQejRZgVI7GZ zo*R)Hfg8XL-;LOf(2e8>?}+G#;0SPpe?)vlctpa4$3(+e3mPjQe$kmP|Q$%ROdIJ z*DbL%<%Al7Q?4Q!f@up);Io>-k> z&c`k>E}Jiv<#Ea97nd5&%UTE?>1o!F%ntXzVFKk0+%Na2j8ma$1Qv|)#Q3D_vLcnt zXy~3!?8bn!#5xNOUyb=zI>@MtfvSWiJCDG+!`x;QDo{|B%g0X8WHa-On6??)-X6*M zy+36HRR5xK_R;hdGb)=zWSM;!!QNk7xBDIND_Lugu0Cr1x_0r$c6#{-7w(Sok{wCj zvqkw|kA>TOXVadTxf(0=iRUgoogSDy&JlK#&xF|}!CsRrwm3|t@i$FuF*QwCYIRwa zTAF><;d(paQ9I)erkt5$*ND{EJz_+WFYDmGGybLd*8MX_EgI}7ykOT-0at?0j=N8x z90T5eS*hbAi!I3_Qa^GC%VCkQQ;F=19C(w}RzAa-&k+m_c?o{>lLsY6$JpGE`5k)XpaP;)lMHii= z;Vj9yOD&hp=hrrWrO7|iZc`mLy`V$Lc$79&^U<*EM@wB zP@<@VW=UV626#=(X2ykITGj!3Rd|c(#uGKq()}q>3 zOpzWOOI%C*xtW(NfCAD^n9n1uP;<-xS4_8FPD`#wyP~Ym*TjNnpUctpxCBFRuY54- zu>xhZpRf4@yW^gyjn_YiJHz5i=q$14+-Nwc#qWE*oY`vrnP92?Q%qir#RZP=3<8^$ zFWF?%Xz{K)qt(u_a|?%*n>G^61Tpk*JM zck!&Gf#TPLII74Ol1W9yBt|Fk9IVm|{Tpsypk*44G-Ot#EU_A5 ze!JEy%$XPJe+JAgQ2Epn?iN zwfdYr9WY&6O4LTYh?P=dv3aun-~xnw!>THDLFtv(_LUCVOERdXi(4ptHQieQcy^!d zssP$AGJu^4UefONCB|BwDK&Vp?ndG@(b*M|C_Eh+M-$zS-HSkxlaU??EQ@b}wmTxY z76&1C?;eE$VvE994`LqUTI_zrlYY`?9@AjJx?71S%^jK;TU1(de`-uM>uwd^JKoUI zSb~$NqkAz>5Lfi2Pgn9^MJYpl(%1Le6cvI{rtWg0P} z`+mkju5>H4Sz-gRID?;9G74fLFbV(ZY6{Xn@+XA70@(2Xx8ky&L(PlXEB646_lNBy zspmhGK(>>F9*GC5cz=~%37l16pv`|MgY7maNxgD7XyBiJ6ioErNlU9o0&^8RkYZfx zxg6&Ed(YOB-H*Ev0_ndOhx^Nk&Y3`~_c&bo+5mT1de8(nU;5fgBZcUXFhVQxf_A~7 zs4yfb#hsR%ih=&8pH@@4k5 zG-X^{3_0J!Km$&W|EE|5oE&0U%wdp$i|`x*uot;dj*PbcRs@c~Jk*4@y5k2(zS7o{{ugAz0RYYtHh{1JlzI4aerUPtV3?5MwhT0l5;^|>HLe75PE0JHk|Q9YNDWIDF2ll)4+^VB zxLgZu_<)$4!9G0<4VZJ-*g<%INH@dHl6#m`2=DXj2GycxoP%oKY z|NON)%{Tm9#A{Y^ob7S!b4mC|toYzVY;o66vusNP&bjw5DSkyPXNn5BYamQ0_OYzg z9|hw3z7Cbqc(AU{eFEi1m=I+>un&HCKi_aYI$85pSMW2ZYfag_FqR``;%t&|X0sAF|!;RFg1UzsoDv_7mBKL|dq!0IjpTm?ywhy9gna8+qN zbkDf$;jbeU<3#DQW!Um&RKWF3=uv*uJKsIj;Sv4n2vc4yIv>F-9;ZH_4msxaI-uJ->2>r7_5s{tFA2? zQFUw-#tCl=t&4B$^l;Jx=xWDwgvP4AaZ!1rrt(Hc1(jSb{ShA)jtvWA|8j!}czXH_ zcJ|1w-G{y1mEA|hY`N3fRqhe8osYepgT0-R-T&KQ+qS5LUGZ>(z3MO7cy-!bVIe!` zp^NwYPGjcb6QEr)Y-JC^!C-t#0=z%I$7~4I@Yjl2`FN!XP!@+g~DuP?tA>T4S%Yj>C`i zk!SY_Snz_xyaloG<=G>1!`$!F=RCW-@Fi|xqU>fGSFOF3ux=2mTbX%dLdEvn z^>m2Mf~RywflaG}_N5#96A9Cwh_pygH;@VN2`^EARRaNAL_{wik(<>U!Y~uylKf`d zbnp`e9Z-3^Ms}94nB8((_7g81I#agWl$5(~DiGU`a>A3$w0lVigko{8STk7!j)ZW# z{aOmG6D94^w>8k;W=d}Yk(=!sn=pF%rMb1i@jBWTFB}(MmmFB6JdpMp;Y2OI4(lX? z1HZllbF$PKIZ&#jJAL{WhH3bvr1-fW@(bOgoTrhjZw}8294;s>52R;_Paqux;n}c- z|C>&H1QZK5aW)(>j>?%6acVD1HI99=HTvb&SnjZ7?9g}X<4pIhvYq2G^`VIY5_7JN z)uiFQT9vA-`>Lxk>2a>#YX6Oq0y-pyCE*mk|Fzzt}7b%ite9_yiPs3cQc?=~|ZR_ZtS{ z$P*9h5uf7;4*b$}&!5Bd$y=8M=f?B-*JIfSOIc#x+vXVH2fhz7f+fX0deu}J>Nyf; z$-nZ%=X~rtHD33tee+3Qa-}-Ferhtv2r=sfJ^x5NIUX#jf2-4Vv!I+i&uh0BHXX`x zzk{%DAGznsv&XBWTPG~xv@c}fmQo@&oMID?V4%UJYMtWHhCJoFmE;5b7 znKO}aCW9a7`Gsc%D*>Y(#v$>yBvI&nC!>+8Gv@2VTb(`P!mLsjA!P;YM4VhUGHYsu z$9YXX&rm(~NB3|9@+y2~pm3d%5c;ZUofy;4KoKLwN$#c2j%N|&^kaWN9l*bdc_i(` zVj>XlBucB*M5d66+j)wJEFqK9r0?x7FgxfX3#+xd92svAiyy?xpRi8VBGRYW_Mu>j zCe2L3Gq|gCVtkogb3rA>yUxw8z+)xpihAROl-axHTmSK8a2(9j*k@jCOb+3qgCZwXvo4G^t^EkBO5Pf(lxynnS)_r!0C)!{QsyTkf33I|{R+SzYz1Xm^8 z`%``8yWuorOj$mD>!_1EJ4rzihOB!tLh_Y}-wn#o;_Hp{r%<1k>P6p-q=W~eSXeSc zGYsrkX01V+LBQDxi^s|76um+e=?j)>Q`2caIt!Iz{3$bHONtITyXqAAP9-85?T>Sf zV|8qvmkkE1T50t+>gPk}x&A_^SldRvY%p9k0YBYZUbTI5xaC9b;syWm=1oQX)bX!Z zbR1Hj0q+KZ(@#PbJx1dB#y+ML?YVlq6p!?Y4b}o9j$0bM)sG3)Dy*EdGL564M%)46 zKJ0q~-#lVXZrxhMh~0tb#dKJ;aZ!6BF1xnEc0-U!7%gn1oz76Mu26@rdpY!a%$4!b>*RY#W|$VBGx|QYd5be22p{F+8|kn_2O3{r3NxDsIqOswO^*KZuxI-*0Tknjj@ z=i=-ZJ)IFk^EPN&GPH?L=ZD<#m4d7t)rz$X*+BbAp#Nbi9=2pb0<}5H7bEqh@ zz;PLCP;^1Ri!qik>b^KDbJP$Dph1TE-1V~lc$K+&Ew_2LPN`5twrxph{6Jr)cyZj2 z>Omy(Y=?9eZ&~?KqkM2<>_K`zfWl9bj|aQGs&D3$DWtXv!wmZqH+D}|$wuh{?(So} zvC6iS_?%}iymj|8rz2=DqhF(?HcW(VbfiSSVa$-5?~F4Yp7bf}j|<_KG0K+YQI%w; zBl#NNC%t$yWW;i9G;nbj5x{jKeIJoTMOv+zlP=-BY`F}fre21z#@@J^I_&#sC)J`aPhpMK_PyyDoMQhndjNo`izjMpllh;#joEq4X%k?_KjiLjuEr)$c^*o-T33`(Jv3N|>fP;K$xyQ0&IJp1z;9)n0tNZmTO_Pf z^vcftOojzFb6YaOsk9jg`}0RAN*2Nr^;#(`+85KG)YZD7#pK{?=IjKpzBsw4D)yvW zRxF2lKY6*8(b#W$^cgz=y=^mpG~>@1`CJ~`f%?Rio)i9karfH6uPu6Cfp`-@HbroJ zn;j_ecjjZ-c=G%g3~UFAgS6H?EY@(A5^WawVlwSXws-oEt}Tp3NGH(33R)s(qCCH; z2l=;5S}NS*Amv(aLZtwgL$~oEugScnFxuXaeS?pGajp)H6Sn18F_IcF3E4+B``GK= zjeIHK_AS((iR`mBqQ{x1plaf%qSTHB$5bhP4%f|ebT2JS_~7n}Q`2^*9Oq8#QtmSx z9^WHpKpnH&N8sC<4w?0KY0(&WlliEWrV{r!1@M}cxJ2<(bv06shtfpMZEpDVuoffDZ{}()GevR!Z{O+o+Awx5?vLLx52_@n zugR)w%M@A?v2`kTD&yli;N#lP_xpJ$^W=*AP_5)(??<2UNUEEVo>|$Z7ZcB7!R?C& zz6|K!a2b>A-}M(Xg7mVS-G<~d&vWjLvz);Nn|bcko$?+9`Jr`yFdc8RCoUCY^zcKw{MQ*wjm^5lu=3VNtp z&V*tF4^^|g%SMnYGM@?aM9!bkb8!x z`92$B>dbd4pM!6scHcML(a|N4Sf`nqPPG2E{p)uA#!YH_Y#1Xt+bIFxLO%NA1*tSt zanK}29X4s-{sVvUCB4C?x1i1M<-R6t_-rwJLI}0RcIQ1Tup)M%!l8*{K6M5aHTFw) zJ8KxT=}to0Wh==}H|^n*+!^8ml?0x{6_o=o`tyd)>L=HYlDDolRcH$?OSyRH9eOOQ z374;rkfV>#j_aEE^0iZ|K39P7ZB|QxSgvKlKpdEH8)ilTl(T#AOh4{Xc75n)qu%%$ zau;2e_z+sCU?J6qBX0UT7}QA2<>D>QEgGovs(2>3FH4(VEwo>YL`^ra=ragQgznXv zrE(}%bN>sY1<@~iCKNmJz@NQs9D-M9T5bKwT9$~HA$A5chhFO4BkC<}AtSp=-`MjK zqxg{%dRKo`ul@}6F}WJUl{~r->e;#4ao!*EPiuum?QDnU(qf+I=+G_ouW{l?2(?3d zHHh7u-{^$p(k)G|mE%Z=wS(l8|3R*yqpfvuN=yWZlbSBu(2=tBUER*Z4Y?(8tf&N9 zN!d-#lPHH*x_mOEUdF~Cjelp0cxXWD4r-W6^qE>@KxTf`Ry7m%;T0C~jChLNYbT6ZQezpqMG=ykdr3*4l;D;tfXiyBg z@q!lw0%7O zrK`65q2J)fQ&~XpeVXb+Of`VMylpHbv$P=00ua?T0e{S6zJ_$H(o(@-jz=%#GI_b`xy(Td!Mj>+UZ!0MKC?A3k$Ic<;O0>v=*9t@ z^3+>+|B(Xo$?xY8akdXDbRsC=p%Z#9Qgs`uxeckQmc;Zb7`q~hrkq%Idq;HER9}8!TiH|uDmT*BQ=SqHwFFg=WR~f%`g)a zT&5=V6vNjF@=Amy%ihd%SM%=hgU0lQpm~+JTYKWDgb}+aibpYgOn~gYTa5fk^VmZe z=pvUpmo4!!{i(Rn3WDwk4>j*TA}t--T?f4lQ^2~tcWP|X{z)#ojU)}Z;cW8uHdnTN z@Ud1{q>R{^HHrpe^+;2A9yu#Fy}Yu9gfE;lv^GZIS-& z`vZ*p!iUHY)m)4X;k-2zw%qC8Ot~BRRKXRKD=TYG+$rC67Zf8@O~Rer6bkImq$z6c z#98a1GfvJaPh96(M8(22*6ovA(*0v|My)X)^eqN_seAa<`^vdEjgbU&YOtcGA zVV}P-310X=ZEKHyxFPVeUtAn0p}|9+eJm>Ws&6#L=4q0T7gyyM8Y(V(?3i@nGg&8C zKW~|9{8AdQw1Z~)wKcVoI%&@0#~zy8bOnAFD@dSn|%Ye|0pR!o=f|3Ll#Q^KV|3Z^^~pfLAOF3Ii-a)gqFrC-a15#MG+)7MPnSDxr60g70_(?f z-18iw6CaT^*-!QuU&N2>i#CUl13^b3n_Y-<8AF8nyxd*tyns~E-opOt7Pacsn$ea{ z8c&B-N^4)CB`qQAw~fd^X%V5JguBs%vmNP|<$A`4wG|u^JI~!jAxv$B{pITFP7Mi5 zJH@?i0n6VsnP|bA^CJnE$%s{)l!=eDAn#A9?^gMn`0~54&kQMiWeTKy_YhvmGh>OW%ClwxlII^XdPS zzH;&`CHC5^_?|$GNVphI=pIgp98S<2PM{u6SQ$zvA4(Viz$urw!jtrnXI)udc6H;<<4n}*(mjEaszFUYw<*AC45E1&T;5lTH_N6 zo$~UUTwxJAH`OqDx~1{8NE`{#_TpY*VmHS(3h(qn!YB);BE`Q7yX@+}K0{-acCGvS z<=LF9^uA$zY|X}IW3h!Zn9o4OK=l0~J?&gx+YhCV>?e)FjveL&+Z%BMY8&x~`VFM8sb?`b>o|8fbvWWUIQlr6MOnd9&v0-hvEzg)+QGV32YB&w zYvW{?+t3idE=f8d(1=0$gF;Ve%Ja3JRK)t2)mZrm%lFZt($=t3$UaWSN`g8OKfRHT NDMp1hFB${m{{V&DCTjoy literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_static/css/fonts/lato-bold-italic.woff2 b/releases/1.32.2/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c4e3d804b57b625b16a36d767bfca6bbf63d414e GIT binary patch literal 193308 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

l?s7}*4vp!2W|88=L^r| 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

nR1?qM=|aYy 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

F}woT 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"bt0}@AlIHaMn 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 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_static/css/fonts/lato-bold.woff2 b/releases/1.32.2/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bb195043cfc07fa52741c6144d7378b5ba8be4c5 GIT binary patch literal 184912 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

x{o9f|7gEmo2*wv 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 z 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≶M9Zv|5`G?V+t`dH%WEMXqpk;_3Hk#c)5bow}^>GHdOg=@5pYx=49b13Ly zrJynzDRebu8rnRSaDCBo@|9g53n?-Toj%;)7@=UY|Noy}Ma{<^CTZW`I9PGat{6t2 zaDw4J3oUfqrNwG{*q4kXjQO#)d%E?I`6unq0@g?R`EPa45Y|xpiRX?D^@^QqfPjrp z`1!tA9;wNGs_VH%HtUBo8*1_;v~g)avtfdTTKYQ+w|_T@R1|@!z4MWbhw@XQ#{r8n zFBZwGL~*S&Epds65DN=S9LDmC%OD``N?Ja3mq@-KYHmwkg<5GJXlu`C1U~hF;}GUt zEV_svDDRB0pxY;h0iVB6!+t9MoPjoUN2{tnNvmp71!_;3|F6OefCDX3EgVYSHa&Y~ zU}M_~aPglu-?Am;VW9ar%IVbGkq@`{Tq5wAt!;iU^4x0?c1udN{X&%ux4V&|KJ4W8 z^-G%6%-Mk6r|NGgPt?6Gz6|&!zRxhaV4(F`GZ8rK4j__!PX?Q7^;*CQ1mh5%DvR6C z?e!IxGMT8~xw^^9NiPO6=pQ@SRODn~Fsq8jD|VmScW#=CFmzog>dWa9ISWyD>bX6* zxnZ#2TwN0;af`pj^X|5h-UR+^#wtJ!B@tKiK!pf5VjK5!fZLt zzX!?qwZ#;g@k9fI%Zc#zkaZg@VAO57d!5O3Ue&0UhOx8iALeb!OI zRvYFgz{G^aMMxIXA9Q8%Ks(ns{Ng8LwsDMRXV9_!HbeTZg#-D*^A&&kWc>8s7s|rI z=ynSoO>Z_is~m>%blt}gX#It_>e2=$ntV|mjceXzzfgYM^uWLH4|qn@T1Vx$y+(mB zr_oTl_0pJ8ZR}4L)pN;gX0*r7gHMr7oprWF%6?*dA?da-61JtJNHWwP^#36TIN#Kl zHX65H`VqI9GB?_ee-?H!Yb?FpyYadu!+UaImNKBnpF_sZf6ay)B7}^R1hodXNP?eK z4UhCNG=>^Ra(w)t-DekO(;#W^pCZ0-I00f84I3?O?7O zB%x)J$UIIl{lRxlFHDbkes}4Xh27aeZ@lufb-e26$_f|NxU&YtVUJG#2x>BxrM_VU z1LCx!(BL?8gDF{Vq$J)xNc>yL)$=)7I*g|%)(&0-;j8CsUSvGa_^S6DVMpH zb8v0T>G{!ohHICj*>1fftNM+zZtws0KCZLv(IK>C_QT1EH@fD(8$2iPv~!>Y4cV!P zSZxtr!>L43HPE+4<>ftO;-5eywKK$aj&E__@NZF$Ub2O545&GURXRcHZf+@4Q*sxY zWp376swn?@b?YH5czxG41HZOjt)n5ymnfWVn}~l0v!W9f09Qb$zl@4>j!2BD$PIWy zG%tHq1co&qIS~ddbB3;u@9Dn~xdsYnr5s8^`W*i3m@VDEnOB&F?o#)Rs5v1eUah$w>#9 z(>0sd(bH1S1!0KMO_Fm9-(30B*tAvEi!I8bj@kN6Z10~`=5`eh*Oh@TSgc~GARo=W z<9@k$y19A1xpq3jbDRG4LD38!4XW&4?>FThiiaoIiVSTRo?|YzPPb-muv!>myEIOW zt#-bt4&U((ZdDWewL`sy(~|m2`BN@QF+Q{|G9ZCrd6ta$KC*E*TQ_G)_3NXw*H*CY zbEL^@$wN>XGaLNe4bu&0*GJMUg5zS=CN)LQyqHShcMq=mcw_4h9+%ozHC=V~`$%?N z`DWW#&TppMgR}4%!g!nK9J8-_y1Mk=F&oUrC@E68`W@5@I(HpHbiw(p1ld9~Keub^ z`qq-^lE(GMES@?`16xSt_yAA?b$A0;omip zd;&xiYAZP+=TTDO@|)ZHN*1!_{_wQ@i@zy5-UG{`HCbB7dqN5AgmRL@R~5 z-KAmZe7J3gow^U;9@e_R+QBj&j{H=={FCM3!&hwmwI9#NDh>OjBmRdo%0A!wRKaXY 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

Jh(@(`-=;Uk2Gv%V|_WcVWJuxK#0@S8N_Z@bH0 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 GFa8giDF565 literal 0 HcmV?d00001 diff --git a/releases/1.32.2/_images/channel_pruning_1.png b/releases/1.32.2/_images/channel_pruning_1.png new file mode 100644 index 0000000000000000000000000000000000000000..68953c8787d746c183985e7fc11e8c079588af92 GIT binary patch literal 27278 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